On 10/12/26 12:03 AM, Tom Rini wrote:
On Sun, Oct 11, 2026 at 05:16:41PM +0200, Marek Vasut wrote:
On 10/6/26 6:10 PM, Tom Rini wrote:
On Wed, Oct 07, 2026 at 12:58:33AM +0900, khaliforce wrote:
The generic OHCI and EHCI drivers provide remove callbacks, but do
not set DM_FLAG_ACTIVE_DMA. Their controllers can remain active
when U-Boot hands control to the operating system.
An active controller may continue DMA after the operating system
starts reusing U-Boot memory. In particular, OHCI may continue
accessing its HCCA.
Set DM_FLAG_ACTIVE_DMA on both drivers so their existing remove
callbacks stop the controllers during OS preparation.
Signed-off-by: khaliforce <[email protected]>
---
Changes in v2:
- Use DM_FLAG_ACTIVE_DMA as suggested by Neil Armstrong.
Retested on MangoPi MQ Pro with the downstream D1 port based on
U-Boot v2026.10 and Linux 6.1:
- Read a 64 GB FAT32 USB device in U-Boot.
- Verified a 4096-byte read against Linux using CRC32.
- Booted Linux without running "usb stop".
- Confirmed USB reads, Wi-Fi and SSH after the handoff.
- Observed no panic, Bad page or failed services.
Standalone builds pass for RISC-V64, ARM64 and ARM32 on upstream
main. RISC-V64 QEMU boots. Checkpatch reports no errors or warnings.
drivers/usb/host/ehci-generic.c | 2 +-
drivers/usb/host/ohci-generic.c | 3 ++-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/usb/host/ehci-generic.c b/drivers/usb/host/ehci-generic.c
index 1ae3619ce25..57f1bcbd9c0 100644
--- a/drivers/usb/host/ehci-generic.c
+++ b/drivers/usb/host/ehci-generic.c
@@ -167,5 +167,5 @@ U_BOOT_DRIVER(ehci_generic) = {
.remove = ehci_usb_remove,
.ops = &ehci_usb_ops,
.priv_auto = sizeof(struct generic_ehci),
- .flags = DM_FLAG_ALLOC_PRIV_DMA,
+ .flags = DM_FLAG_ALLOC_PRIV_DMA | DM_FLAG_ACTIVE_DMA,
};
diff --git a/drivers/usb/host/ohci-generic.c b/drivers/usb/host/ohci-generic.c
index cc44226f5e0..7493750f8d1 100644
--- a/drivers/usb/host/ohci-generic.c
+++ b/drivers/usb/host/ohci-generic.c
@@ -110,5 +110,6 @@ U_BOOT_DRIVER(ohci_generic) = {
.remove = ohci_usb_remove,
.ops = &ohci_usb_ops,
.priv_auto = sizeof(struct generic_ohci),
- .flags = DM_FLAG_ALLOC_PRIV_DMA,
+ /* Stop HCCA DMA before Linux reuses the controller memory. */
HCCA is communication area ?
+ .flags = DM_FLAG_ALLOC_PRIV_DMA | DM_FLAG_ACTIVE_DMA,
};
Ah. Perhaps this is also what Romain needs for fixing the problem they
see on an Apple platform, and would be more palatable to Marek to apply
generally to USB host drivers (and switch the ones that use
DM_FLAG_OS_PREPARE today?) ?
This works, but maybe we should instead unconditionally call usb_stop()
before booting ?
I believe the answer there is that we have flags to handle this problem
generically rather than hard-coding a call in every arch's
boot_prep_linux or similar like we had to with the old USB gadget stack.
This is shutting down host, not gadget. And I believe usb_stop() is
necessary to correctly shut down the devices on the USB bus, while the
DM_FLAG_ACTIVE_DMA flag is necessary to shut down the controller, so
both are needed.