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.2. 处理器电源状态控制

ACPI 定义了多种处理器电源状态(C 状态)控制接口。它们是:

  1. 处理器寄存器块(P_BLK 的)P_LVL2 和 P_LVL3 寄存器,以及配套的 FADT P_LVLx_LAT 值,以及

  2. 处理器对象列表中的 _CST 对象。

  3. 处理器和处理器容器的 _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 状态包值

元素对象类型说明
RegisterBuffer包含一个资源描述符,其中带有单个 Register() 描述符,用于描述 OSPM 必须读取以使处理器进入相应 C 状态的寄存器。
TypeInteger(BYTE)C 状态类型(1=C1,2=C2,3=C3)。该字段向 OSPM 传达在进入/退出 C 状态时要使用的语义。零不是有效值。
LatencyInteger(WORD)进入和退出该 C 状态的最坏情况延迟(以微秒为单位)。没有延迟限制。
PowerInteger(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 状态依赖包值

元素对象类型描述
NumEntriesIntegerCStateDependency 包中的条目数,包括此字段。当前值为 6。
RevisionInteger (BYTE)CStateDependency 包格式的修订号。当前值为 0。
DomainInteger (DWORD)此 C 状态条目所属的依赖域编号。
CoordTypeInteger (DWORD)有关受支持的 C-state 协调类型,请参见表 8.1。
Num ProcessorsInteger (DWORD)对于特定 C-state,属于该域的处理器数量。在检测到并启动同一域中属于该特定 C-state 的这么多个处理器之前,OSPM 不会开始执行到特定 C-state 的电源状态转换。
IndexInteger (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。

Prev
8.4.1. _PDC(处理器驱动程序能力)
Next
8.4.3. 处理器层次结构