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