01 Sep, 2020

1 commit

  • …l/git/westeri/thunderbolt into usb-linus

    Mika writes:

    thunderbolt: Fixes for v5.9-rc4

    This includes two fixes, one that fixes a regression around reboot and
    other that uses a correct link rate when USB3 bandwidth is reclaimed
    when the link is not up.

    Both have been in linux-next with no reported issues.

    * tag 'thunderbolt-for-v5.9-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/westeri/thunderbolt:
    thunderbolt: Use maximum USB3 link rate when reclaiming if link is not up
    thunderbolt: Disable ports that are not implemented

    Greg Kroah-Hartman
     

25 Aug, 2020

1 commit


24 Aug, 2020

1 commit

  • Replace the existing /* fall through */ comments and its variants with
    the new pseudo-keyword macro fallthrough[1]. Also, remove unnecessary
    fall-through markings when it is the case.

    [1] https://www.kernel.org/doc/html/v5.7/process/deprecated.html?highlight=fallthrough#implicit-switch-case-fall-through

    Signed-off-by: Gustavo A. R. Silva

    Gustavo A. R. Silva
     

23 Jun, 2020

5 commits

  • USB3 supports both isochronous and non-isochronous traffic. The former
    requires guaranteed bandwidth and can take up to 90% of the total
    bandwidth. With USB4 USB3 is tunneled over USB4 fabric which means that
    we need to make sure there is enough bandwidth allocated for the USB3
    tunnels in addition to DisplayPort tunnels.

    Whereas DisplayPort bandwidth management is static and done before the
    DP tunnel is established, the USB3 bandwidth management is dynamic and
    allows increasing and decreasing the allocated bandwidth according to
    what is currently consumed. This is done through host router USB3
    downstream adapter registers.

    This adds USB3 bandwidth management to the software connection manager
    so that we always try to allocate maximum bandwidth for DP tunnels and
    what is left is allocated for USB3.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • Sometimes it takes longer for DPRX to be set so increase the timeout to
    cope with this.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • Whereas DisplayPort bandwidth is consumed only in one direction (from DP
    IN adapter to DP OUT adapter), USB3 adds separate bandwidth for both
    upstream and downstream directions.

    For this reason extend the tunnel consumed bandwidth routines to support
    both directions and implement this for DP.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • If the path is not complete when we do discovery the number of hops may
    be less than with the full path. As an example when this can happen is
    that user unloads the driver, disconnects the topology, and loads the
    driver back. If there is PCIe or USB3 tunnel involved this may happen.

    Take this into account in tb_pcie_init_path() and tb_usb3_init_path()
    and prevent potential access over array limits.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • The USB3 discovery used wrong indices when tunnel is discovered. It
    should use TB_USB3_PATH_DOWN for path that flows downstream and
    TB_USB3_PATH_UP when it flows upstream. This should not affect the
    functionality but better to fix it.

    Fixes: e6f818585713 ("thunderbolt: Add support for USB 3.x tunnels")
    Signed-off-by: Mika Westerberg
    Cc: stable@vger.kernel.org # v5.6+

    Mika Westerberg
     

18 Dec, 2019

2 commits

  • 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
    Co-developed-by: Mika Westerberg
    Signed-off-by: Mika Westerberg
    Link: https://lore.kernel.org/r/20191217123345.31850-9-mika.westerberg@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman

    Rajmohan Mani
     
  • 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
    Signed-off-by: Rajmohan Mani
    Signed-off-by: Mika Westerberg
    Link: https://lore.kernel.org/r/20191217123345.31850-5-mika.westerberg@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman

    Mika Westerberg
     

02 Nov, 2019

3 commits

  • Titan Ridge supports Display Port 1.4 which adds HBR3 (High Bit Rate)
    rates that may be up to 8.1 Gb/s over 4 lanes. This translates to
    effective data bandwidth of 25.92 Gb/s (as 8/10 encoding is removed by
    the DP adapters when going over Thunderbolt fabric). If another high
    rate monitor is connected we may need to reduce the bandwidth it
    consumes so that it fits into the total 40 Gb/s available on the
    Thunderbolt fabric.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • Titan Ridge needs an additional connection manager handshake in order to
    do proper Display Port tunneling so implement it here.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • 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
     

