ACPI 中文文档ACPI 中文文档
首页
第 1 章
第 2 章
第 3 章
第 4 章
第 5 章
第 6 章
第 7 章
第 8 章
第 9 章
第 10 章
第 11 章
第 12 章
第 13 章
第 14 章
第 15 章
第 16 章
第 17 章
第 18 章
第 19 章
第 20 章
第 21 章
附录 A
首页
第 1 章
第 2 章
第 3 章
第 4 章
第 5 章
第 6 章
第 7 章
第 8 章
第 9 章
第 10 章
第 11 章
第 12 章
第 13 章
第 14 章
第 15 章
第 16 章
第 17 章
第 18 章
第 19 章
第 20 章
第 21 章
附录 A
  • 第 8 章

    • 总览
    • 8.1. 处理器电源状态
    • 8.2. 刷新缓存
    • 8.3. 电源、性能和节流状态依赖关系
    • 8.4. 声明处理器
      • 8.4.1. _PDC(处理器驱动程序能力)
      • 8.4.2. 处理器电源状态控制
      • 8.4.3. 处理器层次结构
      • 8.4.4. 更低功耗空闲状态
        • 8.4.4.1. 分层空闲状态
        • 8.4.4.2. 空闲状态协调
        • 8.4.4.3. _LPI(低功耗空闲状态)
        • 8.4.4.4. _RDI(空闲的资源依赖)
        • 8.4.4.5. 兼容性
      • 8.4.5. 处理器节流控制
      • 8.4.6. 处理器性能控制
      • 8.4.7. 协作式处理器性能控制
        • 8.4.7.1. _CPC(连续性能控制)
          • 8.4.7.1.1. 性能能力/阈值
          • 8.4.7.1.2. 性能控制
          • 8.4.7.1.3. 性能反馈
          • 8.4.7.1.4. CPPC 启用寄存器
          • 8.4.7.1.5. 自主选择启用寄存器
          • 8.4.7.1.6. 自主活动窗口寄存器
          • 8.4.7.1.7. 能量性能偏好寄存器
          • 8.4.7.1.8. OSPM 控制策略
          • 8.4.7.1.9. 使用 PCC 寄存器
          • 8.4.7.1.10. 与其他由 ACPI 定义的对象和通知的关系
          • 8.4.7.1.11. _CPC 实现示例
      • 8.4.8. _PPE(平台错误轮询)
    • 8.5. 处理器聚合器设备

8.4.4.3. _LPI(低功耗空闲状态)

_LPI 是一个可选对象,它提供了一种用于描述低功耗空闲状态的方法,该方法定义了分层处理器拓扑中每个节点的本地电源状态。OSPM 使用 _LPI 对象为系统中处理器层级的每一级选择一个本地电源状态。然后,这些本地状态选择用于生成一个复合电源状态请求,该请求由 OSPM 提交给平台。

该对象可用于 Processor Container 或处理器声明内部。_LPI 采用以下格式:

参数:

无

返回值:

一个变长的 Package,包含下表所述父 Processor 或 Processor Container 设备的本地电源状态。_LPI 求值返回以下格式:

Package {
   Revision,            // Integer (WORD)
   LevelID,             // Integer (QWORD)
   Count,               // Integer (WORD)
   LPI[1],              // Package
   ...
   LPI[N]               // Package
   }

表 8.11 父 Processor 或 Processor Container 的本地电源状态

元素对象类型描述
RevisionInteger (WORD)_LPI 对象的修订号。当前修订版本为 0。
LevelIDInteger (QWORD)平台定义的数字,用于标识处理器节点层级的级别,LPI 状态适用于该处理器节点。它用于生成“进入方法和组合”中描述的 OS 发起状态的 ID。在仅支持平台协调模式的平台中,此字段必须为 0。
CountInteger (WORD)后续 LPI Package 的计数。
LPI[1]Package一个包含 LPI 状态 1 定义的 Package。
LPI[N]Package一个包含 LPI 状态 N 定义的 Package。

每个 LPI 子 Package 包含以下所述元素:

