ACPI 表格

以下列表讨论了各个 ACPI 表格的预期。

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

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

  • 必需:DSDT、FADT、GTDT、MADT、MCFG、RSDP、SPCR、XSDT

  • 推荐:BERT、EINJ、ERST、HEST、PCCT、SSDT

  • 可选: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

  • 不支持:AEST、APMT、BOOT、DBGP、DMAR、ETDT、HPET、IVRS、LPIT、MSDM、OEMx、PDTT、PSDT、RAS2、RSDT、SLIC、WAET、WDAT、WDRT、WPBT

表格

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”)

简单 BOOT 标志表格

仅限 Microsoft 表格,将不支持。

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”)

调试端口表格

仅限 Microsoft 表格,将不支持。

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 控制结构

此表格不太可能非常有用。 如果提供此表格,则不会使用全局锁,因为它不是硬件精简配置文件的一部分,并且仅 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”)

高精度事件计时器表格

仅限 x86 表格,将不支持。

IBFT

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

iSCSI 启动固件表格

Microsoft 定义的表格,支持待定。

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”)

Microsoft 数据管理表格

仅限 Microsoft 表格,将不支持。

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 节(签名 == “PMTT”)

平台内存拓扑表

可选,目前不支持。

PPTT

第 5.2.30 节(签名 == “PPTT”)

处理器属性拓扑表

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

PSDT

第 5.2.11.3 节(签名 == “PSDT”)

持久系统描述表

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

RAS2

第 5.2.21 节(签名 == “RAS2”)

RAS 功能 2 表

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

RASF

第 5.2.20 节(签名 == “RASF”)

RAS 功能表

可选,目前不支持。

RSDP

第 5.2.5 节(签名 == “RSD PTR”)

根系统描述指针

arm64 必需。

RSDT

第 5.2.7 节(签名 == “RSDT”)

根系统描述表

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

SBST

第 5.2.14 节(签名 == “SBST”)

智能电池子系统表

可选,目前不支持。

SDEI

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

软件委托异常接口表

此表声明了 SDEI 接口的存在。

SLIC

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

软件许可表

仅限 Microsoft 表格,将不支持。

SLIT

第 5.2.17 节(签名 == “SLIT”)

系统局部性距离信息表

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

SPCR

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

串行端口控制台重定向表

arm64 必需。

SPMI

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

服务器平台管理接口表

可选,目前不支持。

SRAT

第 5.2.16 节(签名 == “SRAT”)

系统资源亲和性表

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

SSDT

第 5.2.11.2 节(签名 == “SSDT”)

辅助系统描述表

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

SSDT 只能添加到 ACPI 命名空间。它不能修改或替换命名空间中已有的设备描述。

这些表是可选的。ACPI 表应仅包含一个 DSDT,但可以包含多个 SSDT。

STAO

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

_STA 覆盖表

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

TCPA

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

可信计算平台联盟表

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

TPM2

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

可信平台模块 2 表

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

UEFI

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

UEFI ACPI 数据表

可选,目前不支持。目前在 arm64 上没有已知的用例。

WAET

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

Windows ACPI 模拟设备表

仅限 Microsoft 表格,将不支持。

WDAT

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

看门狗动作表

仅限 Microsoft 表格,将不支持。

WDRT

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

看门狗资源表

仅限 Microsoft 表格,将不支持。

WPBT

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

Windows 平台二进制表

仅限 Microsoft 表格,将不支持。

XENV

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

Xen 项目表

可选,目前仅由 Xen 使用。

XSDT

第 5.2.8 节(签名 == “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 描述,驱动程序将被认为是不完整的。一旦获得内核维护人员的批准,UUID 或设备属性必须在 UEFI 论坛中注册;这可能会导致一些迭代,因为将有多个操作系统注册条目。

_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 的设备对象;不要在 ASL 中使用已弃用的处理器语句。所有多处理器系统还应定义一个处理器层次结构,使用处理器容器设备完成(请参见第 8.4.3.1 节,_HID ACPI0010);不要使用处理器聚合器设备(第 8.5 节)来描述处理器拓扑。该规范的第 8.4 节描述了这些对象定义的语义以及它们如何相互关联。

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

另请注意,定义的处理器设备对象和 MADT 中 GIC 的条目应同步。设备对象的 _UID 必须与 MADT 中使用的处理器 ID 相对应。

建议将 CPPC (8.4.5) 用作 arm64 架构上处理器性能控制的主要模型。C 状态和 P 状态将来可能会可用,但目前大多数设计工作似乎倾向于 CPPC。

此外,ARMv8 SoC 必须提供功能完整的 PSCI 实现;这将是 ACPI 支持的唯一控制 CPU 电源状态的机制。可以使用 ACPI 停车协议启动辅助 CPU,但不建议这样做,因为只有 PSCI 支持 ARM 服务器。

ACPI 系统地址映射接口

在 ACPI 规范的第 15 节中,提到了几种方法作为向内核传递内存资源信息的可能机制。对于 arm64,我们仅支持使用 ACPI 启动的 UEFI,因此 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