From patchwork Tue Apr 21 16:50:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Sylwester Nawrocki/Kernel \\\(PLT\\\) /SRPOL/Staff Engineer/Samsung Electronics" X-Patchwork-Id: 238217 List-Id: U-Boot discussion From: s.nawrocki at samsung.com (Sylwester Nawrocki) Date: Tue, 21 Apr 2020 18:50:56 +0200 Subject: [RFC PATCH 6/9] usb: xhci: Allow accessing 64-bit registers with DWORD accesses only In-Reply-To: <20200421165059.19394-1-s.nawrocki@samsung.com> References: <20200421165059.19394-1-s.nawrocki@samsung.com> Message-ID: <20200421165059.19394-7-s.nawrocki@samsung.com> 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 --- 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 if USB_XHCI_HCD +config XHCI_64BIT_DWORD_ACCESS_ONLY + 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" help 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 +#if BITS_PER_LONG == 64 && !defined(CONFIG_XHCI_64BIT_DWORD_ACCESS_ONLY) return readq(regs); #else __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 +#if BITS_PER_LONG == 64 && !defined(CONFIG_XHCI_64BIT_DWORD_ACCESS_ONLY) writeq(val, regs); #else __u32 *ptr = (__u32 *)regs;