mbox series

[v13,0/5] usb: xhci: Add support for Renesas USB controllers

Message ID 20200506060025.1535960-1-vkoul@kernel.org
Headers show
Series usb: xhci: Add support for Renesas USB controllers | expand

Message

Vinod Koul May 6, 2020, 6 a.m. UTC
This series add support for Renesas USB controllers uPD720201 and uPD720202.
These require firmware to be loaded and in case devices have ROM those can
also be programmed if empty. If ROM is programmed, it runs from ROM as well.

This includes patches from Christian which supported these controllers w/o
ROM and later my patches for ROM support and debugfs hook for rom erase and
export of xhci-pci functions.

Changes in v13:
 - Make rensesas as independent module invoke by xhci-pci which can be
   selected by users of such hardware

Changes in v12:
  - Restore back module name for xhci-pci, so now renesas is a separate
    module, export init/exit routines from renesas modules
  - Update changelog on patch2

Changes in v11:
  - update xhci->quirks and use that in remove function
  - remove error return renesas_verify_fw_version()
  - remove renesas_download_rom() and modify renesas_fw_download_image() for
  reuse
Changes in v10:
  remove renesas_xhci_pci_probe and call renesas_xhci_check_request_fw and
  also cleanup exit code along with it.

Changes in v9:
 Make fw load a sync call and have single instance of probe execute,
   elimating probe/remove races
 Add quirk for renesas and use that for loading

Changes in v8:
 Fix compile error reported by Kbuild-bot by making usb_hcd_pci_probe() take
 const struct hc_driver * as argument

Changes in v7:
 Make a single module which removes issues with module loading
 Keep the renesas code in renesas file
 Add hc_driver as argument for usb_hcd_pci_probe and modify hdc drivers to
   pass this and not use driver_data
 Use driver data for fw name
 Remove code to check if we need to load firmware or not
 remove multiple fw version support, we can do that with symlink in
   userspace

Changes in v6:
 Move the renesas code into a separate driver which invokes xhci-pci functions.

Changes in v5:
 Added a debugfs rom erase patch, helps in debugging
 Squashed patch 1 & 2 as requested by Mathias

Changes in v4:
 Rollback the delay values as we got device failures

Changes in v3:
  Dropped patch 2 as discussed with Christian
  Removed aligned 8 bytes check
  Change order for firmware search from highest version to lowest
  Added entry for new firmware for device 0x14 as well
  Add tested by Christian

Changes in v2:
  used macros for timeout count and delay
  removed renesas_fw_alive_check
  cleaned renesas_fw_callback
  removed recurion for renesas_fw_download
  added MODULE_FIRMWARE
  added comment for multip


Christian Lamparter (1):
  usb: renesas-xhci: Add the renesas xhci driver

Vinod Koul (4):
  usb: hci: add hc_driver as argument for usb_hcd_pci_probe
  usb: xhci: Add support for Renesas controller with memory
  usb: renesas-xhci: Add ROM loader for uPD720201
  usb: xhci: provide a debugfs hook for erasing rom

 drivers/usb/core/hcd-pci.c          |   7 +-
 drivers/usb/host/Kconfig            |   9 +
 drivers/usb/host/Makefile           |   1 +
 drivers/usb/host/ehci-pci.c         |   6 +-
 drivers/usb/host/ohci-pci.c         |   9 +-
 drivers/usb/host/uhci-pci.c         |   8 +-
 drivers/usb/host/xhci-pci-renesas.c | 678 ++++++++++++++++++++++++++++
 drivers/usb/host/xhci-pci.c         |  47 +-
 drivers/usb/host/xhci-pci.h         |  28 ++
 drivers/usb/host/xhci.h             |   1 +
 include/linux/usb/hcd.h             |   3 +-
 11 files changed, 775 insertions(+), 22 deletions(-)
 create mode 100644 drivers/usb/host/xhci-pci-renesas.c
 create mode 100644 drivers/usb/host/xhci-pci.h

