xref: /plan9-contrib/sys/src/9k/k10/acpi.h (revision 9ef1f84b659abcb917c5c090acbce0772e494f21)
1*9ef1f84bSDavid du Colombier typedef struct Atable Atable;
2*9ef1f84bSDavid du Colombier typedef struct Facs Facs;
3*9ef1f84bSDavid du Colombier typedef struct Fadt Fadt;
4*9ef1f84bSDavid du Colombier typedef struct Gas Gas;
5*9ef1f84bSDavid du Colombier typedef struct Gpe Gpe;
6*9ef1f84bSDavid du Colombier typedef struct Rsdp Rsdp;
7*9ef1f84bSDavid du Colombier typedef struct Sdthdr Sdthdr;
8*9ef1f84bSDavid du Colombier typedef struct Parse Parse;
9*9ef1f84bSDavid du Colombier typedef struct Xsdt Xsdt;
10*9ef1f84bSDavid du Colombier typedef struct Regio Regio;
11*9ef1f84bSDavid du Colombier typedef struct Reg Reg;
12*9ef1f84bSDavid du Colombier typedef struct Madt Madt;
13*9ef1f84bSDavid du Colombier typedef struct Msct Msct;
14*9ef1f84bSDavid du Colombier typedef struct Mdom Mdom;
15*9ef1f84bSDavid du Colombier typedef struct Apicst Apicst;
16*9ef1f84bSDavid du Colombier typedef struct Srat Srat;
17*9ef1f84bSDavid du Colombier typedef struct Slit Slit;
18*9ef1f84bSDavid du Colombier typedef struct SlEntry SlEntry;
19*9ef1f84bSDavid du Colombier typedef struct Hpet Hpet;
20*9ef1f84bSDavid du Colombier 
21*9ef1f84bSDavid du Colombier enum
22*9ef1f84bSDavid du Colombier {
23*9ef1f84bSDavid du Colombier 
24*9ef1f84bSDavid du Colombier 	Sdthdrsz	= 36,	/* size of SDT header */
25*9ef1f84bSDavid du Colombier 
26*9ef1f84bSDavid du Colombier 	/* ACPI regions. Gas ids */
27*9ef1f84bSDavid du Colombier 	Rsysmem	= 0,
28*9ef1f84bSDavid du Colombier 	Rsysio,
29*9ef1f84bSDavid du Colombier 	Rpcicfg,
30*9ef1f84bSDavid du Colombier 	Rembed,
31*9ef1f84bSDavid du Colombier 	Rsmbus,
32*9ef1f84bSDavid du Colombier 	Rcmos,
33*9ef1f84bSDavid du Colombier 	Rpcibar,
34*9ef1f84bSDavid du Colombier 	Ripmi,
35*9ef1f84bSDavid du Colombier 	Rfixedhw	= 0x7f,
36*9ef1f84bSDavid du Colombier 
37*9ef1f84bSDavid du Colombier 	/* ACPI PM1 control */
38*9ef1f84bSDavid du Colombier 	Pm1SciEn		= 0x1,		/* Generate SCI and not SMI */
39*9ef1f84bSDavid du Colombier 
40*9ef1f84bSDavid du Colombier 	/* ACPI tbdf as encoded in acpi region base addresses */
41*9ef1f84bSDavid du Colombier 	Rpciregshift	= 0,
42*9ef1f84bSDavid du Colombier 	Rpciregmask	= 0xFFFF,
43*9ef1f84bSDavid du Colombier 	Rpcifunshift	= 16,
44*9ef1f84bSDavid du Colombier 	Rpcifunmask	= 0xFFFF,
45*9ef1f84bSDavid du Colombier 	Rpcidevshift	= 32,
46*9ef1f84bSDavid du Colombier 	Rpcidevmask	= 0xFFFF,
47*9ef1f84bSDavid du Colombier 	Rpcibusshift	= 48,
48*9ef1f84bSDavid du Colombier 	Rpcibusmask	= 0xFFFF,
49*9ef1f84bSDavid du Colombier 
50*9ef1f84bSDavid du Colombier 	/* Apic structure types */
51*9ef1f84bSDavid du Colombier 	ASlapic = 0,	/* processor local apic */
52*9ef1f84bSDavid du Colombier 	ASioapic,	/* I/O apic */
53*9ef1f84bSDavid du Colombier 	ASintovr,	/* Interrupt source override */
54*9ef1f84bSDavid du Colombier 	ASnmi,		/* NMI source */
55*9ef1f84bSDavid du Colombier 	ASlnmi,		/* local apic nmi */
56*9ef1f84bSDavid du Colombier 	ASladdr,	/* local apic address override */
57*9ef1f84bSDavid du Colombier 	ASiosapic,	/* I/O sapic */
58*9ef1f84bSDavid du Colombier 	ASlsapic,	/* local sapic */
59*9ef1f84bSDavid du Colombier 	ASintsrc,	/* platform interrupt sources */
60*9ef1f84bSDavid du Colombier 	ASlx2apic,	/* local x2 apic */
61*9ef1f84bSDavid du Colombier 	ASlx2nmi,	/* local x2 apic NMI */
62*9ef1f84bSDavid du Colombier 
63*9ef1f84bSDavid du Colombier 	/* Apic flags */
64*9ef1f84bSDavid du Colombier 	AFbus	= 0,	/* polarity/trigger like in ISA */
65*9ef1f84bSDavid du Colombier 	AFhigh	= 1,	/* active high */
66*9ef1f84bSDavid du Colombier 	AFlow	= 3,	/* active low */
67*9ef1f84bSDavid du Colombier 	AFpmask	= 3,	/* polarity bits */
68*9ef1f84bSDavid du Colombier 	AFedge	= 1<<2,	/* edge triggered */
69*9ef1f84bSDavid du Colombier 	AFlevel	= 3<<2,	/* level triggered */
70*9ef1f84bSDavid du Colombier 	AFtmask	= 3<<2,	/* trigger bits */
71*9ef1f84bSDavid du Colombier 
72*9ef1f84bSDavid du Colombier 	/* SRAT types */
73*9ef1f84bSDavid du Colombier 	SRlapic = 0,	/* Local apic/sapic affinity */
74*9ef1f84bSDavid du Colombier 	SRmem,		/* Memory affinity */
75*9ef1f84bSDavid du Colombier 	SRlx2apic,	/* x2 apic affinity */
76*9ef1f84bSDavid du Colombier 
77*9ef1f84bSDavid du Colombier 	/* Arg for _PIC */
78*9ef1f84bSDavid du Colombier 	Ppic = 0,	/* PIC interrupt model */
79*9ef1f84bSDavid du Colombier 	Papic,		/* APIC interrupt model */
80*9ef1f84bSDavid du Colombier 	Psapic,		/* SAPIC interrupt model */
81*9ef1f84bSDavid du Colombier 
82*9ef1f84bSDavid du Colombier 
83*9ef1f84bSDavid du Colombier 	CMregion = 0,			/* regio name spc base len accsz*/
84*9ef1f84bSDavid du Colombier 	CMgpe,				/* gpe name id */
85*9ef1f84bSDavid du Colombier 
86*9ef1f84bSDavid du Colombier 	Qdir = 0,
87*9ef1f84bSDavid du Colombier 	Qctl,
88*9ef1f84bSDavid du Colombier 	Qtbl,
89*9ef1f84bSDavid du Colombier 	Qio,
90*9ef1f84bSDavid du Colombier };
91*9ef1f84bSDavid du Colombier 
92*9ef1f84bSDavid du Colombier /*
93*9ef1f84bSDavid du Colombier  * ACPI table (sw)
94*9ef1f84bSDavid du Colombier  */
95*9ef1f84bSDavid du Colombier struct Atable
96*9ef1f84bSDavid du Colombier {
97*9ef1f84bSDavid du Colombier 	Atable*	next;		/* next table in list */
98*9ef1f84bSDavid du Colombier 	int	is64;		/* uses 64bits */
99*9ef1f84bSDavid du Colombier 	char	sig[5];		/* signature */
100*9ef1f84bSDavid du Colombier 	char	oemid[7];	/* oem id str. */
101*9ef1f84bSDavid du Colombier 	char	oemtblid[9];	/* oem tbl. id str. */
102*9ef1f84bSDavid du Colombier 	uchar* tbl;		/* pointer to table in memory */
103*9ef1f84bSDavid du Colombier 	long	dlen;		/* size of data in table, after Stdhdr */
104*9ef1f84bSDavid du Colombier };
105*9ef1f84bSDavid du Colombier 
106*9ef1f84bSDavid du Colombier struct Gpe
107*9ef1f84bSDavid du Colombier {
108*9ef1f84bSDavid du Colombier 	int	stsio;		/* port used for status */
109*9ef1f84bSDavid du Colombier 	int	stsbit;		/* bit number */
110*9ef1f84bSDavid du Colombier 	int	enio;		/* port used for enable */
111*9ef1f84bSDavid du Colombier 	int	enbit;		/* bit number */
112*9ef1f84bSDavid du Colombier 	int	nb;		/* event number */
113*9ef1f84bSDavid du Colombier 	char*	obj;		/* handler object  */
114*9ef1f84bSDavid du Colombier 	int	id;		/* id as supplied by user */
115*9ef1f84bSDavid du Colombier };
116*9ef1f84bSDavid du Colombier 
117*9ef1f84bSDavid du Colombier struct Parse
118*9ef1f84bSDavid du Colombier {
119*9ef1f84bSDavid du Colombier 	char*	sig;
120*9ef1f84bSDavid du Colombier 	Atable*	(*f)(uchar*, int);	/* return nil to keep vmap */
121*9ef1f84bSDavid du Colombier };
122*9ef1f84bSDavid du Colombier 
123*9ef1f84bSDavid du Colombier struct Regio{
124*9ef1f84bSDavid du Colombier 	void	*arg;
125*9ef1f84bSDavid du Colombier 	u8int	(*get8)(uintptr, void*);
126*9ef1f84bSDavid du Colombier 	void	(*set8)(uintptr, u8int, void*);
127*9ef1f84bSDavid du Colombier 	u16int	(*get16)(uintptr, void*);
128*9ef1f84bSDavid du Colombier 	void	(*set16)(uintptr, u16int, void*);
129*9ef1f84bSDavid du Colombier 	u32int	(*get32)(uintptr, void*);
130*9ef1f84bSDavid du Colombier 	void	(*set32)(uintptr, u32int, void*);
131*9ef1f84bSDavid du Colombier 	u64int	(*get64)(uintptr, void*);
132*9ef1f84bSDavid du Colombier 	void	(*set64)(uintptr, u64int, void*);
133*9ef1f84bSDavid du Colombier };
134*9ef1f84bSDavid du Colombier 
135*9ef1f84bSDavid du Colombier struct Reg
136*9ef1f84bSDavid du Colombier {
137*9ef1f84bSDavid du Colombier 	char*	name;
138*9ef1f84bSDavid du Colombier 	int	spc;		/* io space */
139*9ef1f84bSDavid du Colombier 	u64int	base;		/* address, physical */
140*9ef1f84bSDavid du Colombier 	uchar*	p;		/* address, kmapped */
141*9ef1f84bSDavid du Colombier 	u64int	len;
142*9ef1f84bSDavid du Colombier 	int	tbdf;
143*9ef1f84bSDavid du Colombier 	int	accsz;		/* access size */
144*9ef1f84bSDavid du Colombier };
145*9ef1f84bSDavid du Colombier 
146*9ef1f84bSDavid du Colombier /* Generic address structure.
147*9ef1f84bSDavid du Colombier  */
148*9ef1f84bSDavid du Colombier #pragma pack on
149*9ef1f84bSDavid du Colombier struct Gas
150*9ef1f84bSDavid du Colombier {
151*9ef1f84bSDavid du Colombier 	u8int	spc;	/* address space id */
152*9ef1f84bSDavid du Colombier 	u8int	len;	/* register size in bits */
153*9ef1f84bSDavid du Colombier 	u8int	off;	/* bit offset */
154*9ef1f84bSDavid du Colombier 	u8int	accsz;	/* 1: byte; 2: word; 3: dword; 4: qword */
155*9ef1f84bSDavid du Colombier 	u64int	addr;	/* address (or acpi encoded tbdf + reg) */
156*9ef1f84bSDavid du Colombier };
157*9ef1f84bSDavid du Colombier 
158*9ef1f84bSDavid du Colombier /* Root system description table pointer.
159*9ef1f84bSDavid du Colombier  * Used to locate the root system description table RSDT
160*9ef1f84bSDavid du Colombier  * (or the extended system description table from version 2) XSDT.
161*9ef1f84bSDavid du Colombier  * The XDST contains (after the DST header) a list of pointers to tables:
162*9ef1f84bSDavid du Colombier  *	- FADT	fixed acpi description table.
163*9ef1f84bSDavid du Colombier  *		It points to the DSDT, AML code making the acpi namespace.
164*9ef1f84bSDavid du Colombier  *	- SSDTs	tables with AML code to add to the acpi namespace.
165*9ef1f84bSDavid du Colombier  *	- pointers to other tables for apics, etc.
166*9ef1f84bSDavid du Colombier  */
167*9ef1f84bSDavid du Colombier 
168*9ef1f84bSDavid du Colombier struct Rsdp
169*9ef1f84bSDavid du Colombier {
170*9ef1f84bSDavid du Colombier 	u8int	signature[8];			/* "RSD PTR " */
171*9ef1f84bSDavid du Colombier 	u8int	rchecksum;
172*9ef1f84bSDavid du Colombier 	u8int	oemid[6];
173*9ef1f84bSDavid du Colombier 	u8int	revision;
174*9ef1f84bSDavid du Colombier 	u8int	raddr[4];			/* RSDT */
175*9ef1f84bSDavid du Colombier 	u8int	length[4];
176*9ef1f84bSDavid du Colombier 	u8int	xaddr[8];			/* XSDT */
177*9ef1f84bSDavid du Colombier 	u8int	xchecksum;			/* XSDT */
178*9ef1f84bSDavid du Colombier 	u8int	_33_[3];			/* reserved */
179*9ef1f84bSDavid du Colombier };
180*9ef1f84bSDavid du Colombier 
181*9ef1f84bSDavid du Colombier /* Header for ACPI description tables
182*9ef1f84bSDavid du Colombier  */
183*9ef1f84bSDavid du Colombier struct Sdthdr
184*9ef1f84bSDavid du Colombier {
185*9ef1f84bSDavid du Colombier 	u8int	sig[4];			/* "FACP" or whatever */
186*9ef1f84bSDavid du Colombier 	u8int	length[4];
187*9ef1f84bSDavid du Colombier 	u8int	rev;
188*9ef1f84bSDavid du Colombier 	u8int	csum;
189*9ef1f84bSDavid du Colombier 	u8int	oemid[6];
190*9ef1f84bSDavid du Colombier 	u8int	oemtblid[8];
191*9ef1f84bSDavid du Colombier 	u8int	oemrev[4];
192*9ef1f84bSDavid du Colombier 	u8int	creatorid[4];
193*9ef1f84bSDavid du Colombier 	u8int	creatorrev[4];
194*9ef1f84bSDavid du Colombier };
195*9ef1f84bSDavid du Colombier 
196*9ef1f84bSDavid du Colombier /* Firmware control structure
197*9ef1f84bSDavid du Colombier  */
198*9ef1f84bSDavid du Colombier struct Facs
199*9ef1f84bSDavid du Colombier {
200*9ef1f84bSDavid du Colombier 	u32int	hwsig;
201*9ef1f84bSDavid du Colombier 	u32int	wakingv;
202*9ef1f84bSDavid du Colombier 	u32int	glock;
203*9ef1f84bSDavid du Colombier 	u32int	flags;
204*9ef1f84bSDavid du Colombier 	u64int	xwakingv;
205*9ef1f84bSDavid du Colombier 	u8int	vers;
206*9ef1f84bSDavid du Colombier 	u32int	ospmflags;
207*9ef1f84bSDavid du Colombier };
208*9ef1f84bSDavid du Colombier 
209*9ef1f84bSDavid du Colombier #pragma pack off
210*9ef1f84bSDavid du Colombier 
211*9ef1f84bSDavid du Colombier /* Maximum System Characteristics table
212*9ef1f84bSDavid du Colombier  */
213*9ef1f84bSDavid du Colombier struct Msct
214*9ef1f84bSDavid du Colombier {
215*9ef1f84bSDavid du Colombier 	int	ndoms;		/* number of domains */
216*9ef1f84bSDavid du Colombier 	int	nclkdoms;	/* number of clock domains */
217*9ef1f84bSDavid du Colombier 	u64int	maxpa;		/* max physical address */
218*9ef1f84bSDavid du Colombier 
219*9ef1f84bSDavid du Colombier 	Mdom*	dom;		/* domain information list */
220*9ef1f84bSDavid du Colombier };
221*9ef1f84bSDavid du Colombier 
222*9ef1f84bSDavid du Colombier struct Mdom
223*9ef1f84bSDavid du Colombier {
224*9ef1f84bSDavid du Colombier 	Mdom*	next;
225*9ef1f84bSDavid du Colombier 	int	start;		/* start dom id */
226*9ef1f84bSDavid du Colombier 	int	end;		/* end dom id */
227*9ef1f84bSDavid du Colombier 	int	maxproc;	/* max processor capacity */
228*9ef1f84bSDavid du Colombier 	u64int	maxmem;		/* max memory capacity */
229*9ef1f84bSDavid du Colombier };
230*9ef1f84bSDavid du Colombier 
231*9ef1f84bSDavid du Colombier /* Multiple APIC description table
232*9ef1f84bSDavid du Colombier  * Interrupts are virtualized by ACPI and each APIC has
233*9ef1f84bSDavid du Colombier  * a `virtual interrupt base' where its interrupts start.
234*9ef1f84bSDavid du Colombier  * Addresses are processor-relative physical addresses.
235*9ef1f84bSDavid du Colombier  * Only enabled devices are linked, others are filtered out.
236*9ef1f84bSDavid du Colombier  */
237*9ef1f84bSDavid du Colombier struct Madt
238*9ef1f84bSDavid du Colombier {
239*9ef1f84bSDavid du Colombier 	uintmem	lapicpa;		/* local APIC addr */
240*9ef1f84bSDavid du Colombier 	int	pcat;		/* the machine has PC/AT 8259s */
241*9ef1f84bSDavid du Colombier 	Apicst*	st;		/* list of Apic related structures */
242*9ef1f84bSDavid du Colombier };
243*9ef1f84bSDavid du Colombier 
244*9ef1f84bSDavid du Colombier struct Apicst
245*9ef1f84bSDavid du Colombier {
246*9ef1f84bSDavid du Colombier 	int	type;
247*9ef1f84bSDavid du Colombier 	Apicst*	next;
248*9ef1f84bSDavid du Colombier 	union{
249*9ef1f84bSDavid du Colombier 		struct{
250*9ef1f84bSDavid du Colombier 			int	pid;	/* processor id */
251*9ef1f84bSDavid du Colombier 			int	id;	/* apic no */
252*9ef1f84bSDavid du Colombier 		} lapic;
253*9ef1f84bSDavid du Colombier 		struct{
254*9ef1f84bSDavid du Colombier 			int	id;	/* io apic id */
255*9ef1f84bSDavid du Colombier 			int	ibase;	/* interrupt base addr. */
256*9ef1f84bSDavid du Colombier 			uintmem	addr;	/* base address */
257*9ef1f84bSDavid du Colombier 		} ioapic, iosapic;
258*9ef1f84bSDavid du Colombier 		struct{
259*9ef1f84bSDavid du Colombier 			int	irq;	/* bus intr. source (ISA only) */
260*9ef1f84bSDavid du Colombier 			int	intr;	/* system interrupt */
261*9ef1f84bSDavid du Colombier 			int	flags;	/* apic flags */
262*9ef1f84bSDavid du Colombier 		} intovr;
263*9ef1f84bSDavid du Colombier 		struct{
264*9ef1f84bSDavid du Colombier 			int	intr;	/* system interrupt */
265*9ef1f84bSDavid du Colombier 			int	flags;	/* apic flags */
266*9ef1f84bSDavid du Colombier 		} nmi;
267*9ef1f84bSDavid du Colombier 		struct{
268*9ef1f84bSDavid du Colombier 			int	pid;	/* processor id */
269*9ef1f84bSDavid du Colombier 			int	flags;	/* lapic flags */
270*9ef1f84bSDavid du Colombier 			int	lint;	/* lapic LINTn for nmi */
271*9ef1f84bSDavid du Colombier 		} lnmi;
272*9ef1f84bSDavid du Colombier 		struct{
273*9ef1f84bSDavid du Colombier 			int	pid;	/* processor id */
274*9ef1f84bSDavid du Colombier 			int	id;	/* apic id */
275*9ef1f84bSDavid du Colombier 			int	eid;	/* apic eid */
276*9ef1f84bSDavid du Colombier 			int	puid;	/* processor uid */
277*9ef1f84bSDavid du Colombier 			char*	puids;	/* same thing */
278*9ef1f84bSDavid du Colombier 		} lsapic;
279*9ef1f84bSDavid du Colombier 		struct{
280*9ef1f84bSDavid du Colombier 			int	pid;	/* processor id */
281*9ef1f84bSDavid du Colombier 			int	peid;	/* processor eid */
282*9ef1f84bSDavid du Colombier 			int	iosv;	/* io sapic vector */
283*9ef1f84bSDavid du Colombier 			int	intr;	/* global sys intr. */
284*9ef1f84bSDavid du Colombier 			int	type;	/* intr type */
285*9ef1f84bSDavid du Colombier 			int	flags;	/* apic flags */
286*9ef1f84bSDavid du Colombier 			int	any;	/* err sts at any proc */
287*9ef1f84bSDavid du Colombier 		} intsrc;
288*9ef1f84bSDavid du Colombier 		struct{
289*9ef1f84bSDavid du Colombier 			int	id;	/* x2 apic id */
290*9ef1f84bSDavid du Colombier 			int	puid;	/* processor uid */
291*9ef1f84bSDavid du Colombier 		} lx2apic;
292*9ef1f84bSDavid du Colombier 		struct{
293*9ef1f84bSDavid du Colombier 			int	puid;
294*9ef1f84bSDavid du Colombier 			int	flags;
295*9ef1f84bSDavid du Colombier 			int	intr;
296*9ef1f84bSDavid du Colombier 		} lx2nmi;
297*9ef1f84bSDavid du Colombier 	};
298*9ef1f84bSDavid du Colombier };
299*9ef1f84bSDavid du Colombier 
300*9ef1f84bSDavid du Colombier /* System resource affinity table
301*9ef1f84bSDavid du Colombier  */
302*9ef1f84bSDavid du Colombier struct Srat
303*9ef1f84bSDavid du Colombier {
304*9ef1f84bSDavid du Colombier 	int	type;
305*9ef1f84bSDavid du Colombier 	Srat*	next;
306*9ef1f84bSDavid du Colombier 	union{
307*9ef1f84bSDavid du Colombier 		struct{
308*9ef1f84bSDavid du Colombier 			int	dom;	/* proximity domain */
309*9ef1f84bSDavid du Colombier 			int	apic;	/* apic id */
310*9ef1f84bSDavid du Colombier 			int	sapic;	/* sapic id */
311*9ef1f84bSDavid du Colombier 			int	clkdom;	/* clock domain */
312*9ef1f84bSDavid du Colombier 		} lapic;
313*9ef1f84bSDavid du Colombier 		struct{
314*9ef1f84bSDavid du Colombier 			int	dom;	/* proximity domain */
315*9ef1f84bSDavid du Colombier 			u64int	addr;	/* base address */
316*9ef1f84bSDavid du Colombier 			u64int	len;
317*9ef1f84bSDavid du Colombier 			int	hplug;	/* hot pluggable */
318*9ef1f84bSDavid du Colombier 			int	nvram;	/* non volatile */
319*9ef1f84bSDavid du Colombier 		} mem;
320*9ef1f84bSDavid du Colombier 		struct{
321*9ef1f84bSDavid du Colombier 			int	dom;	/* proximity domain */
322*9ef1f84bSDavid du Colombier 			int	apic;	/* x2 apic id */
323*9ef1f84bSDavid du Colombier 			int	clkdom;	/* clock domain */
324*9ef1f84bSDavid du Colombier 		} lx2apic;
325*9ef1f84bSDavid du Colombier 	};
326*9ef1f84bSDavid du Colombier };
327*9ef1f84bSDavid du Colombier 
328*9ef1f84bSDavid du Colombier /* System locality information table
329*9ef1f84bSDavid du Colombier  */
330*9ef1f84bSDavid du Colombier struct Slit {
331*9ef1f84bSDavid du Colombier 	uvlong rowlen;
332*9ef1f84bSDavid du Colombier 	SlEntry **e;
333*9ef1f84bSDavid du Colombier };
334*9ef1f84bSDavid du Colombier 
335*9ef1f84bSDavid du Colombier struct SlEntry {
336*9ef1f84bSDavid du Colombier 	int dom;	/* proximity domain */
337*9ef1f84bSDavid du Colombier 	uint dist;	/* distance to proximity domain */
338*9ef1f84bSDavid du Colombier };
339*9ef1f84bSDavid du Colombier 
340*9ef1f84bSDavid du Colombier /* Fixed ACPI description table.
341*9ef1f84bSDavid du Colombier  * Describes implementation and hardware registers.
342*9ef1f84bSDavid du Colombier  * PM* blocks are low level functions.
343*9ef1f84bSDavid du Colombier  * GPE* blocks refer to general purpose events.
344*9ef1f84bSDavid du Colombier  * P_* blocks are for processor features.
345*9ef1f84bSDavid du Colombier  * Has address for the DSDT.
346*9ef1f84bSDavid du Colombier  */
347*9ef1f84bSDavid du Colombier struct Fadt
348*9ef1f84bSDavid du Colombier {
349*9ef1f84bSDavid du Colombier 	u32int	facs;
350*9ef1f84bSDavid du Colombier 	u32int	dsdt;
351*9ef1f84bSDavid du Colombier 	/* 1 reserved */
352*9ef1f84bSDavid du Colombier 	u8int	pmprofile;
353*9ef1f84bSDavid du Colombier 	u16int	sciint;
354*9ef1f84bSDavid du Colombier 	u32int	smicmd;
355*9ef1f84bSDavid du Colombier 	u8int	acpienable;
356*9ef1f84bSDavid du Colombier 	u8int	acpidisable;
357*9ef1f84bSDavid du Colombier 	u8int	s4biosreq;
358*9ef1f84bSDavid du Colombier 	u8int	pstatecnt;
359*9ef1f84bSDavid du Colombier 	u32int	pm1aevtblk;
360*9ef1f84bSDavid du Colombier 	u32int	pm1bevtblk;
361*9ef1f84bSDavid du Colombier 	u32int	pm1acntblk;
362*9ef1f84bSDavid du Colombier 	u32int	pm1bcntblk;
363*9ef1f84bSDavid du Colombier 	u32int	pm2cntblk;
364*9ef1f84bSDavid du Colombier 	u32int	pmtmrblk;
365*9ef1f84bSDavid du Colombier 	u32int	gpe0blk;
366*9ef1f84bSDavid du Colombier 	u32int	gpe1blk;
367*9ef1f84bSDavid du Colombier 	u8int	pm1evtlen;
368*9ef1f84bSDavid du Colombier 	u8int	pm1cntlen;
369*9ef1f84bSDavid du Colombier 	u8int	pm2cntlen;
370*9ef1f84bSDavid du Colombier 	u8int	pmtmrlen;
371*9ef1f84bSDavid du Colombier 	u8int	gpe0blklen;
372*9ef1f84bSDavid du Colombier 	u8int	gpe1blklen;
373*9ef1f84bSDavid du Colombier 	u8int	gp1base;
374*9ef1f84bSDavid du Colombier 	u8int	cstcnt;
375*9ef1f84bSDavid du Colombier 	u16int	plvl2lat;
376*9ef1f84bSDavid du Colombier 	u16int	plvl3lat;
377*9ef1f84bSDavid du Colombier 	u16int	flushsz;
378*9ef1f84bSDavid du Colombier 	u16int	flushstride;
379*9ef1f84bSDavid du Colombier 	u8int	dutyoff;
380*9ef1f84bSDavid du Colombier 	u8int	dutywidth;
381*9ef1f84bSDavid du Colombier 	u8int	dayalrm;
382*9ef1f84bSDavid du Colombier 	u8int	monalrm;
383*9ef1f84bSDavid du Colombier 	u8int	century;
384*9ef1f84bSDavid du Colombier 	u16int	iapcbootarch;
385*9ef1f84bSDavid du Colombier 	/* 1 reserved */
386*9ef1f84bSDavid du Colombier 	u32int	flags;
387*9ef1f84bSDavid du Colombier 	Gas	resetreg;
388*9ef1f84bSDavid du Colombier 	u8int	resetval;
389*9ef1f84bSDavid du Colombier 	/* 3 reserved */
390*9ef1f84bSDavid du Colombier 	u64int	xfacs;
391*9ef1f84bSDavid du Colombier 	u64int	xdsdt;
392*9ef1f84bSDavid du Colombier 	Gas	xpm1aevtblk;
393*9ef1f84bSDavid du Colombier 	Gas	xpm1bevtblk;
394*9ef1f84bSDavid du Colombier 	Gas	xpm1acntblk;
395*9ef1f84bSDavid du Colombier 	Gas	xpm1bcntblk;
396*9ef1f84bSDavid du Colombier 	Gas	xpm2cntblk;
397*9ef1f84bSDavid du Colombier 	Gas	xpmtmrblk;
398*9ef1f84bSDavid du Colombier 	Gas	xgpe0blk;
399*9ef1f84bSDavid du Colombier 	Gas	xgpe1blk;
400*9ef1f84bSDavid du Colombier };
401*9ef1f84bSDavid du Colombier 
402*9ef1f84bSDavid du Colombier /* XSDT/RSDT. 4/8 byte addresses starting at p.
403*9ef1f84bSDavid du Colombier  */
404*9ef1f84bSDavid du Colombier struct Xsdt
405*9ef1f84bSDavid du Colombier {
406*9ef1f84bSDavid du Colombier 	int	len;
407*9ef1f84bSDavid du Colombier 	int	asize;
408*9ef1f84bSDavid du Colombier 	u8int*	p;
409*9ef1f84bSDavid du Colombier };
410*9ef1f84bSDavid du Colombier 
411*9ef1f84bSDavid du Colombier struct Hpet
412*9ef1f84bSDavid du Colombier {
413*9ef1f84bSDavid du Colombier 	u32int	id;					/* Event Timer Bock ID */
414*9ef1f84bSDavid du Colombier 	uintptr	addr;				/* ACPI Format Address (Gas) */
415*9ef1f84bSDavid du Colombier 	u8int	seqno;				/* Sequence Number */
416*9ef1f84bSDavid du Colombier 	u16int	minticks;			/* Minimum Clock Tick */
417*9ef1f84bSDavid du Colombier 	u8int	attr;				/* Page Protection */
418*9ef1f84bSDavid du Colombier };
419*9ef1f84bSDavid du Colombier 
420*9ef1f84bSDavid du Colombier extern uintmem acpimblocksize(uintmem, int*);
421