4.8.3. 电源管理定时器
ACPI 规范定义了一个可选的电源管理定时器,它提供精确的时间值,系统软件可使用该值来测量和分析系统空闲状态(以及执行其他任务)。当系统处于工作(G0)状态时,电源管理定时器提供精确的计时功能。为了允许软件扩展定时器的位数,当定时器的最后一位发生变化时(从 0 到 1,或从 1 到 0),电源管理定时器会生成一个中断。ACPI 支持 24 位或 32 位电源管理定时器。PM Timer 由 OSPM 直接访问,其编程模型位于固定寄存器空间中。该编程模型最多可以划分到三个不同的寄存器块中。事件位包含在 PM1_EVT 寄存器分组中,该分组有两个寄存器块,而定时器值可通过 PM_TMR_BLK 寄存器块访问。电源管理定时器的框图如下一幅图所示。

图 4.7 电源管理定时器
电源管理定时器是一个 24 位或 32 位的固定频率自由运行递增计数定时器,运行时钟为 3.579545 MHz。ACPI OS 检查 FADT 以确定 PM Timer 是 32 位还是 24 位定时器。PM Timer 的编程模型由事件逻辑和一个计数器值读取端口组成。事件逻辑由一个事件状态位和一个使能位组成。每当定时器的最后一位(位 23 或位 31)从置位变为清零,或从清零变为置位时,状态位都会被置位。如果 TMR_EN 位被置位,则 TMR_STS 的置位将在 PM1_EVT 寄存器分组中生成一个 ACPI 事件(在图中称为 PMTMR_PME)。该事件逻辑仅用于模拟一个更大的定时器。
OSPM 使用只读的 TMR_VAL 字段(位于 PM TMR 寄存器分组中)来读取定时器的当前值。OSPM 从不假定 TMR_VAL 字段的初始值;相反,它在加载 OSPM 时读取一个初始 TMR_VAL,并假定定时器正在计数。当系统从工作(G0/S0)状态迁移出去时,允许停止该定时器。对定时器复位的唯一要求是:定时器在工作状态下必须能正常工作。
PM Timer 的编程模型被实现为一种固定硬件特性,以提高读取定时器的准确性。
4.8.3.1. 控制台按钮
ACPI 定义了用户发起的事件,用于请求 OSPM 在 G0 工作状态与 G1 睡眠、G2 软关机和 G3 机械关机状态之间转换平台。ACPI 还定义了一种推荐机制,用于将平台从挂起的 G0 工作状态无条件转换到 G2 软关机状态。
ACPI 操作系统使用电源按钮事件来判断用户何时在场。因此,这些 ACPI 事件在 ACPI 规范中与按钮相关联。
ACPI 规范支持两种按钮模型:
单按钮模型,为睡眠和进入软关机状态两者生成事件。按钮的功能可以使用 OSPM UI 进行配置。
双按钮模型,其中电源按钮生成软关机转换请求,而睡眠按钮生成睡眠转换请求。按钮类型隐含了按钮的功能。
这些按钮事件的控制可以通过固定硬件编程模型或通用硬件编程模型(基于控制方法)实现。固定硬件编程模型的优点在于 OSPM 可以在任何时候访问按钮,包括系统崩溃时。在具有固定硬件电源按钮的崩溃系统中,OSPM 可以尽“最大努力”判断是否按下了电源按钮,以将系统转换到软关机状态,因为这不需要 AML 解释器来访问事件位。
4.8.3.1.1. 电源按钮
电源按钮逻辑可用于两种模型之一:单按钮或双按钮。在单按钮模型中,用户按钮既充当电源按钮,用于在 G0 和 G2 状态之间转换系统;也充当睡眠按钮,用于在 G0 和 G1 状态之间转换系统。用户按下按钮后的动作由软件策略或用户设置决定。在双按钮模型中,睡眠和电源控制分别由独立的按钮负责。尽管这些按钮仍然生成事件以使软件采取动作,但按钮的功能现在是专用的:睡眠按钮向 OSPM 生成睡眠请求,而电源按钮生成唤醒请求。
对电源按钮的支持由 PWR_BUTTON 标志和电源按钮设备对象的组合来指示,如下所示:
表 4.8 电源按钮支持
| 指示的支持 | PWR_BUTTON 标志 | 电源按钮设备对象 |
|---|---|---|
| 固定硬件电源按钮 | 清零 | 不存在 |
| 控制方法电源按钮 | 置位 | 存在 |
电源按钮还可以具有一项附加能力,即将系统从挂起的工作状态无条件转换到 G2 软关机状态。在 OSPM 事件处理程序不再能够响应电源按钮事件的情况下,电源按钮覆盖功能提供了一种备用机制,可将系统无条件转换到软关机状态。当平台没有机械关机按钮(该按钮也可提供此功能)时,可以使用此特性。ACPI 规定,持续按住电源按钮激活状态四秒或更长时间将生成一个电源按钮覆盖事件。
4.8.3.1.1.1. 固定电源按钮