Package() {
   Min Residency,                 // Integer (DWORD)
   Worst case wakeup latency,     // Integer (DWORD)
   Flags,                         // Integer (DWORD)
   Arch. Context Lost Flags,      // Integer (DWORD)
   Residency Counter Frequency,   // Integer (DWORD)
   Enabled Parent State,          // Integer (DWORD)
   Entry Method,                  // Buffer (ResourceDescriptor) or
                                  // Integer (QWORD)
   Residency Counter Register     // Buffer (ResourceDescriptor)
   Usage Counter Register         // Buffer (ResourceDescriptor)
   State Name                     // String (ASCIIZ)
   }

表 8.12 扩展 LPI 字段

对象对象类型描述
最小驻留时间Integer (DWORD)最小驻留时间 - 以微秒为单位的时间,超过该时间后,某状态将比任何更浅的状态都更节能。参见功耗、最小驻留时间和最坏情况唤醒延迟。
最坏情况唤醒延迟Integer (DWORD)从唤醒中断被置位到所属层级节点(处理器或处理器容器)返回运行状态的最坏情况时间(以微秒为单位)。参见 功耗、最小驻留时间和最坏情况唤醒延迟。
标志Integer (DWORD)有效标志在 LPI 状态的标志 中描述。
体系结构上下文丢失标志Integer (DWORD)体系结构特定的上下文丢失标志。这些标志可由处理器体系结构用于指示哪些处理器上下文可能因该电源状态而丢失,并且必须由 OSPM 处理。更多详细信息请参见 体系结构特定的上下文丢失标志。
驻留计数器频率Integer (DWORD)驻留计数器频率,单位为每秒周期数(Hz)。值 0 表示计数器以体系结构特定的频率运行。仅当定义了驻留计数器寄存器时有效。
已启用父状态Integer (DWORD)父级中的每一个更浅电源状态也都启用。0 表示在父节点上不能进入任何本地空闲状态。
进入方法Buffer or Integer (QWORD)这可以包含资源描述符或整数。可使用带有单个 Register() 描述符的资源描述符来描述为了进入该电源状态而必须读取的寄存器。或者,也可以提供一个整数,在这种情况下,该整数将用于组成进入此状态所必须使用的最终寄存器值。该组成过程在下文 进入方法和组成 中描述。
驻留计数器寄存器Buffer可选的驻留计数器寄存器,用于提供所属层级节点处于该本地电源状态的时间量。时间以驻留计数器频率字段所表示的频率提供(见上文)。该寄存器是可选的。如果平台不支持它,则应使用以下 NULL 寄存器描述符:ResourceTemplate() {Register {(SystemMemory, 0, 0, 0, 0)}} 。
使用计数器寄存器Buffer可选寄存器,用于提供所属层级节点处于该本地电源状态的次数。如果平台不支持此寄存器,则应使用以下 NULL 寄存器描述符:ResourceTemplate() {Register {(SystemMemory, 0, 0, 0, 0)}}
状态名称String (ASCIIZ)包含该 LPI 状态的人类可读标识符的字符串。此元素是可选的;如果不支持,则应使用空字符串(空字符)。

表 8.13 LPI 状态的标志

对象位描述
已启用0如果电源状态已启用可供使用,则为 1

并不要求所有处理器或处理器容器都包含 _LPI 对象。但是,如果某个处理器容器包含 _LPI 对象,则其所有子处理器或处理器容器都必须具有 _LPI 对象。

以下各节将更详细地描述 LPI 的更复杂属性,以及支配 LPI 状态唤醒的规则。

8.4.4.3.1. 禁用状态

当通过清除 标志 字段中的 已启用 位来禁用某个本地状态时,该节点的任何更深状态都_不会_重新编号。这使得依赖于该节点状态列表索引的其他属性(例如 已启用父状态)无需更改。

OS 不应请求已禁用的状态,并且驻留/使用计数器寄存器返回的值是未定义的。

8.4.4.3.2. 已启用父状态

