8.4.6. 处理器性能控制
处理器性能控制通过三个可选对象来实现,这三个对象的存在表明 OSPM 该平台和 CPU 能够支持多个性能状态。如果实现了处理器性能控制,平台必须提供这三个对象。平台必须为其所有处理器都公开处理器性能控制对象,或者一个也不公开。处理器性能控制对象定义了受支持的处理器性能状态,允许将处理器置于特定的性能状态,并报告系统当前可用的性能状态数量。
在多处理环境中,所有 CPU 必须支持相同数量的性能状态,并且每个处理器性能状态都必须具有相同的性能和功耗参数。为了让 OSPM 使用此特性,系统中每个处理器对象下都必须存在性能对象。
处理器性能控制对象包括 ‘_PCT’ 包、‘_PSS’ 包以及 ‘_PPC’ 方法,详见下文。
8.4.6.1. _PCT(性能控制)
此可选对象声明了一个接口,该接口允许 OSPM 将处理器切换到某个性能状态。OSPM 通过将特定于性能状态的控制值写入性能控制寄存器(PERF_CTRL)来执行处理器性能切换。
OSPM 可以选择 _PPC 方法返回的性能状态值所指示的处理器性能状态,或任何更低功耗(编号更高)的状态。要写入的控制值包含在相应 _PSS 项的“控制”字段中。
处理器性能切换的成功或失败通过读取性能状态寄存器(PERF_STATUS)来确定,以判定处理器当前的性能状态。如果切换成功,则从 PERF_STATUS 读出的值将与对应所需处理器性能状态的 _PSS 项中的“状态”字段匹配。
参数:
无
返回值:
如下所述的一个包
返回值信息
Package
{
ControlRegister // Buffer (Resource Descriptor)
StatusRegister // Buffer (Resource Descriptor)
}
表 8.20 _PCT 包值
| 元素 | 对象类型 | 描述 |
|---|---|---|
| 控制寄存器 | Buffer | 包含一个资源描述符,其中带有单个 Register() 描述符,用于描述性能控制寄存器。 |
| 状态寄存器 | Buffer | 包含一个资源描述符,其中带有单个 Register() 描述符,用于描述性能状态寄存器。 |
示例
Name (_PCT, Package()
{
ResourceTemplate(){Perf_Ctrl_Register}, //Generic Register Descriptor
ResourceTemplate(){Perf_Status_Register} //Generic Register Descriptor
}) // End of \_PCT
8.4.6.2. _PSS(性能支持状态)
此可选对象向 OSPM 指示任意给定系统所支持的处理器性能状态数量。此对象求值为一个打包列表,其中包含关于可用性能状态的信息,包括内部 CPU 核心频率、典型功耗、在性能状态之间切换所需的控制寄存器值,以及允许 OSPM 在任何由 OS 发起的切换变更请求之后验证性能切换状态的状态寄存器值。该列表按典型功耗降序排序。因此,第零项描述最高性能状态,而第 ‘n’ 项描述最低性能状态。
参数:
无
返回值:
一个可变长度的包,包含如下所述的 Pstate 子包列表
返回值信息
Package {
PState [0] // Package - Performance state 0
....
PState [n] // Package - Performance state n
}
每个 Pstate 子包包含如下所述的元素:
Package {
CoreFrequency // Integer (DWORD)
Power // Integer (DWORD)
Latency // Integer (DWORD)
BusMasterLatency // Integer (DWORD)
Control // Integer (DWORD)
Status // Integer (DWORD)
}
表 8.21 PState 包值
| 元素 | 对象类型 | 描述 |
|---|---|---|
| 核心频率 | Integer (DWORD) | 指示核心 CPU 的工作频率(单位为 MHz)。 |
| 功率 | Integer (DWORD) | 指示该性能状态的最大功耗(单位为毫瓦)。 |
| 延迟 | Integer (DWORD) | 指示从任意性能状态切换到该性能状态期间,CPU 不可用的最坏情况延迟,单位为微秒。 |
| 总线主控延迟 | Integer (DWORD) | 指示从任意性能状态切换到该性能状态期间,总线主控被阻止访问内存的最坏情况延迟,单位为微秒。 |
| 控制 | Integer (DWORD) | 指示为启动切换到该性能状态而要写入性能控制寄存器(PERF_CTRL)的值。 |
| 状态 | Integer (DWORD) | 指示 OSPM 将与从性能状态寄存器(PERF_STATUS)读取的值进行比较的值,以确保切换到该性能状态成功。OSPM 可以始终将 CPU 置于最低功耗状态,但仅当 _PPC 方法指示时,附加状态才可用。 |
8.4.6.3. _PPC(性能当前能力)
此可选对象是一个方法,它动态地向 OSPM 指示平台当前支持的性能状态数量。该方法返回一个数字,指示 OSPM 在给定时间可以使用的最高性能状态所对应的 _PSS 项编号。OSPM 可以选择 _PPC 方法返回值所指示的 _PSS 中对应状态项,或 _PSS 中任何更低功耗(编号更高)的状态项。
参数:
无
返回值:
一个 Integer,包含受支持的状态范围
0 - 状态 0 到第 n 个状态可用(所有状态可用)
1 - 状态 1 到第 n 个状态可用
2 - 状态 2 到第 n 个状态可用
…
n - 仅状态 n 可用
为了支持 _PPC 对象的动态变化,允许在处理器对象上使用 Notify 事件。类型为 0x80 的 Notify 事件将导致 OSPM 重新求值驻留在被通知的特定处理器对象下的任何 _PPC 对象。这使得 AML 代码能够在由于异步事件(AC 插入/移除、已插接、已拔出等等)而导致受支持状态数量可能发生变化时通知 OSPM。
8.4.6.3.1. OSPM _OST 求值
当 _PPC 对象求值的处理完成时,OSPM 会对 _OST 对象求值(如果其存在于 Processor 设备下),以将 _PPC 求值状态传达给平台。下面描述了 _PPC 求值特有的 _OST 参数。
参数: (2)
Arg0 - 源事件(Integer) : 0x80 Arg1 - 状态码(Integer) : 见下文
返回值:
无
参数信息:
Arg1 - 状态码 0:成功 - OSPM 当前正在使用指定的性能状态 1:失败 - OSPM 未更改正在使用的性能状态数量。
8.4.6.4. 处理器性能控制示例
这是处理器对象列表中处理器性能控制对象的一个示例。
在此示例中,一个单处理器平台具有处理器性能能力,并支持如下三个性能状态:
500 MHz(8.2W)可在任何时候支持
600 MHz(14.9W)仅在 AC 供电时支持
650 MHz(21.5W)仅在已插接时支持
从一个性能状态切换到任何其他性能状态所需时间不超过 500 微秒。
在性能切换期间,总线主控最多有 300 微秒无法访问内存。
PERF_CTRL 和 PERF_STATUS 寄存器实现为 Functional Fixed Hardware。
系统中实现了以下 ASL 对象:
_SB.DOCK:如果系统已插接,则求值为 1,否则为 0。
_SB.AC:如果 AC 已连接,则求值为 1,否则为 0。
Processor (
\_SB.CPU0, // Processor Name
1, // ACPI Processor number
0x120, // PBlk system IO address
6 ) // PBlkLen
{
Name(_PCT, Package () // Performance Control object
{
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}, // PERF_CTRL
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)} // PERF_STATUS
}) // End of _PCT object
Name (_PSS, Package()
{
Package(){650, 21500, 500, 300, 0x00, 0x08}, // Performance State zero (P0)
Package(){600, 14900, 500, 300, 0x01, 0x05}, // Performance State one (P1)
Package(){500, 8200, 500, 300, 0x02, 0x06} // Performance State two (P2)
}) // End of _PSS object
Method (_PPC, 0) // Performance Present Capabilities method
{
If (\_SB.DOCK)
{
Return(0) // All _PSS states available (650, 600, 500).
}
If (\_SB.AC)
{
Return(1) // States 1 and 2 available (600, 500).
}
Else
{
Return(2) // State 2 available (500)
}
} // End of _PPC method
} // End of processor object list
当可用处理器性能状态的数量发生变化时,平台将发出 Notify(_SB.CPU0, 0x80) 以通知 OSPM 重新求值该对象。
8.4.6.5. _PSD(P-State 依赖关系)
此可选对象向 OSPM 提供性能控制、P-state 或 CPPC 逻辑处理器依赖信息。_PSD 对象求值为一个打包列表,其中包含单个项,用于表示一组逻辑处理器之间的性能控制依赖关系。
参数:
无
返回值:
一个包,其中包含单个项,该项由如下所述的 P-state 依赖关系包组成。
返回值信息
Package {
PStateDependency[0] // Package
}
PStateDependency 子包包含如下所述的元素:
Package {
NumEntries // Integer
Revision // Integer (BYTE)
Domain // Integer (DWORD)
CoordType // Integer (DWORD)
NumProcessors // Integer (DWORD)
}
表 8.22 P-State 依赖关系包值
| 元素 | 对象类型 | 描述 |
|---|---|---|
| 项数 | Integer | PStateDependency 包中的项数,包括该字段本身。当前值为 5。 |
| 修订 | Integer (BYTE) | PStateDependency 包格式的修订号。当前值为 0。 |
| 域 | Integer (DWORD) | 此 P 状态项所属的依赖域编号。 |
| 协调类型 | Integer (DWORD) | 支持的 P-state 协调类型见表 8.1。 |
| 处理器数量 | Integer (DWORD) | 属于此逻辑处理器 P-state 的域的处理器数量。在检测到并启动了同一域中的该数量处理器之前,OSPM 不会开始执行到特定 P-state 的电源状态切换。 |
示例
这是命名空间中 Processor 结构内 _PSD 结构的一个示例用法。该示例表示一个双处理器配置,每个处理器有三个性能状态。对于所有性能状态,两个处理器之间都存在依赖关系,因此一个处理器转换到某个特定性能状态时,会导致另一个处理器也转换到相同的性能状态。OSPM 将需要协调这两个处理器之间的 P-state 转换,并且可以在任一处理器上发起转换,以使两者都转换到共同的目标 P-state。
Processor (
\_SB.CPU0, // Processor Name
1, // ACPI Processor number
0x120, // PBlk system IO address
6 ) // PBlkLen
{
Name(_PCT, Package () // Performance Control object
{
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}, // PERF_CTRL
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)} // PERF_STATUS
}) // End of \_PCT object
Name (_PSS, Package()
{
Package(){650, 21500, 500, 300, 0x00, 0x08}, // Performance State zero (P0)
Package(){600, 14900, 500, 300, 0x01, 0x05}, // Performance State one (P1)
Package(){500, 8200, 500, 300, 0x02, 0x06} // Performance State two (P2)
}) // End of \_PSS object
Method (_PPC, 0) // Performance Present Capabilities method
{
} // End of \_PPC method
Name (_PSD, Package()
{
Package(){5, 0, 0, 0xFD, 2} // 5 entries, Revision 0), Domain 0, OSPM
// Coordinate, Initiate on any Proc, 2 Procs
}) // End of \_PSD object
} // End of processor object list
Processor (
\_SB.CPU1, // Processor Name
2, // ACPI Processor number
, // PBlk system IO address
) // PBlkLen
{
Name(_PCT, Package () // Performance Control object
{
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}, // PERF_CTRL
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)} // PERF_STATUS
}) // End of \_PCT object
Name (_PSS, Package()
{
Package(){650, 21500, 500, 300, 0x00, 0x08}, // Performance State zero (P0)
Package(){600, 14900, 500, 300, 0x01, 0x05}, // Performance State one (P1)
Package(){500, 8200, 500, 300, 0x02, 0x06} // Performance State two (P2)
}) // End of \_PSS object
Method (_PPC, 0) // Performance Present Capabilities method
{
} // End of \_PPC method
Name (_PSD, Package()
{
Package(){5, 0, 0, 0xFD, 2} // 5 entries, Revision 0, Domain 0, OSPM
// Coordinate, Initiate on any Proc, 2 Procs
}) // End of \_PSD object
} // End of processor object list
8.4.6.6. _PDL (P-state 深度限制)
这个可选对象求值为在执行被动热控制时 OSPM 可使用的最低性能 P-state 的 _PSS 条目编号。OSPM 可以选择 _PSS 中与 _PDL 对象返回值所指示的对应状态条目,或选择更高性能(编号更低)的状态条目,范围一直到并包括 _PPC 对象返回的 _PSS 条目编号,或者表中的第一个条目(如果未实现 _PPC)。_PDL 对象返回的值必须大于或等于 _PPC 对象返回的值;如果未实现 _PPC,则必须大于或等于 _PSS 中最后一个条目的对应值。如果 _PDL 和 _PPC 对象求值返回的值之间发生冲突,OSPM 优先采用 _PPC 对象,以限制功耗。
参数:
无
返回值:
一个 Integer,包含 P-state 深度限制的 _PSS 条目编号:
0 - P0 是 OSPM 可用的唯一 P-state
1 - 状态 1 是可用的最低功耗 P-state
2 - 状态 2 是可用的最低功耗 P-state
…
n - 状态 n 是可用的最低功耗 P-state
为了使平台能够动态指示 P-state 深度限制的变化,在处理器对象上类型为 0x80 的 Notify 事件将导致 OSPM 重新求值处理器对象列表中的任何 _PDL 对象。这使得 AML 代码能够在由于异步事件导致受支持性能状态数量可能发生变化时通知 OSPM。\