图 4.8 固定电源按钮逻辑
固定硬件电源按钮的事件编程模型位于 PM1x_EVT_BLK 中。该逻辑由一个使能位和一个粘性状态位组成。当用户按下电源按钮时,电源按钮状态位(PWRBTN_STS)会无条件置位。如果电源按钮使能位(PWRBTN_EN)已置位,并且当系统处于 G0 状态时,由于按钮按下而使电源按钮状态位(PWRBTN_STS)置位,则会产生一个 SCI。OSPM 通过清除 PWRBTN_STS 位来响应该事件。电源按钮逻辑提供去抖逻辑,在按钮按下的“边沿”置位 PWRBTN_STS 位。
当系统处于 G1 或 G2 全局状态(S1、S2、S3、S4 或 S5 状态)时,在使系统转换到睡眠状态的那次按钮按下之后,任何进一步的电源按钮按下都会无条件置位电源按钮状态位并唤醒系统,而不考虑电源按钮使能位的值。OSPM 通过清除电源按钮状态位并唤醒系统来响应。
4.8.3.1.1.2. 控制方法电源按钮
电源按钮编程模型也可以使用通用硬件编程模型。这允许电源按钮驻留在任何通用硬件地址空间中(例如,嵌入式控制器),而不是固定空间中。如果电源按钮使用通用硬件实现,则 OEM 需要将电源按钮定义为一个设备,其 _HID 对象值为 “PNP0C0C”,从而使 OSPM 将该设备识别为电源按钮。随后,AML 事件处理程序生成一个 Notify 命令,以通知 OSPM 已生成电源按钮事件。当系统处于工作状态时,按下电源按钮是用户请求将系统转换到睡眠(G1)状态或软关机(G2)状态。在这些情况下,电源按钮事件处理程序发出一个设备特定代码为 0x80 的 Notify 命令。这表示 OSPM 应将控制权传递给电源按钮驱动程序(PNP0C0C),并知道正在请求从 G0 状态转换出去。从 G1 睡眠状态唤醒时,AML 事件处理程序会生成一个代码为 0x2 的 Notify 命令,以表明由它负责唤醒系统。
电源按钮设备需要在平台的 ACPI 命名空间中声明为一个设备,并且只需要一个 _HID。示例定义如下。
该示例 ASL 代码执行以下操作:
创建一个名为 “PWRB” 的设备,并将即插即用标识符(通过 _HID 对象)“PNP0C0C” 与其关联。
该即插即用标识符将此设备对象与电源按钮驱动程序相关联。
为控制方法电源按钮的编程模型创建一个操作区域:位于 0x200 的系统 I/O 空间。
未被访问的字段写为零。这些状态位在向其位位置写入 1 时会清除,因此在这种情况下保留原值会失败。
在操作区域内为电源按钮状态位(称为 PBP)创建一个字段。在此情况下,电源按钮状态位是通用事件状态位 0 的子位。当该位被置位时,由 ASL 代码负责清除它(OSPM 清除通用状态位)。该状态位的地址为 0x200.0(地址 0x200 处的第 0 位)。
创建一个称为 PBW 的附加状态位,用于电源按钮唤醒事件。这是下一个位,其物理地址为 0x200.1(地址 0x200 处的第 1 位)。
为连接到通用事件状态寄存器 0 的第 0 位的电源按钮生成一个事件处理程序。该事件处理程序执行以下操作:
清除硬件中的电源按钮状态位(向其写入 1)。
通过调用 Notify 命令并传递电源按钮对象以及设备特定事件指示符 0x80,向 OSPM 通知该事件。
// Define a control method power button
Device(\_SB.PWRB)
{
Name(_HID, EISAID("PNP0C0C"))
Name(_PRW, Package(){0, 0x4})
OperationRegion(\PHO, SystemIO, 0x200, 0x1)
Field(\PHO, ByteAcc, NoLock, WriteAsZeros)
{
PBP, 1, // sleep/off request
PBW, 1 // wakeup request
}
}
Scope(\_GPE) // Root level event handlers
{
Method(_L00)
{
// uses bit 0 of GP0_STS register
If (PBP)
{
PBP = One // clear power button status
Notify(\_SB.PWRB, 0x80) // Notify OS of event
}
If (\PBW)
{
PBW = One
Notify(\_SB.PWRB, 0x2)
}
}
}
4.8.3.1.1.3. 电源按钮覆盖
ACPI 规范还允许这样一种情况:如果当系统处于工作状态时,用户按住电源按钮超过四秒,则会生成一个硬件事件,并且系统将转换到软关机状态。该硬件事件称为电源按钮覆盖。作为对电源按钮覆盖事件的响应,硬件会清除电源按钮状态位(PWRBTN_STS)。
4.8.3.1.2. 睡眠按钮
当使用双按钮模型时,ACPI 支持第二个按钮,按下该按钮时会请求 OSPM 在 G0 工作状态和 G1 睡眠状态之间转换平台。对睡眠按钮的支持通过 SLEEP_BUTTON 标志与睡眠按钮设备对象的组合来指示:
表 4.9 睡眠按钮支持
| 指示的支持 | SLEEP_BUTTON 标志 | 睡眠按钮设备对象 |
|---|---|---|
| 无睡眠按钮 | 置位 | 不存在 |
| 固定硬件睡眠按钮 | 清零 | 不存在 |
| 控制方法睡眠按钮 | 置位 | 存在 |
4.8.3.1.2.1. 固定硬件睡眠按钮

