From: Thierry Reding <treding@xxxxxxxxxx> Hi, this is an updated proposal to solve the problem of passing memory regions that are actively being accessed during boot. The particular use-case that I need this for is when the bootloader has set up the display controller to scan out a boot splash screen. During boot the DMA/IOMMU glue code will attach devices to an IOMMU domain and by doing so enable IOMMU translations. Typically this will be before a device driver has had a chance to either disable the display controller or set up a new framebuffer and map it to the IOMMU. In that case, the IOMMU will start to fault because the accesses of the display controller will be for memory addresses that are not mapped in the IOMMU. The solution is obviously to create identity mappings for such memory regions. From a device tree point of view, these memory regions can be described using the reserved-memory device tree bindings and hooked up to the consumer devices using the "memory-region" property. On the kernel side, the IOMMU framework already supports the concept of reserved regions, as well as a way of marking these regions as requiring identity (a.k.a. direct) mappings. Unfortunately, the current reserved-memory region bindings only allow properties of the regions themselves to be described (such as whether a kernel virtual mapping of the region is needed or not), but it doesn't provide a way of associating extra information with any particular reference to these regions. However, that's exactly what's needed for this case because a given region may need to be identity mapped for a specific device (such as the display controller scanning out from the region) but referenced by multiple devices (e.g. if the memory is some special carveout memory reserved for display purposes). This series of patches proposes a simple solution: extend memory-region properties to use an optional specifier, such as the ones already commonly used for things like GPIOs or interrupts. The specifier needs to be provided if the reserved-memory region has a non-zero #memory-region-cells property (if the property is not present, zero is the assumed default value). The specifier contains flags that specify how the reference is to be treated. This series of patches introduces the MEMORY_REGION_IDENTITY_MAPPING flag (value: 0x1) that marks the specific reference to the memory region to require an identity mapping. In practice, a device tree would look like this: reserved-memory { #address-cells = <2>; #size-cells = <2>; fb: framebuffer@92cb2000 { reg = <0 0x92cb2000 0 0x00800000>; #memory-region-cells = <1>; }; }; ... display@52400000 { ... memory-region = <&fb MEMORY_REGION_IDENTITY_MAPPING>; ... }; Note: While the above would be valid DTS content, it's more likely that in practice this content would be dynamically generated by the bootloader using runtime information (such as the framebuffer memory location). An operating system can derive from that <phandle, specifier> pair that the 8 MiB of memory at physical address 0x92cb2000 need to be identity mapped to the same IO virtual address if the device is attached to an IOMMU. If no IOMMU is enabled in the system, obviously no identity mapping needs to be created, but the operating system may still use the reference to transition to its own framebuffer using the existing memory region. Note that an earlier proposal was to use the existing simple-framebuffer device tree bindings to transport this information. Unfortunately there are cases where this is not enough. On Tegra SoCs, for example, the bootloader will also set up a color space correction lookup table in the system memory that the display controller will access during boot, alongside the framebuffer. The simple-framebuffer DT bindings have no way of describing this (and I guess one could argue that this particular setup no longer is a "simple" framebuffer), so the above, more flexible proposal was implemented. I've made corresponding changes in the proprietary bootloader, added a compatibility shim in U-Boot (which forwards information created by the proprietary bootloader to the kernel) and the attached patches to test this on Jetson TX1, Jetson TX2 and Jetson AGX Xavier. Note that there will be no new releases of the bootloader for earlier devices, so adding support for these new DT bindings will not be practical. The bootloaders on those devices do pass information about the active framebuffer via the kernel command-line, so we may want to add code to create reserved regions in the IOMMU based on that. Thierry Navneet Kumar (1): iommu/tegra-smmu: Support managed domains Thierry Reding (4): dt-bindings: reserved-memory: Document memory region specifier iommu: Implement of_iommu_get_resv_regions() iommu: dma: Use of_iommu_get_resv_regions() iommu/tegra-smmu: Add support for reserved regions .../reserved-memory/reserved-memory.txt | 21 +++ drivers/iommu/dma-iommu.c | 3 + drivers/iommu/of_iommu.c | 54 ++++++++ drivers/iommu/tegra-smmu.c | 121 +++++++++++++++--- include/dt-bindings/reserved-memory.h | 8 ++ include/linux/of_iommu.h | 8 ++ 6 files changed, 199 insertions(+), 16 deletions(-) create mode 100644 include/dt-bindings/reserved-memory.h -- 2.30.2