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