图 4.9 固定硬件睡眠按钮逻辑
固定硬件睡眠按钮的事件编程模型位于 PM1x_EVT_BLK 中。该逻辑由一个使能位和一个粘性状态位组成。当用户按下睡眠按钮时,睡眠按钮状态位(SLPBTN_STS)会无条件置位。此外,如果睡眠按钮使能位(SLPBTN_EN)已置位,并且当系统处于 G0 状态时,由于按钮按下而使睡眠按钮状态位(SLPBTN_STS)置位,则会产生一个 SCI。OSPM 通过清除 SLPBTN_STS 位来响应该事件。睡眠按钮逻辑提供去抖逻辑,在按钮按下的“边沿”置位 SLPBTN_STS 位。
当系统处于睡眠状态时(处于 S0、S1、S2、S3 或 S4 状态之一),任何进一步的睡眠按钮按下(在导致系统转换到睡眠状态的那次按钮按下之后)都会置位睡眠按钮状态位(SLPBTN_STS),并在 SLP_EN 位已置位时唤醒系统。OSPM 通过清除睡眠按钮状态位并唤醒系统来响应。
4.8.3.1.2.2. 控制方法睡眠按钮
睡眠按钮编程模型也可以使用通用硬件编程模型。这允许睡眠按钮驻留在任何通用硬件地址空间中(例如,嵌入式控制器),而不是固定空间中。如果睡眠按钮通过通用硬件实现,则 OEM 需要将睡眠按钮定义为一个设备,其 _HID 对象值为 “PNP0C0E”,从而使 OSPM 将该设备识别为睡眠按钮。随后,AML 事件处理程序生成一个 Notify 命令,以通知 OSPM 已生成睡眠按钮事件。当处于工作状态时,按下睡眠按钮是用户请求将系统转换到睡眠(G1)状态。在这些情况下,睡眠按钮事件处理程序发出一个设备特定代码为 0x80 的 Notify 命令。这将指示 OSPM 将控制权传递给睡眠按钮驱动程序(PNP0C0E),并知道用户正在请求从 G0 状态转换出去。从 G1 睡眠状态唤醒时,AML 事件处理程序会生成一个代码为 0x2 的 Notify 命令,以表明由它负责唤醒系统。
睡眠按钮设备需要在平台的 ACPI 命名空间中声明为一个设备,并且只需要一个 _HID。示例定义如下所示。
下面的 AML 代码执行以下操作:
创建一个名为 “SLPB” 的设备,并将即插即用标识符(通过 _HID 对象)“PNP0C0E” 与其关联。
该即插即用标识符将此设备对象与睡眠按钮驱动程序相关联。
为控制方法睡眠按钮的编程模型创建一个操作区域:位于 0x201 的系统 I/O 空间。
未被访问的字段写为“1”(这些状态位在向其位位置写入“1”时会清除,因此在这种情况下保留原值会失败)。
在操作区域内为睡眠按钮状态位(称为 PBP)创建一个字段。在此情况下,睡眠按钮状态位是通用状态位 0 的子位。当该位被置位时,由 AML 代码负责清除它(OSPM 清除通用状态位)。该状态位的地址为 0x201.0(地址 0x201 处的第 0 位)。
创建一个称为 PBW 的附加状态位,用于睡眠按钮唤醒事件。这是下一个位,其物理地址为 0x201.1(地址 0x201 处的第 1 位)。
为连接到通用状态寄存器 0 的第 0 位的睡眠按钮生成一个事件处理程序。该事件处理程序执行以下操作:
清除硬件中的睡眠按钮状态位(向其写入“1”)。
通过调用 Notify 命令并传递睡眠按钮对象以及设备特定事件指示符 0x80,向 OSPM 通知该事件。
// Define a control method sleep button
Device(\_SB.SLPB)
{
Name (_HID, EISAID("PNP0C0E"))
Name (_PRW, Package(){0x01, 0x04})
OperationRegion (\Boo, SystemIO, 0x201, 0x1)
Field (\Boo, ByteAcc, NoLock, WriteAsZeros)
{
SBP, 1, // sleep request
SBW, 1 // wakeup request
}
}
Scope (\_GPE) // Root level event handlers
{
Method (_L01) // uses bit 1 of GP0_STS register
{
If (\SBP)
{
\SBP = One // clear sleep button status
Notify(\_SB.SLPB, 0x80) // Notify OS of event
}
If (\SBW)
{
\SBW = One
Notify(\_SB.SLPB, 0x2)
}
}
}
4.8.3.2. 睡眠/唤醒控制
睡眠/唤醒逻辑由一组逻辑组成,这些逻辑将按顺序使系统进入定义的低功耗硬件睡眠状态(S1-S4)或软关机状态(S5),并在发生唤醒事件时将系统唤醒回工作状态。请注意,S4BIOS 状态以不同的方式进入(更多信息,请参见The S4BIOS Transition)。

