First pass at enabling interrupts.
authorRonald G. Minnich <rminnich@google.com>
Mon, 3 Mar 2014 19:15:51 +0000 (11:15 -0800)
committerRonald G. Minnich <rminnich@google.com>
Mon, 3 Mar 2014 19:15:51 +0000 (11:15 -0800)
This may not be too wrong.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
kern/arch/x86/ioapic.c
kern/arch/x86/trap.c
kern/drivers/dev/acpi.c

index b256922..553a77d 100644 (file)
@@ -21,6 +21,7 @@
 #include <smp.h>
 #include <ip.h>
 #include <arch/io.h>
+#include <acpi.h>
 
 struct Rbus {
        struct Rbus     *next;
@@ -140,6 +141,52 @@ ioapicintrinit(int busno, int apicno, int intin, int devno, uint32_t lo)
        rdtbus[busno] = rbus;
 }
 
+static int map_polarity[4] = {
+       -1, IPhigh, -1, IPlow
+};
+
+static int map_edge_level[4] = {
+       -1, TMedge, -1, TMlevel
+};
+int
+ioapic_route_irq(int irq, int apicno)
+{
+       extern struct Madt *apics;
+       struct Madt *a = apics;
+       struct Apicst *st;
+       uint32_t lo;
+       int pol, edge_level;
+
+       /* find it. */
+       for(st = apics->st; st != NULL; st = st->next)
+               switch(st->type){
+               default: 
+                       continue;
+               case ASintovr:
+                       if (st->intovr.irq == irq)
+                               break;
+               }
+       if (! st) {
+               printk("IRQ %d not found in MADT\n", irq);
+               return -1;
+       }
+       
+       pol = map_polarity[st->intovr.flags & AFpmask];
+       if (pol < 0) {
+               printk("BAD POLARITY\n");
+               return -1;
+       }
+       
+       edge_level = map_edge_level[(st->intovr.flags&AFlevel)>>2];
+       if (edge_level < 0) {
+               printk("BAD edge/level\n");
+               return -1;
+       }
+       lo = pol | edge_level;
+       ioapicintrinit(0, 0, irq, /* ah shit int devno*/ 0, lo);
+       printk("FOUND the MADT for %d\n", irq);
+       return 0;
+}
 void
 ioapicinit(int id, int ibase, uintptr_t pa)
 {
index 3234e16..91829bc 100644 (file)
@@ -593,7 +593,7 @@ int register_dev_irq(int irq, isr_t handler, void *irq_arg)
        /* Just sending to core 0 for now */
 #warning "NOT routing the ioapic irq"
        printk("NOT ROUTING irq %d to core 0!\n", irq);
-       //ioapic_route_irq(irq, 0);
+       ioapic_route_irq(irq, 0);
 #else
        pic_unmask_irq(irq);
        unmask_lapic_lvt(LAPIC_LVT_LINT0);
index 5275771..39edf82 100644 (file)
@@ -958,6 +958,7 @@ static char *printiflags(char *start, char *end, int flags)
                polarity[flags & AFpmask], 
                trigger[(flags & AFtmask)>>2]);
 }
+
 static char *
 dumpmadt(char *start, char *end, struct Madt *apics)
 {
@@ -965,6 +966,7 @@ dumpmadt(char *start, char *end, struct Madt *apics)
 
        start = seprintf(start, end, "acpi: madt lapic paddr %llux pcat %d:\n", apics->lapicpa, apics->pcat);
        for(st = apics->st; st != NULL; st = st->next)
+
                switch(st->type){
                case ASlapic:
                        start = seprintf(start, end, "\tlapic pid %d id %d\n", st->lapic.pid, st->lapic.id);