e580c0aeede98b2ea3f75d0ee0cebf15aad34d96
[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         Qpretty,
80         Qioapic,
81         Qapic,
82 };
83
84 /*
85  * ACPI table (sw)
86  */
87 struct Atable
88 {
89         struct Atable*  next;           /* next table in list */
90         int     is64;           /* uses 64bits */
91         char    sig[5];         /* signature */
92         char    oemid[7];       /* oem id str. */
93         char    oemtblid[9];    /* oem tbl. id str. */
94         uint8_t* tbl;           /* pointer to table in memory */
95         long    dlen;           /* size of data in table, after Stdhdr */
96 };
97
98 struct Gpe
99 {
100         uintptr_t       stsio;          /* port used for status */
101         int     stsbit;         /* bit number */
102         uintptr_t       enio;           /* port used for enable */
103         int     enbit;          /* bit number */
104         int     nb;             /* event number */
105         char*   obj;            /* handler object  */
106         int     id;             /* id as supplied by user */
107 };
108
109 struct Parse
110 {
111         char*   sig;
112         struct Atable*  (*f)( uint8_t *unused_uint8_p_t, int);  /* return NULL to keep vmap */
113 };
114
115 struct Regio{
116         void    *arg;
117         uint8_t (*get8)(uintptr_t, void*);
118         void    (*set8)(uintptr_t, uint8_t unused_int, void*);
119         uint16_t        (*get16)(uintptr_t, void*);
120         void    (*set16)(uintptr_t, uint16_t unused_int, void*);
121         uint32_t        (*get32)(uintptr_t, void*);
122         void    (*set32)(uintptr_t, uint32_t, void*);
123         uint64_t        (*get64)(uintptr_t, void*);
124         void    (*set64)(uintptr_t, uint64_t unused_int, void*);
125 };
126
127 struct Reg
128 {
129         char*   name;
130         int     spc;            /* io space */
131         uint64_t        base;           /* address, physical */
132         uint8_t*        p;              /* address, kmapped */
133         uint64_t        len;
134         int     tbdf;
135         int     accsz;          /* access size */
136 };
137
138 /* Generic address structure. 
139  */
140 struct Gas
141 {
142         uint8_t spc;    /* address space id */
143         uint8_t len;    /* register size in bits */
144         uint8_t off;    /* bit offset */
145         uint8_t accsz;  /* 1: byte; 2: word; 3: dword; 4: qword */
146         uint64_t        addr;   /* address (or acpi encoded tbdf + reg) */
147 };
148
149 /* Root system description table pointer.
150  * Used to locate the root system description table RSDT
151  * (or the extended system description table from version 2) XSDT.
152  * The XDST contains (after the DST header) a list of pointers to tables:
153  *      - FADT  fixed acpi description table.
154  *              It points to the DSDT, AML code making the acpi namespace.
155  *      - SSDTs tables with AML code to add to the acpi namespace.
156  *      - pointers to other tables for apics, etc.
157  */
158
159 struct Rsdp
160 {
161         uint8_t signature[8];                   /* "RSD PTR " */
162         uint8_t rchecksum;
163         uint8_t oemid[6];
164         uint8_t revision;
165         uint8_t raddr[4];                       /* RSDT */
166         uint8_t length[4];
167         uint8_t xaddr[8];                       /* XSDT */
168         uint8_t xchecksum;                      /* XSDT */
169         uint8_t _33_[3];                        /* reserved */
170 };
171
172 /* Header for ACPI description tables
173  */
174 struct Sdthdr
175 {
176         uint8_t sig[4];                 /* "FACP" or whatever */
177         uint8_t length[4];
178         uint8_t rev;
179         uint8_t csum;
180         uint8_t oemid[6];
181         uint8_t oemtblid[8];
182         uint8_t oemrev[4];
183         uint8_t creatorid[4];
184         uint8_t creatorrev[4];
185 };
186
187 /* Firmware control structure
188  */
189 struct Facs
190 {
191         uint32_t        hwsig;
192         uint32_t        wakingv;
193         uint32_t        glock;
194         uint32_t        flags;
195         uint64_t        xwakingv;
196         uint8_t vers;
197         uint32_t        ospmflags;
198 };
199
200
201 /* Maximum System Characteristics table
202  */
203 struct Msct
204 {
205         int     ndoms;          /* number of domains */
206         int     nclkdoms;       /* number of clock domains */
207         uint64_t        maxpa;          /* max physical address */
208
209         struct Mdom*    dom;            /* domain information list */
210 };
211
212 struct Mdom
213 {
214         struct Mdom*    next;
215         int     start;          /* start dom id */
216         int     end;            /* end dom id */
217         int     maxproc;        /* max processor capacity */
218         uint64_t        maxmem;         /* max memory capacity */
219 };
220
221 /* Multiple APIC description table
222  * Interrupts are virtualized by ACPI and each APIC has
223  * a `virtual interrupt base' where its interrupts start.
224  * Addresses are processor-relative physical addresses.
225  * Only enabled devices are linked, others are filtered out.
226  */
227 struct Madt
228 {
229         uint64_t        lapicpa;                /* local APIC addr */
230         int     pcat;           /* the machine has PC/AT 8259s */
231         struct Apicst*  st;             /* list of Apic related structures */
232 };
233
234 struct Apicst
235 {
236         int     type;
237         struct Apicst*  next;
238         union{
239                 struct{
240                         int     pid;    /* processor id */
241                         int     id;     /* apic no */
242                 } lapic;
243                 struct{
244                         int     id;     /* io apic id */
245                         uint32_t        ibase;  /* interrupt base addr. */
246                         uint64_t        addr;   /* base address */
247                 } ioapic, iosapic;
248                 struct{
249                         int     irq;    /* bus intr. source (ISA only) */
250                         int     intr;   /* system interrupt */
251                         int     flags;  /* apic flags */
252                 } intovr;
253                 struct{
254                         int     intr;   /* system interrupt */
255                         int     flags;  /* apic flags */
256                 } nmi;
257                 struct{
258                         int     pid;    /* processor id */
259                         int     flags;  /* lapic flags */
260                         int     lint;   /* lapic LINTn for nmi */
261                 } lnmi;
262                 struct{
263                         int     pid;    /* processor id */
264                         int     id;     /* apic id */
265                         int     eid;    /* apic eid */
266                         int     puid;   /* processor uid */
267                         char*   puids;  /* same thing */
268                 } lsapic;
269                 struct{
270                         int     pid;    /* processor id */
271                         int     peid;   /* processor eid */
272                         int     iosv;   /* io sapic vector */
273                         int     intr;   /* global sys intr. */
274                         int     type;   /* intr type */
275                         int     flags;  /* apic flags */
276                         int     any;    /* err sts at any proc */
277                 } intsrc;
278                 struct{
279                         int     id;     /* x2 apic id */
280                         int     puid;   /* processor uid */
281                 } lx2apic;
282                 struct{
283                         int     puid;
284                         int     flags;
285                         int     intr;
286                 } lx2nmi;
287         };
288 };
289
290 /* System resource affinity table
291  */
292 struct Srat
293 {
294         int     type;
295         struct Srat*    next;
296         union{
297                 struct{
298                         int     dom;    /* proximity domain */
299                         int     apic;   /* apic id */
300                         int     sapic;  /* sapic id */
301                         int     clkdom; /* clock domain */
302                 } lapic;
303                 struct{
304                         int     dom;    /* proximity domain */
305                         uint64_t        addr;   /* base address */
306                         uint64_t        len;
307                         int     hplug;  /* hot pluggable */
308                         int     nvram;  /* non volatile */      
309                 } mem;
310                 struct{
311                         int     dom;    /* proximity domain */
312                         int     apic;   /* x2 apic id */
313                         int     clkdom; /* clock domain */
314                 } lx2apic;
315         };
316 };
317
318 /* System locality information table
319  */
320 struct Slit {
321         uint64_t rowlen;
322         struct SlEntry **e;
323 };
324
325 struct SlEntry {
326         int dom;        /* proximity domain */
327         unsigned int dist;      /* distance to proximity domain */
328 };
329
330 /* Fixed ACPI description table.
331  * Describes implementation and hardware registers.
332  * PM* blocks are low level functions.
333  * GPE* blocks refer to general purpose events.
334  * P_* blocks are for processor features.
335  * Has address for the DSDT.
336  */
337 struct Fadt
338 {
339         uint32_t        facs;
340         uint32_t        dsdt;
341         /* 1 reserved */
342         uint8_t pmprofile;
343         uint16_t        sciint;
344         uint32_t        smicmd;
345         uint8_t acpienable;
346         uint8_t acpidisable;
347         uint8_t s4biosreq;
348         uint8_t pstatecnt;
349         uint32_t        pm1aevtblk;
350         uint32_t        pm1bevtblk;
351         uint32_t        pm1acntblk;
352         uint32_t        pm1bcntblk;
353         uint32_t        pm2cntblk;
354         uint32_t        pmtmrblk;
355         uint32_t        gpe0blk;
356         uint32_t        gpe1blk;
357         uint8_t pm1evtlen;
358         uint8_t pm1cntlen;
359         uint8_t pm2cntlen;
360         uint8_t pmtmrlen;
361         uint8_t gpe0blklen;
362         uint8_t gpe1blklen;
363         uint8_t gp1base;
364         uint8_t cstcnt;
365         uint16_t        plvl2lat;
366         uint16_t        plvl3lat;
367         uint16_t        flushsz;
368         uint16_t        flushstride;
369         uint8_t dutyoff;
370         uint8_t dutywidth;
371         uint8_t dayalrm;
372         uint8_t monalrm;
373         uint8_t century;
374         uint16_t        iapcbootarch;
375         /* 1 reserved */
376         uint32_t        flags;
377         struct Gas      resetreg;
378         uint8_t resetval;
379         /* 3 reserved */
380         uint64_t        xfacs;
381         uint64_t        xdsdt;
382         struct Gas      xpm1aevtblk;
383         struct Gas      xpm1bevtblk;
384         struct Gas      xpm1acntblk;
385         struct Gas      xpm1bcntblk;
386         struct Gas      xpm2cntblk;
387         struct Gas      xpmtmrblk;
388         struct Gas      xgpe0blk;
389         struct Gas      xgpe1blk;
390 };
391
392 /* XSDT/RSDT. 4/8 byte addresses starting at p.
393  */
394 struct Xsdt
395 {
396         int     len;
397         int     asize;
398         uint8_t*        p;
399 };
400
401 extern uintptr_t acpimblocksize(uintptr_t, int*);