From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by mx.groups.io with SMTP id smtpd.web10.40614.1629213184708204783 for ; Tue, 17 Aug 2021 08:13:04 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=nSqP+IkC; spf=pass (domain: kernel.org, ip: 198.145.29.99, mailfrom: ardb@kernel.org) Received: by mail.kernel.org (Postfix) with ESMTPSA id 9FC8E61053 for ; Tue, 17 Aug 2021 15:13:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1629213181; bh=GuYoVdooakZZ3rBKCrm6DQMPBj6vufjAvFy89RZCFU4=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=nSqP+IkCgESMRvRBfpU+Ot42mKEaErZEVcYBt3zy9hmW8snIN7Kr2Lg/BrGcjebgO KxTUGK3mufVBs/NHANEho3ye90dbj+YZ1InH7l7drQ/RQG02pEEG0tC7/lMO0mAdw9 afzD4LwZA68OF23phPr5pSBWA0toTqH/MMlJdsNRiyNHZCPHEI2KlKXkbCJkyczvex 5JImegN61EIWuPgVXNqzIWdlRiWghCIWy7OhLSX+4+6qUkZ3CBETpjXgl2YTuDQbAB MuBQeLnEwioT7KD6BMQgZcuVUltKSzF8fggthEmydhLM+n5Lm8+03bfPmDWHH3prXL sYS4Tazrye7bw== Received: by mail-oo1-f52.google.com with SMTP id y16-20020a4ad6500000b0290258a7ff4058so5995721oos.10 for ; Tue, 17 Aug 2021 08:13:01 -0700 (PDT) X-Gm-Message-State: AOAM531BIMV+Lfkzw1KHv7+gHVkkt9b+AXl9dTYqMmiKYHxZEVaHVf7l lynD6yfIXvh+JwXPjuATImDAlyuLld2utLnhAqw= X-Google-Smtp-Source: ABdhPJw+KcK14TTsvyPRtJ6I4toUfGTv3t/FBs2EcIOs0hWmToLsQbwtEv0xsHhqKvA/tRPqZZt4yT1II1bpmwQZ4s4= X-Received: by 2002:a4a:d752:: with SMTP id h18mr3014308oot.13.1629213180907; Tue, 17 Aug 2021 08:13:00 -0700 (PDT) MIME-Version: 1.0 References: <20210816202722.58964-1-jeremy.linton@arm.com> In-Reply-To: <20210816202722.58964-1-jeremy.linton@arm.com> From: "Ard Biesheuvel" Date: Tue, 17 Aug 2021 17:12:49 +0200 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH] Platform/RaspberryPi: Always use non translating DMA in DT mode To: Jeremy Linton Cc: edk2-devel-groups-io , Peter Batard , Ard Biesheuvel , Andrei Warkentin , Sunny Wang , Samer El-Haj-Mahmoud Content-Type: text/plain; charset="UTF-8" On Mon, 16 Aug 2021 at 22:27, Jeremy Linton wrote: > > One of the many issues with the PCIe on this platform is > its inbound DMA is either constrained to the lower 3G, or > on later SoC's a translation can be used. That translation > was problematic with some of the OS's expected to boot > on this platform. So, across the board a 3G DMA limit is > enforced during boot. This itself causes problems because > the later boards removed the SPI EEPROM used by the onboard > XHCI controller, instead favoring using a block of RAM to > load its firmware. Hence it is the lower level firmware's > responsibility via a mailbox call, to read the bridge > translation/configuration before telling the XHCI controller > where it can find its firmware. > > Everything is great, except that it appears that Linux > after reprogramming the bridge to match the DT (when using > a translation) can't actually get the XHCI/QUIRK reset to > function. Apparently, because the firmware only reads the > bridge configuration the first time its called(?). > > So again, simplify the situation and make all DT's > provided by this firmware have a 3G DMA limit on the > PCIe bus. > > Signed-off-by: Jeremy Linton This looks reasonable to me. Anyone care to ack this as well? > --- > Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.c | 51 ++++++++++++++++++++++++++++ > 1 file changed, 51 insertions(+) > > diff --git a/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.c b/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.c > index 0472d8ecf6..bc02cabe24 100644 > --- a/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.c > +++ b/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.c > @@ -334,6 +334,52 @@ CleanSimpleFramebuffer ( > return EFI_SUCCESS; > } > > +STATIC > +EFI_STATUS > +SyncPcie ( > + VOID > + ) > +{ > +#if (RPI_MODEL == 4) > + INTN Node; > + INTN Retval; > + UINT32 DmaRanges[7]; > + > + Node = fdt_path_offset (mFdtImage, "pcie0"); > + if (Node < 0) { > + DEBUG ((DEBUG_ERROR, "%a: failed to locate 'pcie0' alias\n", __FUNCTION__)); > + return EFI_NOT_FOUND; > + } > + > + // non translated 32-bit DMA window with a limit of 0xc0000000 > + DmaRanges[0] = cpu_to_fdt32 (0x02000000); > + DmaRanges[1] = cpu_to_fdt32 (0x00000000); > + DmaRanges[2] = cpu_to_fdt32 (0x00000000); > + DmaRanges[3] = cpu_to_fdt32 (0x00000000); > + DmaRanges[4] = cpu_to_fdt32 (0x00000000); > + DmaRanges[5] = cpu_to_fdt32 (0x00000000); > + DmaRanges[6] = cpu_to_fdt32 (0xc0000000); > + > + DEBUG ((DEBUG_INFO, "%a: Updating PCIe dma-ranges\n", __FUNCTION__)); > + > + // Match dma-ranges with the edk2+ACPI setup we are using. > + // This works around a failure in linux to reset the XHCI correctly > + // when in DT mode following the linux kernel reprogramming the PCIe > + // subsystem to match the DT supplied inbound PCIe/DMA translation. > + // It appears the lower level firmware honors whatever it reads > + // during the first PCI/XHCI quirk call and uses that value until > + // rebooted rather than re-reading it on every mailbox command. > + Retval = fdt_setprop (mFdtImage, Node, "dma-ranges", > + DmaRanges, sizeof DmaRanges); > + if (Retval != 0) { > + DEBUG ((DEBUG_ERROR, "%a: failed to update 'dma-ranges' property (%d)\n", > + __FUNCTION__, Retval)); > + return EFI_NOT_FOUND; > + } > +#endif > + return EFI_SUCCESS; > +} > + > /** > @param ImageHandle of the loaded driver > @param SystemTable Pointer to the System Table > @@ -431,6 +477,11 @@ FdtDxeInitialize ( > Print (L"Failed to update USB compatible properties: %r\n", Status); > } > > + Status = SyncPcie (); > + if (EFI_ERROR (Status)) { > + Print (L"Failed to update PCIe address ranges: %r\n", Status); > + } > + > DEBUG ((DEBUG_INFO, "Installed devicetree at address %p\n", mFdtImage)); > Status = gBS->InstallConfigurationTable (&gFdtTableGuid, mFdtImage); > if (EFI_ERROR (Status)) { > -- > 2.13.7 >