typedef struct Fadt Fadt; typedef struct Gas Gas; typedef struct Tbl Tbl; typedef struct Acpicfg Acpicfg; /* * Header for ACPI description tables */ struct Tbl { uint8_t sig[4]; /* e.g. "FACP" */ uint8_t len[4]; uint8_t rev; uint8_t csum; uint8_t oemid[6]; uint8_t oemtblid[8]; uint8_t oemrev[4]; uint8_t creatorid[4]; uint8_t creatorrev[4]; uint8_t data[]; }; /* * Generic address structure. */ struct Gas { uint8_t spc; /* address space id */ uint8_t len; /* register size in bits */ uint8_t off; /* bit offset */ uint8_t accsz; /* 1: byte; 2: word; 3: dword; 4: qword */ uint64_t addr; /* address (or acpi encoded tbdf + reg) */ }; /* * Fixed ACPI description table. */ struct Fadt { int rev; uint32_t facs; uint32_t dsdt; uint8_t pmprofile; uint16_t sciint; uint32_t smicmd; uint8_t acpienable; uint8_t acpidisable; uint8_t s4biosreq; uint8_t pstatecnt; uint32_t pm1aevtblk; uint32_t pm1bevtblk; uint32_t pm1acntblk; uint32_t pm1bcntblk; uint32_t pm2cntblk; uint32_t pmtmrblk; uint32_t gpe0blk; uint32_t gpe1blk; uint8_t pm1evtlen; uint8_t pm1cntlen; uint8_t pm2cntlen; uint8_t pmtmrlen; uint8_t gpe0blklen; uint8_t gpe1blklen; uint8_t gp1base; uint8_t cstcnt; uint16_t plvl2lat; uint16_t plvl3lat; uint16_t flushsz; uint16_t flushstride; uint8_t dutyoff; uint8_t dutywidth; uint8_t dayalrm; uint8_t monalrm; uint8_t century; uint16_t iapcbootarch; uint32_t flags; Gas resetreg; uint8_t resetval; uint64_t xfacs; uint64_t xdsdt; Gas xpm1aevtblk; Gas xpm1bevtblk; Gas xpm1acntblk; Gas xpm1bcntblk; Gas xpm2cntblk; Gas xpmtmrblk; Gas xgpe0blk; Gas xgpe1blk; }; #pragma varargck type "G" Gas* struct Acpicfg { uint32_t sval[6][2]; /* p1a.ctl, p1b.ctl */ }; Tbl* acpigettbl(void*); extern Fadt fadt; extern Acpicfg acpicfg; extern void hpetinit(uint32_t, uint32_t, uintmem, int); enum{ MemHotPlug= 1<<1, MemNonVolatile= 1<<2, }; extern void memaffinity(uint64_t, uint64_t, uint32_t, int); /* * ACPI 4.0 E820 AddressRange types (table 14-1) */ enum { AddrsNone = 0, AddrsMemory = 1, AddrsReserved = 2, AddrsACPI = 3, AddrsNVS = 4, AddrsUnusable = 5, AddrsDisabled = 6, AddrsDEV = 9, /* our internal code */ AddrsNVDIMM = 0x5a, /* Viking NVDIMM */ /* extended attribute flags, not currently used */ AddrsNonVolatile = 1<<1, AddrsSlowAccess = 1<<2, AddrsErrorLog = 1<<3, };