[RFC] dev_phys_to_bus() and PCI
Simon Glass
sjg at chromium.org
Sat Mar 13 20:19:30 CET 2021
+Tom Rini
Hi Mark,
On Sat, 13 Mar 2021 at 02:24, Mark Kettenis <mark.kettenis at xs4all.nl> wrote:
>
> I'm working on support for Apple's M1 systems in U-Boot. The idea is
> that this can be used as a "payload" for the m1n1 bootloader that is
> being developed by Hector Martin for Asahi Linux in order to provide
> an UEFI implementation that can boot a standard arm64 OS.
>
> My current code, which can be found on the "apple-m1-m1n1" branch at:
>
> https://github.com/kettenis/u-boot/tree/apple-m1-m1n1
>
> can already do this. I'm booting OpenBSD/arm64 this way and I've also
> booted into grub using a standard arm64 Debian installer.
>
> One of the big challenges I'm facing is that the integrated PCIe
> devices on the system sit behind an IOMMU that (as far as we can tell)
> doesn't support any kind of bypass mode. I don't think we want full
> IOMMU support in U-Boot, so the approach I'm currently taking is that
> I set up the IOMMU to map a chunk of memory at the "top of RAM" where
> U-Boot resides after relocation. But in order to use this mapping I
> need to do DMA address translation.
>
> Fortunately Nicolas Saenz Julienne recently introduced
> dev_phys_to_bus() and dev_bus_to_phys() interfaces to do this. Those
> interfaces make use of a dma-ranges property in the device tree which
> doesn't work so well for PCI devices though. However, the PCI code in
> U-Boot already has a way to describe DMA address translation through
> its regions support. Hooking this up to dev_phys_to_bus() and
> dev_bus_to_phys() is fairly easy as illustrated by the diff below.
>
> Would this be viable approach? This could also help adding support
> for PCIe devices on the Raspberry Pi CM4.
It seems OK to me.
I suspect IOMMU support will be needed to some degree eventually in U-Boot.
Regards,
Simon
>
>
> commit 4f0e989c7a765291a38b7d10da562f23c5f31239
> Author: Mark Kettenis <kettenis at openbsd.org>
> Date: Fri Mar 12 20:23:11 2021 +0100
>
> dm: Add PCI support to dev_phys_to_bus()/dev_bus_to_phys()
>
> For PCI devices, call dm_pci_phys_to_bus()/dm_pci_bus_to_phys()
> to do the address translation. This uses the regions set up
> by the PCI host controller driver to do the translation as a
> single translation offset may not be sufficient in this case.
>
> Signed-off-by: Mark Kettenis <kettenis at openbsd.org>
>
> diff --git a/include/phys2bus.h b/include/phys2bus.h
> index 866b8b51a8..13d23ef4bb 100644
> --- a/include/phys2bus.h
> +++ b/include/phys2bus.h
> @@ -23,14 +23,21 @@ static inline unsigned long bus_to_phys(unsigned long bus)
>
> #if CONFIG_IS_ENABLED(DM)
> #include <dm/device.h>
> +#include <pci.h>
>
> static inline dma_addr_t dev_phys_to_bus(struct udevice *dev, phys_addr_t phys)
> {
> + if (device_is_on_pci_bus(dev))
> + return dm_pci_phys_to_bus(dev, phys, PCI_REGION_SYS_MEMORY);
> +
> return phys - dev_get_dma_offset(dev);
> }
>
> static inline phys_addr_t dev_bus_to_phys(struct udevice *dev, dma_addr_t bus)
> {
> + if (device_is_on_pci_bus(dev))
> + return dm_pci_bus_to_phys(dev, bus, PCI_REGION_SYS_MEMORY);
> +
> return bus + dev_get_dma_offset(dev);
> }
> #else
More information about the U-Boot
mailing list