如上所述,LPI 表示本地状态,必须将其组合成复合状态。然而,并非每一种组合都是可能的。请考虑“处理器层级的电源状态”中描述的示例系统。在此系统中,不可能同时为 Core0 选择时钟门控作为本地状态、并为 Cluster0 选择断电作为本地状态。由于 Core0 在物理上位于 Cluster0 中,对集群进行电源门控就意味着对核心进行电源门控。该示例系统的正确本地状态组合在前述示例系统的“有效本地状态组合”中进行了描述。LPI 状态通过 已启用父状态 (EPS) 属性支持枚举这些正确的组合。

LPI 状态采用从 1 开始的索引。与 C 状态和 S 状态类似,LPI0 被视为运行状态。对于给定的 LPI,EPS 是处理器容器 _LPI 状态中的一个从 1 开始的索引。该索引指向给定 LPI 状态所启用的父处理器最深本地电源状态。父级中每一个更浅的电源状态也都启用。以图 8.7 所描述的系统为例,这些状态及其状态的 EPS 值在下面的表 8.14 中描述。

表 8.14 示例系统的已启用父状态值

类别 / 位值状态已启用父状态
系统级 ProcessorContainer LPI 状态
0运行不适用
1断电0
集群级 ProcessorContainer LPI 状态
0运行不适用
1时钟门控0 – 如果集群处于时钟门控,则系统必须处于运行状态
2保持0 – 如果集群处于保持状态,则系统必须处于运行状态
3断电1 – 如果集群处于断电状态,则系统可以处于断电状态
核心级 ProcessorContainer LPI 状态
0运行不适用
1时钟门控1 – 如果核心处于时钟门控,则集群可以处于时钟门控或运行状态
2保持2 – 如果核心处于保持状态,则集群可以处于运行、时钟门控或保持状态
3断电3 – 如果核心断电,则支持集群级别的所有状态

8.4.4.3.3. 功耗、最小驻留时间和最坏情况唤醒延迟

_LPI 中不包含功耗,因为不同状态的相对功耗(连同用于理解转换能量的最小驻留时间),而不是绝对功耗,驱动 OSPM 的空闲状态决策。为了正确传达相对功耗,_LPI 中的本地状态必须按功耗顺序声明。也就是说,特定层级节点的本地状态必须按从最高功耗(最浅)到最低功耗(最深)的顺序列出。

特定本地状态的最坏情况唤醒延迟(WCWL)是指从唤醒中断被置位起,到层级节点能够恢复执行为止的最长时间。通常,WCWL 将是空闲状态退出延迟加上其部分进入延迟。进入流程中包含多少,取决于平台在何处(以及是否)支持检查挂起的唤醒事件并中止空闲状态进入。对于任何给定的电源状态,都会存在一个“无法返回点”,在此之后进入该电源状态将无法逆转。这在下面的“最坏情况唤醒延迟”中有所说明。WCWL 必须包括从无法返回点到可以处理中断唤醒时刻之间的时间段。

../_images/Processor_Configuration_and_Control-9.png

图 8.8 最坏情况唤醒延迟

请注意,其他最坏情况路径也可能最终决定 WCWL,但上述描述预计是最常见的。例如,在 OS 发出空闲请求与无法返回点之间,平台可能还存在另一个不检查唤醒事件的时间段,并且该时间段长于进入和退出该电源状态所花费的时间。在这种情况下,该时间段将成为最坏情况唤醒延迟。

../_images/Processor_Configuration_and_Control-10.png

图 8.9 状态 A、B 和 C 的能量与睡眠持续时间的关系

最小驻留时间(MR)是指超过该时间后,某状态比任何更浅状态都更节能的时间。该参数回答了一个基本问题:层级节点需要在空闲状态中停留多长时间,才能抵消进出转换的能量成本,并使选择该状态相对于更浅的替代状态成为净收益?请注意,这还包括与不进入空闲状态并保持节点运行进行比较。这在“状态 A、B 和 C 的能量与睡眠持续时间的关系”中有所说明,该图展示了三种不同状态选择的能量如何作为睡眠持续时间的函数而变化。请注意,图中未显示状态 A 相对于保持节点运行时的 MR。

