physical page list mapping
[lunaix-os.git] / lunaix-os / includes / hal / irq.h
index 41be4b07f9a758ce3ff39215ba8dda15d0810ab4..e58a6bdfcf263cb8b345fa3a7cefb0b8ff01d743 100644 (file)
@@ -4,6 +4,7 @@
 #include <lunaix/changeling.h>
 #include <lunaix/device.h>
 #include <lunaix/ds/btrie.h>
+#include <lunaix/status.h>
 #include <asm/hart.h>
 
 #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)
 {