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