X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/f89517343bf062d299d54408eea2f9387bfefb6d..b3cd5dea944d54033696d303502e67a16a7bd020:/lunaix-os/includes/hal/irq.h diff --git a/lunaix-os/includes/hal/irq.h b/lunaix-os/includes/hal/irq.h index 41be4b0..e58a6bd 100644 --- a/lunaix-os/includes/hal/irq.h +++ b/lunaix-os/includes/hal/irq.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #define IRQ_VECTOR_UNSET ((unsigned)-1) @@ -43,6 +44,12 @@ enum irq_type IRQ_MESSAGE }; +enum irq_trigger +{ + IRQ_EDGE = 0, + IRQ_LEVEL +}; + struct irq_line_wire { ptr_t domain_local; @@ -59,6 +66,7 @@ struct irq_msi_wire struct irq_object { enum irq_type type; + enum irq_trigger trig; unsigned int vector; union { @@ -106,6 +114,24 @@ irq_get_default_domain(); int irq_forward_install(struct irq_domain* current, irq_t irq); +static inline int +irq_alloc_id(struct irq_domain* domain, irq_t irq, int start, int end) +{ + unsigned int irq_id; + + if (irq->vector != IRQ_VECTOR_UNSET) { + return EEXIST; + } + + irq_id = (unsigned int)btrie_map(&domain->irq_map, start, end, irq); + if (irq_id == -1U) { + return E2BIG; + } + + irq->vector = irq; + return 0; +} + static inline void irq_serve(irq_t irq, struct hart_state* state) {