aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/thunderbolt/switch.c
AgeCommit message (Collapse)Author
2021-03-09thunderbolt: Add support for PCIe tunneling disabled (SL5)Mika Westerberg
commit 3cd542e6e6afb6fa6c34d4094d498f42e22110f5 upstream. Recent Intel Thunderbolt firmware connection manager has support for another security level, SL5, that disables PCIe tunneling. This option can be turned on from the BIOS. When this is set the driver exposes a new security level "nopcie" to the userspace and hides the authorized attribute under connected devices. While there we also hide it when "dponly" security level is enabled since it is not really usable in that case anyway. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Acked-by: Yehezkel Bernat <YehezkelShB@gmail.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: switch: Fix kernel-doc descriptions of non-static functionsMika Westerberg
commit 5c6b471b6ca26c8c67385e1a90e635b4205738a9 upstream. Fix kernel-doc descriptions of all non-static functions. This also gets rid of the warnings on W=1 build. Reported-by: Lee Jones <lee.jones@linaro.org> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Reviewed-by: Lee Jones <lee.jones@linaro.org> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: switch: Fix function name in the headerLee Jones
commit 2c2a2327bdb509c96737258ca6c91f176acc837d upstream. Fixes the following W=1 kernel build warning(s): drivers/thunderbolt/switch.c:1322: warning: expecting prototype for reset_switch(). Prototype was for tb_switch_reset() instead Cc: Andreas Noever <andreas.noever@gmail.com> Cc: Michael Jamet <michael.jamet@intel.com> Cc: Yehezkel Bernat <YehezkelShB@gmail.com> Cc: linux-usb@vger.kernel.org Signed-off-by: Lee Jones <lee.jones@linaro.org> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: switch: Demote a bunch of non-conformant kernel-doc headersLee Jones
commit 47ba5ae46bb995d0766be2fa2068070f61f8f24c upstream. Fixes the following W=1 kernel build warning(s): drivers/thunderbolt/switch.c:730: warning: Function parameter or member 'port' not described in 'tb_init_port' drivers/thunderbolt/switch.c:1348: warning: Function parameter or member 'sw' not described in 'tb_plug_events_active' drivers/thunderbolt/switch.c:1348: warning: Function parameter or member 'active' not described in 'tb_plug_events_active' Cc: Andreas Noever <andreas.noever@gmail.com> Cc: Michael Jamet <michael.jamet@intel.com> Cc: Yehezkel Bernat <YehezkelShB@gmail.com> Cc: linux-usb@vger.kernel.org Signed-off-by: Lee Jones <lee.jones@linaro.org> [ mw: Demote only static functions ] Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Add support for de-authorizing devicesMika Westerberg
commit 3da88be249973f7b74e7b24ed559e6abc2fc5af4 upstream. In some cases it is useful to be able de-authorize devices. For example if user logs out the userspace can have a policy that disconnects PCIe devices until logged in again. This is only possible for software based connection manager as it directly controls the tunnels. For this reason make the authorized attribute accept writing 0 which makes the software connection manager to tear down the corresponding PCIe tunnel. Userspace can check if this is supported by reading a new domain attribute deauthorization, that holds 1 in that case. While there correct tb_domain_approve_switch() kernel-doc and description of authorized attribute to mention that it is only about PCIe tunnels. Cc: Christian Kellner <christian@kellner.me> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Acked-by: Yehezkel Bernat <YehezkelShB@gmail.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Start lane initialization after sleepMika Westerberg
commit fdb0887c5a87c3a98958d3c5c90f871aa6d1a562 upstream. USB4 spec says that for TBT3 compatible device routers the connection manager needs to set SLI (Start Lane Initialization) to get the lanes that were not connected back to functional state after sleep. Same needs to be done if the link was XDomain. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Acked-by: Yehezkel Bernat <YehezkelShB@gmail.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Constify static attribute_group structsRikard Falkeborn
commit 6889e00f0e138beeb775e38decf59959b079ae6f upstream. The only usage of these is to put their addresses in arrays of pointers to const attribute_groups. Make them const to allow the compiler to put them in read-only memory. Signed-off-by: Rikard Falkeborn <rikard.falkeborn@gmail.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Perform USB4 router NVM upgrade in two phasesMika Westerberg
commit 661b19473bf3ac0924560f0cbf84c15458b3c8de upstream. The currect code expects that the router returns back the status of the NVM authentication immediately. When tested against a real USB4 device what happens is that the router is reset and only after that the result is updated in the ROUTER_CS_26 register status field. This also seems to align better what the spec suggests. For this reason do the same what we already do with the Thunderbolt 3 devices and perform the NVM upgrade in two phases. First start the NVM_AUTH router operation and once the router is added back after the reset read the status in ROUTER_CS_26 and expose it to the userspace accordingly. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Add functions for enabling and disabling lane bonding on XDomainIsaac Hazan
commit 5cc0df9ce10a860aaeac53f8df1cc8754c5c7b03 upstream. These can be used by service drivers to enable and disable lane bonding as needed. Signed-off-by: Isaac Hazan <isaac.hazan@intel.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Acked-by: Yehezkel Bernat <YehezkelShB@gmail.com> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Add link_speed and link_width to XDomainIsaac Hazan
commit 4210d50f0b3e423e10a7a254b2a67f5c5318868e upstream. Link speed and link width are needed for checking expected values in case of using a loopback service. Signed-off-by: Isaac Hazan <isaac.hazan@intel.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Acked-by: Yehezkel Bernat <YehezkelShB@gmail.com> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Add debugfs interfaceGil Fine
commit 54e418106c765c5f3c378c770b0f8518632830da upstream. This adds debugfs interface that can be used for debugging possible issues in hardware/software. It exposes router and adapter config spaces through files like this: /sys/kernel/debug/thunderbolt/<DEVICE>/regs /sys/kernel/debug/thunderbolt/<DEVICE>/<PORT1>/regs /sys/kernel/debug/thunderbolt/<DEVICE>/<PORT1>/path /sys/kernel/debug/thunderbolt/<DEVICE>/<PORT1>/counters /sys/kernel/debug/thunderbolt/<DEVICE>/<PORT2>/regs /sys/kernel/debug/thunderbolt/<DEVICE>/<PORT2>/path /sys/kernel/debug/thunderbolt/<DEVICE>/<PORT2>/counters ... The "regs" is either the router or port configuration space register dump. The "path" is the port path configuration space and "counters" is the optional counters configuration space. These files contains one register per line so it should be easy to use normal filtering tools to find the registers of interest if needed. The router and adapter regs file becomes writable when CONFIG_USB4_DEBUGFS_WRITE is enabled (which is not supposed to be done in production systems) and in this case the developer can write "offset value" lines there to modify the hardware directly. For convenience this also supports the long format the read side produces (but ignores the additional fields). The counters file can be written even when CONFIG_USB4_DEBUGFS_WRITE is not enabled and it is only used to clear the counter values. Signed-off-by: Gil Fine <gil.fine@intel.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Introduce tb_port_is_nhi()Mika Westerberg
commit a3cfebdc1b3ab379646f61f095102f7d2b8f6f31 upstream. This is useful if one needs to check if adapter (port) is the host interface (NHI). Make tb_port_alloc_hopid() take advantage of this. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Add runtime PM for Software CMMika Westerberg
commit 6ac6faee5d7d7d1676a3188286438bed2dadd863 upstream. This adds runtime PM support for the Software Connection Manager parts of the driver. This allows to save power when either there is no device attached at all or there is a device attached and all following conditions are true: - Tunneled PCIe root/downstream ports are runtime suspended - Tunneled USB3 ports are runtime suspended - No active DisplayPort stream - No active XDomain connection For the first two we take advantage of device links that were added in previous patch. Difference for the system sleep case is that we also enable wakes when something is geting plugged in/out of the Thunderbolt ports. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Enable wakes from system suspendMika Westerberg
commit b2911a593a705e54adde6d06d4657c1ff2f16583 upstream. In order for the router and the whole domain to wake up from system suspend states we need to enable wakes for the connected routers. For device routers we enable wakes from PCIe and USB 3.x. This allows devices such as keyboards connected to USB 3.x hub that is tunneled to wake the system up as expected. For all routers we enabled wake on USB4 for each connected ports. This is used to propagate the wake from router to another. Do the same for legacy routers through link controller vendor specific registers as documented in USB4 spec chapter 13. While there correct kernel-doc of usb4_switch_set_sleep() -- it does not enable wakes instead there is a separate function (usb4_switch_set_wake()) that does. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Disable lane 1 for XDomain connectionMika Westerberg
commit 341d45188a7800ae3bc18558d62020787b78397e upstream. USB4 spec mandates that the lane 1 should be disabled if lanes are not bonded. For host-to-host connections (XDomain) we don't support lane bonding so in order to be compatible with the spec, disable lane 1 when another host is connected. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Set port configured for both ends of the linkMika Westerberg
commit e28178bf566cf7281b513856aa71a8d41aa81154 upstream. Both ends of the link needs to have this set. Otherwise the link is not re-established properly after sleep. Now since it is possible to have mixed USB4 and Thunderbolt 1, 2 and 3 devices we need to split the link configuration functionality to happen per port so we can pick the correct implementation. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Configure link after lane bonding is enabledMika Westerberg
commit de4620391786513a6971029b61663563c4b7b961 upstream. During testing it was noticed that the link is not properly restored after the domain exits sleep if the link configured bits are set before lane bonding is enabled. The USB4 spec does not say in which order these need to be set but setting link configured afterwards makes the link restoration work so we do that instead. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Do not change default USB4 router notification timeoutMika Westerberg
commit 5cb6ed31c5d51a4b360ae8aa69fc2457723db27a upstream. Some early stage USB4 devices do not like that any of the enumerating router config space fields (ROUTER_CS_1 - ROUTER_CS_4) are written after the initial enumeration for example when entering sleep states. The default timeout by the USB4 spec is 10 ms which should be fine for the driver to handle. For this reason do not change the notification timeout from the default 10 ms for USB4 routers. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Initialize TMU again on resumeMika Westerberg
commit 8145c4350e1303108a86991d3792eb51e5fdf195 upstream. The TMU will be reset after router exits sleep so in order to re-configure it upon resume make sure the structure is initialized again based on the current hardware state. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Send reset only to first generation routersMika Westerberg
commit 356b6c4ef5d62869f8e9ff9003ef6bd8db793539 upstream. First generation routers may need the reset command upon resume but it is not supported by newer generations. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Do not program NFC buffers for USB4 router protocol adaptersMika Westerberg
commit edfbd68bb51e3747c91dbafb5ed0e45cba202c21 upstream. USB4 spec says that NFC buffers field is not used for protocol adapters, only for lane adapters so make tb_port_add_nfc_credits() skip non-lane adapters in order to follow the spec. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Use kobj_to_dev() instead of container_of()Tian Tao
commit fff15f23b8e74c2f969a5d25f29d0565e76e7137 upstream. Doesn't really matter for an individual driver, but it may get coppied to lots more. I consider it's a little tidy up. Signed-off-by: Tian Tao <tiantao6@hisilicon.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Disable ports that are not implementedNikunj A. Dadhania
commit 8824d19b45867be75d375385414c4f06719a11a4 upstream. Commit 4caf2511ec49 ("thunderbolt: Add trivial .shutdown") exposes a bug in the Thunderbolt driver, that frees an unallocated id, resulting in the following spinlock bad magic bug. [ 20.633803] BUG: spinlock bad magic on CPU#4, halt/3313 [ 20.640030] lock: 0xffff92e6ad5c97e0, .magic: 00000000, .owner: <none>/-1, .owner_cpu: 0 [ 20.672139] Call Trace: [ 20.675032] dump_stack+0x97/0xdb [ 20.678950] ? spin_bug+0xa5/0xb0 [ 20.682865] do_raw_spin_lock+0x68/0x98 [ 20.687397] _raw_spin_lock_irqsave+0x3f/0x5d [ 20.692535] ida_destroy+0x4f/0x124 [ 20.696657] tb_switch_release+0x6d/0xfd [ 20.701295] device_release+0x2c/0x7d [ 20.705622] kobject_put+0x8e/0xac [ 20.709637] tb_stop+0x55/0x66 [ 20.713243] tb_domain_remove+0x36/0x62 [ 20.717774] nhi_remove+0x4d/0x58 Fix the issue by disabling ports that are enabled as per the EEPROM, but not implemented. While at it, update the kernel doc for the disabled field, to reflect this. Cc: stable@vger.kernel.org Fixes: 4caf2511ec49 ("thunderbolt: Add trivial .shutdown") Reported-by: Srikanth Nandamuri <srikanth.nandamuri@intel.com> Signed-off-by: Nikunj A. Dadhania <nikunj.dadhania@linux.intel.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Add support for authenticate on disconnectMario Limonciello
commit 1cb36293833766e048cba2026dd860687a2851d9 upstream. Some external devices can support completing thunderbolt authentication when they are unplugged. For this to work though, the link controller must remain operational. The only device known to support this right now is the Dell WD19TB, so add a quirk for this. Signed-off-by: Mario Limonciello <mario.limonciello@dell.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Add support for separating the flush to SPI and authenticateMario Limonciello
commit 4b794f8066e84818c172c81024f1d61071f14710 upstream. This allows userspace to have a shorter period of time that the device is unusable and to call it at a more convenient time. For example flushing the image may happen while the user is using the machine and authenticating/rebooting may happen while logging out. Signed-off-by: Mario Limonciello <mario.limonciello@dell.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Add support for on-board retimersKranthi Kuntala
commit dacb12877d9222e0281b8391e3361fd4c7a7435a upstream. USB4 spec specifies standard access to retimers (both on-board and cable) through USB4 port sideband access. This makes it possible to upgrade their firmware in the same way than we already do with the routers. This enumerates on-board retimers under each USB4 port when the link comes up and adds them to the bus under the router the retimer belongs to. Retimers are exposed in sysfs with name like <device>:<port>.<index> where device is the router the retimer belongs to, port is the USB4 port the retimer is connected to and index is the retimer index under that port (starting from 1). This applies to the upstream USB4 port as well so if there is on-board retimer between the port and the router it is also added accordingly. At this time we do not add cable retimers but there is no techincal restriction to do so in the future if needed. It is not clear whether it makes sense to upgrade their firmwares and at least Thunderbolt 3 cables it has not been done outside of lab environments. The sysfs interface is made to follow the router NVM upgrade to make it easy to extend the existing userspace (fwupd) to handle these as well. Signed-off-by: Kranthi Kuntala <kranthi.kuntala@intel.com> Co-developed-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Split common NVM functionality into a separate fileMika Westerberg
commit 719a5fe87ecd71d140c3ef76d855c70f82893411 upstream. We are going to reuse some of this functionality to implement retimer NVM upgrade so move common NVM functionality into its own file. We also rename the structure from tb_switch_nvm to tb_nvm to make it clear that it is not just for switches. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Add Intel USB-IF ID to the NVM upgrade supported listMika Westerberg
commit 83d1703634c469e427f8648418105d6521e8f7de upstream. With USB4 Intel is also using its USB-IF ID (0x8087) with the new devices. The NVM format is the same. Add this to the driver so NVM upgrade is possible with these devices as well. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Make tb_port_get_link_speed() available to other filesMika Westerberg
commit 5b7b8c0af15a376175302fc91c2af06f356821b0 upstream. We need to call this from tb.c when we improve the bandwidth management to take USB3 into account. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Make tb_next_port_on_path() work with tree topologiesMika Westerberg
commit 69eb79f7d294f92696de8010432758dbd3d1ecb3 upstream. USB4 makes it possible to have tree topology of devices connected in the same way than USB3. This was actually possible in Thunderbolt 1, 2 and 3 as well but all the available devices only had two ports which allows building only daisy-chains of devices. With USB4 it is possible for example that there is DP IN adapter as part of eGPU device router and that should be tunneled over the tree topology to a DP OUT adapter. This updates the tb_next_port_on_path() to support such topologies. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: NHI can use HopIDs 1-7Mika Westerberg
commit 126764236e3557853c4208a70a08f5f69da8d897 upstream. NHI (The host interface adapter) is allowed to use HopIDs 1-7 as well so relax the restriction in tb_port_alloc_hopid() to support this. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09PCI: Unify pcie_find_root_port() and pci_find_pcie_root_port()Yicong Yang
commit 6ae72bfa656ea04806f98ef85cb44b0789064362 upstream. Previously we used pcie_find_root_port() to find a Root Port from a PCIe device and pci_find_pcie_root_port() to find a Root Port from a Conventional PCI device. Unify the two functions and use pcie_find_root_port() to find a Root Port from either a Conventional PCI device or a PCIe device. Then there is no need to distinguish the type of the device. Link: https://lore.kernel.org/r/1589019568-5216-1-git-send-email-yangyicong@hisilicon.com Signed-off-by: Yicong Yang <yangyicong@hisilicon.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by: Kalle Valo <kvalo@codeaurora.org> # wireless Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com> # thunderbolt Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Fix error code in tb_port_is_width_supported()Dan Carpenter
commit e9d0e7511fda92a6511904996dd0aa57b6d7687a upstream. This function is type bool, and it's supposed to return true on success. Unfortunately, this path takes negative error codes and casts them to bool (true) so it's treated as success instead of failure. Fixes: 91c0c12080d0 ("thunderbolt: Add support for lane bonding") Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: fix memory leak of object swColin Ian King
commit 704a940d551c9946bce3fdd661e00a6370c40522 upstream. In the case where the call tb_switch_exceeds_max_depth is true the error reurn path leaks memory in sw. Fix this by setting the return error code to -EADDRNOTAVAIL and returning via the error exit path err_free_sw_ports to free sw. sw has been kzalloc'd so the free of the NULL sw->ports is fine. Addresses-Coverity: ("Resource leak") Fixes: b04079837b20 ("thunderbolt: Add initial support for USB4") Signed-off-by: Colin Ian King <colin.king@canonical.com> Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com> Link: https://lore.kernel.org/r/20191220220526.11307-1-colin.king@canonical.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Add support for USB 3.x tunnelsRajmohan Mani
commit e6f818585713efb29d54f732f41291f75046a2c7 upstream. USB4 added a capability to tunnel USB 3.x protocol over the USB4 fabric. USB4 device routers may include integrated SuperSpeed HUB or a function or both. USB tunneling follows PCIe so that the tunnel is created between the parent and the child router from USB3 downstream adapter port to USB3 upstream adapter port over a single USB4 link. This adds support for USB 3.x tunneling and also capability to discover existing USB 3.x tunnels (for example created by connection manager in boot firmware). Signed-off-by: Rajmohan Mani <rajmohan.mani@intel.com> Co-developed-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Link: https://lore.kernel.org/r/20191217123345.31850-9-mika.westerberg@linux.intel.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Add support for Time Management UnitRajmohan Mani
commit cf29b9afb121494a7aa12dae6eebf81347e0313b upstream. Time Management Unit (TMU) is included in each USB4 router. It is used to synchronize time across the USB4 fabric. By default when USB4 router is plugged to the domain, its TMU is turned off. This differs from Thunderbolt (1, 2 and 3) devices whose TMU is by default configured to bi-directional HiFi mode. Since time synchronization is needed for proper Display Port tunneling this means we need to configure the TMU on USB4 compliant devices. The USB4 spec allows some flexibility on how the TMU can be configured. This makes it possible to enable link power management states (CLx) in certain topologies, where for example DP tunneling is not used. TMU can also be re-configured dynamicaly depending on types of tunnels created over the USB4 fabric. In this patch we simply configure the TMU to be in bi-directional HiFi mode. This way we can tunnel any kind of traffic without need to perform complex steps to re-configure the domain dynamically. We can add more fine-grained TMU configuration later on when we start enabling CLx states. Signed-off-by: Rajmohan Mani <rajmohan.mani@intel.com> Co-developed-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Link: https://lore.kernel.org/r/20191217123345.31850-8-mika.westerberg@linux.intel.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Add initial support for USB4Mika Westerberg
commit b04079837b2094f09e145676eec4b9a56ae8a6aa upstream. USB4 is the public specification based on Thunderbolt 3 protocol. There are some differences in register layouts and flows. In addition to PCIe and DP tunneling, USB4 supports tunneling of USB 3.x. USB4 is also backward compatible with Thunderbolt 3 (and older generations but the spec only talks about 3rd generation). USB4 compliant devices can be identified by checking USB4 version field in router configuration space. This patch adds initial support for USB4 compliant hosts and devices which enables following features provided by the existing functionality in the driver: - PCIe tunneling - Display Port tunneling - Host and device NVM firmware upgrade - P2P networking This brings the USB4 support to the same level that we already have for Thunderbolt 1, 2 and 3 devices. Note the spec talks about host and device "routers" but in the driver we still use term "switch" in most places. Both can be used interchangeably. Co-developed-by: Rajmohan Mani <rajmohan.mani@intel.com> Signed-off-by: Rajmohan Mani <rajmohan.mani@intel.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Link: https://lore.kernel.org/r/20191217123345.31850-5-mika.westerberg@linux.intel.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Make tb_find_port() available to other filesMika Westerberg
commit 386e5e29d81cd088a1111277a18f13d571a6cea5 upstream. We will be needing this when adding initial USB4 support so make it available to other files in the driver as well. We also rename it to tb_switch_find_port() to follow conventions used in switch.c. No functional changes. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Link: https://lore.kernel.org/r/20191217123345.31850-2-mika.westerberg@linux.intel.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Add Display Port adapter pairing and resource managementMika Westerberg
commit 8afe909b78e16ee4baecf78fd4e404aabf425f8c upstream. To perform proper Display Port tunneling for Thunderbolt 3 devices we need to allocate DP resources for DP IN port before they can be used. The reason for this is that the user can also connect a monitor directly to the Type-C ports in which case the Thunderbolt controller acts as re-driver for Display Port (no tunneling takes place) taking the DP sinks away from the connection manager. This allocation is done using special sink allocation registers available through the link controller. We can pair DP IN to DP OUT only if * DP IN has sink allocated via link controller * DP OUT port receives hotplug event For DP IN adapters (only for the host router) we first query whether there is DP resource available (it may be the previous instance of the driver for example already allocated it) and if it is we add it to the list. We then update the list when after each plug/unplug event to a DP IN/OUT adapter. Each time the list is updated we try to find additional DP IN <-> DP OUT pairs for tunnel establishment. This strategy also makes it possible to establish another tunnel in case there are 3 monitors connected and one gets unplugged releasing the DP IN adapter for the new tunnel. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Add default linking between lane adapters if not provided by DROMMika Westerberg
commit 0d46c08d1ed4f7bb283c7315824f2bfe2c5e0fa9 upstream. We currently read how sibling lane adapter ports relate each other from DROM (Device ROM). If the two lane adapter ports go through the same physical connector these lanes can then be bonded together. However, some cases DROM does not provide this information or it is missing completely (host routers typically do not have DROM). In this case we have hard-coded the relationship. Expand this to work with both legacy devices where lane adapter ports 1 and 2, and 3 and 4 are always linked together, and with USB4 devices where lane adapter 1 is always following lane adapter 0 or is disabled completely (see USB4 section 5.2.1 for more information). Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Add support for lane bondingMika Westerberg
commit 91c0c12080d0f40ee7275485221b06b4e1e289e1 upstream. Lane bonding allows aggregating two 10/20 Gb/s (depending on the generation) lanes into a single 20/40 Gb/s bonded link. This allows sharing the full bandwidth more efficiently. In order to establish lane bonding we need to check that lane bonding is possible through link controller and that both ends of the link actually supports 2x widths. This also means that all the paths should be established through the primary port so update tb_path_alloc() to handle this as well. Lane bonding is supported starting from Falcon Ridge (2nd generation) controllers. We also expose the current speed and number of lanes under each device except the host router following similar attribute naming than USB bus. Expose speed and number of lanes for both directions to allow possibility of asymmetric link in the future. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Add helper macro to iterate over switch portsMika Westerberg
commit b433d0100562233b21beb13c0139feeff350bc68 upstream. There are quite many places in the driver where we iterate over each port in the switch. To make it bit more convenient, add a macro that can be used to iterate over each port and convert existing call sites to use it. This is based on code by Lukas Wunner. No functional changes. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Convert DP adapter register names to follow the USB4 specMika Westerberg
commit 98176380cbe5e7747ccd82ed982ce5dfd5cc8b65 upstream. Now that USB4 spec has names for these DP adapter registers we can use them instead. This makes it easier to match certain register to the spec. No functional changes. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Convert PCIe adapter register names to follow the USB4 specMika Westerberg
commit 778bfca3d14aa93d1e3062835061401b08c258f7 upstream. Now that USB4 spec has names for these PCIe adapter registers we can use them instead. This makes it easier to match certain register to the spec. No functional changes. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Convert basic adapter register names to follow the USB4 specMika Westerberg
commit 8f57d47806664d9b2e618ea8086adcf76752daaf upstream. Now that USB4 spec has names for these basic registers we can use them instead. This makes it easier to match certain register to the spec. No functional changes. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Log error if adding switch failsMika Westerberg
commit af99f696b5c57e5e7465750f3a7b3ae5e69d6c7d upstream. If we fail to add a switch for some reason log an error instead of keeping silent. This is useful for debugging. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Introduce tb_switch_is_icm()Mika Westerberg
commit f07a360813f6c551380dca8817d8eb5e7ab40a21 upstream. We currently differentiate between SW CM (Software Connection Manager, sometimes also called External Connection Manager) and ICM (Firmware based Connection Manager, Internal Connection Manager) by looking directly at the sw->config.enabled field which may be rather hard to understand for the casual reader. For this reason introduce a wrapper function with documentation that should make the intention more clear. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2021-03-09thunderbolt: Add 'generation' attribute for devicesChristian Kellner
commit b406357c572b29cdcf05f717c69ae0018fa6a146 upstream. The Thunderbolt standard went through several major iterations, here called generation. USB4, which will be based on Thunderbolt, will be generation 4. Let userspace know the generation of the controller in the devices in order to distinguish between Thunderbolt and USB4, so it can be shown in various user interfaces. Signed-off-by: Christian Kellner <christian@kellner.me> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Liwei Song <liwei.song@windriver.com>
2020-02-28thunderbolt: Prevent crash if non-active NVMem file is readMika Westerberg
commit 03cd45d2e219301880cabc357e3cf478a500080f upstream. The driver does not populate .reg_read callback for the non-active NVMem because the file is supposed to be write-only. However, it turns out NVMem subsystem does not yet support this and expects that the .reg_read callback is provided. If user reads the binary attribute it triggers NULL pointer dereference like this one: BUG: kernel NULL pointer dereference, address: 0000000000000000 ... Call Trace: bin_attr_nvmem_read+0x64/0x80 kernfs_fop_read+0xa7/0x180 vfs_read+0xbd/0x170 ksys_read+0x5a/0xd0 do_syscall_64+0x43/0x150 entry_SYSCALL_64_after_hwframe+0x44/0xa9 Fix this in the driver by providing .reg_read callback that always returns an error. Reported-by: Nicholas Johnson <nicholas.johnson-opensource@outlook.com.au> Fixes: e6b245ccd524 ("thunderbolt: Add support for host and device NVM firmware upgrade") Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20200213095604.1074-1-mika.westerberg@linux.intel.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2019-12-04thunderbolt: Power cycle the router if NVM authentication failsMika Westerberg
commit 7a7ebfa85f4fac349f3ab219538c44efe18b0cf6 upstream. On zang's Dell XPS 13 9370 after Thunderbolt NVM firmware upgrade the Thunderbolt controller did not come back as expected. Only after the system was rebooted it became available again. It is not entirely clear what happened but I suspect the new NVM firmware image authentication failed for some reason. Regardless of this the router needs to be power cycled if NVM authentication fails in order to get it fully functional again. This modifies the driver to issue a power cycle in case the NVM authentication fails immediately when dma_port_flash_update_auth() returns. We also need to call tb_switch_set_uuid() earlier to be able to fetch possible NVM authentication failure when DMA port is added. Link: https://bugzilla.kernel.org/show_bug.cgi?id=205457 Reported-by: zang <dump@tzib.net> Cc: stable <stable@vger.kernel.org> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>