3 #include <lunaix/mm/valloc.h>
4 #include <klibc/string.h>
7 __ispec_sz(struct dtn* node)
9 return node->base.intr_c + node->base.addr_c;
12 static struct dtp_val*
13 __ispec_mask(struct dtn* node)
15 return dt_getprop(&node->base, "interrupt-map-mask");
19 dt_resolve_interrupt_map(struct dtn* node)
22 struct dtspec_create_ops ops = {};
24 ops.child_keysz = __ispec_sz;
25 ops.parent_keysz = __ispec_sz;
26 ops.get_mask = __ispec_mask;
28 map = dt_getprop(&node->base, "interrupt-map");
33 node->intr.map = dtspec_create(node, map, &ops);
37 dt_interrupt_at(struct dtn* node, int idx, struct dtp_val* int_spec)
41 struct dtn_intr* intr;
42 struct dtn* intr_domain;
45 if (!intr->valid || idx >= intr->nr_intrs) {
49 if (!intr->extended) {
50 intr_domain = intr->parent;
51 int_cells = intr_domain->base.intr_c;
53 raw_specs = &intr->raw_ispecs.encoded[int_cells * idx];
54 dtp_val_set(int_spec, raw_specs, int_cells);
59 struct dtspec_intr *p, *n;
60 llist_for_each(p, n, &intr->ext_ispecs, ispecs)
72 parse_stdintr_prop(struct fdt_blob* fdt, fdt_loc_t loc, struct dtn_intr* node)
74 if (propeq(fdt, loc, "interrupt-parent")) {
75 node->parent_hnd = __prop_getu32(loc);
78 else if (propeq(fdt, loc, "interrupts-extended")) {
79 node->extended = true;
80 __mkprop_ptr(loc, &node->raw_ispecs);
83 else if (!node->extended && propeq(fdt, loc, "interrupts")) {
84 __mkprop_ptr(loc, &node->raw_ispecs);