Intel North Mux-Agent

簡介

North Mux-Agent 是 Intel PMC 韌體的一個功能,在大多數基於 Intel 且具有 PMC 微控制器的平臺上都支援。它用於配置系統上各種 USB 多路複用器/解複用器。 允許從作業系統配置 mux-agent 的平臺具有 HID 為“INTC105C”的 ACPI 裝置物件(節點)來表示它。

North Mux-Agent(又名 Intel PMC Mux Control,或簡稱 mux-agent)驅動程式透過使用 PMC IPC 方法 (drivers/platform/x86/intel_scu_ipc.c) 與 PMC 微控制器通訊。 該驅動程式向 USB Type-C Mux 類註冊,這允許 USB Type-C 控制器和介面驅動程式配置電纜插頭方向和模式(使用備用模式)。 該驅動程式還向 USB Role 類註冊,以便支援 USB 主機和裝置模式。 該驅動程式位於:drivers/usb/typec/mux/intel_pmc_mux.c。

埠節點

通用

對於系統上 mux-agent 控制下的每個 USB Type-C 聯結器,PMC mux-agent 裝置節點下都有一個單獨的子節點。 這些節點不代表實際的聯結器,而是代表與聯結器關聯的 mux-agent 中的“通道”

Scope (_SB.PCI0.PMC.MUX)
{
    Device (CH0)
    {
        Name (_ADR, 0)
    }

    Device (CH1)
    {
        Name (_ADR, 1)
    }
}

_PLD(裝置的物理位置)

可選的 _PLD 物件可以與埠(通道)節點一起使用。 如果提供了 _PLD,則它應與聯結器節點 _PLD 匹配

Scope (_SB.PCI0.PMC.MUX)
{
    Device (CH0)
    {
        Name (_ADR, 0)
        Method (_PLD, 0, NotSerialized)
        {
            /* Consider this as pseudocode. */
            Return (\_SB.USBC.CON0._PLD())
        }
    }
}

Mux-agent 特定的 _DSD 裝置屬性

埠號

為了配置 USB Type-C 聯結器後面的多路複用器,PMC 韌體需要知道與聯結器關聯的 USB2 埠和 USB3 埠。 該驅動程式透過讀取名為“usb2-port-number”和“usb3-port-number”的特定 _DSD 裝置屬性來提取正確的埠號。 這些屬性具有整數值,表示埠索引。 埠索引號基於 1,值 0 是非法的。 當將 mux-agent 特定訊息傳送到 PMC 時,驅動程式會按原樣使用從這些裝置屬性中提取的數字

Name (_DSD, Package () {
    ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
    Package() {
        Package () {"usb2-port-number", 6},
        Package () {"usb3-port-number", 3},
    },
})

方向

根據平臺的不同,從聯結器傳出的資料和 SBU 線可能從 mux-agent 的角度來看是“固定的”,這意味著 mux-agent 驅動程式不應根據電纜插頭方向配置它們。 例如,如果平臺上的重定時器處理電纜插頭方向,則可能會發生這種情況。 驅動程式使用特定的裝置屬性“sbu-orientation”(SBU)和“hsl-orientation”(資料)來了解這些線路是否“固定”,以及固定到哪個方向。 這些屬性的值是一個字串值,可以是為 USB Type-C 聯結器方向定義的字串值:“normal”或“reversed”

Name (_DSD, Package () {
    ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
    Package() {
        Package () {"sbu-orientation", "normal"},
        Package () {"hsl-orientation", "normal"},
    },
})

示例 ASL

以下 ASL 是一個示例,顯示了 mux-agent 節點及其控制下的兩個聯結器

Scope (_SB.PCI0.PMC)
{
    Device (MUX)
    {
        Name (_HID, "INTC105C")

        Device (CH0)
        {
            Name (_ADR, 0)

            Name (_DSD, Package () {
                ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
                Package() {
                    Package () {"usb2-port-number", 6},
                    Package () {"usb3-port-number", 3},
                    Package () {"sbu-orientation", "normal"},
                    Package () {"hsl-orientation", "normal"},
                },
            })
        }

        Device (CH1)
        {
            Name (_ADR, 1)

            Name (_DSD, Package () {
                ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
                Package() {
                    Package () {"usb2-port-number", 5},
                    Package () {"usb3-port-number", 2},
                    Package () {"sbu-orientation", "normal"},
                    Package () {"hsl-orientation", "normal"},
                },
            })
        }
    }
}