图 4.10 睡眠/唤醒逻辑
该逻辑通过两个位字段进行控制:睡眠使能(SLP_EN)和睡眠类型(SLP_TYPx)。所需的睡眠或软关机状态类型被编程到 SLP_TYPx 字段中,并且在置位 SLP_EN 时,硬件将按顺序使系统进入定义的睡眠状态。OSPM 从静态定义块中定义的 \_Sx 对象获取 SLP_TYPx 字段的值。如果该对象缺失,OSPM 假定硬件不支持该睡眠状态。在进入所需睡眠状态之前,OSPM 将读取指定的 \_Sx 对象,并将该值放入 SLP_TYP 字段中。
此外,ACPI 定义了一种称为“电源按钮覆盖”的故障安全关机协议,它允许用户在系统软件已无法恢复系统(系统已挂起)的情况下启动关机序列。ACPI 规定,该序列由用户按住电源按钮超过 4 秒来启动,此时硬件会无条件地将系统切换到关机状态。该逻辑由进入睡眠逻辑的 PWRBTN_OR 信号表示。
当处于任意睡眠状态(G1)时,一个已启用的“唤醒”事件将导致硬件把系统切换回工作状态(G0)。“唤醒状态”位(WAK_STS)提供给 OSPM,在设置 SLP_EN/SLP_TYP 位域后进行“自旋等待”。当从 S1 睡眠状态唤醒时,执行控制会立即返回给 OSPM;而当从 S2-S4 状态唤醒时,执行控制会传递给平台启动固件(执行从 CPU 的复位向量开始)。WAK_STS 位提供了一种机制,用于在 S1 序列期间分离 OSPM 的睡眠代码和唤醒代码。当硬件已将系统切换到睡眠状态时(此处定义为处理器已无法再执行指令),任何已启用的唤醒事件都可以设置 WAK_STS 位并将系统重新开启(返回 G0 状态)。如果系统不支持 S1 睡眠状态,则 WAK_STS 位可以始终返回零。
如果支持多个睡眠状态,那么要求睡眠/唤醒逻辑能够在不同睡眠状态之间动态切换。这是通过先唤醒系统来实现的;OSPM 将新的睡眠状态编程到 SLP_TYP 字段中,然后设置 SLP_EN 位,使系统再次进入睡眠状态。
4.8.3.3. 实时时钟闹钟
如果已实现,实时时钟(RTC)闹钟在处于睡眠状态时必须生成一个硬件唤醒事件。RTC 可以被编程为产生闹钟。启用的 RTC 闹钟可用于在系统处于睡眠状态时生成唤醒事件。ACPI 提供了附加硬件,以支持 OSPM 确定 RTC 是唤醒事件源:RTC_STS 和 RTC_EN 位。尽管这些位是可选的,但如果支持,则必须按此处描述的方式实现。
如果不支持 RTC_STS 和 RTC_EN 位,OSPM 将尝试把 RTC 识别为可能的唤醒源;但是,它可能会遗漏某些唤醒事件。如果实现了 RTC 唤醒功能,则要求它在以下睡眠状态中工作:S1-S3。S4 唤醒是可选的,并通过 FADT 中的 RTC_S4 标志支持(如果置位,则平台支持在 S4 状态下通过 RTC 唤醒)*。
注
- G2/S5“软关机”和 G3“机械关机”状态不是睡眠状态。无论如何,OS 在进入 G2/S5 或 G3 状态之前都会禁用 RTC_EN 位。
当 RTC 生成唤醒事件时,RTC_STS 位将被置位。如果 RTC_EN 位已设置,则将生成一个 RTC 硬件电源管理事件(这会使系统从睡眠状态中唤醒,前提是电池电量低信号未被置位)。

