ACPI 表

接下来的列表中讨论了对各个 ACPI 表的期望。

如果使用了节号,则它指的是定义该对象的 ACPI 规范中的节号。如果使用了“签名保留”(Signature Reserved),则表签名(表的前四个字节)是该表中唯一被规范识别的部分,而实际的表是在 UEFI 论坛之外定义的(参见规范的第 5.2.6 节)。

对于 arm64 上的 ACPI,表还分为以下几类

  • 必需的(Required):DSDT, FADT, GTDT, MADT, MCFG, RSDP, SPCR, XSDT

  • 建议的(Recommended):BERT, EINJ, ERST, HEST, PCCT, SSDT

  • 可选的(Optional):AGDI, BGRT, CEDT, CPEP, CSRT, DBG2, DRTM, ECDT, FACS, FPDT, HMAT, IBFT, IORT, MCHI, MPAM, MPST, MSCT, NFIT, PMTT, PPTT, RASF, SBST, SDEI, SLIT, SPMI, SRAT, STAO, TCPA, TPM2, UEFI, XENV

  • 不支持的(Not supported):AEST, APMT, BOOT, DBGP, DMAR, ETDT, HPET, IVRS, LPIT, MSDM, OEMx, PDTT, PSDT, RAS2, RSDT, SLIC, WAET, WDAT, WDRT, WPBT

表 (Table)

ARMv8 Linux 的用法

AEST

签名保留 (signature == “AEST”)

Arm 错误源表

此表向操作系统通知系统中任何符合 Arm RAS 架构的错误节点。

AGDI

签名保留 (signature == “AGDI”)

Arm 通用诊断转储和重置设备接口表

此表描述了一个不可屏蔽事件,平台固件使用该事件来请求操作系统生成诊断转储并重置设备。

APMT

签名保留 (signature == “APMT”)

Arm 性能监视表

此表描述了系统中组件实现的 PMU 支持的属性。

BERT

第 18.3 节 (signature == “BERT”)

引导错误记录表

如果平台提供 RAS 支持,则必须提供此表。建议提供此表。

BOOT

签名保留 (signature == “BOOT”)

简单引导标志表

微软专有表,将不被支持。

BGRT

第 5.2.22 节 (signature == “BGRT”)

引导图形资源表

可选,当前不支持,对于 ARM 服务器没有实际的使用场景。

CEDT

签名保留 (signature == “CEDT”)

CXL 早期发现表

此表允许操作系统发现任何 CXL 主桥及主桥寄存器。

CPEP

第 5.2.18 节 (signature == “CPEP”)

已纠正平台错误轮询表

可选,当前不支持,并且在 ARM 兼容硬件可用且规范做适当修改之前不建议使用。

CSRT

签名保留 (signature == “CSRT”)

核心系统资源表

可选,当前不支持。

DBG2

签名保留 (signature == “DBG2”)

调试端口表 2

许可证已更改,应当可以使用。如果在命令行中用作替代 earlycon=<device>,则为可选。

DBGP

签名保留 (signature == “DBGP”)

调试端口表

微软专有表,将不被支持。

DSDT

第 5.2.11.1 节 (signature == “DSDT”)

差分系统描述表

需要 DSDT;另请参见 SSDT。

ACPI 表只能包含一个 DSDT,但可以包含一个或多个可选的 SSDT。每个 SSDT 只能向 ACPI 命名空间添加内容,而不能修改或替换 DSDT 中的任何内容。

DMAR

签名保留 (signature == “DMAR”)

DMA 重映射表

x86 专用表,将不被支持。

DRTM

签名保留 (signature == “DRTM”)

动态度量信任根表

可选,当前不支持。

ECDT

第 5.2.16 节 (signature == “ECDT”)

嵌入式控制器描述表

可选,当前不支持,但当且仅当使用 GPE_BIT 字段来表示 IRQ 号时,可以在 ARM 上使用,因为在硬件精简模式下未定义 GPE 块。这需要在 ACPI 规范中进行修改。

EINJ

第 18.6 节 (signature == “EINJ”)

错误注入表

该表对于测试平台对错误条件的响应非常有用;它允许向系统注入错误,就好像该错误实际发生了一样。但是,此表不应随生产系统一起发布;它应仅在测试期间使用 ACPICA 工具动态加载和执行。

