引用层级数据节点

版权:

© 2018, 2021 Intel Corporation

作者:

Sakari Ailus <sakari.ailus@linux.intel.com>

通常,ACPI 只允许引用树中的设备对象。层级数据扩展节点可能无法直接引用,因此本文档定义了一种实现此类引用的方案。

引用由设备对象名称后跟一个或多个层级数据扩展 [dsd-guide] 键组成。具体而言,键引用的层级数据扩展节点应直接位于父对象下,即设备对象或另一个层级数据扩展节点。

层级数据节点中的键应由节点名称、“@”字符和节点的十六进制表示的数字(不带前缀或后缀)组成。相同的 ACPI 对象应包含 _DSD 属性扩展,该扩展具有一个属性 “reg”,该属性应具有与节点编号相同的数值。

如果层级数据扩展节点没有数值,则应从 ACPI 对象的 _DSD 属性中省略 “reg” 属性,并从层级数据扩展键中省略 “@” 字符和数字。

示例

在下面的 ASL 代码片段中,“reference” _DSD 属性包含对 DEV0 的设备对象引用,在该设备对象下,一个层级数据扩展键 “node@1” 引用 NOD1 对象,最后,一个层级数据扩展键 “anothernode” 引用 ANOD 对象,该对象也是引用的最终目标节点。

Device (DEV0)
{
    Name (_DSD, Package () {
        ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"),
        Package () {
            Package () { "node@0", "NOD0" },
            Package () { "node@1", "NOD1" },
        }
    })
    Name (NOD0, Package() {
        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
        Package () {
            Package () { "reg", 0 },
            Package () { "random-property", 3 },
        }
    })
    Name (NOD1, Package() {
        ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"),
        Package () {
            Package () { "reg", 1 },
            Package () { "anothernode", "ANOD" },
        }
    })
    Name (ANOD, Package() {
        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
        Package () {
            Package () { "random-property", 0 },
        }
    })
}

Device (DEV1)
{
    Name (_DSD, Package () {
        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
        Package () {
            Package () {
                "reference", Package () {
                    ^DEV0, "node@1", "anothernode"
                }
            },
        }
    })
}

另请参见 图表 中的图表示例。

参考

[dsd-guide] DSD 指南。

https://github.com/UEFI/DSD-Guide/blob/main/dsd-guide.adoc,引用时间为 2021-11-30。