8.4.5. 处理器节流控制
ACPI 定义了两种处理器节流(T 状态)控制接口。它们是:
处理器寄存器块(P_BLK)的 P_CNT 寄存器。
处理器对象列表中的组合 _PTC、_TSS 和 _TPC 对象。
基于 P_BLK 的节流状态控制在ACPI 硬件规范中描述。基于组合 _PTC、_TSS 和 _TPC 的节流状态控制扩展了基于 P_BLK 的控制功能,使 T 状态数量可以动态变化,并可容纳由使用功能固定硬件地址空间定义的寄存器所指示的 CPU 架构特定 T 状态控制机制。虽然平台定义 _PTC、_TSS 和 _TPC 对象是可选的,但为了使 OSPM 能够通过这些控制成功执行处理器节流,这三个对象都必须存在于某个处理器之下。
8.4.5.1. _PTC(处理器节流控制)
_PTC 是一个可选对象,它定义了一种替代 I/O 地址空间基础的 P_BLK 节流控制寄存器(P_CNT)的处理器节流控制接口,相关内容见ACPI 硬件规范
OSPM 通过将从节流支持状态对象(_TSS)中获取的目标节流状态(T-state)的控制字段值写入 _PTC 对象定义的节流控制寄存器(THROTTLE_CTRL)来执行处理器节流控制。OSPM 可以根据 _TPC 控制方法返回的值所指示的可用状态,选择任意处理器节流状态。
处理器节流状态转换的成功或失败通过读取节流状态寄存器(THROTTLE_STATUS)来确定,以判断处理器当前的节流状态。如果转换成功,则从 THROTTLE_STATUS 读取的值将与 _TSS 条目中对应目标处理器节流状态的“状态”字段相匹配。
参数:
无
返回值:
如下所述的包
返回值信息
Package
{
ControlRegister // Buffer (Resource Descriptor)
StatusRegister // Buffer (Resource Descriptor)
}
表 8.17 _PTC 包值
| 元素 | 对象类型 | 描述 |
|---|---|---|
| 控制寄存器 | 缓冲区 | 包含一个资源描述符,其中只有一个 Register() 描述符,用于描述节流控制寄存器。 |
| 状态寄存器 | 缓冲区 | 包含一个资源描述符,其中只有一个 Register() 描述符,用于描述节流状态寄存器。 |
平台必须为其全部处理器或全部不为其处理器公开一个 _PTC 对象。注意,如果 _PTC 对象存在,则使用指定的寄存器,而不是 Processor 条目中指定的 P_CNT 寄存器。还要注意,如果 _PTC 对象存在且 _CST 对象不存在,则 OSPM 将使用来自 _PTC 对象的处理器控制寄存器,以及来自 P_BLK 的 P_LVLx 寄存器。
示例
这是在 Processor 对象列表中使用 _PTC 对象的示例:
Processor (
\_SB.CPU0, // Processor Name
1, // ACPI Processor number
0x120, // PBlk system IO address
6 ) // PBlkLen
{ // Object List
Name(_PTC, Package () // Processor Throttling Control object
{
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}, // Throttling_CTRL
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)} // Throttling_STATUS
}) // End of \_PTC object
} // End of Object List
示例
这是使用 ACPI 1.0 中定义的值来使用 _PTC 对象的示例。这是一个说明性示例,用于演示该机制及已知值。
Processor (
\\_SB.CPU0, // Processor Name
1, // ACPI Processor number
0x120, // PBLK system IO address
6 ) // PBLK Len
{ // Object List
Name(_PTC, Package () // Processor Throttling Control object -
// 32 bit wide IO space-based register at the <p_blk> address
{
ResourceTemplate(){Register(SystemIO, 32, 0, 0x120)}, // Throttling_CTRL
ResourceTemplate(){Register(SystemIO, 32, 0, 0x120)} // Throttling_STATUS
}) // End of \_PTC object
} // End of Object List
8.4.5.2. _TSS(支持的节流状态)
该可选对象向 OSPM 指示平台支持的处理器节流状态数量。该对象求值为一个打包列表,其中包含有关可用节流状态的信息,包括最大内部 CPU 核心频率的百分比、最大功耗、在节流状态之间转换所需的控制寄存器值,以及允许 OSPM 在任何 OS 发起的转换更改请求之后验证节流状态转换状态的状态寄存器值。该列表按功耗降序排序。因此,第 0 项描述的是性能最高的节流状态(未施加节流),而第 n 项描述的是性能最低的节流状态(施加最大节流)。
在提供 _TSS 时,平台必须提供一个 Percent 字段值为 100 的 _TSS 条目。这为 OSPM 提供了一种禁用节流并实现最高性能的方式。
参数:
无
返回值:
一个可变长度的 Package,其中包含如下所述的 Tstate 子包。
返回值信息
Package {
TState [0] // Package - Throttling state 0
....
TState [n] // Package - Throttling state n
}
每个 Tstate 子包包含如下所述的元素。
Package {
Percent // Integer (DWORD)
Power // Integer (DWORD)
Latency // Integer (DWORD)
Control // Integer (DWORD)
Status // Integer (DWORD)
}
表 8.18 TState 包值
| 元素 | 对象类型 | 说明 |
|---|---|---|
| 百分比 | Integer (DWORD) | 指示当此节流状态被调用时可用的核心 CPU 工作频率的百分比。此字段的范围为 1-100。此百分比独立于处理器的性能状态(P-state)而适用。也就是说,此节流状态将调用由该字段指示的最大频率百分比,并将其应用于与处理器当前驻留的 P-state 相对应的 _PSS 项中的核心频率字段。 |
| 功耗 | Integer (DWORD) | 指示该节流状态的最大功耗(以毫瓦为单位)。在支持 P-states 的平台上,OSPM 会忽略此字段,因为这些平台通过 _PSS 对象提供功耗信息。 |
| 延迟 | Integer (DWORD) | 指示从任意节流状态转换到此节流状态期间,CPU 不可用的最坏情况延迟时间,以微秒为单位。 |
| 控制 | Integer (DWORD) | 指示为了发起到此节流状态的转换,写入处理器控制寄存器(THROTTLE_CTRL)的值。 |
| 状态 | Integer (DWORD) | 指示 OSPM 将与从节流状态寄存器(THROTTLE_STATUS)读取的值进行比较的值,以确保到该节流状态的转换成功。OSPM 可以始终将 CPU 置于最低功耗节流状态,但只有在 _TPC 控制方法指示时,附加状态才可用。值为零表示到节流状态的转换是异步的,因此不需要进行状态值比较。 |
8.4.5.3. _TPC(当前存在的节流能力)
这个可选对象是一个方法,用于动态地向 OSPM 指示平台当前支持的节流状态数量。此方法返回一个数字,指示 OSPM 在给定时间可以使用的最高功率节流状态的 _TSS 项编号。OSPM 可以选择由 _TPC 方法返回值所指示的 _TSS 中对应状态项,或者 _TSS 中任何更低功率(编号更高)的状态项。
参数:
无
返回值:
一个包含所支持状态数量的 整数:
0 - 状态 0 … 第 n 个状态可用(所有状态可用)
1 - 状态 1 … 第 n 个状态可用
2 - 状态 2 … 第 n 个状态可用
…
n - 仅状态 n 可用
为了支持 _TPC 对象的动态变化,处理器对象上类型为 0x82 的 Notify 事件将导致 OSPM 重新评估处理器对象列表中的任何 _TPC 对象。这使得 AML 代码能够在由于异步事件导致支持的节流状态数量可能发生变化时通知 OSPM。在支持 P-states 的平台上,OSPM 会忽略 _TPC Notify 事件,除非平台已将 OSPM 对 P-states 的使用限制为最低功率 P-state。若平台启用了非最低功率 P-state 的 OSPM 使用,OSPM 可以选择忽略平台传达的任何 T-state 限制。
8.4.5.4. _TSD(T-State 依赖关系)
这个可选对象向 OSPM 提供 T-state 控制跨逻辑处理器依赖信息。_TSD 对象求值为一个打包列表,其中包含单个项,该项表示一组逻辑处理器之间的 T-state 控制依赖关系。
参数:
无
返回值:
一个 Package,包含单个项,该项由如下所述的 T-state 依赖 Package 组成。
返回值信息
Package {
TStateDependency[0] // Package
}
The TStateDependency sub-Package contains the elements described below:
Package {
NumEntries // Integer
Revision // Integer (BYTE)
Domain // Integer (DWORD)
CoordType // Integer (DWORD)
NumProcessors // Integer (DWORD)
}
表 8.19 T-State 依赖 Package 值
| 元素 | 对象类型 | 说明 |
|---|---|---|
| 项数 | Integer | TStateDependency 打包列表中的项数,包括此字段。当前值为 5。 |
| 修订 | Integer (BYTE) | TStateDependency 打包列表格式的修订号。当前值为 0。 |
| 域 | Integer (DWORD) | 此 T-state 项所属的依赖域编号。 |
| 协调类型 | Integer (DWORD) | 支持的 T-state 协调类型见 表 8.1。 |
| 处理器数量 | Integer (DWORD) | 属于此逻辑处理器 T-states 的该域中的处理器数量。在检测到并启动了同一域中的这一数量的处理器之前,OSPM 不会开始执行到特定 T-state 的电源状态转换。 |
示例
这是在命名空间中的 Processor 结构里使用 _TSD 结构的一个示例。该示例表示一个双处理器配置,每个处理器有三个 T-states。对于所有 T-states,两个处理器之间都存在依赖关系,因此一个处理器转换到特定 T-state 会导致另一个处理器转换到相同的 T-state。OSPM 将需要协调这两个处理器之间的 T-state 转换,并且可以在任一处理器上发起转换,以使两者都转换到共同的目标 T-state。
Processor (
\_SB.CPU0, // Processor Name
1, // ACPI Processor number
0x120, // PBlk system IO address
6) // PBlkLen
{ //Object List
Name(_PTC, Package () // Processor Throttling Control object -
// 32 bit wide IO space-based register at the <p_blk> address
{
ResourceTemplate(){Register(SystemIO, 32, 0, 0x120)}, // Throttling_CTRL
ResourceTemplate(){Register(SystemIO, 32, 0, 0x120)} // Throttling_STATUS
}) // End of \_PTC object
Name (_TSS, Package()
{
Package() {
0x64, // Frequency Percentage (100%, Throttling OFF state)
0x0, // Power
0x0, // Transition Latency
0x7, // Control THT_EN:0 THTL_DTY:111
0x0, // Status
}
Package() {
0x58, // Frequency Percentage (87.5%)
0x0, // Power
0x0, // Transition Latency
0xF, // Control THT_EN:1 THTL_DTY:111
0x0, // Status
}
Package() {
0x4B, // Frequency Percentage (75%)
0x0, // Power
0x0, // Transition Latency
0xE, // Control THT_EN:1 THTL_DTY:110
0x0, // Status
}
})
Name (_TSD, Package()
{
Package(){5, 0, 0, 0xFD, 2} // 5 entries, Revision 0, Domain 0,
// OSPM Coordinate, 2 Procs
}) // End of \_TSD object
Method (_TPC, 0) // Throttling Present Capabilities method
{
If (\_SB.AC)
{
Return(0) // All Throttle States are available for use.
}
Else
{
Return(2) // Throttle States 0 an 1 won't be used.
}
} // End of \_TPC method
} // End of processor object list
Processor (
\_SB.CPU1, // Processor Name
2, // ACPI Processor number
, // PBlk system IO address
) // PBlkLen
{ //Object List
Name(_PTC, Package () // Processor Throttling Control object -
// 32 bit wide IO space-based register at the
// <p_blk> address
{
ResourceTemplate(){Register(SystemIO, 32, 0, 0x120)}, // Throttling_CTRL
ResourceTemplate(){Register(SystemIO, 32, 0, 0x120)} // Throttling_STATUS
}) // End of \_PTC object
Name (_TSS, Package()
{
Package() {
0x64, // Frequency Percentage (100%, Throttling OFF state)
0x0, // Power
0x0, // Transition Latency
0x7, // Control THT_EN:0 THTL_DTY:111
0x0, // Status
}
Package() {
0x58, // Frequency Percentage (87.5%)
0x0, // Power
0x0, // Transition Latency
0xF, // Control THT_EN:1 THTL_DTY:111
0x0, // Status
}\'
Package() {
0x4B, // Frequency Percentage (75%)
0x0, // Power
0x0, // Transition Latency
0xE, // Control THT_EN:1 THTL_DTY:110
0x0, // Status
}
})
Name (_TSD, Package()
{
Package(){5, 0, 0, 0xFD, 2} // 5 entries, Revision 0, Domain 0,
// OSPM Coordinate, 2 Procs
}) // End of \_TSD object
Method (_TPC, 0) // Throttling Present Capabilities method
{
If (\_SB.AC)
{
Return(0) // All Throttle States are available for use.
}
Else
{
Return(2) // Throttle States 0 an 1 won't be used.
}
} // End of \_TPC method
} // End of processor object list
8.4.5.5. _TDL(T-state 深度限制)
这个可选对象求值为 OSPM 可以使用的最低功率节流状态的 _TSS 项编号。_TDL 使平台能够限制 OSPM 通过处理器节流控制可以调用的性能降低量,以试图缓解不利的热条件。OSPM 可以选择由 _TDL 对象返回值指示的 _TSS 中对应状态项,或者 _TSS 中更高性能(编号更低)的状态项,直到并包括由 _TPC 对象返回的 _TSS 项编号,或者表中的第一项(如果未实现 _TPC)。_TDL 对象返回的值必须大于或等于 _TPC 对象返回的值;如果未实现 _TPC,则必须大于或等于 _TSS 中最后一项对应的值。如果对 _TDL 和 _TPC 对象求值所返回的值发生冲突,OSPM 优先采用 _TPC 对象,以限制功耗。
参数:
无
返回值:
一个 Integer,包含节流深度限制的 _TSS 项编号:
0 - 节流被禁用。
1 - 状态 1 是可用的最低功率 T-state。
2 - 状态 2 是可用的最低功率 T-state。
…
n - 状态 n 是可用的最低功率 T-state。
为了使平台能够动态指示可供 OSPM 使用的性能降低限制,处理器对象上类型为 0x82 的 Notify 事件将导致 OSPM 重新评估处理器对象列表中的任何 _TDL 对象。这使得 AML 代码能够在由于异步事件导致支持的节流状态数量可能发生变化时通知 OSPM。在支持 P-states 的平台上,OSPM 会忽略 _TDL Notify 事件,除非平台已将 OSPM 对 P-states 的使用限制为最低功率 P-state。若平台启用了非最低功率 P-state 的 OSPM 使用,OSPM 可以选择忽略平台传达的任何 T-state 深度限制。