On Mon, Oct 12, 2026 at 12:24:38AM +0200, Marek Vasut wrote:
> 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.

Host or gadget isn't the point here, it's that we used to hard-code the
stop function call for the non-DM driver and now we have driver model
and flags. Everything should be able to properly unwind with flags being
set.

-- 
Tom

Attachment: signature.asc
Description: PGP signature

Reply via email to