154 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
.. 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"},
 | 
						|
	                },
 | 
						|
	            })
 | 
						|
	        }
 | 
						|
	    }
 | 
						|
	}
 |