ERST

第 18.5 节 (signature == “ERST”)

错误记录序列化表

在支持 RAS 的平台上,如果不是基于 UEFI 的,则必须提供此表;如果是基于 UEFI 的,则可以提供此表。当此表不存在时,将利用 UEFI 运行时服务将硬件错误信息保存到持久存储中并从中检索。

ETDT

签名保留 (signature == “ETDT”)

事件定时器描述表

已过时的表,将不被支持。

FACS

第 5.2.10 节 (signature == “FACS”)

固件 ACPI 控制结构

此表不太会有太大用处。如果提供了该表,将**不会**使用全局锁(Global Lock),因为它不属于硬件精简配置文件的一部分,并且只有 64 位地址字段会被认为是有效的。

FADT

第 5.2.9 节 (signature == “FACP”)

固定 ACPI 描述表 arm64 必需。

必须设置 HW_REDUCED_ACPI 标志。当设置了 HW_REDUCED_ACPI 时应被忽略的所有字段预期都应设置为零。

如果提供了 FACS 表,则应使用 X_FIRMWARE_CTRL 字段,而不是 FIRMWARE_CTRL。

如果使用了 PSCI(建议使用),请确保正确填写 ARM_BOOT_ARCH —— 设置了 PSCI_COMPLIANT 标志,并且根据需要设置或取消设置 PSCI_USE_HVC(参见表 5-37)。

对于同样必需的 DSDT,应使用 X_DSDT 字段,而不是 DSDT 字段。

FPDT

第 5.2.23 节 (signature == “FPDT”)

固件性能数据表

可选,对于引导性能分析很有用。

GTDT

第 5.2.24 节 (signature == “GTDT”)

通用定时器描述表

arm64 必需。

HEST

第 18.3.2 节 (signature == “HEST”)

硬件错误源表

已定义 ARM 专用的错误源;请使用这些源、PCI 类型(如类型 6 (AER 根端口)、7 (AER 端点) 或 8 (AER 网桥))或使用类型 9 (通用硬件错误源)。当且仅当在 arm64 上使用可信固件时,才可能实现固件优先错误处理。

如果平台提供 RAS 支持,则必须提供此表。建议提供此表。

HMAT

第 5.2.28 节 (signature == “HMAT”)

异构内存属性表

此表描述了与内存邻近域相关的内存属性,例如内存端缓存属性、带宽和延迟详情。操作系统使用此信息来优化系统内存配置。

HPET

签名保留 (signature == “HPET”)

高 Precision 事件定时器表 (High Precision Event timer Table)

x86 专用表,将不被支持。

IBFT

签名保留 (signature == “IBFT”)

iSCSI 引导固件表

微软定义的表,支持情况待定。

IORT

签名保留 (signature == “IORT”)

输入输出重映射表

arm64 专用表,为了描述 IO 拓扑、SMMU 和 GIC ITS,以及这些各种组件如何连接在一起(例如识别哪些组件位于哪些 SMMU/ITS 之后),该表是必需的。此表仅在某些 SBSA 平台上是必需的(例如,当使用 GICv3-ITS 和 SMMU 时);在 SBSA Level 0 平台上,它依然是可选的。

IVRS

签名保留 (signature == “IVRS”)

I/O 虚拟化报告结构

x86_64 (AMD) 专用表,将不被支持。

LPIT

签名保留 (signature == “LPIT”)

低功耗空闲表

截至 ACPI 5.1,这仍是 x86 专用表;从 ACPI 6.0 开始,ARM 平台上的处理器描述和电源状态应使用 DSDT 并定义处理器容器设备(_HID ACPI0010,第 8.4 节,更具体地说是 8.4.3 和 8.4.4 节)。

MADT

第 5.2.12 节 (signature == “APIC”)

多 APIC 描述表

arm64 必需。只能使用 GIC 中断控制器结构(类型 0xA - 0xF)。

MCFG

签名保留 (signature == “MCFG”)

内存映射配置空间

如果平台支持 PCI/PCIe,则需要 MCFG 表。

MCHI

签名保留 (signature == “MCHI”)

管理控制器主机接口表

