[PATCH v2 3/9] PCI: drop `is_thunderbolt` attribute

Mario Limonciello
2022-02-10T22:43:55Z

The `is_thunderbolt` attribute is currently a dumping ground for a
variety of things.

Instead use the driver core removable attribute to indicate the
detail a device is attached to a thunderbolt or USB4 chain.

Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
drivers/pci/pci.c | 2 +-
drivers/pci/probe.c | 20 +++++++-------------
drivers/platform/x86/apple-gmux.c | 2 +-
include/linux/pci.h | 5 ++---
4 files changed, 11 insertions(+), 18 deletions(-)

diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 9ecce435fb3f..1264984d5e6d 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -2955,7 +2955,7 @@ bool pci_bridge_d3_possible(struct pci_dev *bridge)
return true;

/* Even the oldest 2010 Thunderbolt controller supports D3. */
- if (bridge->is_thunderbolt)
+ if (dev_is_removable(&bridge->dev))
return true;

/* Platform might know better if the bridge supports D3 */
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 17a969942d37..e41656cdd8f0 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1577,16 +1577,6 @@ void set_pcie_hotplug_bridge(struct pci_dev *pdev)
pdev->is_hotplug_bridge = 1;
}

-static void set_pcie_thunderbolt(struct pci_dev *dev)
-{
- u16 vsec;
-
- /* Is the device part of a Thunderbolt controller? */
- vsec = pci_find_vsec_capability(dev, PCI_VENDOR_ID_INTEL, PCI_VSEC_ID_INTEL_TBT);
- if (vsec)
- dev->is_thunderbolt = 1;
-}
-
static void set_pcie_untrusted(struct pci_dev *dev)
{
struct pci_dev *parent;
@@ -1603,6 +1593,10 @@ static void set_pcie_untrusted(struct pci_dev *dev)
static void pci_set_removable(struct pci_dev *dev)
{
struct pci_dev *parent = pci_upstream_bridge(dev);
+ u16 vsec;
+
+ /* Is the device a Thunderbolt controller? */
+ vsec = pci_find_vsec_capability(dev, PCI_VENDOR_ID_INTEL, PCI_VSEC_ID_INTEL_TBT);

/*
* We (only) consider everything downstream from an external_facing
@@ -1615,8 +1609,9 @@ static void pci_set_removable(struct pci_dev *dev)
* accessible to user / may not be removed by end user, and thus not
* exposed as "removable" to userspace.
*/
- if (parent &&
- (parent->external_facing || dev_is_removable(&parent->dev)))
+ if (vsec ||
+ (parent &&
+ (parent->external_facing || dev_is_removable(&parent->dev))))
dev_set_removable(&dev->dev, DEVICE_REMOVABLE);
}

@@ -1860,7 +1855,6 @@ int pci_setup_device(struct pci_dev *dev)
dev->cfg_size = pci_cfg_space_size(dev);

/* Need to have dev->cfg_size ready */
- set_pcie_thunderbolt(dev);

set_pcie_untrusted(dev);

diff --git a/drivers/platform/x86/apple-gmux.c b/drivers/platform/x86/apple-gmux.c
index 57553f9b4d1d..04232fbc7d56 100644
--- a/drivers/platform/x86/apple-gmux.c
+++ b/drivers/platform/x86/apple-gmux.c
@@ -596,7 +596,7 @@ static int gmux_resume(struct device *dev)

static int is_thunderbolt(struct device *dev, void *data)
{
- return to_pci_dev(dev)->is_thunderbolt;
+ return pci_is_thunderbolt_attached(to_pci_dev(dev));
}

static int gmux_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 1e5b769e42fc..d9719eb14654 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -442,7 +442,6 @@ struct pci_dev {
unsigned int is_virtfn:1;
unsigned int is_hotplug_bridge:1;
unsigned int shpc_managed:1; /* SHPC owned by shpchp */
- unsigned int is_thunderbolt:1; /* Thunderbolt controller */
unsigned int no_cmd_complete:1; /* Lies about command completed events */

/*
@@ -2447,11 +2446,11 @@ static inline bool pci_is_thunderbolt_attached(struct pci_dev *pdev)
{
struct pci_dev *parent = pdev;

- if (pdev->is_thunderbolt)
+ if (dev_is_removable(&pdev->dev))
return true;

while ((parent = pci_upstream_bridge(parent)))
- if (parent->is_thunderbolt)
+ if (dev_is_removable(&parent->dev))
return true;

return false;
--
2.34.1