29 Feb, 2020

1 commit

  • 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
    Fixes: e6b245ccd524 ("thunderbolt: Add support for host and device NVM firmware upgrade")
    Signed-off-by: Mika Westerberg
    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
    Signed-off-by: Greg Kroah-Hartman

    Mika Westerberg
     

05 Dec, 2019

1 commit

  • 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
    Cc: stable
    Signed-off-by: Mika Westerberg
    Signed-off-by: Greg Kroah-Hartman

    Mika Westerberg
     

08 Oct, 2019

3 commits

  • The read is not needed as we overwrite the returned value in the next
    line anyway so drop it.

    Fixes: 3cdb9446a117 ("thunderbolt: Add support for Intel Ice Lake")
    Reported-by: Nicholas Johnson
    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • When lockdep is enabled, plugging Thunderbolt dock on Dominik's laptop
    triggers following splat:

    ======================================================
    WARNING: possible circular locking dependency detected
    5.3.0-rc6+ #1 Tainted: G T
    ------------------------------------------------------
    pool-/usr/lib/b/1258 is trying to acquire lock:
    000000005ab0ad43 (pci_rescan_remove_lock){+.+.}, at: authorized_store+0xe8/0x210

    but task is already holding lock:
    00000000bfb796b5 (&tb->lock){+.+.}, at: authorized_store+0x7c/0x210

    which lock already depends on the new lock.

    the existing dependency chain (in reverse order) is:

    -> #1 (&tb->lock){+.+.}:
    __mutex_lock+0xac/0x9a0
    tb_domain_add+0x2d/0x130
    nhi_probe+0x1dd/0x330
    pci_device_probe+0xd2/0x150
    really_probe+0xee/0x280
    driver_probe_device+0x50/0xc0
    bus_for_each_drv+0x84/0xd0
    __device_attach+0xe4/0x150
    pci_bus_add_device+0x4e/0x70
    pci_bus_add_devices+0x2e/0x66
    pci_bus_add_devices+0x59/0x66
    pci_bus_add_devices+0x59/0x66
    enable_slot+0x344/0x450
    acpiphp_check_bridge.part.0+0x119/0x150
    acpiphp_hotplug_notify+0xaa/0x140
    acpi_device_hotplug+0xa2/0x3f0
    acpi_hotplug_work_fn+0x1a/0x30
    process_one_work+0x234/0x580
    worker_thread+0x50/0x3b0
    kthread+0x10a/0x140
    ret_from_fork+0x3a/0x50

    -> #0 (pci_rescan_remove_lock){+.+.}:
    __lock_acquire+0xe54/0x1ac0
    lock_acquire+0xb8/0x1b0
    __mutex_lock+0xac/0x9a0
    authorized_store+0xe8/0x210
    kernfs_fop_write+0x125/0x1b0
    vfs_write+0xc2/0x1d0
    ksys_write+0x6c/0xf0
    do_syscall_64+0x50/0x180
    entry_SYSCALL_64_after_hwframe+0x49/0xbe

    other info that might help us debug this:
    Possible unsafe locking scenario:
    CPU0 CPU1
    ---- ----
    lock(&tb->lock);
    lock(pci_rescan_remove_lock);
    lock(&tb->lock);
    lock(pci_rescan_remove_lock);

    *** DEADLOCK ***
    5 locks held by pool-/usr/lib/b/1258:
    #0: 000000003df1a1ad (&f->f_pos_lock){+.+.}, at: __fdget_pos+0x4d/0x60
    #1: 0000000095a40b02 (sb_writers#6){.+.+}, at: vfs_write+0x185/0x1d0
    #2: 0000000017a7d714 (&of->mutex){+.+.}, at: kernfs_fop_write+0xf2/0x1b0
    #3: 000000004f262981 (kn->count#208){.+.+}, at: kernfs_fop_write+0xfa/0x1b0
    #4: 00000000bfb796b5 (&tb->lock){+.+.}, at: authorized_store+0x7c/0x210

    stack backtrace:
    CPU: 0 PID: 1258 Comm: pool-/usr/lib/b Tainted: G T 5.3.0-rc6+ #1

    On an system using ACPI hotplug the host router gets hotplugged first and then
    the firmware starts sending notifications about connected devices so the above
    scenario should not happen in reality. However, after taking a second
    look at commit a03e828915c0 ("thunderbolt: Serialize PCIe tunnel
    creation with PCI rescan") that introduced the locking, I don't think it
    is actually correct. It may have cured the symptom but probably the real
    root cause was somewhere closer to PCI stack and possibly is already
    fixed with recent kernels. I also tried to reproduce the original issue
    with the commit reverted but could not.

    So to keep lockdep happy and the code bit less complex drop calls to
    pci_lock_rescan_remove()/pci_unlock_rescan_remove() in
    tb_switch_set_authorized() effectively reverting a03e828915c0.

    Link: https://lkml.org/lkml/2019/8/30/513
    Fixes: a03e828915c0 ("thunderbolt: Serialize PCIe tunnel creation with PCI rescan")
    Reported-by: Dominik Brodowski
    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • When we discover existing DP tunnels the code checks whether DP IN
    adapter port is enabled by calling tb_dp_port_is_enabled() before it
    continues the discovery process. On Light Ridge (gen 1) controller
    reading only the first dword of the DP IN config space causes subsequent
    access to the same DP IN port path config space to fail or return
    invalid data as can be seen in the below splat:

    thunderbolt 0000:07:00.0: CFG_ERROR(0:d): Invalid config space or offset
    Call Trace:
    tb_cfg_read+0xb9/0xd0
    __tb_path_deactivate_hop+0x98/0x210
    tb_path_activate+0x228/0x7d0
    tb_tunnel_restart+0x95/0x200
    tb_handle_hotplug+0x30e/0x630
    process_one_work+0x1b4/0x340
    worker_thread+0x44/0x3d0
    kthread+0xeb/0x120
    ? process_one_work+0x340/0x340
    ? kthread_park+0xa0/0xa0
    ret_from_fork+0x1f/0x30

    If both DP In adapter config dwords are read in one go the issue does
    not reproduce. This is likely firmware bug but we can work it around by
    always reading the two dwords in one go. There should be no harm for
    other controllers either so can do it unconditionally.

    Link: https://lkml.org/lkml/2019/8/28/160
    Reported-by: Brad Campbell
    Tested-by: Brad Campbell
    Signed-off-by: Mika Westerberg

    Mika Westerberg
     

26 Aug, 2019

7 commits

  • The Thunderbolt controller is integrated into the Ice Lake CPU itself
    and requires special flows to power it on and off using force power bit
    in NHI VSEC registers. Runtime PM (RTD3) and Sx flows also differ from
    the discrete solutions. Now the firmware notifies the driver whether
    RTD3 entry or exit are possible. The driver is responsible of sending
    Go2Sx command through link controller mailbox when system enters Sx
    states (suspend-to-mem/disk). Rest of the ICM firwmare flows follow
    Titan Ridge.

    Signed-off-by: Raanan Avargil
    Signed-off-by: Mika Westerberg
    Reviewed-by: Yehezkel Bernat
    Tested-by: Mario Limonciello

    Mika Westerberg
     
  • Ice Lake Thunderbolt controller NVM firmware is part of the BIOS image
    which means it is not writable through the DMA port anymore. However, we
    can still read it so we can keep nvm_version and active parts of NVM.
    This way users still can find out the active NVM version and other
    potentially useful information directly from Linux.

    Signed-off-by: Mika Westerberg
    Reviewed-by: Yehezkel Bernat
    Tested-by: Mario Limonciello

    Mika Westerberg
     
  • Thunderbolt host routers may not always contain DROM that includes
    device identification information. This is mostly needed for Ice Lake
    systems but some Falcon Ridge controllers on PCs also do not have DROM.

    In that case hide the identification attributes.

    Signed-off-by: Mika Westerberg
    Reviewed-by: Yehezkel Bernat
    Tested-by: Mario Limonciello

    Mika Westerberg
     
  • There are two ways to mark a port as unimplemented. Typical way is to
    return port type as TB_TYPE_INACTIVE when its config space is read.
    Alternatively if the port is not physically present (such as ports 10
    and 11 in ICL) reading from port config space returns
    TB_CFG_ERROR_INVALID_CONFIG_SPACE instead. Currently the driver bails
    out from adding the switch if it receives any error during port
    inititialization which is wrong.

    Handle this properly and just leave the port as TB_TYPE_INACTIVE before
    continuing to the next port.

    This also allows us to get rid of special casing for Light Ridge port 5
    in eeprom.c.

    Signed-off-by: Mika Westerberg
    Reviewed-by: Yehezkel Bernat
    Tested-by: Mario Limonciello

    Mika Westerberg
     
  • The register access should be using 32-bit reads/writes according to the
    datasheet. With the previous generation hardware 16-bit writes have been
    working but starting with ICL this is not the case anymore so fix
    producer/consumer register update to use correct width register address.

    Signed-off-by: Mika Westerberg
    Reviewed-by: Yehezkel Bernat
    Tested-by: Mario Limonciello

    Mika Westerberg
     
  • This is depends on the controller and on the platform/CPU we are
    running. Move it to struct icm so we can set it per controller.

    Signed-off-by: Mika Westerberg
    Reviewed-by: Yehezkel Bernat
    Tested-by: Mario Limonciello

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

06 Aug, 2019

2 commits


13 Jul, 2019

1 commit

  • Pull driver core and debugfs updates from Greg KH:
    "Here is the "big" driver core and debugfs changes for 5.3-rc1

    It's a lot of different patches, all across the tree due to some api
    changes and lots of debugfs cleanups.

    Other than the debugfs cleanups, in this set of changes we have:

    - bus iteration function cleanups

    - scripts/get_abi.pl tool to display and parse Documentation/ABI
    entries in a simple way

    - cleanups to Documenatation/ABI/ entries to make them parse easier
    due to typos and other minor things

    - default_attrs use for some ktype users

    - driver model documentation file conversions to .rst

    - compressed firmware file loading

    - deferred probe fixes

    All of these have been in linux-next for a while, with a bunch of
    merge issues that Stephen has been patient with me for"

    * tag 'driver-core-5.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core: (102 commits)
    debugfs: make error message a bit more verbose
    orangefs: fix build warning from debugfs cleanup patch
    ubifs: fix build warning after debugfs cleanup patch
    driver: core: Allow subsystems to continue deferring probe
    drivers: base: cacheinfo: Ensure cpu hotplug work is done before Intel RDT
    arch_topology: Remove error messages on out-of-memory conditions
    lib: notifier-error-inject: no need to check return value of debugfs_create functions
    swiotlb: no need to check return value of debugfs_create functions
    ceph: no need to check return value of debugfs_create functions
    sunrpc: no need to check return value of debugfs_create functions
    ubifs: no need to check return value of debugfs_create functions
    orangefs: no need to check return value of debugfs_create functions
    nfsd: no need to check return value of debugfs_create functions
    lib: 842: no need to check return value of debugfs_create functions
    debugfs: provide pr_fmt() macro
    debugfs: log errors when something goes wrong
    drivers: s390/cio: Fix compilation warning about const qualifiers
    drivers: Add generic helper to match by of_node
    driver_find_device: Unify the match function with class_find_device()
    bus_find_device: Unify the match callback with class_find_device
    ...

    Linus Torvalds
     

24 Jun, 2019

1 commit

  • There is an arbitrary difference between the prototypes of
    bus_find_device() and class_find_device() preventing their callers
    from passing the same pair of data and match() arguments to both of
    them, which is the const qualifier used in the prototype of
    class_find_device(). If that qualifier is also used in the
    bus_find_device() prototype, it will be possible to pass the same
    match() callback function to both bus_find_device() and
    class_find_device(), which will allow some optimizations to be made in
    order to avoid code duplication going forward. Also with that, constify
    the "data" parameter as it is passed as a const to the match function.

    For this reason, change the prototype of bus_find_device() to match
    the prototype of class_find_device() and adjust its callers to use the
    const qualifier in accordance with the new prototype of it.

    Cc: Alexander Shishkin
    Cc: Andrew Lunn
    Cc: Andreas Noever
    Cc: Arnd Bergmann
    Cc: Bjorn Helgaas
    Cc: Corey Minyard
    Cc: Christian Borntraeger
    Cc: David Kershner
    Cc: "David S. Miller"
    Cc: David Airlie
    Cc: Felipe Balbi
    Cc: Frank Rowand
    Cc: Grygorii Strashko
    Cc: Harald Freudenberger
    Cc: Hartmut Knaack
    Cc: Heiko Stuebner
    Cc: Jason Gunthorpe
    Cc: Jonathan Cameron
    Cc: "James E.J. Bottomley"
    Cc: Len Brown
    Cc: Mark Brown
    Cc: Michael Ellerman
    Cc: Michael Jamet
    Cc: "Martin K. Petersen"
    Cc: Peter Oberparleiter
    Cc: Sebastian Ott
    Cc: Srinivas Kandagatla
    Cc: Yehezkel Bernat
    Cc: rafael@kernel.org
    Acked-by: Corey Minyard
    Acked-by: David Kershner
    Acked-by: Mark Brown
    Acked-by: Rafael J. Wysocki
    Acked-by: Srinivas Kandagatla
    Acked-by: Wolfram Sang # for the I2C parts
    Acked-by: Rob Herring
    Signed-off-by: Suzuki K Poulose
    Signed-off-by: Greg Kroah-Hartman

    Suzuki K Poulose
     

14 Jun, 2019

1 commit

  • When starting ICM firmware on Apple systems we need to perform CIO reset
    as part of the flow. However, it turns out that the reset register has
    changed to another location in Titan Ridge.

    Fix this by introducing ->cio_reset() callback with corresponding
    implementations for Alpine and Titan Ridge.

    Fixes: c4630d6ae6e3 ("thunderbolt: Start firmware on Titan Ridge Apple systems")
    Reported-by: Peter Bowen
    Signed-off-by: Mika Westerberg

    Mika Westerberg
     

12 Jun, 2019

1 commit

  • When a device is authorized from userspace by writing to authorized
    attribute we first take the domain lock and then runtime resume the
    device in question. There are two issues with this.

    First is that the device connected notifications are blocked during this
    time which means we get them only after the authorization operation is
    complete. Because of this the authorization needed flag from the
    firmware notification is not reflecting the real authorization status
    anymore. So what happens is that the "authorized" keeps returning 0 even
    if the device was already authorized properly.

    Second issue is that each time the controller is runtime resumed the
    connection_id field of device connected notification may be different
    than in the previous resume. We need to use the latest connection_id
    otherwise the firmware rejects the authorization command.

    Fix these by moving runtime resume operations to happen before the
    domain lock is taken, and waiting for the updated device connected
    notification from the firmware before we allow runtime resume of a
    device to complete.

    While there add missing locking to tb_switch_nvm_read().

    Fixes: 09f11b6c99fe ("thunderbolt: Take domain lock in switch sysfs attribute callbacks")
    Reported-by: Pengfei Xu
    Signed-off-by: Mika Westerberg

    Mika Westerberg
     

21 May, 2019

2 commits


08 May, 2019

1 commit

  • …/git/gregkh/char-misc

    Pull char/misc update part 2 from Greg KH:
    "Here is the "real" big set of char/misc driver patches for 5.2-rc1

    Loads of different driver subsystem stuff in here, all over the places:
    - thunderbolt driver updates
    - habanalabs driver updates
    - nvmem driver updates
    - extcon driver updates
    - intel_th driver updates
    - mei driver updates
    - coresight driver updates
    - soundwire driver cleanups and updates
    - fastrpc driver updates
    - other minor driver updates
    - chardev minor fixups

    Feels like this tree is getting to be a dumping ground of "small
    driver subsystems" these days. Which is fine with me, if it makes
    things easier for those subsystem maintainers.

    All of these have been in linux-next for a while with no reported
    issues"

    * tag 'char-misc-5.2-rc1-part2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (255 commits)
    intel_th: msu: Add current window tracking
    intel_th: msu: Add a sysfs attribute to trigger window switch
    intel_th: msu: Correct the block wrap detection
    intel_th: Add switch triggering support
    intel_th: gth: Factor out trace start/stop
    intel_th: msu: Factor out pipeline draining
    intel_th: msu: Switch over to scatterlist
    intel_th: msu: Replace open-coded list_{first,last,next}_entry variants
    intel_th: Only report useful IRQs to subdevices
    intel_th: msu: Start handling IRQs
    intel_th: pci: Use MSI interrupt signalling
    intel_th: Communicate IRQ via resource
    intel_th: Add "rtit" source device
    intel_th: Skip subdevices if their MMIO is missing
    intel_th: Rework resource passing between glue layers and core
    intel_th: SPDX-ify the documentation
    intel_th: msu: Fix single mode with IOMMU
    coresight: funnel: Support static funnel
    dt-bindings: arm: coresight: Unify funnel DT binding
    coresight: replicator: Add new device id for static replicator
    ...

    Linus Torvalds
     

25 Apr, 2019

2 commits

  • Clang warns:

    drivers/thunderbolt/tunnel.c:504:17: warning: implicit truncation from
    'int' to bit-field changes value from 5 to -3
    [-Wbitfield-constant-conversion]
    path->priority = 5;
    ^ ~
    1 warning generated.

    The priority member in struct tb_path is only ever assigned a positive
    number:

    $ rg -n priority drivers/thunderbolt/path.c
    drivers/thunderbolt/tunnel.c:99: path->priority = 3;
    drivers/thunderbolt/tunnel.c:308: path->priority = 2;
    drivers/thunderbolt/tunnel.c:323: path->priority = 1;
    drivers/thunderbolt/tunnel.c:504: path->priority = 5;

    Furthermore, that value is only assigned to an unsigned integer in
    tb_path_activate (the priority member in struct tb_regs_hop).

    Fixes: 44242d6c9703 ("thunderbolt: Add support for DMA tunnels")
    Link: https://github.com/ClangBuiltLinux/linux/issues/454
    Signed-off-by: Nathan Chancellor
    Reviewed-by: Nick Desaulniers
    Signed-off-by: Mika Westerberg

    Nathan Chancellor
     
  • The flags field in 'struct shash_desc' never actually does anything.
    The only ostensibly supported flag is CRYPTO_TFM_REQ_MAY_SLEEP.
    However, no shash algorithm ever sleeps, making this flag a no-op.

    With this being the case, inevitably some users who can't sleep wrongly
    pass MAY_SLEEP. These would all need to be fixed if any shash algorithm
    actually started sleeping. For example, the shash_ahash_*() functions,
    which wrap a shash algorithm with the ahash API, pass through MAY_SLEEP
    from the ahash API to the shash API. However, the shash functions are
    called under kmap_atomic(), so actually they're assumed to never sleep.

    Even if it turns out that some users do need preemption points while
    hashing large buffers, we could easily provide a helper function
    crypto_shash_update_large() which divides the data into smaller chunks
    and calls crypto_shash_update() and cond_resched() for each chunk. It's
    not necessary to have a flag in 'struct shash_desc', nor is it necessary
    to make individual shash algorithms aware of this at all.

    Therefore, remove shash_desc::flags, and document that the
    crypto_shash_*() functions can be called from any context.

    Signed-off-by: Eric Biggers
    Signed-off-by: Herbert Xu

    Eric Biggers
     

18 Apr, 2019

17 commits

  • Titan Ridge flow to start the firmware is the same as Alpine Ridge so we
    can do the same on Titan Ridge based Apple systems.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • While tb_dump_hop() prints out necessary information it is in format
    that is quite hard to read from the logs especially when one needs to
    follow the path to see that the setup is correct.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • 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
     
  • The printing macros do not modify the passed object so make them
    const. While there make tb_route() to take const parameter as well.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • Two domains (hosts) can be connected through a Thunderbolt cable and in
    that case they can start software services such as networking over the
    high-speed DMA paths. Now that we have all the basic building blocks in
    place to create DMA tunnels over the Thunderbolt fabric we can add this
    support to the software connection manager as well.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • In order to detect possible connections to other domains we need to be
    able to find out why tb_switch_alloc() fails so make it return ERR_PTR()
    instead. This allows the caller to differentiate between errors such as
    -ENOMEM which comes from the kernel and for instance -EIO which comes
    from the hardware when trying to access the possible switch.

    Convert all the current call sites to handle this properly.

    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
     
  • Currently ICM has been handling XDomain UUID exchange so there was no
    need to have it in the driver yet. However, since now we are going to
    add the same capabilities to the software connection manager it needs to
    be handled properly.

    For this reason modify the driver XDomain protocol handling so that if
    the remote domain UUID is not filled in the core will query it first and
    only then start the normal property exchange flow.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • We run all XDomain requests during discovery in tb->wq and since it only
    runs one work at the time it means that sending back reply to the other
    domain may be delayed too much depending whether there is an active
    XDomain discovery request running.

    To make sure we can send reply to the other domain as soon as possible
    run tb_xdp_handle_request() in system workqueue instead. Since the
    device can be hot-removed in the middle we need to make sure the domain
    structure is still around when the function is run so increase reference
    count before we schedule the reply work.

    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
     
  • NFC (non flow control) credits is actually 20-bit field so update
    tb_port_add_nfc_credits() to handle this properly. This allows us to set
    NFC credits for Display Port path in subsequent patches.

    Also make sure the function does not update the hardware if the
    underlying switch is already unplugged.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • We will be needing these routines to find Display Port adapters as well
    so modify them to take port type as the second parameter.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • The only way to expand Thunderbolt topology is through the NULL adapter
    ports (typically ports 1, 2, 3 and 4). There is no point handling
    Thunderbolt hotplug events on any other port.

    Add a helper function (tb_port_is_null()) that can be used to determine
    if the port is NULL port, and use it in software connection manager code
    when hotplug event is handled.

    Signed-off-by: Mika Westerberg

    Mika Westerberg
     
  • Currently the software connection manager (tb.c) has only supported
    creating a single PCIe tunnel, no PCIe device daisy chaining has been
    supported so far. This updates the software connection manager so that
    it now can create PCIe tunnels for full chain of six devices.

    Because PCIe allows DMA and opens possibility for DMA attacks we change
    security level to "user" meaning that PCIe tunneling requires that the
    userspace authorizes the devices first. This makes it possible to block
    PCIe tunneling completely while still allowing other types of tunnels to
    be automatically created.

    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