可选,当前不支持。

MPAM

签名保留 (signature == “MPAM”)

内存分区和监控表

此表允许操作系统发现子系统实现的 MPAM 控制。

MPST

第 5.2.21 节 (signature == “MPST”)

内存电源状态表

可选,当前不支持。

MSCT

第 5.2.19 节 (signature == “MSCT”)

最大系统特征表

可选,当前不支持。

MSDM

签名保留 (signature == “MSDM”)

微软数据管理表

微软专有表,将不被支持。

NFIT

第 5.2.25 节 (signature == “NFIT”)

NVDIMM 固件接口表

可选,当前不支持。

OEMx

仅 “OEMx” 签名

OEM 专用表

所有以“OEM”签名开头的表都保留供 OEM 使用。由于这些表不用于通用目的,而是限于非常特定的最终用户,因此不建议使用它们,并且 arm64 内核不支持它们。

PCCT

第 14.1 节 (signature == “PCCT”)

平台通信通道表

建议在 arm64 上使用;当使用 CPPC 控制平台处理器的性能和功耗时,建议使用 PCC。

PDTT

第 5.2.29 节 (signature == “PDTT”)

平台调试触发表

此表描述用于收集非架构特性调试日志的 PCC 通道。

PMTT

第 5.2.21.12 节 (signature == “PMTT”)

平台内存拓扑表

可选,当前不支持。

PPTT

第 5.2.30 节 (signature == “PPTT”)

处理器属性拓扑表

此表提供处理器和缓存拓扑。

PSDT

第 5.2.11.3 节 (signature == “PSDT”)

持久系统描述表

已过时的表,将不被支持。

RAS2

第 5.2.21 节 (signature == “RAS2”)

RAS 特性 2 表

此表为平台中实现的 RAS 功能提供接口。

RASF

第 5.2.20 节 (signature == “RASF”)

RAS 特性表

可选,当前不支持。

RSDP

第 5.2.5 节 (signature == “RSD PTR”)

根系统描述指针

arm64 必需。

RSDT

第 5.2.7 节 (signature == “RSDT”)

根系统描述表

由于此表只能提供 32 位地址,因此它在 arm64 上已被弃用,并且不会被使用。如果提供,它将被忽略。

SBST

第 5.2.14 节 (signature == “SBST”)

智能电池子系统表

可选,当前不支持。

SDEI

签名保留 (signature == “SDEI”)

软件委派异常接口表

此表公布了 SDEI 接口的存在。

SLIC

签名保留 (signature == “SLIC”)

软件许可表

微软专有表,将不被支持。

SLIT

第 5.2.17 节 (signature == “SLIT”)

系统局部性距离信息表

通常为可选,但对于 NUMA 系统是必需的。

SPCR

签名保留 (signature == “SPCR”)

串口控制台重定向表

arm64 必需。

SPMI

签名保留 (signature == “SPMI”)

服务器平台管理接口表

可选,当前不支持。

SRAT

第 5.2.16 节 (signature == “SRAT”)

系统资源亲和性表

可选,但如果使用,则仅读取 GICC 亲和性结构。为了支持 arm64 NUMA,必须提供此表。

SSDT

第 5.2.11.2 节 (signature == “SSDT”)

辅助系统描述表

这些表是 DSDT 的延续;建议将它们用于可以添加到运行中的系统的设备,也可以用于将设备描述划分为更容易管理的小块。

SSDT 只能向 ACPI 命名空间**添加**内容。它不能修改或替换命名空间中已存在的设备描述。

然而,这些表是可选的。ACPI 表只能包含一个 DSDT,但可以包含许多 SSDT。

STAO

签名保留 (signature == “STAO”)

_STA 覆盖表

可选,但仅在虚拟化环境中为了对客户机操作系统隐藏设备时才是必要的。

TCPA

签名保留 (signature == “TCPA”)

可信计算平台联盟表

可选,当前不支持,并且可能需要修改才能与 arm64 完全互操作。

TPM2

签名保留 (signature == “TPM2”)

可信平台模块 2 表

可选,当前不支持,并且可能需要修改才能与 arm64 完全互操作。

UEFI

签名保留 (signature == “UEFI”)

