* [PATCH v2 1/2] PCI: Move Synopsys HAPS platform device IDs
@ 2018-12-10 22:07 Thinh Nguyen
2018-12-10 22:08 ` [PATCH v2 2/2] PCI: Override Synopsys USB 3.x HAPS device class Thinh Nguyen
0 siblings, 1 reply; 6+ messages in thread
From: Thinh Nguyen @ 2018-12-10 22:07 UTC (permalink / raw)
To: Felipe Balbi, Greg Kroah-Hartman, linux-usb, linux-pci, Bjorn Helgaas
Cc: John Youn
Move Synopsys HAPS platform device IDs to pci_ids.h so that both
drivers/pci/quirks.c and dwc3-haps driver can reference these IDs.
Signed-off-by: Thinh Nguyen <thinhn@synopsys.com>
Acked-by: Felipe Balbi <felipe.balbi@linux.intel.com>
---
Change in v2:
- Revise title to fit PCI patches' convention
- Revise commit message to include the change purpose
drivers/usb/dwc3/dwc3-haps.c | 4 ----
include/linux/pci_ids.h | 3 +++
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/drivers/usb/dwc3/dwc3-haps.c b/drivers/usb/dwc3/dwc3-haps.c
index c9cc33881bef..02d57d98ef9b 100644
--- a/drivers/usb/dwc3/dwc3-haps.c
+++ b/drivers/usb/dwc3/dwc3-haps.c
@@ -15,10 +15,6 @@
#include <linux/platform_device.h>
#include <linux/property.h>
-#define PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3 0xabcd
-#define PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3_AXI 0xabce
-#define PCI_DEVICE_ID_SYNOPSYS_HAPSUSB31 0xabcf
-
/**
* struct dwc3_haps - Driver private structure
* @dwc3: child dwc3 platform_device
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
index 69f0abe1ba1a..25db0c1586ea 100644
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -2358,6 +2358,9 @@
#define PCI_DEVICE_ID_CENATEK_IDE 0x0001
#define PCI_VENDOR_ID_SYNOPSYS 0x16c3
+#define PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3 0xabcd
+#define PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3_AXI 0xabce
+#define PCI_DEVICE_ID_SYNOPSYS_HAPSUSB31 0xabcf
#define PCI_VENDOR_ID_VITESSE 0x1725
#define PCI_DEVICE_ID_VITESSE_VSC7174 0x7174
--
2.11.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 2/2] PCI: Override Synopsys USB 3.x HAPS device class
2018-12-10 22:07 [PATCH v2 1/2] PCI: Move Synopsys HAPS platform device IDs Thinh Nguyen
@ 2018-12-10 22:08 ` Thinh Nguyen
2018-12-17 22:29 ` Bjorn Helgaas
2019-02-04 22:42 ` Trent Piepho
0 siblings, 2 replies; 6+ messages in thread
From: Thinh Nguyen @ 2018-12-10 22:08 UTC (permalink / raw)
To: linux-pci, Bjorn Helgaas, linux-usb; +Cc: John Youn
Synopsys USB 3.x host HAPS platform has a class code of
PCI_CLASS_SERIAL_USB_XHCI, and xhci driver can claim it. However, these
devices should use dwc3-haps driver. Change these devices' class code to
PCI_CLASS_SERIAL_USB_DEVICE to prevent the xhci-pci driver from claiming
them.
Signed-off-by: Thinh Nguyen <thinhn@synopsys.com>
---
Change in v2:
- Revise title to fit PCI patches' convention
- Override pci class instead of driver
drivers/pci/quirks.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 4700d24e5d55..c84f81c42a1f 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -618,6 +618,32 @@ static void quirk_amd_nl_class(struct pci_dev *pdev)
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_NL_USB,
quirk_amd_nl_class);
+/*
+ * Synopsys USB 3.x host HAPS platform has a class code of
+ * PCI_CLASS_SERIAL_USB_XHCI, and xhci driver can claim it. However, these
+ * devices should use dwc3-haps driver. Change these devices' class code to
+ * PCI_CLASS_SERIAL_USB_DEVICE to prevent the xhci-pci driver from claiming
+ * them.
+ */
+static void quirk_synopsys_haps(struct pci_dev *pdev)
+{
+ u32 class = pdev->class;
+
+ switch (pdev->device) {
+ case PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3:
+ case PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3_AXI:
+ case PCI_DEVICE_ID_SYNOPSYS_HAPSUSB31:
+ pdev->class = PCI_CLASS_SERIAL_USB_DEVICE;
+ pci_info(pdev, "PCI class overridden (%#08x -> %#08x) so dwc3 driver can claim this instead of xhci\n",
+ class, pdev->class);
+ break;
+ default:
+ return;
+ }
+}
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SYNOPSYS, PCI_ANY_ID,
+ quirk_synopsys_haps);
+
/*
* Let's make the southbridge information explicit instead of having to
* worry about people probing the ACPI areas, for example.. (Yes, it
--
2.11.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 2/2] PCI: Override Synopsys USB 3.x HAPS device class
2018-12-10 22:08 ` [PATCH v2 2/2] PCI: Override Synopsys USB 3.x HAPS device class Thinh Nguyen
@ 2018-12-17 22:29 ` Bjorn Helgaas
2019-02-04 22:42 ` Trent Piepho
1 sibling, 0 replies; 6+ messages in thread
From: Bjorn Helgaas @ 2018-12-17 22:29 UTC (permalink / raw)
To: Thinh Nguyen; +Cc: linux-pci, linux-usb, John Youn
On Mon, Dec 10, 2018 at 02:08:01PM -0800, Thinh Nguyen wrote:
> Synopsys USB 3.x host HAPS platform has a class code of
> PCI_CLASS_SERIAL_USB_XHCI, and xhci driver can claim it. However, these
> devices should use dwc3-haps driver. Change these devices' class code to
> PCI_CLASS_SERIAL_USB_DEVICE to prevent the xhci-pci driver from claiming
> them.
>
> Signed-off-by: Thinh Nguyen <thinhn@synopsys.com>
I applied both of these to pci/misc for v4.21, thanks!
> ---
> Change in v2:
> - Revise title to fit PCI patches' convention
> - Override pci class instead of driver
>
> drivers/pci/quirks.c | 26 ++++++++++++++++++++++++++
> 1 file changed, 26 insertions(+)
>
> diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
> index 4700d24e5d55..c84f81c42a1f 100644
> --- a/drivers/pci/quirks.c
> +++ b/drivers/pci/quirks.c
> @@ -618,6 +618,32 @@ static void quirk_amd_nl_class(struct pci_dev *pdev)
> DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_NL_USB,
> quirk_amd_nl_class);
>
> +/*
> + * Synopsys USB 3.x host HAPS platform has a class code of
> + * PCI_CLASS_SERIAL_USB_XHCI, and xhci driver can claim it. However, these
> + * devices should use dwc3-haps driver. Change these devices' class code to
> + * PCI_CLASS_SERIAL_USB_DEVICE to prevent the xhci-pci driver from claiming
> + * them.
> + */
> +static void quirk_synopsys_haps(struct pci_dev *pdev)
> +{
> + u32 class = pdev->class;
> +
> + switch (pdev->device) {
> + case PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3:
> + case PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3_AXI:
> + case PCI_DEVICE_ID_SYNOPSYS_HAPSUSB31:
> + pdev->class = PCI_CLASS_SERIAL_USB_DEVICE;
> + pci_info(pdev, "PCI class overridden (%#08x -> %#08x) so dwc3 driver can claim this instead of xhci\n",
> + class, pdev->class);
> + break;
> + default:
> + return;
I dropped this "default: return;" because it's superfluous.
> + }
> +}
> +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SYNOPSYS, PCI_ANY_ID,
> + quirk_synopsys_haps);
> +
> /*
> * Let's make the southbridge information explicit instead of having to
> * worry about people probing the ACPI areas, for example.. (Yes, it
> --
> 2.11.0
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 2/2] PCI: Override Synopsys USB 3.x HAPS device class
2018-12-10 22:08 ` [PATCH v2 2/2] PCI: Override Synopsys USB 3.x HAPS device class Thinh Nguyen
2018-12-17 22:29 ` Bjorn Helgaas
@ 2019-02-04 22:42 ` Trent Piepho
2019-02-04 23:18 ` Thinh Nguyen
1 sibling, 1 reply; 6+ messages in thread
From: Trent Piepho @ 2019-02-04 22:42 UTC (permalink / raw)
To: linux-pci, thinh.nguyen, bhelgaas, linux-usb; +Cc: john.youn
On Mon, 2018-12-10 at 14:08 -0800, Thinh Nguyen wrote:
> Synopsys USB 3.x host HAPS platform has a class code of
> PCI_CLASS_SERIAL_USB_XHCI, and xhci driver can claim it. However, these
> devices should use dwc3-haps driver. Change these devices' class code to
> PCI_CLASS_SERIAL_USB_DEVICE to prevent the xhci-pci driver from claiming
> them.
>
> +
> + switch (pdev->device) {
> + case PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3:
> + case PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3_AXI:
> + case PCI_DEVICE_ID_SYNOPSYS_HAPSUSB31:
> + pdev->class = PCI_CLASS_SERIAL_USB_DEVICE;
> + pci_info(pdev, "PCI class overridden (%#08x -> %#08x) so dwc3 driver can claim this instead of xhci\n",
> + class, pdev->class);
> + break;
> + default:
> + return;
> + }
> +}
> +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SYNOPSYS, PCI_ANY_ID,
> + quirk_synopsys_haps);
> +
This change breaks my IMX7d based device. This SoC has a PCIe bus
based on the Synopsys Designware host controller. This has a root
bridge that shows up as:
00:00.0 PCI bridge: Synopsys, Inc. Device abcd (rev 01) (prog-if 00 [Normal decode])
00:00.0 0604: 16c3:abcd (rev 01) (prog-if 00 [Normal decode])
Which is to say, class 0x0604, vendor PCI_VENDOR_ID_SYNOPSYS, and the
device ID 0xabcd.
It looks like there has been a bit of sloppy allocation of PCI device
codes, as PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3 is also 0xabcd.
So the result of this patch is to try to turn the imx7d PCIe root
bridge into a USB controller. Which of course breaks it and prevents
anything behind it, i.e. the endpoint attached to the pci-e bus, from
working.
Somehow this quirk needs to be more targeted.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 2/2] PCI: Override Synopsys USB 3.x HAPS device class
2019-02-04 22:42 ` Trent Piepho
@ 2019-02-04 23:18 ` Thinh Nguyen
2019-02-04 23:50 ` Trent Piepho
0 siblings, 1 reply; 6+ messages in thread
From: Thinh Nguyen @ 2019-02-04 23:18 UTC (permalink / raw)
To: Trent Piepho, linux-pci, thinh.nguyen, bhelgaas, linux-usb; +Cc: john.youn
Hi Trent,
Trent Piepho wrote:
> On Mon, 2018-12-10 at 14:08 -0800, Thinh Nguyen wrote:
>> Synopsys USB 3.x host HAPS platform has a class code of
>> PCI_CLASS_SERIAL_USB_XHCI, and xhci driver can claim it. However, these
>> devices should use dwc3-haps driver. Change these devices' class code to
>> PCI_CLASS_SERIAL_USB_DEVICE to prevent the xhci-pci driver from claiming
>> them.
>>
>> +
>> + switch (pdev->device) {
>> + case PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3:
>> + case PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3_AXI:
>> + case PCI_DEVICE_ID_SYNOPSYS_HAPSUSB31:
>> + pdev->class = PCI_CLASS_SERIAL_USB_DEVICE;
>> + pci_info(pdev, "PCI class overridden (%#08x -> %#08x) so dwc3 driver can claim this instead of xhci\n",
>> + class, pdev->class);
>> + break;
>> + default:
>> + return;
>> + }
>> +}
>> +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SYNOPSYS, PCI_ANY_ID,
>> + quirk_synopsys_haps);
>> +
> This change breaks my IMX7d based device. This SoC has a PCIe bus
> based on the Synopsys Designware host controller. This has a root
> bridge that shows up as:
>
> 00:00.0 PCI bridge: Synopsys, Inc. Device abcd (rev 01) (prog-if 00 [Normal decode])
> 00:00.0 0604: 16c3:abcd (rev 01) (prog-if 00 [Normal decode])
>
> Which is to say, class 0x0604, vendor PCI_VENDOR_ID_SYNOPSYS, and the
> device ID 0xabcd.
>
> It looks like there has been a bit of sloppy allocation of PCI device
> codes, as PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3 is also 0xabcd.
>
> So the result of this patch is to try to turn the imx7d PCIe root
> bridge into a USB controller. Which of course breaks it and prevents
> anything behind it, i.e. the endpoint attached to the pci-e bus, from
> working.
>
> Somehow this quirk needs to be more targeted.
Right. Lukas also reported this. It appears that there's a duplicate VID
PID used for the USB controller on HAPS platform. You can review the
discussion subject "Linux Kernel Regression: HAPS quirk breaks PCIe on
i.MX6QP".
I'll send out a patch to resolve this issue. You can check the change to
see if this resolves your issue:
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index b0a413f3f7ca..f46e7de9e15d 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -639,8 +639,8 @@ static void quirk_synopsys_haps(struct pci_dev *pdev)
break;
}
}
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SYNOPSYS, PCI_ANY_ID,
- quirk_synopsys_haps);
+DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_VENDOR_ID_SYNOPSYS, PCI_ANY_ID,
+ PCI_CLASS_SERIAL_USB_XHCI, 0, quirk_synopsys_haps);
/*
* Let's make the southbridge information explicit instead of having to
Thanks,
Thinh
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 2/2] PCI: Override Synopsys USB 3.x HAPS device class
2019-02-04 23:18 ` Thinh Nguyen
@ 2019-02-04 23:50 ` Trent Piepho
0 siblings, 0 replies; 6+ messages in thread
From: Trent Piepho @ 2019-02-04 23:50 UTC (permalink / raw)
To: linux-pci, thinh.nguyen, bhelgaas, linux-usb; +Cc: john.youn
On Mon, 2019-02-04 at 23:18 +0000, Thinh Nguyen wrote:
> Trent Piepho wrote:
> > On Mon, 2018-12-10 at 14:08 -0800, Thinh Nguyen wrote:
> > > Synopsys USB 3.x host HAPS platform has a class code of
> > > PCI_CLASS_SERIAL_USB_XHCI, and xhci driver can claim it. However, these
> > > devices should use dwc3-haps driver. Change these devices' class code to
> > > PCI_CLASS_SERIAL_USB_DEVICE to prevent the xhci-pci driver from claiming
> > > them.
> > >
> > This change breaks my IMX7d based device. This SoC has a PCIe bus
> > based on the Synopsys Designware host controller. This has a root
> >
> >
> Right. Lukas also reported this. It appears that there's a duplicate VID
> PID used for the USB controller on HAPS platform. You can review the
> discussion subject "Linux Kernel Regression: HAPS quirk breaks PCIe on
> i.MX6QP".
>
> -DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SYNOPSYS, PCI_ANY_ID,
> - quirk_synopsys_haps);
> +DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_VENDOR_ID_SYNOPSYS, PCI_ANY_ID,
> + PCI_CLASS_SERIAL_USB_XHCI, 0, quirk_synopsys_haps);
Thanks for the quick response. Tested this on imx7d, and as expected,
it fixes the problem. The host bridge has class PCI_CLASS_BRIDGE_PCI
like it should and the quirk no longer matches.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2019-02-04 23:50 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-10 22:07 [PATCH v2 1/2] PCI: Move Synopsys HAPS platform device IDs Thinh Nguyen
2018-12-10 22:08 ` [PATCH v2 2/2] PCI: Override Synopsys USB 3.x HAPS device class Thinh Nguyen
2018-12-17 22:29 ` Bjorn Helgaas
2019-02-04 22:42 ` Trent Piepho
2019-02-04 23:18 ` Thinh Nguyen
2019-02-04 23:50 ` Trent Piepho
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).