通常,较深状态的最小驻留时间和最坏情况唤醒延迟会更大,但情况并非总是如此。换一个与上述不同的例子,考虑两个系统级状态 StateY 和 StateZ,它们具有相似的进入开销,但 StateZ 比 StateY 节省更多功耗。一个抽象的状态列表可能如下所示:

StateX: MR = 100 us
StateY: MR = 1000 us
StateZ: MR = 800 us, power resource A must be OFF

从能量角度看,StateZ 总是更优,但在本例中,StateZ 只有在满足某些设备依赖关系时才可用。这使得当依赖关系无法满足时,StateY 变得有吸引力。尽管 StateZ 是更深(更低功耗)的状态,但它的 MR 却低于 StateY,因为进入开销相似,而 StateZ 的更低功耗能更快摊销转换成本。尽管设定 MR 的交叉点通常应当相对于下一个更浅状态,但 MR 被定义为相对于任何更浅(更高功耗)状态,以处理诸如此类的情况。在这种情况下,StateZ 的 MR 由它与 StateX 的交叉点决定,因为只要设备依赖关系允许,StateZ 总是优于 StateY。为了实现最低能耗,OSPM 必须选择满足所有进入约束的最深(最低功耗)状态,并且不应仅仅因为未达到某个更浅状态的 WCWL/MR 阈值,就假定更深状态不可行。

由于 WCWL 可被 OSPM 用于限制空闲状态选择并保证对关键中断的响应时间,因此应保守地设置它(偏向较高值),以便 OSPM 不会遇到比规定更差的中断响应时间。另一方面,MR 有助于 OSPM 做出高效决策。如果在某种场景下 MR 不准确,而 OSPM 选择了对特定空闲周期来说比最优方案更深或更浅的状态,则可能会浪费一些能量,但系统在功能上不会损坏。这并不是说 MR 不重要——能效很重要——只是平台可以选择基于典型情况而不是最坏情况来优化 MR。

8.4.4.3.3.1. 跨层级级别的最小驻留时间和最坏情况唤醒延迟组合

_LPI 中的 WCWL 针对的是特定本地状态。在将复合状态选择与系统延迟容限一起评估、作为空闲状态选择的一部分时,OSPM 将跨层级级别累加唤醒延迟。例如,如果一个系统具有核心断电且 WCWL = 50 us,以及集群断电且 WCWL = 20 us,则核心断电 + 集群断电复合状态的延迟计算为 70 us。

在 _LPI 中定义的 MRs 适用于特定的层级节点。隐含的假设是,每个层级节点都表示一个独立的可电源管理域,并且可以单独考虑。例如,假设当底层核心处于核心断电或核心保持状态时,集群保持状态是合法的。集群保持的 MR 基于将核心之外的共享逻辑进入和退出保持状态的能量成本,与该共享逻辑处于该状态时所实现的稳态功耗节省进行权衡。关键在于,在核心级别选择的具体状态并不会从根本上影响集群级别的决策,因为该决策与核心之外共享逻辑的属性相关。进入/退出集群状态的能量成本以及它所提供的功耗节省,独立于核心是处于保持状态还是断电状态。基于此,在 ACPI 中,MRs 被视为按层级彼此独立。也就是说,当将不同状态的 MR 与特定节点的预期睡眠持续时间进行比较时,OSPM 直接使用该节点的 _LPI 中定义的 MRs,而不根据层级较低级别的状态进行调整(当然,该状态必须基于较低级别状态的 Enabled Parent State 属性而合法)。

8.4.4.3.3.2. 最小驻留时间和最坏情况唤醒延迟的已知限制