UEFI ACPI 数据表

可选,当前不支持。目前对于 arm64 尚无已知的使用场景。

WAET

签名保留 (signature == “WAET”)

Windows ACPI 仿真设备表

微软专有表,将不被支持。

WDAT

签名保留 (signature == “WDAT”)

看门狗动作表

微软专有表,将不被支持。

WDRT

签名保留 (signature == “WDRT”)

看门狗资源表

微软专有表,将不被支持。

WPBT

签名保留 (signature == “WPBT”)

Windows 平台二进制表

微软专有表,将不被支持。

XENV

签名保留 (signature == “XENV”)

Xen 项目表

可选,目前仅由 Xen 使用。

XSDT

第 5.2.8 节 (signature == “XSDT”)

扩展系统描述表

arm64 必需。

ACPI 对象

接下来的列表中展示了对可能使用的各个 ACPI 对象的期望;对于下面未明确提及的任何对象,应根据特定平台或特定子系统(例如电源管理或 PCI)的需要进行使用。

名称

ARMv8 Linux 的用法

_CCA

6.2.17

必须为 arm64 上的所有总线主设备定义此方法 —— 对于此类设备是否具有缓存一致性,没有任何默认假设。_CCA 值由这些设备的所有后代继承,因此不需要重复定义。在 arm64 上如果没有 _CCA,内核将不知道如何为该设备设置 DMA。

注意:此方法提供默认的缓存一致性属性;然而,SMMU 的存在可用于修改这一点。例如,主设备默认可以是非一致的,但通过适当的 SMMU 配置可以使其变为一致的(参见 IORT 规范表 17,ARM 文档 DEN 0049B)。

_CID

6.1.2

按需使用,另请参见 _HID。

_CLS

6.1.3

按需使用,另请参见 _HID。

_CPC

8.4.7.1

按需使用,电源管理专用。在 arm64 上建议使用 CPPC。

_CRS

6.2.2

arm64 必需。

_CSD

8.4.2.2

按需使用,仅与 _CST 结合使用。

_CST

8.4.2.1

建议使用低功耗空闲状态 (8.4.4) 而不是 C 状态。

_DDN

6.1.4

此字段可用于设备名称。但是,它是针对 DOS 设备名称(例如 COM1)设计的,因此在跨操作系统使用时要小心。

_DSD

6.2.5

需谨慎使用。如果使用此对象,请尽量在设备属性 UUID 已定义的约束范围内使用。只有在极少数情况下才需要创建新的 _DSD UUID。

无论哪种情况,请提交 _DSD 定义以及任何驱动程序补丁以供讨论,特别是当使用设备属性时。如果没有相应的 _DSD 描述,驱动程序将不被认为是完整的。一旦得到内核维护者的批准,必须向 UEFI 论坛注册 UUID 或设备属性;由于可能会有不止一个操作系统注册条目,这可能会引发一些反复修改。

_DSM

9.1.1

请勿使用此方法。它未经标准化,返回值文档记录不佳,并且目前是常见的错误来源。

_GL

5.7.1

此对象不能在硬件精简模式下使用,因此不应在 arm64 上使用。

_GLK

6.5.7

此对象要求定义全局锁;arm64 上没有全局锁,因为它在硬件精简模式下运行。因此,请勿在 arm64 上使用此对象。

_GPE

5.3.1

此命名空间仅供 x86 使用。请勿在 arm64 上使用它。

_HID

6.1.5

这是设备探测中使用的主要对象,尽管也可以使用 _CID 和 _CLS。

_INI

6.5.1

并非必需,但当 UEFI 将设备留在一个可能并非驱动程序开始探测前所期望的状态时,它在设置设备时会很有用。

_LPI

8.4.4.3

建议在 arm64 上与处理器定义(_HID ACPI0010)一起使用。另请参见 _RDI。

_MLS

6.1.7

强烈建议用于国际化。

_OFF

7.2.2

建议为任何可以开启或关闭的设备定义此方法。

_ON

7.2.3

建议为任何可以开启或关闭的设备定义此方法。

_OS

5.7.3

此方法默认返回“Linux”(这是 Linux 上宏 ACPI_OS_NAME 的值)。可以使用命令行参数 acpi_os=<string> 将其设置为其他值。

