[RFC PATCH 6/9] usb: xhci: Allow accessing 64-bit registers with DWORD accesses only

Sylwester Nawrocki s.nawrocki at samsung.com
Tue Apr 21 18:50:56 CEST 2020

This patch adds a Kconfig option which allows accessing 64-bit xHCI
IO registers only with 2 double word accesses rather than using
a single quad word access. There might be HW configurations where
single quad word access doesn't work, even though the CPU is 64-bit.
That seems to be the case on rpi4 board with Broadcom BCM2711 SoC,
where the VL805 USB xHCI hub is connected to the PCIe controller
behind the SCB bridge.

Signed-off-by: Sylwester Nawrocki <s.nawrocki at samsung.com>
So far I couldn't come up with anything better to make the xHCI host
controller working on the rpi4 board. For some reason dereferencing
a 64-bit pointer to access 64-bit registers doesn't work there,
might be a limitation of the PCIe bridge behind the SCB. In Linux
always 2 double word accesses are used.
 drivers/usb/host/Kconfig | 7 +++++++
 include/usb/xhci.h       | 4 ++--
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
index 0987ff2..3990b8a 100644
--- a/drivers/usb/host/Kconfig
+++ b/drivers/usb/host/Kconfig
@@ -15,6 +15,13 @@ config USB_XHCI_HCD
+	bool "Access xHCI 64-bit registers with double word accesses only"
+	help
+	  Choose this option if your hardware does not support quad word accesses
+	  for registers with 64-bit address pointers.
+	  If unsure, say Y.
 config USB_XHCI_DWC3
 	bool "DesignWare USB3 DRD Core Support"
diff --git a/include/usb/xhci.h b/include/usb/xhci.h
index 6017504..459e76b 100644
--- a/include/usb/xhci.h
+++ b/include/usb/xhci.h
@@ -1111,7 +1111,7 @@ static inline void xhci_writel(uint32_t volatile *regs, const unsigned int val)
 static inline u64 xhci_readq(__le64 volatile *regs)
-#if BITS_PER_LONG == 64
 	return readq(regs);
 	__u32 *ptr = (__u32 *)regs;
@@ -1123,7 +1123,7 @@ static inline u64 xhci_readq(__le64 volatile *regs)
 static inline void xhci_writeq(__le64 volatile *regs, const u64 val)
-#if BITS_PER_LONG == 64
 	writeq(val, regs);
 	__u32 *ptr = (__u32 *)regs;

More information about the U-Boot mailing list