01 Nov, 2019

2 commits


26 Aug, 2019

1 commit

  • PCIe tunnel path indices got mixed up when we added support for tunnels
    between switches that are not adjacent. This did not affect the
    functionality as it is just an index but fix it now nevertheless to make
    the code easier to understand.

    Reported-by: Rajmohan Mani
    Fixes: 8c7acaaf020f ("thunderbolt: Extend tunnel creation to more than 2 adjacent switches")
    Signed-off-by: Mika Westerberg
    Reviewed-by: Yehezkel Bernat

    Mika Westerberg
     

18 Apr, 2019

9 commits

  • Now that the driver can handle every possible tunnel types there is no
    point to log everything as info level so turn these to happen at debug
    level instead.

    While at it remove duplicated tunnel activation log message
    (tb_tunnel_activate() calls tb_tunnel_restart() which print the same
    message) and add one missing '\n' termination.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • In addition to PCIe and Display Port tunnels it is also possible to
    create tunnels that forward DMA traffic from the host interface adapter
    (NHI) to a NULL port that is connected to another domain through a
    Thunderbolt cable. These tunnels can be used to carry software messages
    such as networking packets.

    To support this we introduce another tunnel type (TB_TUNNEL_DMA) that
    supports paths from NHI to NULL port and back.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • Now that we have capability to discover existing tunnels during driver
    load there is no point tearing down tunnels when the driver gets
    unloaded. Instead we can just leave them running. If user disconnects
    devices while there is no Thunderbolt driver loaded, tunneled protocol
    hotplug happens and is handled by the corresponding driver (pciehp in
    case of PCIe tunnel, GFX driver in case of DP tunnel).

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • Display Port tunnels are somewhat more complex than PCIe tunnels as it
    requires 3 tunnels (AUX Rx/Tx and Video). In addition we are not
    supposed to create the tunnels immediately when a DP OUT is enumerated.
    Instead we need to wait until we get hotplug event to that adapter port
    or check if the port has HPD set before tunnels can be established. This
    adds Display Port tunneling support to the software connection manager.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • In Apple Macs the boot firmware (EFI) connects all devices automatically
    when the system is started, before it hands over to the OS. Instead of
    ignoring we discover all those PCIe tunnels and record them using our
    internal structures, just like we do when a device is connected after
    the OS is already up.

    By doing this we can properly tear down tunnels when devices are
    disconnected. Also this allows us to resume the existing tunnels after
    system suspend/resume cycle.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • State of the connected devices and tunnel configuration is not known
    during resume. For example some paths may not be complete anymore if the
    user has unplugged the related devices. So instead of marking all paths
    as inactive we go ahead and deactivate them explicitly before we restart
    them.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • Now that we can allocate hop IDs per port on a path, we can take
    advantage of this and create tunnels covering longer paths than just
    between two adjacent switches. PCIe actually does not need this as it
    is typically a daisy chain between two adjacent switches but this way we
    do not need to hard-code creation of the tunnel.

    While there add name to struct tb_path to make debugging easier, and
    update kernel-doc comments.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • To be able to tunnel non-PCIe traffic, separate tunnel functionality
    into generic and PCIe specific parts. Rename struct tb_pci_tunnel to
    tb_tunnel, and make it hold an array of paths instead of just two.
    Update all the tunneling functions to take this structure as parameter.

    We also move tb_pci_port_active() to switch.c (and rename it) where we
    will be keeping all port and switch related functions.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • In order to tunnel non-PCIe traffic as well rename tunnel_pci.[ch] to
    tunnel.[ch] to reflect this fact. No functional changes.

    Signed-off-by: Mika Westerberg

    Mika Westerberg