|  | .. SPDX-License-Identifier: GPL-2.0 | 
|  |  | 
|  | ===================== | 
|  | Intel North Mux-Agent | 
|  | ===================== | 
|  |  | 
|  | Introduction | 
|  | ============ | 
|  |  | 
|  | North Mux-Agent is a function of the Intel PMC firmware that is supported on | 
|  | most Intel based platforms that have the PMC microcontroller. It's used for | 
|  | configuring the various USB Multiplexer/DeMultiplexers on the system. The | 
|  | platforms that allow the mux-agent to be configured from the operating system | 
|  | have an ACPI device object (node) with HID "INTC105C" that represents it. | 
|  |  | 
|  | The North Mux-Agent (aka. Intel PMC Mux Control, or just mux-agent) driver | 
|  | communicates with the PMC microcontroller by using the PMC IPC method | 
|  | (drivers/platform/x86/intel_scu_ipc.c). The driver registers with the USB Type-C | 
|  | Mux Class which allows the USB Type-C Controller and Interface drivers to | 
|  | configure the cable plug orientation and mode (with Alternate Modes). The driver | 
|  | also registers with the USB Role Class in order to support both USB Host and | 
|  | Device modes. The driver is located here: drivers/usb/typec/mux/intel_pmc_mux.c. | 
|  |  | 
|  | Port nodes | 
|  | ========== | 
|  |  | 
|  | General | 
|  | ------- | 
|  |  | 
|  | For every USB Type-C connector under the mux-agent control on the system, there | 
|  | is a separate child node under the PMC mux-agent device node. Those nodes do not | 
|  | represent the actual connectors, but instead the "channels" in the mux-agent | 
|  | that are associated with the connectors:: | 
|  |  | 
|  | Scope (_SB.PCI0.PMC.MUX) | 
|  | { | 
|  | Device (CH0) | 
|  | { | 
|  | Name (_ADR, 0) | 
|  | } | 
|  |  | 
|  | Device (CH1) | 
|  | { | 
|  | Name (_ADR, 1) | 
|  | } | 
|  | } | 
|  |  | 
|  | _PLD (Physical Location of Device) | 
|  | ---------------------------------- | 
|  |  | 
|  | The optional _PLD object can be used with the port (the channel) nodes. If _PLD | 
|  | is supplied, it should match the connector node _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 specific _DSD Device Properties | 
|  | ----------------------------------------- | 
|  |  | 
|  | Port Numbers | 
|  | ~~~~~~~~~~~~ | 
|  |  | 
|  | In order to configure the muxes behind a USB Type-C connector, the PMC firmware | 
|  | needs to know the USB2 port and the USB3 port that is associated with the | 
|  | connector. The driver extracts the correct port numbers by reading specific _DSD | 
|  | device properties named "usb2-port-number" and "usb3-port-number". These | 
|  | properties have integer value that means the port index. The port index number | 
|  | is 1's based, and value 0 is illegal. The driver uses the numbers extracted from | 
|  | these device properties as-is when sending the mux-agent specific messages to | 
|  | the PMC:: | 
|  |  | 
|  | Name (_DSD, Package () { | 
|  | ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), | 
|  | Package() { | 
|  | Package () {"usb2-port-number", 6}, | 
|  | Package () {"usb3-port-number", 3}, | 
|  | }, | 
|  | }) | 
|  |  | 
|  | Orientation | 
|  | ~~~~~~~~~~~ | 
|  |  | 
|  | Depending on the platform, the data and SBU lines coming from the connector may | 
|  | be "fixed" from the mux-agent's point of view, which means the mux-agent driver | 
|  | should not configure them according to the cable plug orientation. This can | 
|  | happen for example if a retimer on the platform handles the cable plug | 
|  | orientation. The driver uses a specific device properties "sbu-orientation" | 
|  | (SBU) and "hsl-orientation" (data) to know if those lines are "fixed", and to | 
|  | which orientation. The value that these properties have is a string value, and | 
|  | it can be one that is defined for the USB Type-C connector orientation: "normal" | 
|  | or "reversed":: | 
|  |  | 
|  | Name (_DSD, Package () { | 
|  | ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), | 
|  | Package() { | 
|  | Package () {"sbu-orientation", "normal"}, | 
|  | Package () {"hsl-orientation", "normal"}, | 
|  | }, | 
|  | }) | 
|  |  | 
|  | Example ASL | 
|  | =========== | 
|  |  | 
|  | The following ASL is an example that shows the mux-agent node, and two | 
|  | connectors under its control:: | 
|  |  | 
|  | 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"}, | 
|  | }, | 
|  | }) | 
|  | } | 
|  | } | 
|  | } |