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