Comments

Mathias Nyman May 13, 2020, 12:19 p.m. UTC | #1
On 6.5.2020 9.00, Vinod Koul wrote:
> This series add support for Renesas USB controllers uPD720201 and uPD720202.
> These require firmware to be loaded and in case devices have ROM those can
> also be programmed if empty. If ROM is programmed, it runs from ROM as well.
> 
> This includes patches from Christian which supported these controllers w/o
> ROM and later my patches for ROM support and debugfs hook for rom erase and
> export of xhci-pci functions.
> 

First four patches look ok to me, but 5/5 that adds rom erase debugfs support
still needs some work.

If you prefer I can take the first four, maybe we can get them to 5.8, and then
later add that debugs rom erase support.

Let me know what you prefer

-Mathias
Mathias Nyman May 13, 2020, 12:36 p.m. UTC | #2
On 6.5.2020 9.00, Vinod Koul wrote:
> run "echo 1 > /sys/kernel/debug/renesas-usb/rom_erase" to erase
> firmware when driver is loaded.
> 
> Subsequent init of driver shall reload the firmware
> 
> Signed-off-by: Vinod Koul <vkoul@kernel.org>
> ---
>  drivers/usb/host/xhci-pci-renesas.c | 33 +++++++++++++++++++++++++++++
>  1 file changed, 33 insertions(+)
> 
> diff --git a/drivers/usb/host/xhci-pci-renesas.c b/drivers/usb/host/xhci-pci-renesas.c
> index f7d2445d30ec..fa32ec352dc8 100644
> --- a/drivers/usb/host/xhci-pci-renesas.c
> +++ b/drivers/usb/host/xhci-pci-renesas.c
> @@ -2,6 +2,7 @@
>  /* Copyright (C) 2019-2020 Linaro Limited */
>  
>  #include <linux/acpi.h>
> +#include <linux/debugfs.h>
>  #include <linux/firmware.h>
>  #include <linux/module.h>
>  #include <linux/pci.h>
> @@ -170,6 +171,8 @@ static int renesas_fw_verify(const void *fw_data,
>  	return 0;
>  }
>  
> +static void debugfs_init(struct pci_dev *pdev);
> +
>  static bool renesas_check_rom(struct pci_dev *pdev)
>  {
>  	u16 rom_status;
> @@ -183,6 +186,7 @@ static bool renesas_check_rom(struct pci_dev *pdev)
>  	rom_status &= RENESAS_ROM_STATUS_ROM_EXISTS;
>  	if (rom_status) {
>  		dev_dbg(&pdev->dev, "External ROM exists\n");
> +		debugfs_init(pdev);
>  		return true; /* External ROM exists */
>  	}
>  
> @@ -449,6 +453,34 @@ static void renesas_rom_erase(struct pci_dev *pdev)
>  	dev_dbg(&pdev->dev, "ROM Erase... Done success\n");
>  }
>  
> +static int debugfs_rom_erase(void *data, u64 value)
> +{
> +	struct pci_dev *pdev = data;
> +
> +	if (value == 1) {
> +		dev_dbg(&pdev->dev, "Userspace requested ROM erase\n");
> +		renesas_rom_erase(pdev);
> +		return 0;
> +	}
> +	return -EINVAL;
> +}
> +DEFINE_DEBUGFS_ATTRIBUTE(rom_erase_ops, NULL, debugfs_rom_erase, "%llu\n");
> +
> +static struct dentry *debugfs_root;
> +
> +static void debugfs_init(struct pci_dev *pdev)
> +{
> +	debugfs_root = debugfs_create_dir("renesas_usb", NULL);

This will create a renesas_usb directory right under debugfs root.
xhci has its own struct dentry xhci_debugfs_root; 
Use that as parent instead
 
Also note that debugs_create_dir() can fail, for example if debugfs isn't supported.    

- Mathias
Greg Kroah-Hartman May 13, 2020, 12:45 p.m. UTC | #3
On Wed, May 13, 2020 at 03:36:19PM +0300, Mathias Nyman wrote:
> On 6.5.2020 9.00, Vinod Koul wrote:
> > run "echo 1 > /sys/kernel/debug/renesas-usb/rom_erase" to erase
> > firmware when driver is loaded.
> > 
> > Subsequent init of driver shall reload the firmware
> > 
> > Signed-off-by: Vinod Koul <vkoul@kernel.org>
> > ---
> >  drivers/usb/host/xhci-pci-renesas.c | 33 +++++++++++++++++++++++++++++
> >  1 file changed, 33 insertions(+)
> > 
> > diff --git a/drivers/usb/host/xhci-pci-renesas.c b/drivers/usb/host/xhci-pci-renesas.c
> > index f7d2445d30ec..fa32ec352dc8 100644
> > --- a/drivers/usb/host/xhci-pci-renesas.c
> > +++ b/drivers/usb/host/xhci-pci-renesas.c
> > @@ -2,6 +2,7 @@
> >  /* Copyright (C) 2019-2020 Linaro Limited */
> >  
> >  #include <linux/acpi.h>
> > +#include <linux/debugfs.h>
> >  #include <linux/firmware.h>
> >  #include <linux/module.h>
> >  #include <linux/pci.h>
> > @@ -170,6 +171,8 @@ static int renesas_fw_verify(const void *fw_data,
> >  	return 0;
> >  }
> >  
> > +static void debugfs_init(struct pci_dev *pdev);
> > +
> >  static bool renesas_check_rom(struct pci_dev *pdev)
> >  {
> >  	u16 rom_status;
> > @@ -183,6 +186,7 @@ static bool renesas_check_rom(struct pci_dev *pdev)
> >  	rom_status &= RENESAS_ROM_STATUS_ROM_EXISTS;
> >  	if (rom_status) {
> >  		dev_dbg(&pdev->dev, "External ROM exists\n");
> > +		debugfs_init(pdev);
> >  		return true; /* External ROM exists */
> >  	}
> >  
> > @@ -449,6 +453,34 @@ static void renesas_rom_erase(struct pci_dev *pdev)
> >  	dev_dbg(&pdev->dev, "ROM Erase... Done success\n");
> >  }
> >  
> > +static int debugfs_rom_erase(void *data, u64 value)
> > +{
> > +	struct pci_dev *pdev = data;
> > +
> > +	if (value == 1) {
> > +		dev_dbg(&pdev->dev, "Userspace requested ROM erase\n");
> > +		renesas_rom_erase(pdev);
> > +		return 0;
> > +	}
> > +	return -EINVAL;
> > +}
> > +DEFINE_DEBUGFS_ATTRIBUTE(rom_erase_ops, NULL, debugfs_rom_erase, "%llu\n");
> > +
> > +static struct dentry *debugfs_root;
> > +
> > +static void debugfs_init(struct pci_dev *pdev)
> > +{
> > +	debugfs_root = debugfs_create_dir("renesas_usb", NULL);
> 
> This will create a renesas_usb directory right under debugfs root.
> xhci has its own struct dentry xhci_debugfs_root; 
> Use that as parent instead

Ah, I misssed that, a follow-on patch can do this, right?

> Also note that debugs_create_dir() can fail, for example if debugfs isn't supported.    

Doesn't matter, never check the result, just move on and all is fine :)

This logic is correct, no need for it to be changed.

thanks,

greg k-h
Greg Kroah-Hartman May 13, 2020, 12:52 p.m. UTC | #4
On Wed, May 13, 2020 at 03:51:28PM +0300, Mathias Nyman wrote:
> On 13.5.2020 15.40, Greg Kroah-Hartman wrote:
> > On Wed, May 13, 2020 at 03:19:29PM +0300, Mathias Nyman wrote:
> >> On 6.5.2020 9.00, Vinod Koul wrote:
> >>> This series add support for Renesas USB controllers uPD720201 and uPD720202.
> >>> These require firmware to be loaded and in case devices have ROM those can
> >>> also be programmed if empty. If ROM is programmed, it runs from ROM as well.
> >>>
> >>> This includes patches from Christian which supported these controllers w/o
> >>> ROM and later my patches for ROM support and debugfs hook for rom erase and
> >>> export of xhci-pci functions.
> >>>
> >>
> >> First four patches look ok to me, but 5/5 that adds rom erase debugfs support
> >> still needs some work.
> >>
> >> If you prefer I can take the first four, maybe we can get them to 5.8, and then
> >> later add that debugs rom erase support.
> >>
> >> Let me know what you prefer
> > 
> > Oops, I just added all of these to my testing tree :)
> > 
> > What's wrong with the debugfs patch?  I can drop it, but it seemed
> > simple enough to me.
> 
> Added "usb_renesas" directory under debugfs root when we have easily accessible
> debugfs/usb/xhci directory to use as parent. 

I've responded to the patch now, sorry I missed that.

> Also not checking if adding directory failed (if debufs not supported)

That's fine and encouraged to do :)

thanks,

greg k-h
Greg Kroah-Hartman May 14, 2020, 9:24 a.m. UTC | #5
On Wed, May 13, 2020 at 02:45:54PM +0200, Greg Kroah-Hartman wrote:
> On Wed, May 13, 2020 at 03:36:19PM +0300, Mathias Nyman wrote:
> > On 6.5.2020 9.00, Vinod Koul wrote:
> > > run "echo 1 > /sys/kernel/debug/renesas-usb/rom_erase" to erase
> > > firmware when driver is loaded.
> > > 
> > > Subsequent init of driver shall reload the firmware
> > > 
> > > Signed-off-by: Vinod Koul <vkoul@kernel.org>
> > > ---
> > >  drivers/usb/host/xhci-pci-renesas.c | 33 +++++++++++++++++++++++++++++
> > >  1 file changed, 33 insertions(+)
> > > 
> > > diff --git a/drivers/usb/host/xhci-pci-renesas.c b/drivers/usb/host/xhci-pci-renesas.c
> > > index f7d2445d30ec..fa32ec352dc8 100644
> > > --- a/drivers/usb/host/xhci-pci-renesas.c
> > > +++ b/drivers/usb/host/xhci-pci-renesas.c
> > > @@ -2,6 +2,7 @@
> > >  /* Copyright (C) 2019-2020 Linaro Limited */
> > >  
> > >  #include <linux/acpi.h>
> > > +#include <linux/debugfs.h>
> > >  #include <linux/firmware.h>
> > >  #include <linux/module.h>
> > >  #include <linux/pci.h>
> > > @@ -170,6 +171,8 @@ static int renesas_fw_verify(const void *fw_data,
> > >  	return 0;
> > >  }
> > >  
> > > +static void debugfs_init(struct pci_dev *pdev);
> > > +
> > >  static bool renesas_check_rom(struct pci_dev *pdev)
> > >  {
> > >  	u16 rom_status;
> > > @@ -183,6 +186,7 @@ static bool renesas_check_rom(struct pci_dev *pdev)
> > >  	rom_status &= RENESAS_ROM_STATUS_ROM_EXISTS;
> > >  	if (rom_status) {
> > >  		dev_dbg(&pdev->dev, "External ROM exists\n");
> > > +		debugfs_init(pdev);
> > >  		return true; /* External ROM exists */
> > >  	}
> > >  
> > > @@ -449,6 +453,34 @@ static void renesas_rom_erase(struct pci_dev *pdev)
> > >  	dev_dbg(&pdev->dev, "ROM Erase... Done success\n");
> > >  }
> > >  
> > > +static int debugfs_rom_erase(void *data, u64 value)
> > > +{
> > > +	struct pci_dev *pdev = data;
> > > +
> > > +	if (value == 1) {
> > > +		dev_dbg(&pdev->dev, "Userspace requested ROM erase\n");
> > > +		renesas_rom_erase(pdev);
> > > +		return 0;
> > > +	}
> > > +	return -EINVAL;
> > > +}
> > > +DEFINE_DEBUGFS_ATTRIBUTE(rom_erase_ops, NULL, debugfs_rom_erase, "%llu\n");
> > > +
> > > +static struct dentry *debugfs_root;
> > > +
> > > +static void debugfs_init(struct pci_dev *pdev)
> > > +{
> > > +	debugfs_root = debugfs_create_dir("renesas_usb", NULL);
> > 
> > This will create a renesas_usb directory right under debugfs root.
> > xhci has its own struct dentry xhci_debugfs_root; 
> > Use that as parent instead
> 
> Ah, I misssed that, a follow-on patch can do this, right?

Actually, a whole new series with this changed is good, I didn't take
these for now, for some reason I thought I had.

thanks,

greg k-h
Vinod Koul May 14, 2020, 11:26 a.m. UTC | #6
On 14-05-20, 11:24, Greg Kroah-Hartman wrote:
> On Wed, May 13, 2020 at 02:45:54PM +0200, Greg Kroah-Hartman wrote:

> > Ah, I misssed that, a follow-on patch can do this, right?
> 
> Actually, a whole new series with this changed is good, I didn't take
> these for now, for some reason I thought I had.

Do you mind taking these except this patch (last). I will spin this
later

Debugfs was for my own testing to be able to erase so that I can test
load :) No hurry for users to have that yet...

Thanks
Vinod Koul May 14, 2020, 12:15 p.m. UTC | #7
On 14-05-20, 13:46, Greg Kroah-Hartman wrote:
> On Thu, May 14, 2020 at 04:56:18PM +0530, Vinod Koul wrote:
> > On 14-05-20, 11:24, Greg Kroah-Hartman wrote:
> > > On Wed, May 13, 2020 at 02:45:54PM +0200, Greg Kroah-Hartman wrote:
> > 
> > > > Ah, I misssed that, a follow-on patch can do this, right?
> > > 
> > > Actually, a whole new series with this changed is good, I didn't take
> > > these for now, for some reason I thought I had.
> > 
> > Do you mind taking these except this patch (last). I will spin this
> > later
> 
> Can you resend, they are not in my patch queue anymore.

Sure, will resend dropping patch 5.
Anders Roxell May 18, 2020, 5:53 p.m. UTC | #8
On Wed, 6 May 2020 at 08:01, Vinod Koul <vkoul@kernel.org> wrote:
>
> Some rensas controller like uPD720201 and uPD720202 need firmware to be
> loaded. Add these devices in pci table and invoke renesas firmware loader
> functions to check and load the firmware into device memory when
> required.
>
> Signed-off-by: Vinod Koul <vkoul@kernel.org>

Hi, I got a build error when I built an arm64 allmodconfig kernel.

building obj-arm64-next-20200518

aarch64-linux-gnu-ld: drivers/usb/host/xhci-pci.o: in function
`xhci_pci_remove':
/srv/src/kernel/next/obj-arm64-next-20200518/../drivers/usb/host/xhci-pci.c:411:
undefined reference to `renesas_xhci_pci_exit'
aarch64-linux-gnu-ld:
/srv/src/kernel/next/obj-arm64-next-20200518/../drivers/usb/host/xhci-pci.c:411:(.text+0xd8):
relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol
`renesas_xhci_pci_exit'
aarch64-linux-gnu-ld: drivers/usb/host/xhci-pci.o: in function `xhci_pci_probe':
/srv/src/kernel/next/obj-arm64-next-20200518/../drivers/usb/host/xhci-pci.c:345:
undefined reference to `renesas_xhci_check_request_fw'
aarch64-linux-gnu-ld:
/srv/src/kernel/next/obj-arm64-next-20200518/../drivers/usb/host/xhci-pci.c:345:(.text+0x2298):
relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol
`renesas_xhci_check_request_fw'
make[1]: *** [/srv/src/kernel/next/Makefile:1126: vmlinux] Error 1
make[1]: Target 'Image' not remade because of errors.
make: *** [Makefile:185: __sub-make] Error 2
make: Target 'Image' not remade because of errors.

When I reverted this patch from todays next tag next-20200518 I
managed to build.


Cheers,
Anders

> ---
>  drivers/usb/host/xhci-pci.c | 35 ++++++++++++++++++++++++++++++++++-
>  drivers/usb/host/xhci.h     |  1 +
>  2 files changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
> index b6c2f5c530e3..ef513c2fb843 100644
> --- a/drivers/usb/host/xhci-pci.c
> +++ b/drivers/usb/host/xhci-pci.c
> @@ -15,6 +15,7 @@
>
>  #include "xhci.h"
>  #include "xhci-trace.h"
> +#include "xhci-pci.h"
>
>  #define SSIC_PORT_NUM          2
>  #define SSIC_PORT_CFG2         0x880c
> @@ -87,7 +88,16 @@ static int xhci_pci_reinit(struct xhci_hcd *xhci, struct pci_dev *pdev)
>
>  static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
>  {
> -       struct pci_dev          *pdev = to_pci_dev(dev);
> +       struct pci_dev                  *pdev = to_pci_dev(dev);
> +       struct xhci_driver_data         *driver_data;
> +       const struct pci_device_id      *id;
> +
> +       id = pci_match_id(pdev->driver->id_table, pdev);
> +
> +       if (id && id->driver_data) {
> +               driver_data = (struct xhci_driver_data *)id->driver_data;
> +               xhci->quirks |= driver_data->quirks;
> +       }
>
>         /* Look for vendor-specific quirks */
>         if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC &&
> @@ -328,6 +338,14 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
>         int retval;
>         struct xhci_hcd *xhci;
>         struct usb_hcd *hcd;
> +       struct xhci_driver_data *driver_data;
> +
> +       driver_data = (struct xhci_driver_data *)id->driver_data;
> +       if (driver_data && driver_data->quirks & XHCI_RENESAS_FW_QUIRK) {
> +               retval = renesas_xhci_check_request_fw(dev, id);
> +               if (retval)
> +                       return retval;
> +       }
>
>         /* Prevent runtime suspending between USB-2 and USB-3 initialization */
>         pm_runtime_get_noresume(&dev->dev);
> @@ -389,6 +407,9 @@ static void xhci_pci_remove(struct pci_dev *dev)
>         struct xhci_hcd *xhci;
>
>         xhci = hcd_to_xhci(pci_get_drvdata(dev));
> +       if (xhci->quirks & XHCI_RENESAS_FW_QUIRK)
> +               renesas_xhci_pci_exit(dev);
> +
>         xhci->xhc_state |= XHCI_STATE_REMOVING;
>
>         if (xhci->quirks & XHCI_DEFAULT_PM_RUNTIME_ALLOW)
> @@ -540,14 +561,26 @@ static void xhci_pci_shutdown(struct usb_hcd *hcd)
>
>  /*-------------------------------------------------------------------------*/
>
> +static const struct xhci_driver_data reneses_data = {
> +       .quirks  = XHCI_RENESAS_FW_QUIRK,
> +       .firmware = "renesas_usb_fw.mem",
> +};
> +
>  /* PCI driver selection metadata; PCI hotplugging uses this */
>  static const struct pci_device_id pci_ids[] = {
> +       { PCI_DEVICE(0x1912, 0x0014),
> +               .driver_data =  (unsigned long)&reneses_data,
> +       },
> +       { PCI_DEVICE(0x1912, 0x0015),
> +               .driver_data =  (unsigned long)&reneses_data,
> +       },
>         /* handle any USB 3.0 xHCI controller */
>         { PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_XHCI, ~0),
>         },
>         { /* end: all zeroes */ }
>  };
>  MODULE_DEVICE_TABLE(pci, pci_ids);
> +MODULE_FIRMWARE("renesas_usb_fw.mem");
>
>  /* pci driver glue; this is a "new style" PCI driver module */
>  static struct pci_driver xhci_pci_driver = {
> diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
> index 3289bb516201..4047363c7423 100644
> --- a/drivers/usb/host/xhci.h
> +++ b/drivers/usb/host/xhci.h
> @@ -1873,6 +1873,7 @@ struct xhci_hcd {
>  #define XHCI_DEFAULT_PM_RUNTIME_ALLOW  BIT_ULL(33)
>  #define XHCI_RESET_PLL_ON_DISCONNECT   BIT_ULL(34)
>  #define XHCI_SNPS_BROKEN_SUSPEND    BIT_ULL(35)
> +#define XHCI_RENESAS_FW_QUIRK  BIT_ULL(36)
>
>         unsigned int            num_active_eps;
>         unsigned int            limit_active_eps;
> --
> 2.25.4
>
Bjorn Andersson May 18, 2020, 10:42 p.m. UTC | #9
On Mon 18 May 12:57 PDT 2020, Vinod Koul wrote:

> Hi Anders,
> 
> On 18-05-20, 19:53, Anders Roxell wrote:
> > On Wed, 6 May 2020 at 08:01, Vinod Koul <vkoul@kernel.org> wrote:
> > >
> > > Some rensas controller like uPD720201 and uPD720202 need firmware to be
> > > loaded. Add these devices in pci table and invoke renesas firmware loader
> > > functions to check and load the firmware into device memory when
> > > required.
> > >
> > > Signed-off-by: Vinod Koul <vkoul@kernel.org>
> > 
> > Hi, I got a build error when I built an arm64 allmodconfig kernel.
> 
> Thanks for this. This is happening as we have default y for USB_XHCI_PCI
> and then we make USB_XHCI_PCI_RENESAS=m. That should be not allowed as
> we export as symbol so both can be inbuilt or modules but USB_XHCI_PCI=y
> and USB_XHCI_PCI_RENESAS=m cant. While it is valid that USB_XHCI_PCI=y|m
> and USB_XHCI_PCI_RENESAS=n
> 
> So this seems to get fixed by below for me. I have tested with
>  - both y and m (easy)
>  - make USB_XHCI_PCI_RENESAS=n, USB_XHCI_PCI=y|m works
>  - try making USB_XHCI_PCI=y and USB_XHCI_PCI_RENESAS=m, then
>    USB_XHCI_PCI=m by kbuild :)
>  - try making USB_XHCI_PCI=m and USB_XHCI_PCI_RENESAS=y, kbuild gives
>    error prompt that it will be m due to depends
> 
> Thanks to all the fixes done by Arnd which pointed me to this. Pls
> verify and I will send the fix with you as reported :)
> 
> ---- >8 ----
> 
> diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
> index b5c542d6a1c5..92783d175b3f 100644
> --- a/drivers/usb/host/Kconfig
> +++ b/drivers/usb/host/Kconfig
> @@ -40,11 +40,11 @@ config USB_XHCI_DBGCAP
>  config USB_XHCI_PCI
>         tristate
>         depends on USB_PCI
> +       depends on USB_XHCI_PCI_RENESAS || !USB_XHCI_PCI_RENESAS

This correctly captures the variations you describe above.

Regards,
Bjorn

>         default y
>  
>  config USB_XHCI_PCI_RENESAS
>         tristate "Support for additional Renesas xHCI controller with firwmare"
> -       depends on USB_XHCI_PCI
>         ---help---
>           Say 'Y' to enable the support for the Renesas xHCI controller with
>           firwmare. Make sure you have the firwmare for the device and
> 
> -- 
> ~Vinod
Vinod Koul May 19, 2020, 12:42 p.m. UTC | #10
HI Arnd,

On 19-05-20, 09:44, Arnd Bergmann wrote:
> On Tue, May 19, 2020 at 6:53 AM Vinod Koul <vkoul@kernel.org> wrote:
> > On 19-05-20, 00:37, Anders Roxell wrote:
> > > On Mon, 18 May 2020 at 21:57, Vinod Koul <vkoul@kernel.org> wrote:
> > > > On 18-05-20, 19:53, Anders Roxell wrote:
> > > > > On Wed, 6 May 2020 at 08:01, Vinod Koul <vkoul@kernel.org> wrote:
> > > > > >
> > > > > > Some rensas controller like uPD720201 and uPD720202 need firmware to be
> > > > > > loaded. Add these devices in pci table and invoke renesas firmware loader
> > > > > > functions to check and load the firmware into device memory when
> > > > > > required.
> > > > > >
> > > > > > Signed-off-by: Vinod Koul <vkoul@kernel.org>
> > > > >
> > > > > Hi, I got a build error when I built an arm64 allmodconfig kernel.
> > > >
> > > > Thanks for this. This is happening as we have default y for USB_XHCI_PCI
> > > > and then we make USB_XHCI_PCI_RENESAS=m. That should be not allowed as
> > > > we export as symbol so both can be inbuilt or modules but USB_XHCI_PCI=y
> > > > and USB_XHCI_PCI_RENESAS=m cant. While it is valid that USB_XHCI_PCI=y|m
> > > > and USB_XHCI_PCI_RENESAS=n
> > > >
> > > > So this seems to get fixed by below for me. I have tested with
> > > >  - both y and m (easy)
> > > >  - make USB_XHCI_PCI_RENESAS=n, USB_XHCI_PCI=y|m works
> > > >  - try making USB_XHCI_PCI=y and USB_XHCI_PCI_RENESAS=m, then
> > > >    USB_XHCI_PCI=m by kbuild :)
> > > >  - try making USB_XHCI_PCI=m and USB_XHCI_PCI_RENESAS=y, kbuild gives
> > > >    error prompt that it will be m due to depends
> > > >
> > > > Thanks to all the fixes done by Arnd which pointed me to this. Pls
> > > > verify
> > >
> > > I was able to build an arm64 allmodconfig kernel with this change.
> >
> > I will send the formal patch and add your name in reported and
> > tested. Thanks for the quick verification
> 
> I just checked the patch and I think this will work correctly in all cases,
> but it still seems a bit backwards:
> 
> > > > diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
> > > > index b5c542d6a1c5..92783d175b3f 100644
> > > > --- a/drivers/usb/host/Kconfig
> > > > +++ b/drivers/usb/host/Kconfig
> > > > @@ -40,11 +40,11 @@ config USB_XHCI_DBGCAP
> > > >  config USB_XHCI_PCI
> > > >         tristate
> > > >         depends on USB_PCI
> > > > +       depends on USB_XHCI_PCI_RENESAS || !USB_XHCI_PCI_RENESAS
> > > >         default y
> > > >
> > > >  config USB_XHCI_PCI_RENESAS
> > > >         tristate "Support for additional Renesas xHCI controller with firwmare"
> > > > -       depends on USB_XHCI_PCI
> > > >         ---help---
> > > >           Say 'Y' to enable the support for the Renesas xHCI controller with
> > > >           firwmare. Make sure you have the firwmare for the device and
> > > >
> 
> I think it would have been better to follow the normal driver abstraction here
> and make the renesas xhci a specialized version of the xhci driver with
> its own platform_driver instance that calls into the generic xhci_pci module,
> rather than having the generic code treat it as a quirk.
> 
> That would be more like how we handle all the ehci and ohci variants, though
> I'm not sure how exactly it would work with two drivers having pci_device_id
> tables with non-exclusive members. Presumably the generic driver would
> still have to know that it needs to fail its probe() function on devices that
> need the firmware.

Yeah one of the earlier versions did try this and it wasn't nice. The
xhci driver claims the devices as it registers for the class. Now only
solution is to ensure we load the renesas first and resort to makefile
hacks..