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