_OSC

6.2.11

此方法可以是 ACPI 中的全局方法(即 _SB._OSC),也可以与特定设备关联(例如 _SB.DEV0._OSC),或者两者兼有。当用作全局方法时,仅允许使用 ACPI 规范中发布的功能。当用作设备特定方法时,必须使用为使用 _DSD 描述的过程来创建 _OSC 定义;不允许在进程外使用 _OSC。也就是说,将设备特定的 _OSC 用法描述作为内核驱动程序提交的一部分进行提交,获得内核社区的批准,然后将其注册到 UEFI 论坛。

_OSI

5.7.2

在 ARM64 上已弃用。就 ACPI 固件而言,不得使用 _OSI 来确定正在使用何种系统或提供了什么功能。应改用 _OSC 方法。

_PDC

8.4.1

已弃用,请勿在 arm64 上使用。

_PIC

5.8.1

不应使用此方法。在 arm64 上,唯一可用的中断模型是 GIC。

_PR

5.3.1

此命名空间仅供传统系统上的 x86 使用。请勿在 arm64 上使用它。

_PRT

6.2.13

作为所有 PCI 根设备定义的一部分是必需的。

_PRx

7.3.8-11

按需使用;电源管理专用。如果定义了 _PR0,则必须同时定义 _PR3。

_PSx

7.3.2-5

按需使用;电源管理专用。如果定义了 _PS0,则必须同时定义 _PS3。如果需要调整时钟或稳压器以与功耗保持一致,请在这些方法中进行更改。

_RDI

8.4.4.4

建议在 arm64 上与处理器定义(_HID ACPI0010)一起使用。这只能与 _LPI 结合使用。

_REV

5.7.4

始终返回支持的最新 ACPI 版本。

_SB

5.3.1

arm64 必需;所有设备都必须在此命名空间中定义。

_SLI

6.2.15

当使用 SLIT 表时,建议使用此项。

_STA

6.3.7, 7.2.4

建议为任何可以开启或关闭的设备定义此方法。另请参见提供覆盖以在虚拟化环境中隐藏设备的 STAO 表。

_SRS

6.2.16

按需使用;另请参见 _PRS。

_STR

6.1.10

建议用于向最终用户传达设备名称;这比使用 _DDN 更好。

_SUB

6.1.9

按需使用;更倾向于使用 _HID 或 _CID。

_SUN

6.1.11

按需使用,但推荐使用。

_SWS

7.4.3

按需使用;电源管理专用;在 arm64 上使用可能需要修改规范。

_UID

6.1.12

建议用于区分同类设备;如果完全可能,请定义它。

ACPI 事件模型

请勿使用 GPE 块设备;arm64 使用的硬件精简配置文件不支持这些设备。由于没有为 ARM 平台定义可用的 GPE 块,因此必须通过不同的方式发出 ACPI 事件信号。

有两个选项:GPIO 信令中断(第 5.6.5 节)和中断信令事件(第 5.6.9 节)。中断信令事件是 ACPI 6.1 规范中的一项新功能。在给定平台上可以使用其中一个或两个,具体使用哪个可能取决于特定 SoC 中的限制。如果可能,建议使用中断信令事件。

ACPI 处理器控制

ACPI 规范的第 8 节在 6.0 版本中发生了重大变化。现在应将处理器定义为带有 _HID ACPI0007 的 Device 对象;请勿在 ASL 中使用已弃用的 Processor 语句。所有多处理器系统还应定义处理器层次结构,这通过处理器容器设备(参见第 8.4.3.1 节,_HID ACPI0010)来实现;请勿使用处理器聚合器设备(第 8.5 节)来描述处理器拓扑。规范的第 8.4 节描述了这些对象定义的语义及其相互关系。

最重要的是,定义的处理器层次结构还定义了平台可用的低功耗空闲状态,以及确定哪些处理器可以开启或关闭的规则及控制这些规则的环境。如果没有此信息,处理器将以 UEFI 留下的任何电源状态运行。

还要注意,定义的处理器 Device 对象与 MADT 中关于 GIC 的条目预期应保持同步。Device 对象的 _UID 必须与 MADT 中使用的处理器 ID 相对应。

