4.8.4. 固定硬件寄存器
固定硬件寄存器由 OSPM 直接操作。以下各节在编程模型下描述固定硬件特性。OSPM 拥有所有固定硬件资源寄存器;这些寄存器不能由 AML 代码操作。寄存器可以以不超过其寄存器宽度的任意宽度访问(字节粒度)。
4.8.4.1. PM1 事件分组
PM1 事件分组具有一组位,这些位可以分布在两个不同的寄存器块之间。这使得这些寄存器可以在两个芯片之间分区,或者全部放置在单个芯片中。尽管这些位可以在两个寄存器块之间拆分(每个寄存器块在 FADT 中都有唯一指针),但位位置保持不变。包含未实现位的寄存器块(即那些在另一个寄存器块中实现的位)始终返回零,并且写入不会产生副作用。
4.8.4.1.1. PM1 状态寄存器
寄存器位置:<PM1a_EVT_BLK / PM1b_EVT_BLK> 系统 I/O 或内存空间
默认值:00h
属性:读/写
大小:PM1_EVT_LEN / 2
PM1 状态寄存器包含固定硬件特性状态位。这些位可以分布在两个寄存器之间:PM1a_STS 或 PM1b_STS。每个寄存器组可以位于不同的 32 位对齐地址,并由 PM1a_EVT_BLK 或 PM1b_EVT_BLK 指向。指向这些寄存器空间的指针值可在 FADT 中找到。对 PM1 状态寄存器的访问通过字节或字访问完成。
对于 ACPI/传统系统,当从传统状态转换到 G0 工作状态时,平台固件会在设置 SCI_EN 位(从而将控制权交给 OSPM)之前清除此寄存器。对于仅 ACPI 平台(其中 SCI_EN 始终置位),当从机械断电(G3)或软关机状态转换到 G0 工作状态时,在进入 G0 工作状态之前会清除此寄存器。
此寄存器包含在 FADT 中启用或禁用的可选特性。如果 FADT 指示该特性不作为固定硬件特性支持,则软件将这些位视为忽略。
表 4.11 PM1 状态寄存器固定硬件特性状态位
| 位 | 名称 | 描述 |
|---|---|---|
| 0 | TMR_STS | 这是定时器进位状态位。每当 24/32 位计数器的最高有效位从清零变为置位,或从置位变为清零时,此位都会被置位。当 TMR_EN 和 TMR_STS 置位时,会触发一个中断事件。 |
| 1-3 | 保留 | 保留 |
| 4 | BM_STS | 这是总线主控状态位。每当系统总线主控请求系统总线时,此位都会被置位,并且只能通过向该位位置写入“1”来清除。请注意,此位反映的是总线主控活动,而不是 CPU 活动(此位监视任何在总线主控执行内存事务时,可能导致处于 C3 状态的处理器缓存不一致的总线主控)。 |
| 5 | GBL_STS | 当由于平台运行时固件希望 SCI 处理程序注意而生成 SCI 时,此位会被置位。平台运行时固件将具有一个控制位(位于其地址空间中的某处),该控制位会触发 SCI 并设置此位。当平台运行时固件释放 Global Lock 的所有权并看到挂起位已置位时,会相应地设置此位。 |
| 6-7 | 保留 | 保留。这些位始终返回零值。 |
| 8 | PWRBTN_STS | 当按下电源按钮时,此可选位会被置位。在系统工作状态下,当 PWRBTN_EN 和 PWRBTN_STS 都置位时,会触发一个中断事件。在睡眠或软关机状态下,当按下电源按钮时会生成一个唤醒事件(无论 PWRBTN_EN 位如何设置)。此位仅由硬件置位,并且只能由软件向该位位置写入“1”来复位。ACPI 定义了一种可选机制,称为电源按钮覆盖,用于将已停止响应的系统从 G0 工作状态无条件转换到 G2 软关机状态。如果电源按钮保持激活超过四秒,则此位由硬件清除,系统无条件转换到 G2/S5 软关机状态。对电源按钮的支持由 FADT 中的 PWR_BUTTON 标志被清零(复位)来指示。如果 PWR_BUTTON 标志被置位,或者 ACPI 命名空间中存在电源按钮设备对象,则 OSPM 将忽略该位字段。如果电源按钮是唤醒原因(来自 S1-S4 状态),则在将控制权返回给 OSPM 之前会设置此位。 |
| 9 | SLPBTN_STS | 当按下睡眠按钮时,此可选位会被置位。在系统工作状态下,当 SLPBTN_EN 和 SLPBTN_STS 都置位时,会触发一个中断事件。在睡眠或软关机状态下,当按下睡眠按钮且 SLPBTN_EN 位被置位时,会生成一个唤醒事件。此位仅由硬件置位,并且只能由软件向该位位置写入“1”来复位。对睡眠按钮的支持由 FADT 中的 SLP_BUTTON 标志被清零(复位)来指示。如果 SLP_BUTTON 标志被置位,或者 ACPI 命名空间中存在睡眠按钮设备对象,则 OSPM 将忽略该位字段。如果睡眠按钮是唤醒原因(来自 S1-S4 状态),则在将控制权返回给 OSPM 之前会设置此位。 |
| 10 | RTC_STS | 当 RTC 生成报警(断言 RTC IRQ 信号)时,此可选位会被置位。此外,如果 RTC_EN 位被置位,那么 RTC_STS 位的设置将生成一个电源管理事件(SCI、SMI 或恢复事件)。此位仅由硬件置位,并且只能由软件向该位位置写入“1”来复位。如果 RTC 是唤醒原因(来自 S1-S3 状态),则在将控制权返回给 OSPM 之前会设置此位。如果 FADT 中的 RTC_S4 标志被置位,并且 RTC 是从 S4 状态唤醒的原因,则在将控制权返回给 OSPM 之前会设置此位。 |
| 11 | 忽略 | 软件忽略该位字段。 |
| 12-14 | 保留 | 保留。这些位始终返回零值。 |
| 14 | PCIEXP_WAKE_STS | 对于实现 PCI Express 的芯片组,此位是可选的。此位由硬件置位,以指示系统由于 PCI Express 唤醒事件而被唤醒。PCI Express 唤醒事件定义为 PCI Express WAKE# 引脚处于激活状态、一个或多个 PCI Express 端口处于信标状态,或者根端口接收到 PCI Express PME 消息。仅当这些事件之一导致系统从非 S0 系统电源状态转换到 S0 系统电源状态时,才应设置此位。此位的设置独立于 PCIEXP_WAKE_DIS 位的状态。软件写入 1 以清除此位。如果在写入期间 WAKE# 引脚仍然处于激活状态、一个或多个 PCI Express 端口处于信标状态,或者根端口中的 PME 消息接收指示尚未清除,则该位将保持激活(即此位的所有输入都是电平敏感的)。注意:此位本身不会导致唤醒事件,也不会阻止进入睡眠状态。因此,如果该位为 1 且系统进入睡眠状态,系统不会自动唤醒。 |
| 15 | WAK_STS | 当系统处于睡眠状态并发生已启用的唤醒事件时,此位会被置位。设置此位后,系统将转换到工作状态。此位由硬件置位,并且只能由软件向该位位置写入“1”来清除。 |
4.8.4.1.2. PM1 使能寄存器
寄存器位置:<<PM1a_EVT_BLK / PM1b_EVT_BLK> + PM1_EVT_LEN / 2 系统 I/O 或内存空间
默认值:00h
属性:读/写
大小:PM1_EVT_LEN / 2
PM1 使能寄存器包含固定硬件特性使能位。这些位可以分布在两个寄存器之间:PM1a_EN 或 PM1b_EN。每个寄存器组可以位于不同的 32 位对齐地址,并由 PM1a_EVT_BLK 或 PM1b_EVT_BLK 指向。指向这些寄存器空间的指针值可在 FADT 中找到。对 PM1 使能寄存器的访问通过字节或字访问完成。
对于 ACPI/传统系统,当从传统状态转换到 G0 工作状态时,平台固件会在设置 SCI_EN 位(从而将控制权交给 OSPM)之前清除这些使能位。对于仅 ACPI 平台(其中 SCI_EN 始终置位),当从机械断电(G3)或软关机状态转换到 G0 工作状态时,在进入 G0 工作状态之前会清除此寄存器。
此寄存器包含在 FADT 中启用或禁用的可选特性。如果 FADT 指示该特性不作为固定硬件特性支持,则软件将这些使能位视为写入即为零。
表 4.12 PM1 使能寄存器固定硬件特性使能位
| 位 | 名称 | 描述 |
|---|---|---|
| 0 | TMR_EN | 这是定时器进位中断使能位。当此位置位时,每当 TMR_STS 位被置位,就会生成一个 SCI 事件。当此位复位时,TMR_STS 位被置位时不会生成中断。 |
| 1-4 | 保留 | 保留。这些位始终返回零值。 |
| 5 | GBL_EN | 全局使能位。当 GBL_EN 位和 GBL_STS 位都置位时,会触发 SCI。 |
| 6-7 | 保留 | 保留 |
| 8 | PWRBTN_EN | 此可选位用于使 PWRBTN_STS 位的设置能够生成电源管理事件(SCI 或唤醒)。每当电源按钮被断言时,PWRBTN_STS 位都会被置位。无需设置该使能位,也可以通过电源按钮的断言使 PWRBTN_STS 位被置位(参见电源按钮硬件的说明)。对电源按钮的支持由 FADT 中的 PWR_BUTTON 标志被清零(复位)来指示。如果 PWR_BUTTON 标志被置位,或者 ACPI 命名空间中存在电源按钮设备对象,则 OSPM 将忽略该位字段。 |
| 9 | SLPBTN_EN | 此可选位用于使 SLPBTN_STS 位的设置能够生成电源管理事件(SCI 或唤醒)。每当睡眠按钮被断言时,SLPBTN_STS 位都会被置位。无需设置该使能位,也可以通过睡眠按钮的断言使 SLPBTN_STS 位被置位(参见睡眠按钮硬件的说明)。对睡眠按钮的支持由 FADT 中的 SLP_BUTTON 标志被清零(复位)来指示。如果 SLP_BUTTON 标志被置位,或者 ACPI 命名空间中存在睡眠按钮设备对象,则 OSPM 将忽略该位字段。 |
| 10 | RTC_EN | 此可选位用于使 RTC_STS 位的设置能够生成唤醒事件。每当 RTC 生成报警时,RTC_STS 位都会被置位。 |
| 11-13 | 保留 | 保留。这些位始终返回零值。 |
| 14 | PCIEXP_WAKE_DIS | 对于实现 PCI Express 的芯片组,此位是可选的。此位会禁止 PM1 状态寄存器中 PCIEXP_WAKE_STS 位的输入唤醒系统。修改此位不会影响 PCIEXP_WAKE_STS 位的值。 |
| 15 | 保留 | 保留。这些位始终返回零值。 |
4.8.4.2. PM1 控制分组
PM1 控制分组具有一组位,这些位可以分布在两个不同的寄存器之间。这使得这些寄存器可以在两个芯片之间分区,或者全部放置在单个芯片中。尽管这些位可以在两个寄存器块之间拆分(每个寄存器块在 FADT 中都有唯一指针),但此处规定的位位置保持不变。包含未实现位的寄存器块(即那些在另一个寄存器块中实现的位)返回零,并且写入不会产生副作用。
4.8.4.2.1. PM1 控制寄存器
寄存器位置:<PM1a_CNT_BLK / PM1b_CNT_BLK> 系统 I/O 或内存空间
默认值:00h
属性:读/写
大小:PM1_CNT_LEN
PM1 控制寄存器包含固定硬件特性控制位。这些位可以分布在两个寄存器中:PM1a_CNT 或 PM1b_CNT。每组寄存器可以位于不同的 32 位对齐地址,并由 PM1a_CNT_BLK 或 PM1b_CNT_BLK 指向。这些指向寄存器空间的指针值可在 FADT 中找到。对 PM1 控制寄存器的访问通过字节和字访问进行。
此寄存器包含在 FADT 中启用或禁用的可选特性。如果 FADT 指示该特性不作为固定硬件特性受支持,则软件将这些位视为忽略。
表 4.13 PM1 控制寄存器固定硬件特性控制位
| 位 | 名称 | 描述 |
|---|---|---|
| 0 | SCI_EN | 为以下事件选择电源管理事件是作为 SCI 还是 SMI 中断。当该位置位时,电源管理事件将产生 SCI 中断。当该位复位时,电源管理事件将产生 SMI 中断。设置或复位该位是硬件的责任。OSPM 总是保留该位位置。 |
| 1 | BM_RLD | 置位时,该位允许总线主设备请求的产生使任何处于 C3 状态的处理器转换到 C0 状态。复位时,总线主设备请求的产生不会影响任何处于 C3 状态的处理器。 |
| 2 | GBL_RLS | 该只写位由 ACPI 软件用于向平台运行时固件发出一个事件,也就是说,在 IA-PC 平台上会生成一个 SMI,将执行控制权传递给平台运行时固件。平台运行时固件软件具有相应的使能位和状态位来控制其接收 ACPI 事件的能力(例如 BIOS_EN 和 BIOS_STS)。GBL_RLS 位由 OSPM 置位,以指示释放全局锁并设置 FACS 内存结构中的挂起位。 |
| 8:3 | Reserved | 保留。这些位由 OSPM 保留。 |
| 9 | 忽略 | 软件忽略该位字段。 |
| 12:10 | SLP_TYPx | 定义当 SLP_EN 位被置为 1 时系统进入的睡眠或软关闭状态类型。该 3 位字段定义当 SLP_EN 位被置位时系统进入的硬件睡眠状态类型。_Sx 对象包含与相应睡眠状态关联的 3 位二进制值(如该对象所述)。OSPM 从 _Sx 对象中获取这两个值,并将每个值编程到相应的 SLP_TYPx 字段中。 |
| 13 | SLP_EN | 这是一个只写位,对其读取总是返回零。设置该位会使系统按顺序进入与 SLP_TYPx 字段关联的睡眠状态,而这些字段已使用 _Sx 对象中的值进行了编程。 |
| 15:14 | Reserved | 保留。该字段始终返回零。 |
4.8.4.3. 电源管理定时器 (PM_TMR)
寄存器位置:<PM_TMR_BLK> 系统 I/O 或内存空间
默认值:00h
属性:只读
大小:32 位
如果该可选只读寄存器在平台上实现,则它返回电源管理定时器(PM 定时器)的当前值。FADT 有一个名为 TMR_VAL_EXT 的标志,OEM 将其置位以表示 32 位 PM 定时器,或将其复位以表示 24 位 PM 定时器。当定时器的最后一位翻转时,TMR_STS 位被置位。该寄存器按 32 位访问。
此寄存器包含在 FADT 中启用或禁用的可选特性。如果 FADT 指示该特性不作为固定硬件特性受支持,则软件将这些位视为忽略。
表 4.14 PM 定时器位
| 位 | 名称 | 描述 |
|---|---|---|
| TMR_VAL | 23:0 | 此只读字段返回电源管理定时器的运行计数值。这是一个 24 位计数器,由 3.579545-MHz 时钟驱动,并在 S0 工作系统状态下计数。定时器的起始值未定义,因此允许在从任何其他状态转换到 S0 状态时复位定时器(或不复位)。定时器会被复位(到任意初始值),然后继续计数,直到系统进入其 Sx 状态且系统的 14.31818 MHz 时钟停止时为止。如果时钟在未复位的情况下重新启动,则计数器将从停止的位置继续计数。 |
| E_TMR_VAL | 31:24 | 此只读字段返回 32 位电源管理定时器的高八位。如果硬件支持 32 位定时器,则该字段将返回高八位;如果硬件支持 24 位定时器,则该字段返回全零。 |
4.8.4.4. PM2 控制 (PM2_CNT)
寄存器位置:<PM2_CNT_BLK> 系统 I/O、系统内存或功能
固定硬件空间
默认值:00h
属性:读/写
大小:PM2_CNT_LEN
该寄存器块按其长度自然对齐并进行访问。对于 ACPI 1.0,此寄存器按字节对齐并按字节访问。
此寄存器包含在 FADT 中启用或禁用的可选特性。如果 FADT 指示该特性不作为固定硬件特性受支持,则软件将这些位视为忽略。
表 4.15 PM2 控制寄存器位
| 位 | 名称 | 描述 |
|---|---|---|
| 0 | ARB_DIS | 此位用于启用和禁用系统仲裁器。当该位为 CLEAR 时,系统仲裁器被启用,仲裁器可以将总线授予其他总线主设备。当该位为 SET 时,系统仲裁器被禁用,默认 CPU 拥有系统所有权。OSPM 在使用 C0、C1 和 C2 电源状态时会清除此位。 |
0 | Reserved | 保留
4.8.4.5. 处理器寄存器块 (P_BLK)
该可选寄存器块用于控制系统中的每个处理器。系统中的每个处理器都有一个唯一的处理器寄存器块。有关控制处理器以及可用于控制处理器的控制方法的更多信息,请参见处理器配置与控制 此寄存器块按 DWORD 对齐,并且该寄存器块的上下文在 S3 或 S4 睡眠状态或 S5 软关闭状态之间不会被保持。
4.8.4.5.1. 处理器控制 (P_CNT):32
寄存器位置:<P_BLK> 或者:系统 I/O 空间
或由 _PTC 对象指定:系统 I/O、系统内存或
功能固定硬件空间
默认值:00h
属性:读/写
大小:32 位
该寄存器按 DWORD 访问。CLK_VAL 字段是对节流硬件的占空比设置进行编程的位置,如 FADT 中 DUTY_WIDTH 和 DUTY_OFFSET 的值所述。软件将所有其他 CLK_VAL 位视为忽略(即那些未被占空比设置值使用的位)。
表 4.16 处理器控制寄存器位
| 位 | 名称 | 描述 |
|---|---|---|
| 3:0 | CLK_VAL | 时钟节流值的可能位置。 |
| 4 | THT_EN | 该位启用由 CLK_VAL 字段设置的时钟节流。在更改 CLK_VAL 字段(更改占空比设置)时,THT_EN 位必须复位为 LOW。 |
| 31:5 | CLK_VAL | 时钟节流值的可能位置。 |
4.8.4.5.2. 处理器 LVL2 寄存器 (P_LVL2):8
寄存器位置:<P_BLK> + 4:系统 I/O 空间
或由 _CST 对象指定:系统 I/O、系统内存或
功能固定硬件空间
默认值:00h
属性:只读
大小:8 位
该寄存器按字节访问。
表 4.17 处理器 LVL2 寄存器位
| 位 | 名称 | 描述 |
|---|---|---|
| 7:0 | P_LVL2 | 对该寄存器的读取返回全零;对该寄存器的写入没有效果。对该寄存器的读取还会向时钟控制逻辑产生一个“进入 C2 电源状态”。 |
4.8.4.5.3. 处理器 LVL3 寄存器 (P_LVL3):8
寄存器位置:<P_BLK> + 5:系统 I/O 空间
或由 _CST 对象指定:系统 I/O、系统内存或
功能固定硬件空间
默认值:00h
属性:只读
大小:8 位
该寄存器按字节访问。
表 4.18 处理器 LVL3 寄存器位
| 位 | 名称 | 描述 |
|---|---|---|
| 7:0 | P_LVL3 | 对该寄存器的读取返回全零;对该寄存器的写入没有效果。对该寄存器的读取还会向时钟控制逻辑产生一个“进入 C3 电源状态”。 |
4.8.4.6. 复位寄存器
可选的 ACPI 复位机制规定了一种提供完整系统复位的标准机制。实现时,该机制必须复位整个系统。这包括处理器、核心逻辑、所有总线以及所有外设。从 OSPM 的角度来看,触发该复位机制在逻辑上等同于对系统进行断电重启。在复位后重新获得控制权时,OSPM 将以类似冷启动的方式执行操作。
复位机制通过 FADT 中 RESET_REG 描述的一个 8 位寄存器实现(始终按照 RESET_REG 中描述的自然对齐和大小进行访问)。要复位系统,软件将向复位寄存器写入一个值(在 FADT 的 RESET_VALUE 中指示)。FADT 中的 RESET_REG 字段指示复位寄存器的位置。
复位寄存器只能存在于 I/O 空间、内存空间,或总线 0 上某个功能的 PCI 配置空间中。因此,RESET_REG 中的 Address_Space_ID 值必须设置为系统 I/O 空间、系统内存空间或 PCI 配置空间(总线号为 0)。由于该寄存器只有 8 位,Register_Bit_Width 必须为 8,且 Register_Bit_Offset 必须为 0。
在写入该寄存器后,系统必须立即复位。OSPM 假定处理器不会在写指令之后继续执行。OSPM 应在向该寄存器写入后,让系统中的 CPU 执行自旋循环。
4.8.4.7. 睡眠控制和状态寄存器
可选的 ACPI 睡眠寄存器(SLEEP_CONTROL_REG 和 SLEEP_STATUS_REG)规定了一种用于硬件精简 ACPI 系统进入系统睡眠状态的标准机制。实现时,睡眠寄存器将替代 PM1_BLK 中的 SLP_TYP、SLP_EN 和 WAK_STS 寄存器。是否使用这些寄存器由 OSPM 自行决定。OSPM 可以基于 LOW_POWER_S0_IDLE_CAPABLE 标志决定平台是否进入睡眠状态。即使已经实现,OSPM 也可以对休眠和关机使用其他提供的选项(例如 UEFI ResetSystem())。
硬件精简睡眠机制通过 FADT 中 SLEEP_CONTROL_REG 和 SLEEP_STATUS_REG 描述的两个 8 位寄存器实现(始终按照 SLEEP_*_REG 中描述的自然对齐和大小进行访问)。要使系统进入睡眠状态,软件将硬件精简睡眠类型值(从 DSDT 中的 \_Sx 对象获取)和 SLP_EN 位写入睡眠控制寄存器。然后 OSPM 轮询 SLEEP_STATUS_REG 的 WAK_STS 位,等待其变为一 (1),这表示系统已经转换回工作状态。
睡眠寄存器只能存在于 I/O 空间、内存空间,或总线 0 上某个功能的 PCI 配置空间中。因此,Address_Space_ID 的值必须设置为系统 I/O 空间、系统内存空间或 PCI 配置空间(总线号为 0)。由于这些寄存器只有 8 位,Register_Bit_Width 必须为 8,且 Register_Bit_Offset 必须为 0。
表 4.19 睡眠控制寄存器位
| 字段名称 | 位长度 | 位偏移 | 描述 |
|---|---|---|---|
| 保留 | 1 | 0 | 保留。该位由 OSPM 保留。 |
| 忽略 | 1 | 1 | 软件忽略该位字段。 |
| SLP_TYPx | 3 | 2 | 定义当 SLP_EN 位被置为一时,系统进入的睡眠状态类型。该 3 位字段定义当 SLP_EN 位被置位时系统进入的硬件睡眠状态类型。_Sx 对象包含与相应睡眠状态相关联的 3 位二进制值(如该对象所描述)。OSPM 从 _Sx 对象获取硬件精简睡眠类型值,并将其编程到 SLP_TYPx 字段中。 |
| SLP_EN | 1 | 5 | 这是一个只写位,对其读取始终返回零。设置该位会使系统进入由 SLP_TYPx 字段关联的睡眠状态,该字段使用来自 _Sx 对象的值进行编程。 |
| 保留 | 2 | 6 | 保留。该字段始终返回零。 |
表 4.20 睡眠状态寄存器
| 字段名称 | 位长度 | 位偏移 | 描述 |
|---|---|---|---|
| 忽略 | 4 | 0 | 软件忽略该位字段。 |
| 保留 | 2 | 4 | 保留。这些位始终返回值零。 |
| 忽略 | 1 | 6 | 软件忽略该位字段。 |
| WAK_STS | 1 | 7 | 当系统处于睡眠状态且发生已使能的唤醒事件时,该位被置位。设置该位后,系统将转换到工作状态。该位由硬件置位,并且只能由软件向该位位置写入“1”来清除。 |