[RFC 0/3] Unify IOMMU-based DMA-mapping code for ARM and ARM64
mark.yao at rock-chips.com
Sun Apr 17 19:18:37 PDT 2016
With your patches, do drm/rockchip dma-mapping rewrite, IOMMU works good
on drm/rockchip ARM64 platform.
Thanks for your patches.
On 2016年02月19日 16:22, Marek Szyprowski wrote:
> Dear All,
> This is an initial RFC on the unification of IOMMU-based DMA-mapping
> code for ARM and ARM64 architectures.
> Right now ARM architecture still use my old code for IOMMU-based
> DMA-mapping glue, initially merged in commit
> 4ce63fcd919c32d22528e54dcd89506962933719 ("ARM: dma-mapping: add support
> for IOMMU mapper"). In meantime ARM64 got a new, slightly improved
> implementation provided by Robin Murphy in commit
> 13b8629f651164d71f4d38b821925f93ba4236c8 ("arm64: Add IOMMU dma_ops").
> Both implementations are very similar thus their unification is desired
> to avoid duplicating future works and simplify code, which uses this
> layer on both architectures. In this patchset I've selected the new
> implementation (from ARM64 architecture) as a base. This means that
> ARM-specific, old interface (arm_iommu_* functions) for configuring
> IOMMU domains will be no longer available and its users have to be
> converted to new API.
> Besides lack of old interface, the second difference is additional
> requirements for IOMMU drivers. New code relies on the support for
> IOMMU_DOMAIN_DMA and default IOMMU domain, which is automatically
> attached by the IOMMU core.
> The new code also assumes that the IOMMU-based DMA-mapping ops are
> mainly configured from arch_setup_dma_ops() function, which means that
> the IOMMU driver should provide needed of_xlate callbacks and initialize
> IOMMU ops for device nodes. However it should be also possible to
> initialize IOMMU-based DMA-mapping ops for client devices directly from
> IOMMU drivers by calling common_iommu_setup_dma_ops() (some drivers used
> such approach).
> IOMMU drivers should be also aware of the fact that the
> default domain is attached via device_attach and then device_attach
> callback can be called once again with different domain without previous
> detach from default domain. For more information on this issue, see the
> following thread:
> Currently there are 4 users of the old arm_iommu_* interface:
> 1. Exynos DRM driver
> 2. Rockchip DRM driver
> 3. OMAP3 ISP camera driver
> 4. Renesas VMSA-compatible IPMMU driver
> In this patchset I've converted Exynos DRM driver for the new API (patch
> 1). This required some changes in the memory management model inside the
> driver and removal of some hacks, which were used to setup IOMMU-based
> DMA-mapping ops on the 'exynos-drm' virtual device and common IOMMU
> domain for all Exynos DRM sub-devices, those changes have been posted
> separately here: http://www.spinics.net/lists/dri-devel/msg100861.html
> Rockchip DRM driver requires similar conversion.
> Converting OMAP3 ISP camera driver to new API requires adding support
> for IOMMU groups to OMAP IOMMU driver, because the new DMA/IOMMU code
> used IOMMU_DOMAIN_DMA type domains and default groups.
> Renesas IPMMU driver needs also to be extended with IOMMU_DOMAIN_DMA domain
> type support. It can also be prepared for IOMMU_OF_DECLARE and of_xlate
> callback-based initialization to let core to automatically setup of
> IOMMU-based DMA mapping implementation.
> Patch 2 moves existing code from arch/arm64 to drivers/iommu and
> introduces some minor changes in function names - mainly adding arch_
> prefix to some dma-mapping internal functions, which stay in arch/arm64/
> (functions of similar names are present in arch/arm). Patch 3 adapts ARM
> architecture for the common code.
> I would like to get your comments on the proposed approach. There is
> still some work that need to be done to convert remaining users of the
> old API and updating IOMMU drivers to the new API requirements. This
> change need to be tested on the all affected ARM sub-architectures.
> Right now patches were tested on only Exynos based boards: ARM 32bit:
> Exynos4412 and Exynos5422 boards and ARM 64 bit Exnyos 5433 (with some
> out-of-tree DTS).
> To ease testing I've prepared a branch with all the patches needed
> (there are all needed patches for Exynos subarch, which have been posted
> as separate patchsets):
> https://git.linaro.org/people/marek.szyprowski/linux-srpol.git v4.5-dma-iommu-unification
> Patches are based on Linux v4.5-rc4 vanilla tree.
> Best regards
> Marek Szyprowski
> Samsung R&D Institute Poland
> Patch summary:
> Marek Szyprowski (3):
> drm/exynos: rewrite IOMMU support code
> iommu: dma-iommu: move IOMMU/DMA-mapping code from ARM64 arch to drivers
> iommu: dma-iommu: use common implementation also on ARM architecture
> arch/arm/Kconfig | 22 +-
> arch/arm/include/asm/device.h | 9 -
> arch/arm/include/asm/dma-iommu.h | 37 -
> arch/arm/include/asm/dma-mapping.h | 59 +-
> arch/arm/mm/dma-mapping.c | 1158 +----------------------------
> arch/arm64/include/asm/dma-mapping.h | 39 +-
> arch/arm64/mm/dma-mapping.c | 491 +-----------
> drivers/gpu/drm/exynos/Kconfig | 2 +-
> drivers/gpu/drm/exynos/exynos_drm_drv.c | 7 +-
> drivers/gpu/drm/exynos/exynos_drm_drv.h | 2 +-
> drivers/gpu/drm/exynos/exynos_drm_iommu.c | 91 ++-
> drivers/gpu/drm/exynos/exynos_drm_iommu.h | 2 +-
> drivers/gpu/drm/rockchip/Kconfig | 1 +
> drivers/iommu/Kconfig | 1 +
> drivers/iommu/Makefile | 2 +-
> drivers/iommu/dma-iommu-ops.c | 471 ++++++++++++
> drivers/media/platform/Kconfig | 1 +
> include/linux/dma-iommu.h | 14 +
> 18 files changed, 679 insertions(+), 1730 deletions(-)
> delete mode 100644 arch/arm/include/asm/dma-iommu.h
> create mode 100644 drivers/iommu/dma-iommu-ops.c
More information about the linux-arm-kernel