diff mbox series

[v2,4/9] PCI: mark USB4 devices as removable

Message ID 20220210224329.2793-5-mario.limonciello@amd.com (mailing list archive)
State Superseded
Headers show
Series Overhaul is_thunderbolt | expand

Commit Message

Mario Limonciello Feb. 10, 2022, 10:43 p.m. UTC
USB4 class devices are also removable like Intel Thunderbolt devices.

Drivers of downstream devices use this information to declare functional
differences in how the drivers perform by knowing that they are connected
to an upstream TBT/USB4 port.

Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
 drivers/pci/probe.c | 1 +
 1 file changed, 1 insertion(+)

Comments

Macpaul Lin Feb. 11, 2022, 1:28 a.m. UTC | #1
On 2/11/22 6:43 AM, Mario Limonciello wrote:
> USB4 class devices are also removable like Intel Thunderbolt devices.
> 
> Drivers of downstream devices use this information to declare functional
> differences in how the drivers perform by knowing that they are connected
> to an upstream TBT/USB4 port.
> 
> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
> ---
>   drivers/pci/probe.c | 1 +
>   1 file changed, 1 insertion(+)
> 
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index e41656cdd8f0..73673a83eb5e 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -1610,6 +1610,7 @@ static void pci_set_removable(struct pci_dev *dev)
>   	 * exposed as "removable" to userspace.
>   	 */
>   	if (vsec ||
> +	    dev->class == PCI_CLASS_SERIAL_USB_USB4 ||
>   	    (parent &&
>   	    (parent->external_facing || dev_is_removable(&parent->dev))))
>   		dev_set_removable(&dev->dev, DEVICE_REMOVABLE);
> 

Reviewed-by: Macpaul Lin <macpaul.lin@mediatek.com>

Thanks!

Regards,
Macpaul Lin
Mika Westerberg Feb. 11, 2022, 10:35 a.m. UTC | #2
Hi Mario,

On Thu, Feb 10, 2022 at 04:43:24PM -0600, Mario Limonciello wrote:
> USB4 class devices are also removable like Intel Thunderbolt devices.
> 
> Drivers of downstream devices use this information to declare functional
> differences in how the drivers perform by knowing that they are connected
> to an upstream TBT/USB4 port.

This may not be covering the integrated controllers. For discrete, yes
but if it is the PCIe root ports that start the PCIe topology (over the
PCIe tunnels) this does not work.

For integrated we have the "usb4-host-interface" ACPI property that
tells this for each port:

https://docs.microsoft.com/en-us/windows-hardware/drivers/pci/dsd-for-pcie-root-ports#mapping-native-protocols-pcie-displayport-tunneled-through-usb4-to-usb4-host-routers

and for discrete there is the PCIe DVSEC that can be used (see the USB4
spec archive it includes the "USB4 DVSEC Version 1.0.pdf" that has more
information). I would expect AMD controller (assuming it is discrete)
implements this too.

So I'm proposing that we mark the devices that are below  PCIe ports
(root, downstream) that fall in the above categories as "removable".
This is then not dependent on checking the USB4 controller and how it is
setup in a particular system.
Mario Limonciello Feb. 11, 2022, 7:36 p.m. UTC | #3
[Public]



> -----Original Message-----
> From: Mika Westerberg <mika.westerberg@linux.intel.com>
> Sent: Friday, February 11, 2022 04:35
> To: Limonciello, Mario <Mario.Limonciello@amd.com>
> Cc: Bjorn Helgaas <bhelgaas@google.com>; Andreas Noever
> <andreas.noever@gmail.com>; open list:PCI SUBSYSTEM <linux-
> pci@vger.kernel.org>; open list:THUNDERBOLT DRIVER <linux-
> usb@vger.kernel.org>; open list:RADEON and AMDGPU DRM DRIVERS <amd-
> gfx@lists.freedesktop.org>; open list:DRM DRIVERS <dri-
> devel@lists.freedesktop.org>; open list:DRM DRIVER FOR NVIDIA
> GEFORCE/QUADRO GPUS <nouveau@lists.freedesktop.org>; open list:X86
> PLATFORM DRIVERS <platform-driver-x86@vger.kernel.org>; Michael Jamet
> <michael.jamet@intel.com>; Yehezkel Bernat <YehezkelShB@gmail.com>;
> Lukas Wunner <lukas@wunner.de>; Deucher, Alexander
> <Alexander.Deucher@amd.com>
> Subject: Re: [PATCH v2 4/9] PCI: mark USB4 devices as removable
> 
> Hi Mario,
> 
> On Thu, Feb 10, 2022 at 04:43:24PM -0600, Mario Limonciello wrote:
> > USB4 class devices are also removable like Intel Thunderbolt devices.
> >
> > Drivers of downstream devices use this information to declare functional
> > differences in how the drivers perform by knowing that they are connected
> > to an upstream TBT/USB4 port.
> 
> This may not be covering the integrated controllers. For discrete, yes
> but if it is the PCIe root ports that start the PCIe topology (over the
> PCIe tunnels) this does not work.
> 
> For integrated we have the "usb4-host-interface" ACPI property that
> tells this for each port:
> 
> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdocs.mi
> crosoft.com%2Fen-us%2Fwindows-hardware%2Fdrivers%2Fpci%2Fdsd-for-pcie-
> root-ports%23mapping-native-protocols-pcie-displayport-tunneled-through-
> usb4-to-usb4-host-
> routers&amp;data=04%7C01%7Cmario.limonciello%40amd.com%7C64e5b663f
> 97b40f4035a08d9ed4a3162%7C3dd8961fe4884e608e11a82d994e183d%7C0%7
> C0%7C637801725176496963%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLj
> AwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&amp;sd
> ata=7BvPgExVP8Upvi25EEbqH9TacFDZ4zpCEKOfoBJWcxs%3D&amp;reserved=0
> 
> and for discrete there is the PCIe DVSEC that can be used (see the USB4
> spec archive it includes the "USB4 DVSEC Version 1.0.pdf" that has more
> information). I would expect AMD controller (assuming it is discrete)
> implements this too.
> 
> So I'm proposing that we mark the devices that are below  PCIe ports
> (root, downstream) that fall in the above categories as "removable".
> This is then not dependent on checking the USB4 controller and how it is
> setup in a particular system.

Thanks for all of the great suggestions!  I've incorporated them in v3.
diff mbox series

Patch

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index e41656cdd8f0..73673a83eb5e 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1610,6 +1610,7 @@  static void pci_set_removable(struct pci_dev *dev)
 	 * exposed as "removable" to userspace.
 	 */
 	if (vsec ||
+	    dev->class == PCI_CLASS_SERIAL_USB_USB4 ||
 	    (parent &&
 	    (parent->external_facing || dev_is_removable(&parent->dev))))
 		dev_set_removable(&dev->dev, DEVICE_REMOVABLE);