建议在 arm64 上使用 CPPC (8.4.5) 作为处理器性能控制的主要模型。C 状态和 P 状态在未来某个时候可能会可用,但当前的大多数设计工作似乎更倾向于 CPPC。

此外,ARMv8 SoC 提供功能完备的 PSCI 实现至关重要;这将是 ACPI 支持的用于控制 CPU 电源状态的唯一机制。使用 ACPI 停车协议引导辅助 CPU 是可能的,但不鼓励这样做,因为 ARM 服务器只支持 PSCI。

ACPI 系统地址映射接口

在 ACPI 规范的第 15 节中,提到了几种方法作为向内核传递内存资源信息的可能机制。对于 arm64,我们仅支持通过 UEFI 使用 ACPI 引导,因此 UEFI GetMemoryMap() 引导服务将是唯一使用的机制。

ACPI 平台错误接口 (APEI)

支持的 APEI 表如上所述。

APEI 要求在 ARMv8 上具备 SCI 和 NMI 的等效项。SCI 用于通知 OSPM 已发生错误但可以纠正且系统可以继续正常运行(即使可能性能下降)。NMI 用于指示无法纠正且需要立即处理的致命错误。

由于没有 x86 SCI 或 NMI 的直接等效项,arm64 对这些的处理略有不同。SCI 作为高优先级中断处理;鉴于报告的是已纠正(或可纠正)的错误,这就足够了。NMI 被模拟为可能具有的最高优先级中断。这意味着必须谨慎使用,因为可能存在处于更高特权级别甚至与模拟 NMI 具有相同优先级的中断。在 Linux 中,通常不应该出现这种情况,但应该意识到它可能会发生。

ARM64 上不支持的 ACPI 对象

虽然这在未来可能会改变,但有几类对象虽然可以定义,但目前对 ARM 服务器来说并不普遍需要。其中一些对象具有 x86 等效项,并且在 ARM 服务器中实际上可能是有意义的。然而,目前要么没有可用的硬件,要么甚至还没有非 ARM 的实现。因此,目前不支持它们。

不支持以下类别的对象

  • 第 9.2 节:环境光传感器设备

  • 第 9.3 节:电池设备

  • 第 9.4 节:机盖(例如笔记本电脑机盖)

  • 第 9.8.2 节:IDE 控制器

  • 第 9.9 节:软盘控制器

  • 第 9.10 节:GPE 块设备

  • 第 9.15 节:PC/AT RTC/CMOS 设备

  • 第 9.16 节:用户存在检测设备

  • 第 9.17 节:I/O APIC 设备;所有 GIC 必须可通过 MADT 枚举

  • 第 9.18 节:时间和闹钟设备(参见 9.15)

  • 第 10 节:电源和功率计设备

  • 第 11 节:热管理

  • 第 12 节:嵌入式控制器接口

  • 第 13 节:SMBus 接口

这也意味着不支持以下对象

名称

名称

_ALC

9.3.4

_FDM

9.10.3

_ALI

9.3.2

_FIX

6.2.7

_ALP

9.3.6

_GAI

10.4.5

_ALR

9.3.5

_GHL

10.4.7

_ALT

9.3.3

_GTM

9.9.2.1.1

_BCT

10.2.2.10

_LID

9.5.1

_BDN

6.5.3

_PAI

10.4.4

_BIF

10.2.2.1

_PCL

10.3.2

_BIX

10.2.2.1

_PIF

10.3.3

_BLT

9.2.3

_PMC

10.4.1

_BMA

10.2.2.4

_PMD

10.4.8

_BMC

10.2.2.12

_PMM

10.4.3

_BMD

10.2.2.11

_PRL

10.3.4

_BMS

10.2.2.5

_PSR

10.3.1

_BST

10.2.2.6

_PTP

10.4.2

_BTH

10.2.2.7

_SBS

10.1.3

_BTM

10.2.2.9

_SHL

10.4.6

_BTP

10.2.2.8

_STM

9.9.2.1.1

_DCK

6.5.2

_UPD

9.16.1

_EC

12.12

_UPP

9.16.2

_FDE

9.10.1

_WPC

10.5.2

_FDI

9.10.2

_WPP

10.5.3