4 #include <lunaix/changeling.h>
5 #include <lunaix/device.h>
6 #include <lunaix/ds/btrie.h>
7 #include <lunaix/status.h>
10 #define IRQ_VECTOR_UNSET ((unsigned)-1)
13 typedef struct irq_object* irq_t;
14 typedef void (*irq_servant)(irq_t, const struct hart_state*);
19 (*install_irq)(struct irq_domain*, irq_t);
22 (*map_irq)(struct irq_domain*, irq_t, void* irq_extra);
25 (*remove_irq)(struct irq_domain*, irq_t);
32 struct llist_header list;
34 struct irq_domain* parent;
36 const struct irq_domain_ops* ops;
69 enum irq_trigger trig;
73 struct irq_line_wire* line;
74 struct irq_msi_wire* msi;
80 struct irq_domain* domain;
85 irq_create_domain(struct device* intc_dev, const struct irq_domain_ops* ops);
88 irq_owning_domain(struct device* dev);
91 irq_attach_domain(struct irq_domain* parent, struct irq_domain* child);
94 irq_declare(enum irq_type, irq_servant, ptr_t);
100 irq_assign(struct irq_domain* domain, irq_t, void*);
103 irq_find(struct irq_domain* domain, int local_irq);
106 irq_record(struct irq_domain* domain, irq_t irq);
109 irq_set_default_domain(struct irq_domain*);
112 irq_get_default_domain();
115 irq_forward_install(struct irq_domain* current, irq_t irq);
118 irq_alloc_id(struct irq_domain* domain, irq_t irq, int start, int end)
122 if (irq->vector != IRQ_VECTOR_UNSET) {
126 irq_id = (unsigned int)btrie_map(&domain->irq_map, start, end, irq);
136 irq_serve(irq_t irq, struct hart_state* state)
138 irq->serve(irq, state);
142 irq_set_servant(irq_t irq, irq_servant callback)
144 irq->serve = callback;
148 irq_bind_vector(irq_t irq, int vector)
150 irq->vector = vector;
154 irq_set_payload(irq_t irq, void* payload)
156 irq->payload = payload;
160 irq_set_domain_object(struct irq_domain* domain, void* obj)
162 domain->object = obj;
165 #define irq_payload(irq, type) ((type*)(irq)->payload)
166 #define irq_domain_obj(domain, type) ((type*)(domain)->object)
169 irq_declare_line(irq_servant callback, int local_irq)
171 return irq_declare(IRQ_LINE, callback, (int)local_irq);
175 irq_declare_msg(irq_servant callback,
176 ptr_t message, ptr_t sideband)
179 irq = irq_declare(IRQ_MESSAGE, callback, message);
180 irq->msi->sideband = sideband;
186 irq_declare_direct(irq_servant callback)
188 return irq_declare(IRQ_DIRECT, callback, 0);
191 static inline struct irq_domain*
192 irq_get_domain(struct device* maybe_intc)
194 struct potens_meta* domain_m;
196 domain_m = device_get_potens(maybe_intc, potens(INT_DOMAIN));
197 return domain_m ? get_potens(domain_m, struct irq_domain) : NULL;
200 static inline struct irq_domain*
201 irq_parent_domain(struct irq_domain* domain)
203 return domain->parent;
206 #endif /* __LUNAIX_IRQ_H */