4 #include <lunaix/changeling.h>
5 #include <lunaix/device.h>
6 #include <lunaix/ds/btrie.h>
10 typedef struct irq_object* irq_t;
11 typedef void (*irq_servant)(irq_t, const struct hart_state*);
16 (*install_irq)(struct irq_domain*, irq_t);
19 (*map_irq)(struct irq_domain*, irq_t, void* irq_extra);
22 (*remove_irq)(struct irq_domain*, irq_t);
29 struct llist_header list;
31 struct irq_domain* parent;
33 const struct irq_domain_ops* ops;
62 struct irq_line_wire* line;
63 struct irq_msi_wire* msi;
69 struct irq_domain* domain;
74 #define SZ sizeof(struct irq_object)
77 irq_create_domain(struct device* intc_dev, const struct irq_domain_ops* ops);
80 irq_owning_domain(struct device* dev);
83 irq_attach_domain(struct irq_domain* parent, struct irq_domain* child);
86 irq_declare(enum irq_type, irq_servant, ptr_t, void*);
92 irq_assign(struct irq_domain* domain, irq_t);
95 irq_find(struct irq_domain* domain, int local_irq);
98 irq_record(struct irq_domain* domain, irq_t irq);
101 irq_set_default_domain(struct irq_domain*);
104 irq_get_default_domain();
107 irq_forward_install(struct irq_domain* current, irq_t irq);
110 irq_serve(irq_t irq, struct hart_state* state)
112 irq->serve(irq, state);
116 irq_set_payload(irq_t irq, void* payload)
118 irq->payload = payload;
122 irq_set_domain_object(struct irq_domain* domain, void* obj)
124 domain->object = obj;
127 #define irq_payload(irq, type) ((type*)(irq)->payload)
128 #define irq_domain_obj(domain, type) ((type*)(domain)->object)
131 irq_declare_line(irq_servant callback, int local_irq, void* irq_extra)
133 return irq_declare(IRQ_LINE, callback, (int)local_irq, irq_extra);
137 irq_declare_msg(irq_servant callback,
138 ptr_t message, ptr_t sideband, void* irq_extra)
141 irq = irq_declare(IRQ_MESSAGE, callback, message, irq_extra);
142 irq->msi->sideband = sideband;
147 static inline struct irq_domain*
148 irq_get_domain(struct device* maybe_intc)
150 struct potens_meta* domain_m;
152 domain_m = device_get_potens(maybe_intc, potens(INT_DOMAIN));
153 return domain_m ? get_potens(domain_m, struct irq_domain) : NULL;
156 static inline struct irq_domain*
157 irq_parent_domain(struct irq_domain* domain)
159 return domain->parent;
162 #endif /* __LUNAIX_IRQ_H */