图 4.11 RTC 闹钟
RTC 唤醒事件状态位和使能位是一项可选的固定硬件特性,FADT 中的一个标志(FIX_RTC)指示 OSPM 是否应使用这些寄存器位。如果 RTC 唤醒事件状态位和使能位是在固定硬件中实现的,OSPM 可以在不加载整个 OS 的情况下确定 RTC 是否为唤醒事件源。这也使平台能够在不消耗 GPE 位的情况下指示 RTC 唤醒源;如果 RTC 唤醒不是使用固定硬件 RTC 特性实现的,则需要消耗一个 GPE 位。如果不支持该固定硬件特性事件位,则 OSPM 将尝试通过读取 RTC 的状态字段来确定这一点。如果平台实现了 RTC 固定硬件特性,并且该硬件消耗资源,则可以使用 _FIX 方法将这些资源与固定硬件关联起来。详见 _FIX (固定寄存器资源提供者)。
OSPM 支持对现有 RTC 设备的增强(该设备仅支持 99 年日期和 24 小时闹钟)。为以下功能提供了可选扩展:
日闹钟
DAY_ALRM 字段指向一个可选的 CMOS RAM 位置,该位置用于选择在一个月中的哪一天生成 RTC 闹钟。
月闹钟
MON_ALRM 字段指向一个可选的 CMOS RAM 位置,该位置用于选择在一年中的哪个月生成 RTC 闹钟。
世纪值
CENT 字段指向一个可选的 CMOS RAM 位置,该位置表示日期的世纪值(千位和百位年份)。
RTC_STS 位可以通过 RTC 中断(在 IA-PC 体系结构系统中为 IRQ8)置位。OSPM 将确保在进入睡眠之前禁用周期性中断源和更新时间中断源。这使 RTC 的中断引脚能够作为生成 RTC_STS 位的来源。但请注意,如果 RTC 中断引脚用于生成 RTC_STS,则从 S4 唤醒时 RTC_STS 位值可能不准确。如果该值在从 S4 唤醒时是准确的,平台应设置 S4_RTC_STS_VALID 标志,以便 OSPM 可以利用 RTC_STS 信息。
表 4.10 FADT 中闹钟字段的解码
| 字段 | 值 | RTC CMOS RAM 中的地址(位置)(必须为第 0 Bank) |
|---|---|---|
| DAY_ALRM | 可表示 BCD 格式 0x01-0x31 天或二进制格式 0x01-0x1F 天的八位值。该字段的第 6 位和第 7 位在软件中视为忽略。RTC 被初始化为:当平台固件从传统模式切换到 ACPI 模式时,该字段包含“无关”值。无关值可以是任何未使用的值(不是 0x1-0x31 BCD 或 0x01-0x1F 十六进制),RTC 会回退为 24 小时闹钟。 | FADT 中的 DAY_ALRM 字段将包含一个非零值,该值表示 RTC 的 CMOS RAM 区域中的一个偏移量,该偏移量包含日闹钟值。DAY_ALRM 字段值为零表示不支持日闹钟功能。 |
| MON_ALRM | 可表示 BCD 格式 01-12 月或二进制格式 0x01-0xC 月的八位值。RTC 被初始化为:当平台固件从传统模式切换到 ACPI 模式时,该字段包含“无关”值。“无关”值可以是任何未使用的值(不是 1-12 的 BCD 或 0x01-0xC 十六进制),RTC 会回退为 24 小时闹钟和/或 31 天闹钟。 | FADT 中的 MON_ALRM 字段将包含一个非零值,该值表示 RTC 的 CMOS RAM 区域中的一个偏移量,该偏移量包含月闹钟值。MON_ALRM 字段值为零表示不支持月闹钟功能。如果支持月闹钟,则也必须支持日闹钟功能。 |
| CENTURY | 8 位 BCD 或二进制值。该值以 BCD(本世纪为 19,下世纪为 20)或二进制(本世纪为 x13,下世纪为 x14)表示日期中的千年和百年(世纪)变量。 | FADT 中的 CENTURY 字段将包含一个非零值,该值表示 RTC 的 CMOS RAM 区域中的一个偏移量,该偏移量包含日期的世纪值。CENTURY 字段值为零表示该 RTC 不支持世纪值。 |
4.8.3.4. 传统/ACPI 选择与 SCI 中断
如前所述,电源管理事件被生成以启动中断或硬件序列。ACPI 操作系统使用 SCI 中断处理程序来响应事件,而传统系统使用某种透明中断处理程序来响应这些事件(即 SMI 中断处理程序)。ACPI 兼容硬件可以选择同时支持传统模式和 ACPI 模式,或者仅支持 ACPI 模式。对于非 ACPI 兼容操作系统,需要传统硬件来支持这些特性。当 ACPI OS 加载时,它会扫描平台固件表以确定硬件支持 ACPI,然后如果发现 SCI_EN 位被清零(表明 ACPI 未启用),则通过 SMI 命令端口向 SMI 处理程序发出 ACPI 激活命令。平台固件通过设置 SCI_EN 位来确认已切换到 ACPI 电源管理模型(该位也可用于如下图所示切换事件机制):

