cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

typec.rst (10667B)


      1.. _typec:
      2
      3USB Type-C connector class
      4==========================
      5
      6Introduction
      7------------
      8
      9The typec class is meant for describing the USB Type-C ports in a system to the
     10user space in unified fashion. The class is designed to provide nothing else
     11except the user space interface implementation in hope that it can be utilized
     12on as many platforms as possible.
     13
     14The platforms are expected to register every USB Type-C port they have with the
     15class. In a normal case the registration will be done by a USB Type-C or PD PHY
     16driver, but it may be a driver for firmware interface such as UCSI, driver for
     17USB PD controller or even driver for Thunderbolt3 controller. This document
     18considers the component registering the USB Type-C ports with the class as "port
     19driver".
     20
     21On top of showing the capabilities, the class also offer user space control over
     22the roles and alternate modes of ports, partners and cable plugs when the port
     23driver is capable of supporting those features.
     24
     25The class provides an API for the port drivers described in this document. The
     26attributes are described in Documentation/ABI/testing/sysfs-class-typec.
     27
     28User space interface
     29--------------------
     30Every port will be presented as its own device under /sys/class/typec/. The
     31first port will be named "port0", the second "port1" and so on.
     32
     33When connected, the partner will be presented also as its own device under
     34/sys/class/typec/. The parent of the partner device will always be the port it
     35is attached to. The partner attached to port "port0" will be named
     36"port0-partner". Full path to the device would be
     37/sys/class/typec/port0/port0-partner/.
     38
     39The cable and the two plugs on it may also be optionally presented as their own
     40devices under /sys/class/typec/. The cable attached to the port "port0" port
     41will be named port0-cable and the plug on the SOP Prime end (see USB Power
     42Delivery Specification ch. 2.4) will be named "port0-plug0" and on the SOP
     43Double Prime end "port0-plug1". The parent of a cable will always be the port,
     44and the parent of the cable plugs will always be the cable.
     45
     46If the port, partner or cable plug supports Alternate Modes, every supported
     47Alternate Mode SVID will have their own device describing them. Note that the
     48Alternate Mode devices will not be attached to the typec class. The parent of an
     49alternate mode will be the device that supports it, so for example an alternate
     50mode of port0-partner will be presented under /sys/class/typec/port0-partner/.
     51Every mode that is supported will have its own group under the Alternate Mode
     52device named "mode<index>", for example /sys/class/typec/port0/<alternate
     53mode>/mode1/. The requests for entering/exiting a mode can be done with "active"
     54attribute file in that group.
     55
     56Driver API
     57----------
     58
     59Registering the ports
     60~~~~~~~~~~~~~~~~~~~~~
     61
     62The port drivers will describe every Type-C port they control with struct
     63typec_capability data structure, and register them with the following API:
     64
     65.. kernel-doc:: drivers/usb/typec/class.c
     66   :functions: typec_register_port typec_unregister_port
     67
     68When registering the ports, the prefer_role member in struct typec_capability
     69deserves special notice. If the port that is being registered does not have
     70initial role preference, which means the port does not execute Try.SNK or
     71Try.SRC by default, the member must have value TYPEC_NO_PREFERRED_ROLE.
     72Otherwise if the port executes Try.SNK by default, the member must have value
     73TYPEC_DEVICE, and with Try.SRC the value must be TYPEC_HOST.
     74
     75Registering Partners
     76~~~~~~~~~~~~~~~~~~~~
     77
     78After successful connection of a partner, the port driver needs to register the
     79partner with the class. Details about the partner need to be described in struct
     80typec_partner_desc. The class copies the details of the partner during
     81registration. The class offers the following API for registering/unregistering
     82partners.
     83
     84.. kernel-doc:: drivers/usb/typec/class.c
     85   :functions: typec_register_partner typec_unregister_partner
     86
     87The class will provide a handle to struct typec_partner if the registration was
     88successful, or NULL.
     89
     90If the partner is USB Power Delivery capable, and the port driver is able to
     91show the result of Discover Identity command, the partner descriptor structure
     92should include handle to struct usb_pd_identity instance. The class will then
     93create a sysfs directory for the identity under the partner device. The result
     94of Discover Identity command can then be reported with the following API:
     95
     96.. kernel-doc:: drivers/usb/typec/class.c
     97   :functions: typec_partner_set_identity
     98
     99Registering Cables
    100~~~~~~~~~~~~~~~~~~
    101
    102After successful connection of a cable that supports USB Power Delivery
    103Structured VDM "Discover Identity", the port driver needs to register the cable
    104and one or two plugs, depending if there is CC Double Prime controller present
    105in the cable or not. So a cable capable of SOP Prime communication, but not SOP
    106Double Prime communication, should only have one plug registered. For more
    107information about SOP communication, please read chapter about it from the
    108latest USB Power Delivery specification.
    109
    110The plugs are represented as their own devices. The cable is registered first,
    111followed by registration of the cable plugs. The cable will be the parent device
    112for the plugs. Details about the cable need to be described in struct
    113typec_cable_desc and about a plug in struct typec_plug_desc. The class copies
    114the details during registration. The class offers the following API for
    115registering/unregistering cables and their plugs:
    116
    117.. kernel-doc:: drivers/usb/typec/class.c
    118   :functions: typec_register_cable typec_unregister_cable typec_register_plug typec_unregister_plug
    119
    120The class will provide a handle to struct typec_cable and struct typec_plug if
    121the registration is successful, or NULL if it isn't.
    122
    123If the cable is USB Power Delivery capable, and the port driver is able to show
    124the result of Discover Identity command, the cable descriptor structure should
    125include handle to struct usb_pd_identity instance. The class will then create a
    126sysfs directory for the identity under the cable device. The result of Discover
    127Identity command can then be reported with the following API:
    128
    129.. kernel-doc:: drivers/usb/typec/class.c
    130   :functions: typec_cable_set_identity
    131
    132Notifications
    133~~~~~~~~~~~~~
    134
    135When the partner has executed a role change, or when the default roles change
    136during connection of a partner or cable, the port driver must use the following
    137APIs to report it to the class:
    138
    139.. kernel-doc:: drivers/usb/typec/class.c
    140   :functions: typec_set_data_role typec_set_pwr_role typec_set_vconn_role typec_set_pwr_opmode
    141
    142Alternate Modes
    143~~~~~~~~~~~~~~~
    144
    145USB Type-C ports, partners and cable plugs may support Alternate Modes. Each
    146Alternate Mode will have identifier called SVID, which is either a Standard ID
    147given by USB-IF or vendor ID, and each supported SVID can have 1 - 6 modes. The
    148class provides struct typec_mode_desc for describing individual mode of a SVID,
    149and struct typec_altmode_desc which is a container for all the supported modes.
    150
    151Ports that support Alternate Modes need to register each SVID they support with
    152the following API:
    153
    154.. kernel-doc:: drivers/usb/typec/class.c
    155   :functions: typec_port_register_altmode
    156
    157If a partner or cable plug provides a list of SVIDs as response to USB Power
    158Delivery Structured VDM Discover SVIDs message, each SVID needs to be
    159registered.
    160
    161API for the partners:
    162
    163.. kernel-doc:: drivers/usb/typec/class.c
    164   :functions: typec_partner_register_altmode
    165
    166API for the Cable Plugs:
    167
    168.. kernel-doc:: drivers/usb/typec/class.c
    169   :functions: typec_plug_register_altmode
    170
    171So ports, partners and cable plugs will register the alternate modes with their
    172own functions, but the registration will always return a handle to struct
    173typec_altmode on success, or NULL. The unregistration will happen with the same
    174function:
    175
    176.. kernel-doc:: drivers/usb/typec/class.c
    177   :functions: typec_unregister_altmode
    178
    179If a partner or cable plug enters or exits a mode, the port driver needs to
    180notify the class with the following API:
    181
    182.. kernel-doc:: drivers/usb/typec/class.c
    183   :functions: typec_altmode_update_active
    184
    185Multiplexer/DeMultiplexer Switches
    186~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    187
    188USB Type-C connectors may have one or more mux/demux switches behind them. Since
    189the plugs can be inserted right-side-up or upside-down, a switch is needed to
    190route the correct data pairs from the connector to the USB controllers. If
    191Alternate or Accessory Modes are supported, another switch is needed that can
    192route the pins on the connector to some other component besides USB. USB Type-C
    193Connector Class supplies an API for registering those switches.
    194
    195.. kernel-doc:: drivers/usb/typec/mux.c
    196   :functions: typec_switch_register typec_switch_unregister typec_mux_register typec_mux_unregister
    197
    198In most cases the same physical mux will handle both the orientation and mode.
    199However, as the port drivers will be responsible for the orientation, and the
    200alternate mode drivers for the mode, the two are always separated into their
    201own logical components: "mux" for the mode and "switch" for the orientation.
    202
    203When a port is registered, USB Type-C Connector Class requests both the mux and
    204the switch for the port. The drivers can then use the following API for
    205controlling them:
    206
    207.. kernel-doc:: drivers/usb/typec/class.c
    208   :functions: typec_set_orientation typec_set_mode
    209
    210If the connector is dual-role capable, there may also be a switch for the data
    211role. USB Type-C Connector Class does not supply separate API for them. The
    212port drivers can use USB Role Class API with those.
    213
    214Illustration of the muxes behind a connector that supports an alternate mode::
    215
    216                     ------------------------
    217                     |       Connector      |
    218                     ------------------------
    219                            |         |
    220                     ------------------------
    221                      \     Orientation    /
    222                       --------------------
    223                                |
    224                       --------------------
    225                      /        Mode        \
    226                     ------------------------
    227                         /              \
    228      ------------------------        --------------------
    229      |       Alt Mode       |       /      USB Role      \
    230      ------------------------      ------------------------
    231                                         /            \
    232                     ------------------------      ------------------------
    233                     |       USB Host       |      |       USB Device     |
    234                     ------------------------      ------------------------