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(通用硬件错误源)。 如果且仅当 Trusted Firmware 在 arm64 上使用时,才有可能进行固件优先的错误处理。

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

HMAT

第 5.2.28 节(signature == “HMAT”)

异构内存属性表

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

HPET

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

高精度事件计时器表

仅 x86 表,将不受支持。

IBFT

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

iSCSI 启动固件表

Microsoft 定义的表,支持 TBD。

IORT

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

输入输出重映射表

仅 arm64 表,为了描述 IO 拓扑、SMMU 和 GIC ITS 以及这些各种组件如何连接在一起(例如,识别哪些组件位于哪些 SMMU/ITS 之后)是必需的。 此表仅在某些 SBSA 平台上是必需的(例如,当使用 GICv3-ITS 和 SMMU 时); 在 SBSA 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 节(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”)

软件许可表

仅 Microsoft 表,将不受支持。

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 模拟设备表

仅 Microsoft 表,将不受支持。

WDAT

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

看门狗操作表

仅 Microsoft 表,将不受支持。

WDRT

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

看门狗资源表

仅 Microsoft 表,将不受支持。

WPBT

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

Windows 平台二进制表

仅 Microsoft 表,将不受支持。

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 描述,则不会认为驱动程序已完成。 获得内核维护人员的批准后,必须将 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=<字符串> 可用于将其设置为其他值。

_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 相对应。

建议将 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