Graphs

_DSD

_DSD(Device Specific Data 设备特定数据)[dsd-guide] 是一个预定义的 ACPI 设备配置对象,可用于传达 ACPI 规范 [acpi] 未明确涵盖的硬件功能信息。有两个与图表相关的 _DSD 扩展:属性 [dsd-guide] 和分层数据扩展。属性扩展提供通用键值对,而分层数据扩展支持引用其他节点的节点,从而形成一棵树。树中的节点可能包含属性扩展定义的属性。这两个扩展一起提供了一个树状结构,树的每个节点都有零个或多个属性(键值对)。

可以使用 include/linux/fwnode.h 中定义的 device_* 和 fwnode_* 函数在运行时访问数据结构。

Fwnode 表示通用固件节点对象。它与固件类型无关。在 ACPI 中,fwnode 是 _DSD 分层数据扩展对象。设备的 _DSD 对象由 fwnode 表示。

可以使用对设备本身的硬引用和每个深度上的分层数据扩展数组的索引在 ACPI 表中的其他地方引用数据结构。

端口和端点

端口和端点概念与设备树 [devicetree, graph-bindings] 中的概念非常相似。端口表示设备中的接口,端点表示与该接口的连接。另请参阅 [data-node-ref] 了解通用数据节点参考。

所有端口节点都位于分层数据扩展树中设备的“_DSD”节点下。与每个端口节点相关的数据扩展必须以“port”开头,后面必须跟“@”字符和端口号作为其键。它引用的目标对象应称为“PRTX”,其中“X”是端口号。此类包的一个示例如下:

Package() { "port@4", "PRT4" }

此外,端点位于端口节点下。端点节点的分层数据扩展键必须以“endpoint”开头,后面必须跟有“@”字符和端点编号。它引用的对象应称为“EPXY”,其中“X”是端口编号,“Y”是端点编号。此类包的一个示例如下:

Package() { "endpoint@0", "EP40" }

每个端口节点包含一个属性扩展键“port”,其值为端口号。每个端点同样用属性扩展键“reg”编号,其值为端点号。端口号在设备内必须是唯一的,端点号在端口内必须是唯一的。如果设备对象只能有一个端口,则该端口的编号应为0。同样,如果端口只能有一个端点,则该端点的编号应为0。

端点引用使用属性扩展,属性名称为“remote-endpoint”,后跟同一包中的引用。此类引用由remote设备引用、设备下的端口数据扩展引用的第一个包条目以及端口下的端点数据扩展引用的第一个包条目组成。因此,各个引用显示为:

Package() { device, "port@X", "endpoint@Y" }

在上面的例子中,“X”是端口号,“Y”是端点号。

对端点的引用必须始终双向进行,即到remote端点,并从引用的remote端点节点返回。

下面显示了一个简单的示例:

复制代码
Scope (\_SB.PCI0.I2C2)
{
    Device (CAM0)
    {
        Name (_DSD, Package () {
            ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
            Package () {
                Package () { "compatible", Package () { "nokia,smia" } },
            },
            ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"),
            Package () {
                Package () { "port@0", "PRT0" },
            }
        })
        Name (PRT0, Package() {
            ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
            Package () {
                Package () { "reg", 0 },
            },
            ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"),
            Package () {
                Package () { "endpoint@0", "EP00" },
            }
        })
        Name (EP00, Package() {
            ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
            Package () {
                Package () { "reg", 0 },
                Package () { "remote-endpoint", Package() { \_SB.PCI0.ISP, "port@4", "endpoint@0" } },
            }
        })
    }
}

Scope (\_SB.PCI0)
{
    Device (ISP)
    {
        Name (_DSD, Package () {
            ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"),
            Package () {
                Package () { "port@4", "PRT4" },
            }
        })

        Name (PRT4, Package() {
            ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
            Package () {
                Package () { "reg", 4 }, /* CSI-2 port number */
            },
            ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"),
            Package () {
                Package () { "endpoint@0", "EP40" },
            }
        })

        Name (EP40, Package() {
            ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
            Package () {
                Package () { "reg", 0 },
                Package () { "remote-endpoint", Package () { \_SB.PCI0.I2C2.CAM0, "port@0", "endpoint@0" } },
            }
        })
    }
}
复制代码

这里,“CAM0”设备的端口 0 连接到“ISP”设备的端口 4,反之亦然。

参考

[acpi] Advanced Configuration and Power Interface Specification.

https://uefi.org/specifications/ACPI/6.4/, referenced 2021-11-30.

[data-node-ref] Referencing hierarchical data nodes

[devicetree] Devicetree. https://www.devicetree.org, referenced 2016-10-03.

[dsd-guide] DSD Guide.

https://github.com/UEFI/DSD-Guide/blob/main/dsd-guide.adoc, referenced 2021-11-30.

[dsd-rules] _DSD Device Properties Usage Rules.

_DSD Device Properties Usage Rules

[graph-bindings] Common bindings for device graphs (Devicetree).

https://github.com/devicetree-org/dt-schema/blob/main/schemas/graph.yaml, referenced 2021-11-30.

 

posted @   闹闹爸爸  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示