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