ACPI(Advanced Configuration and Power Interface)作为连接操作系统与硬件的桥梁,在Arm架构中承担着系统配置和电源管理的核心职责。与x86体系不同,Arm平台的ACPI实现有其独特的考量因素和技术细节。
传统Arm系统常采用Device Tree进行硬件描述,但随着服务器市场对标准化需求的增长,ACPI在Arm生态中的地位日益重要。ACPI通过以下机制为Arm平台带来显著优势:
Arm架构扩展了标准ACPI规范,引入专有表格来描述其特有硬件组件:
| 表格名称 | 描述内容 | 对应规范 |
|---|---|---|
| AGDI | 通用诊断转储接口 | DEN0093 1.2 |
| AEST | Arm错误源表 | DEN0085 |
| APMT | CoreSight PMU架构表 | DEN0117 |
| IORT | IO重映射表 | DEN0049E |
这些表格与标准ACPI表(如MADT、GTDT)协同工作,共同构建完整的系统描述。以CMN(Coherent Mesh Network)为例,其配置空间通过PERIPHBASE和ROOTNODEBASE两个关键地址进行映射:
c复制// CMN-600寄存器映射示例
#define PERIPHBASE 0x80000000 // 64MB对齐基址
#define ROOTNODEBASE (PERIPHBASE + 0x1000000) // 根节点偏移
Arm采用特定的_HID编码方案来标识其硬件组件,格式为"ARMH"前缀加4位特征码:
传统组件标识(第5位为数字):
BSA标准组件(第5位为'B'):
CoreLink互连组件(第5位为'C'):
功能特性标识(第5位为'E'):
对于同时支持Device Tree和ACPI的平台,需注意以下转换原则:
中断描述转换:
python复制# Device Tree中断描述
interrupts = <GIC_SPI 168 IRQ_TYPE_EDGE_RISING>;
# 对应ACPI描述
Interrupt(ResourceConsumer, Edge, ActiveHigh, Exclusive) {168}
寄存器空间映射:
c复制// DT reg属性
reg = <0x0 0x80000000 0x0 0x1000>;
// ACPI _CRS描述
QWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
0x0000000000000000, // Granularity
0x0000000080000000, // Minimum
0x0000000080000FFF, // Maximum
0x0000000000000000, // Translation
0x0000000000001000) // Length
DSU作为Armv8.2引入的关键组件,其ACPI描述需体现与CPU拓扑的关联:
层次化描述结构:
code复制Processor Container (Cluster)
├─ DSU Common Elements (_HID=ARMHD501)
├─ DSU PMU (_HID=ARMHD500)
├─ CPU0 (_HID=ACPI0007)
└─ CPU1 (_HID=ACPI0007)
PMU中断配置:
asl复制Device(DSP0) {
Name(_HID, "ARMHD500")
Name(_CRS, ResourceTemplate() {
Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive) {302}
})
}
DSU-110新增特性:
CMN网络的描述是Arm平台ACPI最具挑战性的部分之一,主要涉及:
CMN-600与后续型号存在显著差异:
| 特性 | CMN-600 | CMN-700/650 |
|---|---|---|
| 配置空间基址 | ROOTNODEBASE | PERIPHBASE |
| 节点寻址方式 | 树状层级 | 扁平地址空间 |
| DTC分布 | 集中在HN-D | 可分布在多个HN-T |
CMN网络中的性能监控单元(PMU)分布在DTC(Debug and Trace Controller)中,其中断描述需特别注意:
逻辑ID分配规则:
多DTC配置示例:
asl复制Device(CMN0) {
Name(_HID, "ARMHC700")
Name(_CRS, ResourceTemplate() {
// DTC0中断(逻辑ID 0)
Interrupt(ResourceConsumer, Edge, ActiveHigh, Exclusive) {256}
// DTC1中断(逻辑ID 2)
Interrupt(ResourceConsumer, Edge, ActiveHigh, Exclusive) {257}
})
}
Arm平台中断处理需特别注意:
GSIV分配原则:
混合信号模式示例:
asl复制// AGDI表中同时支持SDEI和GSIV信号
AGDI {
Flags = 0x2 // 位[1:0]=10表示支持两种模式
SDEI_Event = 0x20
GSIV = 288
}
PMU计数器不递增:
中断无法触发:
bash复制# 检查GIC配置
gicd_ispendr <GSIV/32> # 查看pending状态
gicd_isenabler <GSIV/32> # 确认中断使能
ACPI表验证工具:
bash复制# 使用acpica工具集验证
acpidump -b # 获取原始ACPI表
iasl -d DSDT.dat # 反编译DSDT
NUMA拓扑描述:
asl复制Processor(CPU0, 0x00, 0x00000410, 0x06) {
Name(_HID, "ACPI0007")
Name(_LOC, Package() {0, 0}) // 节点0,核心0
}
缓存属性配置:
asl复制QWordMemory(
ResourceProducer,
PosDecode,
MinFixed,
MaxFixed,
NonCacheable, // 关键配置项
ReadWrite,
...
)
电源状态转换延迟优化:
asl复制Name(_LPI, Package() {
0, // 状态0
10, // 进入延迟(us)
20, // 退出延迟(us)
100 // 功耗(mW)
})
提示:在调试复杂CMN网络时,建议先通过仿真器验证PERIPHBASE和ROOTNODEBASE的配置,再着手ACPI表的编写。Arm提供的FVP模型可以完美模拟这些硬件行为。
通过本文详实的配置示例和原理分析,开发者应能掌握Arm平台ACPI实现的核心要点。实际部署时,建议参考Arm提供的ACPI合规性测试套件(ACS)进行验证,确保与各种操作系统的兼容性。