xref: /plan9-contrib/sys/src/9k/k10/mpacpi.c (revision 59461365a183d2654b8e210a706556113b1536a9)
1 #include "u.h"
2 #include "../port/lib.h"
3 #include "mem.h"
4 #include "dat.h"
5 #include "fns.h"
6 
7 #include "io.h"
8 #include "mp.h"
9 #include "apic.h"
10 #include "acpi.h"
11 
12 extern	Madt*	apics;
13 
14 void
mpacpi(void)15 mpacpi(void)
16 {
17 	char *already;
18 	int nprocid, bp;
19 	Apic *apic;
20 	Apicst *st;
21 
22 	DBG("APIC mpacpi lapic addr %#p, flags %#ux\n",
23 		apics->lapicpa, apics->pcat);
24 
25 	nprocid = 0;
26 	for(st = apics->st; st != nil; st = st->next){
27 		already = "";
28 		switch(st->type){
29 		case ASlapic:
30 			if(st->lapic.id > Napic)
31 				break;
32 			apic = &xapic[st->lapic.id];
33 			bp = (nprocid++ == 0);
34 			if(apic->useable)
35 				already = "(on)";
36 			else
37 				apicinit(st->lapic.id, apics->lapicpa, bp);
38 			USED(already);
39 			DBG("apic proc %d/%d apicid %d %s\n", nprocid-1,
40 				apic->machno, st->lapic.id, already);
41 			break;
42 		case ASioapic:
43 			if(st->ioapic.id > Napic)
44 				break;
45 			apic = &ioapic[st->ioapic.id];
46 			if(apic->useable){
47 				apic->gsib = st->ioapic.ibase;
48 				already = "(on)";
49 			}else
50 				ioapicinit(st->ioapic.id, st->ioapic.addr);
51 			USED(already);
52 			DBG("ioapic %d addr %p gsib %d %s\n",
53 				st->ioapic.id, apic->addr, apic->gsib, already);
54 			break;
55 		}
56 	}
57 }
58