19.6.47. Field(声明字段对象)
语法 :
Field ( RegionName, AccessType, LockRule, UpdateRule ) {FieldUnitList}
参数
RegionName 被求值为一个 Namestring,用于引用宿主操作区域。
AccessType 是可选的,用于定义字段定义的默认访问宽度,可以是以下任一项:AnyAcc、ByteAcc、WordAcc、DWordAcc 或 QWordAcc。通常,对父对象内的访问会以自然对齐方式执行。如果需要,可将 AccessType 设置为 AnyAcc 以外的值,以强制最小访问宽度。请注意,父对象必须能够容纳 AccessType 的宽度。例如,WordAcc 类型的访问不能读取奇数长度操作区域的最后一个字节。自然对齐的例外是用于非线性 SMBus 设备的访问类型。下面将对此进行详细讨论。并非所有访问类型对于每种操作区域类型都有意义。如果未指定,则默认值为 AnyAcc。
LockRule 是可选的,用于指示在访问此字段时是否使用 Global Lock,可以是以下任一项:Lock 或 NoLock。如果 LockRule 设置为 Lock,则对修改组件数据对象的访问将获取并释放 Global Lock。如果两种锁定类型同时发生,则在父对象 Mutex 之后获取 Global Lock。在硬件精简 ACPI 平台上,不支持 Lock。如果未指定,则默认值为 NoLock。
UpdateRule 是可选的,用于指定如何处理字段中未修改的位,可以是以下任一项:Preserve、WriteAsOnes 或 WriteAsZeros。例如,如果某个字段在一个 WordAcc 区域的中间定义了一个 4 位的组件数据对象,则当这 4 位被修改时,UpdateRule 指定其余 12 位应如何处理。如果未指定,则默认值为 Preserve。
FieldUnitList 是一个可变长度列表,包含各个字段单元定义,并以逗号分隔。字段单元列表中的每个条目可以是以下之一:
表 19.33 字段单元列表条目
FieldUnitName (BitLength)
Offset (ByteOffset) AccessAs (AccessType, AccessAttribute) Connection (ConnectionResourceObj)
FieldUnitName 是字段单元的 ACPI 名称(1 到 4 个字符),BitLength 是字段单元的位长度。Offset 用于指定下一个已定义字段单元的字节偏移。这可用于代替定义需要跳过的位长度。AccessAs 用于为列表中剩余的字段单元定义访问类型和属性。Connection 用于标识字段访问的连接资源。这仅对 GenericSerialBus 和 GeneralPurposeIO 操作区域地址空间是必需的。
说明
声明一系列已命名的数据对象,这些对象的数据值是较大对象内部的字段。这些字段是由 RegionName 命名的对象的一部分,但它们的名称出现在与 Field 项相同的作用域中。
例如,字段运算符允许将表示硬件寄存器的较大操作区域拆分为单独的位字段,然后可通过这些位字段名称进行访问。在访问字段时,会自动完成从其父对象中提取组件字段以及将其组合回父对象的操作。
当从 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 节。
访问字段数据对象的内容可提供对父对象中相应字段的访问。如果父对象支持 Mutex 同步,则对组件数据对象的修改访问将在修改前后获取并释放父对象的所有权。
下表将使用 OperationRegion 项声明的区域类型与每个区域所支持的不同访问类型相关联。
表 19.34 OperationRegion 地址空间和访问类型
| 地址空间 | 允许的访问类型 | 描述 |
|---|---|---|
| SystemMemory | ByteAcc、WordAcc、DWordAcc、QWordAcc 或 AnyAcc | 允许所有访问 |
| SystemIO | ByteAcc、WordAcc、DWordAcc、QWordAcc 或 AnyAcc | 允许所有访问 |
| PCI_Config | ByteAcc、WordAcc、DWordAcc、QWordAcc 或 AnyAcc | 允许所有访问 |
| EmbeddedControl | ByteAcc | 仅字节访问 |
| SMBus | BufferAcc | 对此操作区域的读写涉及使用特定于区域的数据缓冲区。(见下文。) |
| SystemCMOS | ByteAcc | 仅字节访问 |
| PciBarTarget | ByteAcc、WordAcc、DWordAcc、QWordAcc 或 AnyAcc | 允许所有访问 |
| IPMI | BufferAcc | 对此操作区域的读写涉及使用特定于区域的数据缓冲区。(见下文。) |
| GeneralPurposeIO | ByteAcc | 仅字节访问 |
| GenericSerialBus | BufferAcc | 对此操作区域的读写涉及使用特定于区域的数据缓冲区。(见下文。) |
| PCC | ByteAcc | 对此操作区域的读写以字节为单位执行。 |
命名的 FieldUnit 数据对象在 FieldList 中作为一系列名称和位宽提供。未分配名称(或为 NULL)的位将被跳过。ASL 编译器支持在 FieldList 中使用 Offset (ByteOffset) 宏以跳到所提供字节偏移量对应的位位置,并支持使用 AccessAs 宏来更改字段列表中的访问方式。
GenericSerialBus、SMBus 和 IPMI 区域本质上是非线性的,其中各自地址空间中的每个偏移量都表示一个可变大小(0 到 32 字节)的字段。鉴于这一独特性,这些操作区域对其字段定义施加了限制,并要求在发起事务时使用特定于区域的数据缓冲区。有关 SMBus 数据缓冲区格式的更多信息,请参见第 13.2.5 节。有关 IPMI 数据缓冲区格式的更多信息,请参见第 5.5.2.4.4 节。有关 GenericSerialBus 数据缓冲区格式的更多信息,请参见第 5.5.2.4.6 节。
有关在 GeneralPurposeIO OpRegions 中使用 Fields 的限制,请参见第 5.5.2.4.5 节。
示例:
OperationRegion (MIOC, PCI_Config, Zero, 0xFF)
Field (MIOC, AnyAcc, NoLock, Preserve)
{
Offset (0x58),
HXGB, 32,
HXGT, 32,
GAPE, 8,
MR0A, 4,
MR0B, 4
}