请注意,WCWL 和 MR 参数并不完美。例如,它们不会随频率、电压、温度以及可能影响它们的各种其他因素而缩放。它们跨层级组合的规则也并不完美。例如,集群级别的 MRs 可能会因核心状态选择而略有变化,因为核心状态的进入延迟会延后进入集群状态,从而降低预期睡眠持续时间。集群级别的 MR 可以调整以涵盖这一点,但如果多个具有不同进入延迟的核心级别状态都能使同一个集群状态可用,那么它的 MR 就无法完美涵盖所有这些情况。尽管如此,这组参数和组合方案被认为在简单性/可用性与准确性之间取得了良好的平衡。

8.4.4.3.4. 进入方法与组合

OSPM 组合本地 LPI 状态以创建总体复合电源状态。每个 LPI 状态都提供一个进入方法字段。对于所选本地电源状态,这些字段会被组合起来,以创建必须读取才能进入给定复合电源状态的进入方法寄存器。

为了从本地状态的进入方法推导出适当的寄存器地址,使用以下方法:

  1. 处理器的本地状态始终声明基于寄存器的进入方法。这提供了一个基础寄存器。

  2. 更高层级可以使用整数或寄存器。如果使用 Integer,则其值必须加到步骤 1 中获得的基础寄存器上。如果使用寄存器,则它成为新的基础寄存器,覆盖先前的任何值。请注意,在这种情况下,所选的 LPI 必须隐含所有较低层级节点的特定本地 LPI 选择。

  3. 在 OS 发起模式下,还必须由 OSPM 告知平台:调用处理器在哪个层级上是最后一个进入空闲的。这是通过将层级节点的 LPI 的 Level ID 属性加到基础寄存器来完成的。

下面的伪代码展示了平台协调系统中进入状态的基本组合算法:

Reg = SelectedLocalState(CurrentProcessor).EntryMethod
WCWL = SelectedLocalState(CurrentProcessor).WCWL
MR = SelectedLocalState(CurrentProcessor).MR

for level = Parent(CurrentProcessor) to system
   LocalState = SelectedLocalState(level)
   If LocalState == Run
      break
   EM = LocalState.EntryMethod
   WCWL = WCWL+ LocalState.WCWL
   MR = LocalState.MR
   If IsInteger(EM)
      Reg.Addr = Reg.Addr+ZeroExtend(EM)
   Else
      // Entry method here overrides any previous method
      Reg = EM
CompositeState.EntryMethod = Reg
CompositeState.WCWL=WCWL
CompositeState.MR=MR

在 OS 发起模式下,还必须由 OSPM 告知平台:调用处理器在哪个层级上是最后一个进入空闲的,并请求一个电源状态。为此,上述算法修改如下:

Reg = SelectedLocalState(CurrentProcessor).EntryMethod
WCWL = SelectedLocalState(CurrentProcessor).WCWL
MR = SelectedLocalState(CurrentProcessor).MR

RegDecided = False
                      // Retrieve Level Index from Processor's \_LPI object
LastLevel = GetLevelIDOfLevel(CurrentProcessor)

for level = Parent(CurrentProcessor) to system
   LocalState = SelectedLocalState(level)

   If LocalState == Run
      break
   EM = LocalState.EntryMethod
   WCWL = WCWL+ LocalState.WCWL

      EM = LocalState.EntryMethod
      If IsInteger(EM)
         Reg.Addr = Reg.Addr+ZeroExtend(EM)
      Else
                      // Entry method is register
         Reg = EM

If IsProcessorLastInLevel(CurrentProcessor,level)
                      // If calling processor is last one to go idle in
                      // current level, retrieve Level Index from
                      // the container's \_LPI object
         LastLevel = GetLevelIDOfLevel(level)

Reg.Addr = Reg.Addr+LastLevel
CompositeState.EntryMethod = Reg
CompositeState.WCWL=WCWL
CompositeState.MR=MR

在平台协调系统中,属于处理器级别之上某个层级节点的 LPI 可以使用整数值零作为其进入方法。由于进入方法组合是通过加法完成的,这会导致该状态的进入命令与仅包含其子节点的复合状态相同。进入值 0 本质上将某个状态标识为“可自动提升”。这意味着 OS 不会显式请求进入该状态,但当所有子节点都已进入基于其 EPS 属性允许父状态的状态时,平台可以自动进入该状态。对于涉及可自动提升本地状态的复合状态,OSPM 在包含其他参数(最坏情况唤醒延迟、最小驻留时间等)时应遵循正常的组合过程。