图 4.12 到 SMI/SCI 控制逻辑的电源管理事件
这些中断事件(在传统模式下生成 SMI,在 ACPI 模式下生成 SCI)通过一个由 SCI_EN 位控制的解码器发送。对于传统模式,该位被清零,这会将中断事件路由到 SMI 中断逻辑。对于 ACPI 模式,该位被置位,这会将中断事件路由到 SCI 中断逻辑。对于不支持传统电源管理模式的 ACPI 兼容硬件,该位始终返回置位(换言之,该位被硬连线为读作“1”并忽略写入)。
SCI 中断被定义为可共享中断,并连接到一个 OS 可见的、使用可共享协议的中断。FADT 有一个条目指示 SCI 中断映射到哪个中断(参见系统描述表头)。
如果 ACPI 平台同时支持传统模式和 ACPI 模式,则它具有一个可生成硬件事件的寄存器(例如,对于 IA-PC 处理器为 SMI)。OSPM 使用该寄存器使硬件切入和切出 ACPI 模式。在 FADT 中有三个值,分别表示该端口的地址(SMI_CMD)、写入以启用 ACPI 状态的数据值(ACPI_ENABLE),以及写入以禁用 ACPI 状态的数据值(ACPI_DISABLE)。
要将 ACPI/传统平台从传统模式转换到 ACPI 模式,将发生以下过程:
ACPI 驱动程序检查 SCI_EN 位为零,并且当前处于传统模式。
OSPM 使用 FADT 的 ACPI_ENABLE 字段中的数据对 SMI_CMD 端口执行一次 OUT。
OSPM 轮询 SCI_EN 位,直到采样为置位。
要将 ACPI/传统平台从 ACPI 模式转换到传统模式,将发生以下过程:
ACPI 驱动程序检查 SCI_EN 位为一,并且当前处于 ACPI 模式。
OSPM 使用 FADT 的 ACPI_DISABLE 字段中的数据对 SMI_CMD 端口执行一次 OUT。
OSPM 轮询 SCI_EN 位,直到采样为复位。
仅支持 ACPI 的平台对 SCI_EN 位始终返回 1。在这种情况下,OSPM 跳过上述从传统模式到 ACPI 模式的转换。
4.8.3.5. 处理器控制
ACPI 规范定义了多种处理器控制,包括电源状态控制、节流控制和性能状态控制。有关处理器控制的完整描述,请参见处理器配置与控制。