Set up ACPI interrupt configuration
authorRonald G. Minnich <rminnich@google.com>
Mon, 3 Mar 2014 06:47:30 +0000 (22:47 -0800)
committerRonald G. Minnich <rminnich@google.com>
Mon, 3 Mar 2014 06:47:30 +0000 (22:47 -0800)
This builds and boots, and we seem to get console interrupts,
but not ethernet interrupts (under QEMU). Things need to be fixed.
Only works if you enable CONFIG_MPTABLES (which should be renamed
since we don't parse them, hooray!)

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

index b9fd6e5..300834b 100644 (file)
@@ -70,10 +70,11 @@ void arch_init()
        save_fp_state(&x86_default_fpu); /* used in arch/trap.h for fpu init */
        pci_init();
 #ifdef CONFIG_ENABLE_MPTABLES
-       mptables_parse();
-       ioapic_init(); // MUST BE AFTER PCI/ISA INIT!
-       // TODO: move these back to regular init.  requires fixing the 
-       // CONFIG_NETWORKING inits to not need multiple cores running.
+       int acpiinit(void);
+       /* this also does the mpacpi ... is that enough? */
+       acpiinit();
+       void ioapiconline(void);
+       ioapiconline();
 #endif
        // this returns when all other cores are done and ready to receive IPIs
        #ifdef CONFIG_SINGLE_CORE
index bd8a35a..bfa3bf4 100644 (file)
@@ -591,7 +591,8 @@ int register_dev_irq(int irq, isr_t handler, void *irq_arg)
 #ifdef CONFIG_ENABLE_MPTABLES
        /* TODO: this should be for any IOAPIC EOI, not just MPTABLES */
        /* Just sending to core 0 for now */
-       ioapic_route_irq(irq, 0);
+#warning "NOT routing the ioapic irq"
+       //ioapic_route_irq(irq, 0);
 #else
        pic_unmask_irq(irq);
        unmask_lapic_lvt(LAPIC_LVT_LINT0);
index a058f71..faf3a71 100644 (file)
@@ -628,10 +628,12 @@ acpifadt(uint8_t *p, int unused)
        gasget(&fp->xgpe0blk, p+220);
        gasget(&fp->xgpe1blk, p+232);
 
+#if 0
        static char buf[8192]; // XXX
        char *out;
        out = dumpfadt(buf, &buf[8191], fp);
        printk("%s\n", out);
+#endif
        if(fp->xfacs != 0)
                loadfacs(fp->xfacs);
        else
@@ -671,7 +673,7 @@ acpimsct(uint8_t *p, int len)
        uint8_t *pe;
        struct Mdom **stl, *st;
        int off;
-       char *dump;
+
 
        msct = kzmalloc(sizeof(struct Msct), KMALLOC_WAIT);
        msct->ndoms = l32get(p+40) + 1;
@@ -691,11 +693,14 @@ acpimsct(uint8_t *p, int len)
                *stl = st;
                stl = &st->next;
        }
-
+#if 0
+       // no longer works if called from init.c
+       char *dump;
        dump = kzmalloc(1024, KMALLOC_WAIT);
        dumpmsct(dump, &dump[1023], msct);
        printk("%s\n", dump);
        kfree(dump);
+#endif
        return NULL;    /* can be unmapped once parsed */
 }
 
@@ -731,7 +736,7 @@ dumpsrat(char *start, char *end, struct Srat *st)
 static struct Atable*
 acpisrat(uint8_t *p, int len)
 {
-       char *dump;
+
        struct Srat **stl, *st;
        uint8_t *pe;
        int stlen, flags;
@@ -792,10 +797,13 @@ acpisrat(uint8_t *p, int len)
                }
        }
 
+#if 0
+       char *dump;
        dump = kzmalloc(8192, KMALLOC_WAIT);
        dumpsrat(dump, &dump[8192], srat);
        printk("%s\n", dump);
        kfree(dump);
+#endif
        return NULL;    /* can be unmapped once parsed */
 }
 
@@ -828,7 +836,7 @@ cmpslitent(void* v1, void* v2)
 static struct Atable*
 acpislit(uint8_t *p, int len)
 {
-       char *dump;
+
        uint8_t *pe;
        int i, j, k;
        struct SlEntry *se;
@@ -848,12 +856,14 @@ acpislit(uint8_t *p, int len)
                se->dom = k;
                se->dist = *p;
        }
+
+#warning "no qsort"
+#if 0
+       char *dump;
        dump = kzmalloc(8192, KMALLOC_WAIT);
        dumpslit(dump, &dump[8191], slit);
        printk("%s", dump);
        kfree(dump);
-#warning "no qsort"
-#if 0
        for(i = 0; i < slit->rowlen; i++)
                qsort(slit->e[i], slit->rowlen, sizeof(slit->e[0][0]), cmpslitent);
        
@@ -982,7 +992,7 @@ dumpmadt(char *start, char *end, struct Madt *apics)
 static struct Atable*
 acpimadt(uint8_t *p, int len)
 {
-       char *dump;
+
        uint8_t *pe;
        struct Apicst *st, *l, **stl;
        int stlen, id;
@@ -1095,10 +1105,13 @@ acpimadt(uint8_t *p, int len)
                        stl = &st->next;
                }
        }
+#if 0
+       char *dump;
        dump = kzmalloc(8192, KMALLOC_WAIT);
        dumpmadt(dump, &dump[8191], apics);
        printk("%s\n", dump);
        kfree(dump);
+#endif
        return NULL;    /* can be unmapped once parsed */
 }
 
@@ -1185,7 +1198,7 @@ acpixsdtload(char *sig)
                        printk("acpi: %s addr %#p\n", tsig, sdt);
                        for(t = 0; t < ARRAY_SIZE(ptables); t++)
                                if(strcmp(tsig, ptables[t].sig) == 0){
-                                       dumptable(table, &table[127], tsig, sdt, l);
+                                       //dumptable(table, &table[127], tsig, sdt, l);
                                        unmap = ptables[t].f(sdt, l) == NULL;
                                        found = 1;
                                        break;
@@ -1550,6 +1563,7 @@ acpiioalloc(unsigned int addr, int len)
 int
 acpiinit(void)
 {
+       /* this smicmd test implements 'run once' for now. */
        if(fadt.smicmd == 0){
                //fmtinstall('G', Gfmt);
                acpirsdptr();
index 22fd169..c36901b 100644 (file)
@@ -103,7 +103,8 @@ void test_ioapic_pit_reroute(void)
 {
        register_raw_irq(0x20, test_hello_world_handler, NULL);
 #ifdef CONFIG_ENABLE_MPTABLES
-       ioapic_route_irq(0, 3); 
+#warning "not routing the irq"
+       //ioapic_route_irq(0, 3);       
 #endif
 
        cprintf("Starting pit on core 3....\n");
@@ -112,7 +113,8 @@ void test_ioapic_pit_reroute(void)
        
        udelay(3000000);
 #ifdef CONFIG_ENABLE_MPTABLES
-       ioapic_unroute_irq(0);
+#warning "NOT unrouting the irq"
+       //ioapic_unroute_irq(0);
 #endif
        udelay(300000);
        cprintf("Masked pit. Waiting before return...\n");