19.6.99. OperationRegion(声明操作区域)
语法 :
OperationRegion (RegionName, RegionSpace, Offset, Length)
参数
声明一个名为 RegionName 的操作区域。Offset 是所选 RegionSpace 中该区域开始处的偏移(字节粒度),Length 是该区域的长度(以字节为单位)。
描述
Operation Region 是一种数据对象类型,对该数据对象执行的读或写操作发生在某个硬件空间中。例如,Definition Block 可以在总线或系统 I/O 空间中定义一个 Operation Region。对该命名对象的任何读写操作都会导致访问该 I/O 空间。
操作区域是某个空间中的区域,其中包含专供 ACPI 控制方法独占使用的硬件寄存器。一般来说,ACPI 控制方法访问的操作区域内的任何硬件寄存器(至少以字节粒度)都不能与任何其他来源的访问共享,唯一例外是使用 Global Lock 与固件共享一个区域。整个 Operation Region 可以分配给主机 OS 中的 ACPI 子系统独占使用。
在方法作用域内定义的 Operation Regions 是此规则的例外。这些 Operation Regions 被称为“动态”,因为在控制方法执行之前,OS 不知道它们的存在,也不知道它们使用了哪些寄存器。不建议使用动态的 SystemIO 或 SystemMemory Operation Region,因为 OS 无法保证独占访问。所有其他类型的 Operation Regions 都可以是动态的。
Operation Regions 定义了硬件区域的整体基地址和长度,但 AML 代码不能直接访问它们。使用包含一个或多个 FieldUnits 的 Field 对象覆盖在 Operation Region 之上,以访问区域中的各个部分。Operation Region 中的单个 FieldUnit 可以小到一位,也可以大到整个区域的长度。FieldUnit 的值会被规范化(移位并掩码到正确长度)。FieldUnit 的数据类型可以是 Buffer 或 Integer,具体取决于 FieldUnit 的位长度。如果 FieldUnit 小于或等于一个 Integer 的大小(以位为单位),则它将被视为 Integer。如果 FieldUnit 大于一个 Integer 的大小,则它将被视为 Buffer。Integer 的大小由 DSDT 头中的 Revision 字段指示。修订版本小于 2 表示 Integer 的大小为 32 位。大于或等于 2 的值表示 Integer 的大小为 64 位。有关数据类型和 FieldUnit 类型转换规则的更多信息,参见第 19.3.5.7 节。
Operation Region 对象隐式支持 Mutex 同步。对该对象或该区域的 Field 数据对象的更新将自动在 Operation Region 对象上进行同步;但是,控制方法也可以显式地与某个区域同步,以防止对该区域的其他访问(来自其他控制方法)。请注意,根据控制方法执行模型,控制方法执行是非抢占式的。因此,只有在控制方法阻塞或让出执行以及寄存器使用类型需要此类同步的情况下,才需要对 Operation Region 进行显式同步。
ACPI 中指定的预定义 Operation Region 类型见表 5.149
示例
下面的 ASL 代码示例展示了将 OperationRegion 与 Field 结合使用,通过一个 FET 来描述经由通用 I/O 空间控制的 IDE 0 和 1:
OperationRegion (GIO, SystemIO, 0x125, 0x1)
Field (GIO, ByteAcc, NoLock, Preserve) {
IDEI, 1, // IDEISO_EN - isolation buffer
IDEP, 1, // IDE_PWR_EN - power
IDER, 1 // IDERST#_EN - reset#
}