8.4.2. 处理器电源状态控制
ACPI 定义了多种处理器电源状态(C 状态)控制接口。它们是:
处理器寄存器块(P_BLK 的)P_LVL2 和 P_LVL3 寄存器,以及配套的 FADT P_LVLx_LAT 值,以及
处理器对象列表中的 _CST 对象。
处理器和处理器容器的 _LPI 对象。
基于 P_BLK 的 C 状态控制在 ACPI 硬件规范 中描述。基于 _CST 的 C 状态控制扩展了基于 P_BLK 的控制功能,使 C 状态的数量和类型可以动态变化,并且能够适应 CPU 体系结构特定的 C 状态进入和退出机制,这些机制通过使用 Functional Fixed Hardware 地址空间定义的寄存器来表示。
_CST 是一个可选对象,提供:
处理器寄存器块(P_BLK 的)P_LVL2 和 P_LVL3 寄存器,以及配套的 FADT P_LVLx_LAT 值。
处理器对象列表中的 _CST 对象。
ACPI 6.0 引入了 _LPI,即低功耗空闲状态对象。_LPI 提供了更详细的电源状态信息,并且可以结合处理器容器描述多个层级上的空闲状态。详见 _LPI(低功耗空闲状态)。
8.4.2.1. _CST(C 状态)
_CST 是一个可选对象,提供一种声明受支持处理器电源状态(C 状态)的替代方法。_CST 对象提供的值会覆盖 P_BLK 中的 P_LVLx 值以及 FADT 中的 P_LVLx_LAT 值。_CST 对象允许处理器电源状态的数量扩展到超出 C1、C2 和 C3,达到任意数量的电源状态。这些扩展状态的进入语义(换言之,即进入这些状态时的考虑因素)通过 C 状态类型字段传达给 OSPM,并对应于 第 8.1.2 节 到 第 8.1.4 节 中所述的 C1 C2 和 C3 的进入语义。_CST 定义了按升序排列的 C 状态,其特征是更低功耗和更高进入/退出延迟。
参数:
无
返回值:
一个可变长度的 Package,包含如下所述的 C 状态信息包列表
返回值信息
_CST 返回一个可变长度的 Package,其中包含以下元素:
Count 一个 Integer,包含后续 CState 子包的数量
CStates[] 一个由 Count 个 CState 子包组成的列表
Package {
Count // Integer
CStates[0] // Package
...
CStates[Count-1] // Package
}
每个固定长度的 C 状态子包包含如下所述的元素:
Package {
Register // Buffer (Resource Descriptor)
Type // Integer (BYTE)
Latency // Integer (WORD)
Power // Integer (DWORD)
}
表 8.2 C 状态包值
| 元素 | 对象类型 | 说明 |
|---|---|---|
| Register | Buffer | 包含一个资源描述符,其中带有单个 Register() 描述符,用于描述 OSPM 必须读取以使处理器进入相应 C 状态的寄存器。 |
| Type | Integer(BYTE) | C 状态类型(1=C1,2=C2,3=C3)。该字段向 OSPM 传达在进入/退出 C 状态时要使用的语义。零不是有效值。 |
| Latency | Integer(WORD) | 进入和退出该 C 状态的最坏情况延迟(以微秒为单位)。没有延迟限制。 |
| Power | Integer(DWORD) | 处理器处于相应 C 状态时的平均功耗(以毫瓦为单位)。 |
平台必须为其全部处理器都公开 _CST 对象,或者全部都不公开。如果 _CST 对象存在,则 OSPM 使用 _CST 对象中指定的 C 状态信息,而不是 P_BLK 中定义的 P_LVL2 和 P_LVL3 寄存器以及 FADT 中定义的 P_LVLx_LAT 值。还要注意,如果 _CST 对象存在而 _PTC 对象不存在,则 OSPM 将使用 P_BLK 中定义的处理器控制寄存器以及 _CST 对象中的 C_State_Register 寄存器。
平台可以通过在处理器对象上发出通知值为 0x81 的 Notify 事件,动态更改可供 OSPM 使用的 C 状态的数量或类型。这将导致 OSPM 重新计算位于已通知处理器对象下的任何 _CST 对象。例如,平台可能会通知 OSPM,由于异步 AC 插入/移除事件,受支持的 C 状态数量已发生变化。
平台必须为给定 _CST 对象中的所有条目指定唯一的 C_State_Register 地址。
_CST 消除了 ACPI 1.0 中所有处理器都必须具有 C 状态一致性的限制。通过 _CST,每个处理器都可以具有独立于其他处理器的自身特性。例如,处理器 0 可以支持 C1、C2 和 C3,而处理器 1 仅支持 C1。
处理器结构中的字段保留以实现向后兼容。
示例
Processor (
\_SB.CPU0, // Processor Name
1, // ACPI Processor number
0x120, // PBlk system IO address
6 // PBlkLen
)
{
Name(_CST, Package()
{
4, // There are four C-states defined here with three semantics
// The third and fourth C-states defined have the same C3 entry semantics
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}, 1, 20, 1000},
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2, 40, 750},
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3, 60, 500},
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100, 250}
}
)
}
请注意,在上面的示例中,OSPM 应当预期 _CST 对象可能提供多个具有相同 C_State_Type 值的条目。在这种情况下,OSPM 必须决定它将使用哪个 C_State_Register 来进入该 C 状态。
示例
这是一个使用 _CST 对象的示例,其采用了 ACPI 1.0 中定义的典型值。
Processor (
\\_SB.CPU0, // Processor Name
1, // ACPI Processor number
0x120, // PBLK system IO address
6 ) // PBLK Len
{
Name(_CST, Package()
{
2, // There are two C-states defined here - C2 and C3
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x124)}, 2, 2, 750},
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x125)}, 3, 65, 500}
})
}
当可用的处理器电源状态数量发生变化时,平台将发出 Notify (_SB.CPU0, 0x81) 来通知 OSPM 重新计算该对象。
8.4.2.2. _CSD(C 状态依赖关系)
此可选对象向 OSPM 提供 C 状态控制的跨逻辑处理器依赖信息。_CSD 对象求值为一个打包的信息列表,它与 _CST 对象返回的 C 状态信息相关联。打包列表中的每个条目都标识正在为其指定依赖关系的 C 状态(作为 _CST 对象列表中的索引)、该 C 状态的依赖域编号、该 C 状态的协调类型,以及对于该特定 C 状态属于该域的逻辑处理器数量。某个特定 C 状态有可能属于多个域。也就是说,_CSD 列表中可能存在多个具有相同 CStateIndex 值的条目。
参数:
无
返回值:
一个可变长度的 Package,包含如下所述的 C 状态依赖包列表。
返回值信息
Package {
CStateDependency[0] // Package
...
CStateDependency[n] // Package
}
每个 C 状态依赖子包包含如下所述的元素:
Package {
NumEntries // Integer
Revision // Integer (BYTE)
Domain // Integer (DWORD)
CoordType // Integer (DWORD)
NumProcessors // Integer (DWORD)
Index // Integer (DWORD)
}
表 8.3 C 状态依赖包值
| 元素 | 对象类型 | 描述 |
|---|---|---|
| NumEntries | Integer | CStateDependency 包中的条目数,包括此字段。当前值为 6。 |
| Revision | Integer (BYTE) | CStateDependency 包格式的修订号。当前值为 0。 |
| Domain | Integer (DWORD) | 此 C 状态条目所属的依赖域编号。 |
| CoordType | Integer (DWORD) | 有关受支持的 C-state 协调类型,请参见表 8.1。 |
| Num Processors | Integer (DWORD) | 对于特定 C-state,属于该域的处理器数量。在检测到并启动同一域中属于该特定 C-state 的这么多个处理器之前,OSPM 不会开始执行到特定 C-state 的电源状态转换。 |
| Index | Integer (DWORD) | 指示 _CST 对象中适用该依赖关系的 C-State 条目的索引。 |
鉴于可用 C States 的数量或类型可能会动态变化,ACPI 支持处理器对象上的 Notify 事件,其中类型为 0x81 的 Notify 事件将导致 OSPM 重新评估驻留在被通知的特定处理器对象下的任何 _CST 对象。在收到类型为 0x81 的 Notify 事件时,OSPM 还应重新评估任何现有的 _CSD 对象。
示例
这是命名空间中 Processor 结构内 _CSD 结构的一个使用示例。该示例表示一个双处理器配置。C1-type 状态可以在每个处理器上独立进入。对于 C2-type 状态,两个处理器之间存在依赖关系,因此一个处理器转换到 C2-type 状态时,会导致另一个处理器转换到 C2-type 状态。对于 C3-type 状态也存在类似的依赖关系。OSPM 将需要协调两个处理器之间的 C2 和 C3 转换。此外,OSPM 可以在任一处理器上发起转换,从而使两者都转换到共同的目标 C-state。
Processor (
\_SB.CPU0, // Processor Name
1, // ACPI Processor number
0x120, // PBlk system IO address
6 ) // PBlkLen
{
Name (_CST, Package()
{
3, // There are three C-states defined here with three semantics
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}, 1, 20,1000},
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2, 40, 750},
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3, 60, 500}
})
Name(_CSD, Package()
{
Package(){6, 0, 0, 0xFD, 2, 1} , // 6 entries,Revision 0,Domain 0,OSPM Coordinate
// Initiate on Any Proc,2 Procs, Index 1 (C2-type)
Package(){6, 0, 0, 0xFD, 2, 2} // 6 entries,Revision 0 Domain 0,OSPM Coordinate
// Initiate on Any Proc,2 Procs, Index 2 (C3-type)
})
}
Processor (
\_SB.CPU1, // Processor Name
2, // ACPI Processor number
, // PBlk system IO address
) // PBlkLen
{
Name(_CST, Package()
{
3, // There are three C-states defined here with three semantics
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}, 1, 20, 1000},
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2, 40, 750},
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3, 60, 500}
})
Name(_CSD, Package()
{
Package(){6, 0, 0, 0xFD, 2, 1}, // 6 entries,Revision 0,Domain 0,OSPM Coordinate
// Initiate on any Proc,2 Procs, Index 1 (C2-type)
Package(){6, 0, 0, 0xFD, 2, 2} // 6 entries,Revision 0,Domain 0,OSPM Coordinate
// Initiate on any Proc,2 Procs,Index 2 (C3-type)
})
}
当平台发出 Notify (\_SB.CPU0, 0x81) 以通知 OSPM 在可用处理器电源状态数量发生变化时重新评估 _CST,OSPM 也应评估 _CSD。