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
  • 第 4 章

    • 总览
    • 4.1. 硬件精简型 ACPI
    • 4.2. 固定硬件编程模型
    • 4.3. 通用硬件编程模型
    • 4.4. 图例
    • 4.5. 寄存器位表示法
    • 4.6. ACPI 硬件模型
    • 4.7. ACPI 硬件功能
    • 4.8. ACPI 寄存器模型
      • 4.8.1. ACPI 寄存器摘要
      • 4.8.2. 固定硬件特性
      • 4.8.3. 电源管理定时器
      • 4.8.4. 固定硬件寄存器
      • 4.8.5. 通用硬件寄存器

4.8. ACPI 寄存器模型

ACPI 硬件驻留在以下六种地址空间之一中:

  • 系统 I/O

  • 系统内存

  • PCI 配置空间

  • 系统管理总线

  • 嵌入式控制器

  • 功能固定硬件

不同的实现会导致不同的地址空间用于不同的功能。ACPI 规范由固定硬件寄存器和通用硬件寄存器组成。固定硬件寄存器是实现 ACPI 定义接口所必需的。通用硬件寄存器则用于由增值硬件生成的任何事件。

ACPI 定义了寄存器块。兼容 ACPI 的系统提供一个 ACPI 表(FADT,在启动时构建于内存中),其中包含 OSPM 使用的不同固定硬件寄存器块的指针列表。这些寄存器中的位具有为给定寄存器块定义的属性。ACPI 定义的寄存器类型包括:

  • 状态/使能寄存器(用于事件)

  • 控制寄存器

如果一个寄存器块属于状态/使能类型,那么它将包含一个带有状态位的寄存器,以及一个对应的带有使能位的寄存器。状态位和使能位具有必须遵循的精确定义实现(除非另有说明),如下图所示:

../_images/Block_diagram_of_a_status_cell_enable.PNG

图 4.4 状态/使能单元框图

请注意,在此示例中,状态位由硬件在事件输入被置位时设置,只能由软件向其位位置写入 1 来清除。此外,使能位对状态位的置位或复位没有影响;它仅决定已置位的状态位是否会生成“事件输出”,而当其使能位被置位时,该事件输出会生成 SCI。

ACPI 还定义了寄存器分组。一个寄存器分组由两个寄存器块组成,具有指向两个不同寄存器块的两个指针,其中寄存器分组内每个位位置都是固定的且不能更改。寄存器分组中的位具有固定的位位置,可以分布在这两个寄存器块之间。这允许寄存器分组中的位驻留在其中一个或两个寄存器块中,从而便于将多个不同芯片中的位映射到同一个寄存器,并因此为编程模型提供单一的寄存器分组位结构。

OSPM 将寄存器分组视为单个寄存器;但它位于多个位置。为了读取一个寄存器分组,OSPM 将读取 “A” 寄存器块,然后读取 “B” 寄存器块,接着将两个结果进行逻辑“或”运算(SLP_TYP 字段是此规则的一个例外)。寄存器块中的保留位或未使用位在读取时始终返回零,并且对写入没有副作用(这是要求)。

SLP_TYPx 字段对于每个寄存器分组都可以不同。相应的睡眠对象 \_Sx 包含 SLP_TYPa 和 SLP_TYPb 字段。也就是说,该对象返回一个包,其中包含两个取值范围为 0-7 的整数值。OSPM 将始终先把 SLP_TYPa 值写入 “A” 寄存器块,然后把该字段中的 SLP_TYPb 值写入 “B” 寄存器块。所有其他位位置将写入相同的值。此外,OSPM 不会读取 SLP_TYPx 值,而是将其忽略。

../_images/Example_fixed_hardware_feature_register_grouping.png

图 4.5 固定硬件特性寄存器分组示例

例如,上图表示一个由寄存器块 A 和寄存器块 B 组成的寄存器分组。位 “a” 和 “d” 在寄存器块 B 中实现,而寄存器块 A 在这些位位置返回零。位 “b”、“c” 和 “e” 在寄存器块 A 中实现,而寄存器块 B 在这些位位置返回零。所有保留位或被忽略的位都返回其定义的 ACPI 值。

在访问该寄存器分组时,OSPM 必须先读取寄存器块 A,然后读取寄存器块 B。随后 OSPM 对这两个寄存器执行逻辑“或”运算,并对结果进行操作。

在向该寄存器分组写入时,OSPM 将把所需值写入寄存器组 A,然后再将相同的值写入寄存器组 B。

ACPI 定义了以下固定硬件寄存器块。每个寄存器块都从 FADT 获得一个单独的指针。这些地址由 OEM 作为静态资源进行设置,因此永远不会改变——OSPM 不能重新映射 ACPI 资源。定义了以下寄存器块:

../_images/Register_blocks_vs_register_groupings.png

图 4.6 寄存器块与寄存器分组

PM1 EVT 分组由 PM1a_EVT 和 PM1b_EVT 寄存器块组成,这些寄存器块包含固定硬件特性事件位。每个事件寄存器块(如果实现)都包含两个寄存器:一个状态寄存器和一个使能寄存器。每个寄存器分组都有一个定义好的位位置且不能更改;但是,该位可以在任一寄存器块(A 或 B)中实现。事件的 A 和 B 寄存器块允许芯片组在两个或更多芯片之间灵活划分事件。对于读操作,OSPM 将对相关的 A 和 B 寄存器发起读取,将两个值或在一起,然后对该结果进行操作。对于写操作,OSPM 将把该值写入两个寄存器块中的对应寄存器。因此,在实现事件寄存器时需要遵循两条规则:

  • 保留位或未实现位始终返回零(控制或使能)。

  • 对保留位或未实现位的写入没有影响。

PM1 CNT 分组包含固定硬件特性控制位,由 PM1a_CNT_BLK 和 PM1b_CNT_BLK 寄存器块组成。每个寄存器块都与单个控制寄存器相关联。每个寄存器分组都有一个定义好的位位置且不能更改;但是,该位可以在任一寄存器块(A 或 B)中实现。在实现 CNT 寄存器时需要遵循两条规则:

  • 保留位或未实现位始终返回零(控制或使能)。

  • 对保留位或未实现位的写入没有影响。

PM2_CNT_BLK 寄存器块当前包含一个用于仲裁器禁用功能的单个位。通用用途事件寄存器包含通用特性的事件编程模型。所有通用事件与固定事件一样,都会生成 SCI。通用事件状态位可以驻留在任何位置;但是,顶层通用事件驻留在某个通用寄存器块中。任何不在通用寄存器空间中的通用特性事件状态都被视为子状态位或同级状态位,其父状态位位于通用用途事件寄存器空间中。请注意,在到达 GPE 事件状态之前,可能存在 N 层通用用途事件。

通用用途事件寄存器由两个寄存器块描述:GPE0_BLK 或 GPE1_BLK。每个寄存器块都从 FADT 中单独获得指向。每个寄存器块又进一步分为两个寄存器:GPEx_STS 和 GPEx_EN。通用用途事件寄存器中的状态寄存器和使能寄存器遵循固定硬件事件寄存器的事件模型。

小节

  • 4.8.1. ACPI 寄存器摘要
  • 4.8.2. 固定硬件特性
  • 4.8.3. 电源管理定时器
  • 4.8.4. 固定硬件寄存器
  • 4.8.5. 通用硬件寄存器
Prev
4.7. ACPI 硬件功能