这在以下示例中进行了说明:

Device (SYSM) {                   // System level states
   Name (_HID, "ACPI0010")
   Name (_UID, 0)
   Name (_LPI,
      Package() {
         0,                       // Version
         0,                       // Level ID
         1,                       // Count

         Package () {             // Power gating state for system
            900,                  // Min residency (uS)
            400,                  // Wake latency (uS)
            0,                    // Enabled Parent State
            ...                   // (skipped fields). . .
            ResourceTemplate () {
                                  // Register Entry method
               Register(FFH,0x20,0x00,0x00000000DECEA5ED,0x3)
            },
            ...                   // (skipped fields). . .
         }
      )

      Device (CLU0) {             // Package0 state
         Name (_HID, "ACPI0010")
         Name (_UID, 1)
         Name (_LPI,
            Package() {
               0,                 // Version
               0,                 // Level ID
               2,                 // Count
               Package () {       // Retention state for Cluster
                  40,             // Min residency (uS)
                  20,             // Wake latency (uS)
                  ...             // (skipped fields). . .
                  0,              // System must be running
                  0,              // Integer Entry method
                  ...             // (skipped fields). . .
                  },
               Package () {       // Power Gating state for Cluster
                  100,            // Min residency (uS)
                  80,             // Wake latency (uS)
                  ...             // (skipped fields). . .
                  1,              // System may power down
                  0x1020000,      // Integer Entry method
                  ...             // (skipped fields). . .
                  }
               }
            )
         Name(PLPI,
            Package() {
               0,                 // Version
               0,                 // Level ID
               2,                 // Count
               Package () {       // Retention state for CPU
                  40,             // Min residency (uS)
                  20,             // Wake latency (uS)
                  ...             // (skipped fields). . .
                  1,              // Parent node can be
                                  // in retention or running
                  ResourceTemplate () {
                                  // Register Entry method
                     Register(FFH,
                        0x20,0x00,
                        0x000000000000DEAF,0x3),
                     }
                  ...             // (skipped fields). . .
                  },
               Package () {       // Power Gating state for CPU
                  100,            // Min residency (uS)
                  80,             // Wake latency (uS)
                  ...             // (skipped fields). . .
                  2,              // Parent node can be in any state
                  ResourceTemplate () {
                                  // Register Entry method
                     Register(FFH,
                        0x20,0x00,
                        0x0000000000000DEAD,0x3),
                     }
                  ...             // (skipped fields). . .
                  }
               }
            )
         Device (CPU0) {          // Core0
               Name (_HID, "ACPI0007")
               Method (_LPI, 0, NotSerialized)
            {
                  return(PLPI)
            }
         }
         Device (CPU1) { // Core1
               Name (_HID, "ACPI0007")
               Method (_LPI, 0, NotSerialized)
            {
                  return(PLPI)
            }
         }
   }                              // end of NOD0
   Device (CLU1) {                // Package1 state
         Name (_HID, "ACPI0010")
         Name (_UID, 2)
      ....
   }
} // End of SYM

在上面的示例中,CPU0 和 CPU1 上的 OSPM 将能够选择以下复合状态:

表 8.15 进入方法示例

Core LPICluster LPISystem LPI复合状态进入方法
保持 Register: 0xDEAF运行运行核心保持 Register: 0xDEAF
断电 Register 0xDEAD运行运行核心断电 Register: 0xDEAD
保持 Register: 0xDEAF保持 Integer: 0x0运行核心保持 保持 Register 0xDEAF+0x0 = 0xDEAF
断电 Register: 0xDEAD保持 Integer: 0x0运行核心断电 保持 Register 0xDEAD+0x102000 0 = 0xDEAD
断电 Register: 0xDEAD断电 Integer: 0x1020000运行核心断电 断电 Register 0xDEAD+0x102000 0 = 0x102DEAD
断电 Register: 0xDEAD断电 Integer: 0x1020000断电 Register : 0xDECEA5ED系统断电 Register 0xDECEA5ED

如示例所示,集群级别的保持状态将整数值 0 定义为其进入方法。根据组合规则,这意味着复合状态核心断电和核心断电|集群保持的进入方法相同(FFH 寄存器 0xDEAD)。类似地,复合状态核心保持和核心保持|集群保持也是相同的(FFH 寄存器 0xDEAF)。因此,如果 CPU0 和 CPU1 都处于断电或电源保持状态之一,则平台可以使集群 CLU0 进入保持状态。

该示例还展示了基于寄存器的进入方法如何在高层覆盖低层的进入方法定义。如上所述,这只有在所选的 LPI 在所有较低层级都蕴含特定 LPI 时才可能。在本示例中,通过 FFH 寄存器 0xDECEA5ED 进入的系统断电 LPI,蕴含了核心级和簇级的断电 LPI,因为根据 EPS,不存在其他核心/簇本地状态能够使能系统断电。

8.4.4.3.5. 体系结构特定的上下文丢失标志

对于基于 Intel 的系统,该标志寄存器的值为 0。

对于基于 ARM 的系统,请参阅“ARM FFH 规范”标题下指向 ACPI-相关文档( http://uefi.org/acpi )的链接。

8.4.4.3.6. 驻留和进入计数器寄存器

LPI 状态描述可以选择性地提供驻留和使用计数寄存器,以允许 OSPM 收集平台对给定本地状态的使用统计信息。这两个寄存器都提供各自统计信息的运行计数。为了测量某个时间窗口内的统计值,OSPM 应在开始和结束时进行采样并计算增量。计数器在各种复位/S-state 退出情况下是否从 0 重新开始由实现定义,因此 OSPM 应在任何复位或 Sx 退出时重新同步其基线。

这些寄存器是可选的,如果该特性不存在,平台必须使用如下形式的 NULL 寄存器:

ResourceTemplate() {Register {(SystemMemory, 0, 0, 0, 0)}}

使用计数寄存器对本地状态被使用的次数进行计数。它计数进入还是退出由实现定义。

驻留寄存器以 LPI 的 Residency Counter Frequency 字段给出的速率,统计层级节点处于给定 LPI 状态的时长。频率为 0 表示该计数器以体系结构特定的频率运行。驻留计数器是在处于本地状态期间连续运行,还是仅在退出时更新,由实现定义。如果 OSPM 想要保证特定状态的读数是最新的,则应从该处理器本身读取(或者对于更高层级空闲状态,从其底层子处理器之一读取)。

8.4.4.3.7. 从 LPI 状态唤醒

借助 _LPI,平台可以描述较深的 S0-idle 状态,这些状态可能会关闭诸如总线时钟、中断控制器等基础资源,因此必须特别注意确保平台能够从这些状态被唤醒。本节描述设备发起的唤醒处理。还有其他唤醒源,例如定时器,这些将在别处描述。

对于设备唤醒,要求是 OSPM 不得进入任何会阻止已启用唤醒的设备唤醒系统的 LPI 状态。这意味着不得进入任何其 _RDI 中列出的任一电源资源(参见 _RDI 章节 _RDI(空闲的资源依赖))需要为 ON 的 LPI 状态。注意,在平台协调系统中,即使其配套 RDI 中列出的资源仍然开启,OSPM 也可以选择进入某个 _LPI 状态。然而,如果 OSPM 已经为某个设备启用了唤醒,并确保唤醒所需的电源资源处于开启状态,则平台会将 LPI 状态降级为这些资源保持开启的状态。

唤醒设备使用标准的 _PRx 和 _PRW 方法来描述基于其 D-state 和唤醒启用状态而要求为 ON 的电源资源。这进一步意味着,任何已启用唤醒并依赖于某个资源,而该资源可能作为 LPI 状态的一部分被关闭的设备,都必须通过 _PRx/_PRW => _RDI => _LPI 来描述该依赖关系。

如下示例对此进行了说明:

PowerResource(PWRA,0,0) {...}
PowerResource(PWRB,0,0) {...}
PowerResource(PWRC,0,0) {...}
PowerResource(PWRD,0,0) {...}
PowerResource(PWRE,0,1) {...}

Device (FOO) {
   Name(_S0W, 4) //Device in D3Cold can wake system from S0-idle
   Name(_PR0,Package(){PWRA, PWRB, PWRC})
   Name(_PR2,Package(){PWRA, PWRB})
   Name(_PR3,Package(){PWRA})
   Name(_PRE,Package(){PWRD})
   Name(_PRW,Package(){0, 0, PWRD} // PWRD must be ON for FOO to wake system
}

Device (BAR) {
   Name(_S0W, 3) // Device in D3Hot can wake system from S0-idle
   Name(_PR0,Package(){PWRA, PWRB})
   Name(_PR3,Package(){PWRC})
   Name(_PRW,Package(){PWRC}) // PWRC must be ON for BAR to wake system

}
Device (BAH) {
   Name(_S0W, 0) // This device can only wake the system from
                            // S0-idle if it is in D0
   Name(_PR0,Package(){PWRA, PWRB, PWRC})
}
Device (SYM) {
   Name(_RDI,
      Package() {
         0,                              // Version
         Package(){}                     // Local State 1 is Shallow;
                                         // Devices FOO, BAR and BAH can wake
                                         // the system if enabled for wake
         Package(){PWRA, PWRB}           // RDI for Local State 2. State is deeper
                                         // Device BAH cannot wake the system if this
                                         // state is used, as it needs PWRA and PWRB
                                         // to be able to wake the system
         Package(){PWRA, PWRB, PWRC}     // RDI for Local State 3.
                                         // Devices BAH and BAR cannot wake
                                         // the system, BAH needs PWRA, PWRB
                                         // and PWRC, and BAR needs PWRC
                                         // for all devices
      Package(){PWRA, PWRB, PWRC, PWRD}  // None of the devices listed
                                         // above could wake the system
      })
   ...

上述示例声明了一组电源资源(PWRA/B/C/D)。此外,它还有四个系统级本地状态,具有以下依赖关系:

  • LPI 1:没有电源资源依赖

  • LPI 2:要求 PWRA 和 PWRB 关闭

  • LPI 3:要求 PWRA、PWRB 和 PWRC 关闭

  • LPI 4:要求示例中的所有电源资源都关闭

设备 BAH 只有在其处于 D0 状态时才能唤醒系统。要处于 D0,它要求 PWRA、PWRB 和 PWRC 处于开启状态。因此设备 BAH 只能从 LPI 1 唤醒系统。如果该设备已启用唤醒,则平台不得进入 LPI 2 或更深的状态。

设备 BAR 可以在其处于除 D3Cold 之外的任何设备状态时唤醒系统。然而,为此它要求 PWRC 处于开启状态。因此它只能从 LPI 1 或 LPI 2 唤醒系统。如果该设备已启用唤醒,则平台不得进入 LPI 3 或更深的状态。

设备 FOO 可以在其处于任何设备状态时唤醒系统。然而,为此它要求 PWRD 处于开启状态。因此它只能从 LPI 1、LPI 2 或 LPI 3 唤醒系统。如果该设备已启用唤醒,则平台不得进入 LPI 4。

8.4.4.3.8. 默认空闲状态

层级中每个叶节点的最浅空闲状态是该处理器的“默认”空闲状态,并假定始终可以进入。该状态的最坏情况唤醒延迟和最小驻留时间必须足够低,以至于 OSPM 在决定是否使用它时无需考虑这些因素。除将处理器置于某种电源状态之外,该状态没有其他软件可见的影响。例如,它不会丢失任何 OSPM 必须保存/恢复的上下文,也没有任何设备依赖关系。

Prev
8.4.4.2. 空闲状态协调
Next
8.4.4.4. _RDI(空闲的资源依赖)