Greg Kroah-Hartman wrote: > On Thu, Apr 08, 2021 at 06:41:59PM -0700, Thinh Nguyen wrote: >> DWC3 (and possibly others such as CDNS3) will need to access these xHCI >> quirks' definitions to initialize their hosts. Currently, to set these >> quirks, we'd need to create new DT properties matching the quirks. This >> may not be necessary as the driver can check the controller IP and >> version at runtime to determine which quirks are needed. Let's move >> these quirks' definitions to a common header under include/linux/usb so >> DWC3 can properly access them. >> >> Signed-off-by: Thinh Nguyen <Thinh.Nguyen@xxxxxxxxxxxx> >> --- >> drivers/usb/host/xhci-plat.c | 1 - >> drivers/usb/host/xhci-plat.h | 25 ----------- >> drivers/usb/host/xhci-rcar.c | 1 - >> drivers/usb/host/xhci.h | 53 +---------------------- >> include/linux/usb/xhci-quirks.h | 77 +++++++++++++++++++++++++++++++++ >> 5 files changed, 78 insertions(+), 79 deletions(-) >> delete mode 100644 drivers/usb/host/xhci-plat.h >> create mode 100644 include/linux/usb/xhci-quirks.h >> >> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c >> index c1edcc9b13ce..716ef3a338db 100644 >> --- a/drivers/usb/host/xhci-plat.c >> +++ b/drivers/usb/host/xhci-plat.c >> @@ -21,7 +21,6 @@ >> #include <linux/usb/of.h> >> >> #include "xhci.h" >> -#include "xhci-plat.h" >> #include "xhci-mvebu.h" >> #include "xhci-rcar.h" >> >> diff --git a/drivers/usb/host/xhci-plat.h b/drivers/usb/host/xhci-plat.h >> deleted file mode 100644 >> index 561d0b7bce09..000000000000 >> --- a/drivers/usb/host/xhci-plat.h >> +++ /dev/null >> @@ -1,25 +0,0 @@ >> -/* SPDX-License-Identifier: GPL-2.0 */ >> -/* >> - * xhci-plat.h - xHCI host controller driver platform Bus Glue. >> - * >> - * Copyright (C) 2015 Renesas Electronics Corporation >> - */ >> - >> -#ifndef _XHCI_PLAT_H >> -#define _XHCI_PLAT_H >> - >> -#include "xhci.h" /* for hcd_to_xhci() */ >> - >> -struct xhci_plat_priv { >> - const char *firmware_name; >> - unsigned long long quirks; >> - int (*plat_setup)(struct usb_hcd *); >> - void (*plat_start)(struct usb_hcd *); >> - int (*init_quirk)(struct usb_hcd *); >> - int (*suspend_quirk)(struct usb_hcd *); >> - int (*resume_quirk)(struct usb_hcd *); >> -}; >> - >> -#define hcd_to_xhci_priv(h) ((struct xhci_plat_priv *)hcd_to_xhci(h)->priv) >> -#define xhci_to_priv(x) ((struct xhci_plat_priv *)(x)->priv) >> -#endif /* _XHCI_PLAT_H */ >> diff --git a/drivers/usb/host/xhci-rcar.c b/drivers/usb/host/xhci-rcar.c >> index 1bc4fe7b8c75..7690bee365fd 100644 >> --- a/drivers/usb/host/xhci-rcar.c >> +++ b/drivers/usb/host/xhci-rcar.c >> @@ -14,7 +14,6 @@ >> #include <linux/sys_soc.h> >> >> #include "xhci.h" >> -#include "xhci-plat.h" >> #include "xhci-rcar.h" >> >> /* >> diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h >> index 2595a8f057c4..9a4e2808668b 100644 >> --- a/drivers/usb/host/xhci.h >> +++ b/drivers/usb/host/xhci.h >> @@ -17,6 +17,7 @@ >> #include <linux/kernel.h> >> #include <linux/usb/hcd.h> >> #include <linux/io-64-nonatomic-lo-hi.h> >> +#include <linux/usb/xhci-quirks.h> >> >> /* Code sharing between pci-quirks and xhci hcd */ >> #include "xhci-ext-caps.h" >> @@ -1840,58 +1841,6 @@ struct xhci_hcd { >> #define XHCI_STATE_HALTED (1 << 1) >> #define XHCI_STATE_REMOVING (1 << 2) >> unsigned long long quirks; >> -#define XHCI_LINK_TRB_QUIRK BIT_ULL(0) >> -#define XHCI_RESET_EP_QUIRK BIT_ULL(1) >> -#define XHCI_NEC_HOST BIT_ULL(2) >> -#define XHCI_AMD_PLL_FIX BIT_ULL(3) >> -#define XHCI_SPURIOUS_SUCCESS BIT_ULL(4) >> -/* >> - * Certain Intel host controllers have a limit to the number of endpoint >> - * contexts they can handle. Ideally, they would signal that they can't handle >> - * anymore endpoint contexts by returning a Resource Error for the Configure >> - * Endpoint command, but they don't. Instead they expect software to keep track >> - * of the number of active endpoints for them, across configure endpoint >> - * commands, reset device commands, disable slot commands, and address device >> - * commands. >> - */ >> -#define XHCI_EP_LIMIT_QUIRK BIT_ULL(5) >> -#define XHCI_BROKEN_MSI BIT_ULL(6) >> -#define XHCI_RESET_ON_RESUME BIT_ULL(7) >> -#define XHCI_SW_BW_CHECKING BIT_ULL(8) >> -#define XHCI_AMD_0x96_HOST BIT_ULL(9) >> -#define XHCI_TRUST_TX_LENGTH BIT_ULL(10) >> -#define XHCI_LPM_SUPPORT BIT_ULL(11) >> -#define XHCI_INTEL_HOST BIT_ULL(12) >> -#define XHCI_SPURIOUS_REBOOT BIT_ULL(13) >> -#define XHCI_COMP_MODE_QUIRK BIT_ULL(14) >> -#define XHCI_AVOID_BEI BIT_ULL(15) >> -#define XHCI_PLAT BIT_ULL(16) >> -#define XHCI_SLOW_SUSPEND BIT_ULL(17) >> -#define XHCI_SPURIOUS_WAKEUP BIT_ULL(18) >> -/* For controllers with a broken beyond repair streams implementation */ >> -#define XHCI_BROKEN_STREAMS BIT_ULL(19) >> -#define XHCI_PME_STUCK_QUIRK BIT_ULL(20) >> -#define XHCI_MTK_HOST BIT_ULL(21) >> -#define XHCI_SSIC_PORT_UNUSED BIT_ULL(22) >> -#define XHCI_NO_64BIT_SUPPORT BIT_ULL(23) >> -#define XHCI_MISSING_CAS BIT_ULL(24) >> -/* For controller with a broken Port Disable implementation */ >> -#define XHCI_BROKEN_PORT_PED BIT_ULL(25) >> -#define XHCI_LIMIT_ENDPOINT_INTERVAL_7 BIT_ULL(26) >> -#define XHCI_U2_DISABLE_WAKE BIT_ULL(27) >> -#define XHCI_ASMEDIA_MODIFY_FLOWCONTROL BIT_ULL(28) >> -#define XHCI_HW_LPM_DISABLE BIT_ULL(29) >> -#define XHCI_SUSPEND_DELAY BIT_ULL(30) >> -#define XHCI_INTEL_USB_ROLE_SW BIT_ULL(31) >> -#define XHCI_ZERO_64B_REGS BIT_ULL(32) >> -#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) >> -#define XHCI_SKIP_PHY_INIT BIT_ULL(37) >> -#define XHCI_DISABLE_SPARSE BIT_ULL(38) >> -#define XHCI_SG_TRB_CACHE_SIZE_QUIRK BIT_ULL(39) >> -#define XHCI_NO_SOFT_RETRY BIT_ULL(40) >> >> unsigned int num_active_eps; >> unsigned int limit_active_eps; >> diff --git a/include/linux/usb/xhci-quirks.h b/include/linux/usb/xhci-quirks.h >> new file mode 100644 >> index 000000000000..c2cb35c5b273 >> --- /dev/null >> +++ b/include/linux/usb/xhci-quirks.h >> @@ -0,0 +1,77 @@ >> +/* SPDX-License-Identifier: GPL-2.0 */ >> +/* >> + * This file holds the definitions of quirks found in xHCI USB hosts. >> + */ >> + >> +#ifndef __LINUX_USB_XHCI_QUIRKS_H >> +#define __LINUX_USB_XHCI_QUIRKS_H >> + >> +#define XHCI_LINK_TRB_QUIRK BIT_ULL(0) >> +#define XHCI_RESET_EP_QUIRK BIT_ULL(1) >> +#define XHCI_NEC_HOST BIT_ULL(2) >> +#define XHCI_AMD_PLL_FIX BIT_ULL(3) >> +#define XHCI_SPURIOUS_SUCCESS BIT_ULL(4) >> +/* >> + * Certain Intel host controllers have a limit to the number of endpoint >> + * contexts they can handle. Ideally, they would signal that they can't handle >> + * anymore endpoint contexts by returning a Resource Error for the Configure >> + * Endpoint command, but they don't. Instead they expect software to keep track >> + * of the number of active endpoints for them, across configure endpoint >> + * commands, reset device commands, disable slot commands, and address device >> + * commands. >> + */ >> +#define XHCI_EP_LIMIT_QUIRK BIT_ULL(5) >> +#define XHCI_BROKEN_MSI BIT_ULL(6) >> +#define XHCI_RESET_ON_RESUME BIT_ULL(7) >> +#define XHCI_SW_BW_CHECKING BIT_ULL(8) >> +#define XHCI_AMD_0x96_HOST BIT_ULL(9) >> +#define XHCI_TRUST_TX_LENGTH BIT_ULL(10) >> +#define XHCI_LPM_SUPPORT BIT_ULL(11) >> +#define XHCI_INTEL_HOST BIT_ULL(12) >> +#define XHCI_SPURIOUS_REBOOT BIT_ULL(13) >> +#define XHCI_COMP_MODE_QUIRK BIT_ULL(14) >> +#define XHCI_AVOID_BEI BIT_ULL(15) >> +#define XHCI_PLAT BIT_ULL(16) >> +#define XHCI_SLOW_SUSPEND BIT_ULL(17) >> +#define XHCI_SPURIOUS_WAKEUP BIT_ULL(18) >> +/* For controllers with a broken beyond repair streams implementation */ >> +#define XHCI_BROKEN_STREAMS BIT_ULL(19) >> +#define XHCI_PME_STUCK_QUIRK BIT_ULL(20) >> +#define XHCI_MTK_HOST BIT_ULL(21) >> +#define XHCI_SSIC_PORT_UNUSED BIT_ULL(22) >> +#define XHCI_NO_64BIT_SUPPORT BIT_ULL(23) >> +#define XHCI_MISSING_CAS BIT_ULL(24) >> +/* For controller with a broken Port Disable implementation */ >> +#define XHCI_BROKEN_PORT_PED BIT_ULL(25) >> +#define XHCI_LIMIT_ENDPOINT_INTERVAL_7 BIT_ULL(26) >> +#define XHCI_U2_DISABLE_WAKE BIT_ULL(27) >> +#define XHCI_ASMEDIA_MODIFY_FLOWCONTROL BIT_ULL(28) >> +#define XHCI_HW_LPM_DISABLE BIT_ULL(29) >> +#define XHCI_SUSPEND_DELAY BIT_ULL(30) >> +#define XHCI_INTEL_USB_ROLE_SW BIT_ULL(31) >> +#define XHCI_ZERO_64B_REGS BIT_ULL(32) >> +#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) >> +#define XHCI_SKIP_PHY_INIT BIT_ULL(37) >> +#define XHCI_DISABLE_SPARSE BIT_ULL(38) >> +#define XHCI_SG_TRB_CACHE_SIZE_QUIRK BIT_ULL(39) >> +#define XHCI_NO_SOFT_RETRY BIT_ULL(40) >> + >> +struct usb_hcd; >> + >> +struct xhci_plat_priv { >> + const char *firmware_name; >> + unsigned long long quirks; >> + int (*plat_setup)(struct usb_hcd *hcd); >> + void (*plat_start)(struct usb_hcd *hcd); >> + int (*init_quirk)(struct usb_hcd *hcd); >> + int (*suspend_quirk)(struct usb_hcd *hcd); >> + int (*resume_quirk)(struct usb_hcd *hcd); >> +}; >> + >> +#define hcd_to_xhci_priv(h) ((struct xhci_plat_priv *)hcd_to_xhci(h)->priv) >> +#define xhci_to_priv(x) ((struct xhci_plat_priv *)(x)->priv) > > Why do you need this tructure and #defines for xhci priv stuff need to > be in a public .h file? > > I would think that at most you just need the xhci bit fields. > > thanks, > > greg k-h > Ah right.... What I wanted to do was to also expose the xhci-plat.h as a common header for DWC3. I should leave that a separate file separate from this. Thanks, Thinh