FADT

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; // ACPI 标准描述表头部
uint32_t FirmwareCtrl; // 固件控制寄存器地址
uint32_t Dsdt; // DSDT 表地址

// ACPI 1.0 中使用的字段;现在不再使用,仅用于兼容性
uint8_t Reserved;

uint8_t PreferredPowerManagementProfile; // 首选电源管理配置
uint16_t SCI_Interrupt; // SCI 中断
uint32_t SMI_CommandPort; // SMI 命令端口
uint8_t AcpiEnable; // ACPI 启用
uint8_t AcpiDisable; // ACPI 禁用
uint8_t S4BIOS_REQ; // S4BIOS 请求
uint8_t PSTATE_Control; // PSTATE 控制
uint32_t PM1aEventBlock; // PM1a 事件块地址
uint32_t PM1bEventBlock; // PM1b 事件块地址
uint32_t PM1aControlBlock; // PM1a 控制块地址
uint32_t PM1bControlBlock; // PM1b 控制块地址
uint32_t PM2ControlBlock; // PM2 控制块地址
uint32_t PMTimerBlock; // 定时器块地址
uint32_t GPE0Block; // GPE0 块地址
uint32_t GPE1Block; // GPE1 块地址
uint8_t PM1EventLength; // PM1 事件长度
uint8_t PM1ControlLength; // PM1 控制长度
uint8_t PM2ControlLength; // PM2 控制长度
uint8_t PMTimerLength; // 定时器长度
uint8_t GPE0Length; // GPE0 长度
uint8_t GPE1Length; // GPE1 长度
uint8_t GPE1Base; // GPE1 基址
uint8_t CStateControl; // C 状态控制
uint16_t WorstC2Latency; // 最差的 C2 延迟
uint16_t WorstC3Latency; // 最差的 C3 延迟
uint16_t FlushSize; // 刷新大小
uint16_t FlushStride; // 刷新步进
uint8_t DutyOffset; // 任务偏移
uint8_t DutyWidth; // 任务宽度
uint8_t DayAlarm; // 日闹钟
uint8_t MonthAlarm; // 月闹钟
uint8_t Century; // 世纪

// ACPI 1.0 中保留;自 ACPI 2.0+ 开始使用
uint16_t BootArchitectureFlags; // 启动架构标志

uint8_t Reserved2;
uint32_t Flags; // 标志位

// 12 字节结构;详情请参阅下文
GenericAddressStructure ResetReg; // 复位寄存器

uint8_t ResetValue; // 复位值
uint8_t Reserved3[3];

// 64 位指针 - 在 ACPI 2.0+ 中可用
uint64_t X_FirmwareControl; // 扩展固件控制寄存器地址
uint64_t X_Dsdt; // 扩展 DSDT 表地址

GenericAddressStructure X_PM1aEventBlock; // 扩展 PM1a 事件块地址
GenericAddressStructure X_PM1bEventBlock; // 扩展 PM1b 事件块地址
GenericAddressStructure X_PM1aControlBlock; // 扩展 PM1a 控制块地址
GenericAddressStructure X_PM1bControlBlock; // 扩展 PM1b 控制块地址
GenericAddressStructure X_PM2ControlBlock; // 扩展 PM2 控制块地址
GenericAddressStructure X_PMTimerBlock; // 扩展定时器块地址
GenericAddressStructure X_GPE0Block; // 扩展 GPE0 块地址
GenericAddressStructure X_GPE1Block; // 扩展 GPE1 块地址
};

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: 寄存器的地址

参考


FADT
http://example.com/2024/12/30/FADT/
作者
凌云行者
发布于
2024年12月30日
许可协议