--- /sys/src/9k/k10/fns.h +++ /sys/src/9k/k10/fns.h @@ -218,6 +218,11 @@ extern int i8259isr(int); extern void mpsinit(void); /* + * mpacpi.c + */ +extern void mpacpi(void); + +/* * sipi.c */ extern void sipi(void); --- /sys/src/9k/k10/k10aoe +++ /sys/src/9k/k10/k10aoe @@ -55,7 +55,7 @@ link +dev misc +dev nocache - mp apic ioapic pci sipi + mp apic ioapic pci sipi mpacpi # #boot cpu --- /sys/src/9k/k10/k10cpu +++ /sys/src/9k/k10/k10cpu @@ -49,7 +49,7 @@ link +dev misc +dev cache - mp apic ioapic pci sipi + mp apic ioapic pci sipi mpacpi # #boot cpu --- /sys/src/9k/k10/k10cpuf +++ /sys/src/9k/k10/k10cpuf @@ -56,7 +56,7 @@ link +dev misc +dev cache - mp apic ioapic pci sipi + mp apic ioapic pci sipi mpacpi # #boot cpu --- /sys/src/9k/k10/k10root +++ /sys/src/9k/k10/k10root @@ -48,7 +48,7 @@ link +dev misc +dev nocache - mp apic ioapic pci sipi + mp apic ioapic pci sipi mpacpi # #boot cpu --- /sys/src/9k/k10/mp.c +++ /sys/src/9k/k10/mp.c @@ -479,6 +479,7 @@ mpsinit(void) * startup. */ mpparse(pcmp); + mpacpi(); apicdump(); ioapicdump(); --- /dev/null +++ /sys/src/9k/k10/mpacpi.c @@ -0,0 +1,57 @@ +#include "u.h" +#include "../port/lib.h" +#include "mem.h" +#include "dat.h" +#include "fns.h" + +#include "io.h" +#include "mp.h" +#include "apic.h" +#include "acpi.h" + +extern Madt* apics; + +void +mpacpi(void) +{ + char *already; + int nprocid, bp; + Apic *apic; + Apicst *st; + + DBG("APIC mpacpi lapic addr %#p, flags %#ux\n", + apics->lapicpa, apics->pcat); + + nprocid = 0; + for(st = apics->st; st != nil; st = st->next){ + already = ""; + switch(st->type){ + case ASlapic: + if(st->lapic.id > Napic) + break; + apic = &xapic[st->lapic.id]; + bp = (nprocid++ == 0); + if(apic->useable) + already = "(on)"; + else + apicinit(st->lapic.id, apics->lapicpa, bp); + USED(already); + DBG("apic proc %d/%d apicid %d %s\n", nprocid-1, + apic->machno, st->lapic.id, already); + break; + case ASioapic: + if(st->ioapic.id > Napic) + break; + apic = &ioapic[st->ioapic.id]; + if(apic->useable){ + apic->gsib = st->ioapic.ibase; + already = "(on)"; + }else + ioapicinit(st->ioapic.id, st->ioapic.addr); + USED(already); + DBG("ioapic %d addr %p gsib %d %s\n", + st->ioapic.id, apic->addr, apic->gsib, already); + break; + } + } +}