FADT
概述: FADT(Fixed ACPI Description
Table)表是ACPI编程接口中使用一种的数据结构,该表包含与电源管理相关的固定寄存器块的信息。
查找FADT
通过RSDP指针以获取RSDT或XSDT,然后找到FADT,FADT是RSDT或XSDT的一个条目、FADT结构体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| struct FADT { struct ACPISDTHeader h; uint32_t FirmwareCtrl; uint32_t Dsdt;
uint8_t Reserved;
uint8_t PreferredPowerManagementProfile; uint16_t SCI_Interrupt; uint32_t SMI_CommandPort; uint8_t AcpiEnable; uint8_t AcpiDisable; uint8_t S4BIOS_REQ; uint8_t PSTATE_Control; uint32_t PM1aEventBlock; uint32_t PM1bEventBlock; uint32_t PM1aControlBlock; uint32_t PM1bControlBlock; uint32_t PM2ControlBlock; uint32_t PMTimerBlock; uint32_t GPE0Block; uint32_t GPE1Block; uint8_t PM1EventLength; uint8_t PM1ControlLength; uint8_t PM2ControlLength; uint8_t PMTimerLength; uint8_t GPE0Length; uint8_t GPE1Length; uint8_t GPE1Base; uint8_t CStateControl; uint16_t WorstC2Latency; uint16_t WorstC3Latency; uint16_t FlushSize; uint16_t FlushStride; uint8_t DutyOffset; uint8_t DutyWidth; uint8_t DayAlarm; uint8_t MonthAlarm; uint8_t Century;
uint16_t BootArchitectureFlags;
uint8_t Reserved2; uint32_t Flags;
GenericAddressStructure ResetReg;
uint8_t ResetValue; uint8_t Reserved3[3];
uint64_t X_FirmwareControl; uint64_t X_Dsdt;
GenericAddressStructure X_PM1aEventBlock; GenericAddressStructure X_PM1bEventBlock; GenericAddressStructure X_PM1aControlBlock; GenericAddressStructure X_PM1bControlBlock; GenericAddressStructure X_PM2ControlBlock; GenericAddressStructure X_PMTimerBlock; GenericAddressStructure X_GPE0Block; GenericAddressStructure X_GPE1Block; };
|
FirmwareCtrl:
这是一个指向FACS(固件控制结构)的32位指针。自ACPI2.0版本,表格中添加了一个新字段,名为X_FirmwareControl,类型为GAS,宽度为64位。这两个字段中只有一个被使用,另一个字段包含0。根据规范,当FACS放置在第4个GB上方时,才会使用X_字段
Dsdt:
这是一个指向DSDT(差异化系统描述表)的32位指针,同时还有一个名为X_Dsdt的兄弟字段。
PreferredPowerManagementProfile:
该值应指向一个电源管理配置文件,例如,如果它包含2,则计算机是笔记本电脑,并且您应该在省电模式下配置电源管理
值含义:
0 |
未指定 |
1 |
桌面电脑 |
2 |
移动设备(笔记本电脑) |
3 |
工作站 |
4 |
企业服务器 |
5 |
SOHO服务器 |
6 |
设备PC |
7 |
性能服务器 |
大于7 |
保留 |
SCI_Interrupt:
ACPI使用系统控制中断(SCI)通知OS有关固定事件的信息,例如按下电源按钮,或用于特定于固件的通用事件(GPE)。
FADT结构中这个字段指示了用于SCI的PIC(可编程中断控制器)或IOAPIC(输入输出高级可编程中断控制器)中断引脚。
要知道它是否是PIC
IRQ,通过MADT(多处理器描述表)检查是否存在双8259中断控制器,否则,它就是一个GSI(全局系统中断)。
如果正在使用IOAPIC并且PIC存在,请首先检查中断源覆盖以获取与IRQ源相关联的GSI。
SMI_CommandPort:
这是一个I/O端口,OS在这里写入AcpiEnable或AcpiDisable,以获取或释放ACPI寄存器的所有权,在不支持SMM(系统管理模式)的系统上,该端口地址为0。
GnericAddress结构体
GAS是ACPI用来描述寄存器位置的一种结构
1 2 3 4 5 6 7 8
| struct GenericAddressStructure { uint8_t AddressSpace; uint8_t BitWidth; uint8_t BitOffset; uint8_t AccessSize; uint64_t Address; };
|
AddressSpace: 寄存器所在的地址空间
值 |
地址空间 |
0x00 |
系统内存 |
0x01 |
系统I/O |
0x02 |
PCI配置空间 |
0x03 |
嵌入式控制器 |
0x04 |
系统管理总线 |
0x05 |
系统CMOS |
0x06 |
PCI设备BAR目标 |
0x07 |
智能平台管理基础设施 |
0x08 |
通用性I/O |
0x09 |
通用串行总线 |
0x0A |
平台沟通渠道 |
0x0B to 0x0F |
保留位 |
0x80 to 0xFF |
OEM定义 |
BitWidth: 寄存器的位宽,即寄存器中数据的位数
BitOffset: 指示数据在寄存器中的偏移量
AccessSize: 定义一次可以读/写的字节数
值 |
访问大小 |
0x00 |
未定义 |
0x01 |
字节(8位)访问 |
0x02 |
16位访问 |
0x03 |
32位访问 |
0x04 |
64位访问 |
Address: 寄存器的地址
参考