圖形

_DSD

_DSD(裝置特定資料)[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” 編號,其值為端點號。埠號在裝置內必須是唯一的,端點號在埠內必須是唯一的。如果裝置物件只有一個埠,則該埠的編號應為零。同樣,如果一個埠只有一個端點,則該端點的編號應為零。

端點引用使用屬性擴充套件,其屬性名為 “remote-endpoint”,後跟同一包中的字串引用。[data-node-ref]

"device.datanode"

在上述示例中,“X” 是埠號,“Y” 是端點號。

對端點的引用必須始終是雙向的,即指向遠端端點,並從被引用的遠端端點節點返回。

一個簡單的示例如下所示:

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", "\\_SB.PCI0.ISP.EP40" },
            }
        })
    }
}

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", "\\_SB.PCI0.I2C2.CAM0.EP00" },
            }
        })
    }
}

這裡,“CAM0” 裝置的埠 0 連線到 “ISP” 裝置的埠 4,反之亦然。

參考資料

[acpi] 高階配置和電源介面規範。

https://uefi.org/specifications/ACPI/6.4/,引用日期 2021-11-30。

[data-node-ref] 引用分層資料節點

[devicetree] 裝置樹。 https://www.devicetree.org,引用日期 2016-10-03。

[dsd-guide] DSD 指南。

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

[dsd-rules] _DSD 裝置屬性使用規則。

_DSD 裝置屬性使用規則

[graph-bindings] 裝置圖形的通用繫結(裝置樹)。

https://github.com/devicetree-org/dt-schema/blob/main/schemas/graph.yaml,引用日期 2021-11-30。