7.2. 声明电源资源对象
ASL 的 PowerResource 语句用于声明一个 PowerResource 对象。电源资源对象指软件可控制的供电平面、时钟平面或其他资源,集成的 ACPI 电源管理设备可能依赖这些资源。电源资源对象可以出现在命名空间中任何方便的位置。
PowerResource 语句的语法为:
PowerResource (resourcename, systemlevel, resourceorder) {TermList}
其中 systemlevel 参数是一个数字,resourceorder 参数是一个数值常量(一个 WORD)。有关 PowerResource 语句语法的正式定义,参见第 7.2 节。
Systemlevel 是 OSPM 为保持该电源资源处于开启状态而必须维持的最深系统睡眠级别(0 等同于 S0,1 等同于 S1,依此类推)。
每个受电源管理的 ACPI 设备都会列出其在受支持电源状态下所需的资源。OSPM 汇总所有设备中的这些信息,然后相应地启用和禁用所需的 Power Resources。Power Resource 对象中的 resourceorder 字段是每个 Power Resource 的一个值,它向系统提供必须启用或禁用 Power Resources 的顺序。每个唯一的 resourceorder 值代表一个级别,并且任意数量的电源资源都可以具有相同的级别。Power Resource 级别按从低值到高值的顺序启用,按从高值到低值的顺序禁用。操作软件会在进入下一个有序级别之前,一次性启用或禁用任一 resourceorder 级别中的所有 Power Resources。将 Power Resources 放在不同的顺序级别中,可在需要时提供电源时序和串行化。请注意,在每个级别内部不保证顺序(即具有相同 resourceorder 值的 Power Resources 之间)。
Power Resource 可以在其命名空间位置下包含命名对象。有关 ACPI 为 Power Resource 定义的命名对象说明,参见 设备电源管理对象
电源管理对象列表被编码为 TermList,因此不必描述静态的电源管理对象列表,而是可以根据系统设置描述动态的电源管理对象列表。参见“定义块加载。
下面的 ASL 代码块示例演示了 PowerResource 的使用:
PowerResource(PIDE, 0, 0) {
Method(_STA) {
Return (Xor (GIO.IDEI, One, Zero)) // inverse of isolation
}
Method(_ON) {
Store (One, GIO.IDEP) // assert power
Sleep (10) // wait 10ms
Store (One, GIO.IDER) // de-assert reset#
Stall (10) // wait 10us
Store (Zero, GIO.IDEI) // de-assert isolation
}
Method(_OFF) {
Store (One, GIO.IDEI) // assert isolation
Store (Zero, GIO.IDER) // assert reset#
Store (Zero, GIO.IDEP) // de-assert power
}
}
7.2.1. 电源资源的已定义方法
下方的 Power Resource Methods 表列出了可以在电源资源下定义的控制方法。_ON、_OFF 和 _STA 是必需的,以便对每个电源资源进行基本控制。在通过共享电源资源管理设备复位的情况下,_RST 是必需的。当 OSPM 改变系统中设备对象的状态时,所需的电源资源也会发生变化,从而导致 OSPM 打开和关闭电源资源。为了确定初始电源资源设置,可以使用 _STA 方法。在通过共享 Power Resource 控制设备复位的情况下,_RST 是必需的(参见 _RST(设备复位))。
表 7.2 电源资源方法
| 对象 | 说明 |
|---|---|
| _OFF | 将资源设为关闭。 |
| _ON | 将资源设为开启。 |
| _RST | 执行平台级复位,复位所有在其 _PRR 对象中列出此资源的设备的对象。(有关此对象的说明,参见 _RST(设备复位)。) |
| _STA | 求值为 Power Resource 当前开启或关闭状态的对象。0-OFF,1-ON |
7.2.2. _OFF
此电源资源控制方法将电源资源置于 OFF 状态。在电源资源关闭之前,控制方法不得完成,这包括对电源资源执行操作期间或之后所需的任何时序延迟。OSPM 一次只允许开启或关闭一个资源。AML 代码可以在该方法中使用 Stall 或 Sleep 来产生适当的时序延迟。OSPM 不要求运行 _STA 方法来确认资源已成功关闭,并且即使资源已经关闭,也可以重复运行 _OFF 方法。
参数:
None
返回值:
None
7.2.3. _ON
此电源资源控制方法将电源资源置于 ON 状态。在电源资源开启之前,控制方法不得完成,这包括对电源资源执行操作期间或之后所需的任何时序延迟。OSPM 一次只允许开启或关闭一个资源。AML 代码可以在该方法中使用 Stall 或 Sleep 来产生适当的时序延迟。OSPM 不要求运行 _STA 方法来确认资源已成功开启,并且即使资源已经开启,也可以重复运行 _ON 方法。
参数:
None
返回值:
None
7.2.4. _STA(电源资源状态)
返回电源资源当前的 ON 或 OFF 状态。
参数:
None
返回值:
一个 Integer,包含设备当前的电源状态:
0 - 电源资源当前关闭
1 - 电源资源当前开启
7.2.5. 被动电源资源
在某些平台中,某些电源资源可能由设备和处理器共享,这要求二者都处于特定的空闲状态之后才能将这些资源关闭。当 OS 正在运行时,无法直接由 OSPM 控制此类资源,因为处理器在运行期间依赖这些资源保持启用。只有当处理器进入空闲状态时,才有可能关闭这些共享资源。对于给定的此类资源,除了处理器处于空闲状态之外,还只有在任何其他依赖该资源的设备也处于允许将其断电的状态时,这才是可能的。在这些情况下,平台可以将该电源资源作为进入/退出低功耗空闲(LPI)状态的一部分进行管理,而 OSPM 可以通过其 LPI 状态请求来指导是否关闭这些资源的决策。在这些情况下,电源资源 _ON/_OFF/_STA 方法完全是多余的。
为支持这种情况,引入了被动电源资源,它们与传统电源资源类似,只是它们不包含 _ON、_OFF 或 _STA。省略这些方法可通过避免冗余求值来减少开销,并使平台不必提供其不需要的(可工作的)方法。由于 OSPM 无法通过 _ON/_OFF 直接管理被动电源资源,因此被动电源资源必须被列为至少一个 LPI 状态的依赖项,在该状态下平台将操作它们。LPI 状态与电源资源之间的依赖关系在 _RDI 对象中描述。有关更多详细信息,请参见 _RDI(空闲资源依赖关系)。