[RFC PATCH v1] usb: xhci: fix crash with arm64 QEMU and KVM

Jerome Forissier jerome.forissier at linaro.org
Tue Jun 10 14:17:57 CEST 2025


Add a xhci_flush_cache() call to xhci_start() to fix the following
issue when running arm64 QEMU with KVM support (on a arm64 host):

 $ make qemu_arm64_defconfig
 $ sed -i 's/CONFIG_BLOBLIST=y/# CONFIG_BLOBLIST is not set/' .config
 $ make -j$(nproc)
 $ qemu-system-aarch64 -machine virt -cpu host -enable-kvm -nographic \
                       -bios u-boot.bin \
                       -device qemu-xhci -device usb-kbd
 U-Boot 2025.07-rc4 (Jun 10 2025 - 12:00:15 +0000)
 [...]
 Register 8001040 NbrPorts 8
 Starting the controller
 "Synchronous Abort" handler, esr 0x96000010, far 0x10100040
 elr: 000000000005b1c8 lr : 000000000005b1ac (reloc)
 elr: 00000000476fc1c8 lr : 00000000476fc1ac
 x0 : 0000000010100040 x1 : 0000000000000001
 x2 : 0000000000000000 x3 : 0000000000003e80
 x4 : 0000000000000000 x5 : 00000000477a5694
 x6 : 0000000000000038 x7 : 000000004666f360
 x8 : 0000000000000000 x9 : 00000000ffffffd8
 x10: 000000000000000d x11: 0000000000000006
 x12: 0000000046560a78 x13: 0000000046560dd0
 x14: 00000000ffffffff x15: 000000004666eed2
 x16: 00000000476ee2f0 x17: 0000000000000000
 x18: 0000000046660dd0 x19: 000000004666f480
 x20: 0000000000000000 x21: 0000000010100040
 x22: 0000000010100000 x23: 0000000000000000
 x24: 0000000000000000 x25: 0000000000000000
 x26: 0000000000000000 x27: 0000000000000000
 x28: 0000000000000000 x29: 000000004666f360

 Code: d5033fbf aa1503e0 5287d003 52800002 (b8004401)
 Resetting CPU ...

Reported-by: Mikko Rapeli <mikko.rapeli at linaro.org>
Signed-off-by: Jerome Forissier <jerome.forissier at linaro.org>
---
This is sent as an RFC because I am really not sure what is happening
here. Is this the proper thing to do? xhci_flush_cache() or
xhci_inval_cache()? Where exactly? Which size?

 drivers/usb/host/xhci.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 3ee1f67190f..7c5a898cf3d 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -159,6 +159,7 @@ static int xhci_start(struct xhci_hcor *hcor)
 	int ret;
 
 	puts("Starting the controller\n");
+	xhci_flush_cache((uintptr_t)&hcor, sizeof(hcor));
 	temp = xhci_readl(&hcor->or_usbcmd);
 	temp |= (CMD_RUN);
 	xhci_writel(&hcor->or_usbcmd, temp);
-- 
2.43.0

base-commit: d7c449c3d83a986d61e38d1762433c0607caf5c5
branch: qemu-kvm-fix


More information about the U-Boot mailing list