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