[PATCH v2 00/25] iommu: Make default_domain's mandatory

Marek Szyprowski m.szyprowski at samsung.com
Wed May 17 15:42:54 PDT 2023


On 16.05.2023 02:00, Jason Gunthorpe wrote:
> [ There was alot of unexpected complication after rc1 with this series,
> several new patches were needed ]
>
> It has been a long time coming, this series completes the default_domain
> transition and makes it so that the core IOMMU code will always have a
> non-NULL default_domain for every driver on every
> platform. set_platform_dma_ops() turned out to be a bad idea, and so
> completely remove it.
>
> This is achieved by changing each driver to either:
>
> 1 - Convert the existing (or deleted) ops->detach_dev() into an
>      op->attach_dev() of an IDENTITY domain.
>
>      This is based on the theory that the ARM32 HW is able to function when
>      the iommu is turned off as so the turned off state is an IDENTITY
>      translation.
>
> 2 - Use a new PLATFORM domain type. This is a hack to accommodate drivers
>      that we don't really know WTF they do. S390 is legitimately using this
>      to switch to it's platform dma_ops implementation, which is where the
>      name comes from.
>
> 3 - Do #1 and force the default domain to be IDENTITY, this corrects
>      the tegra-smmu case where even an ARM64 system would have a NULL
>      default_domain.
>
> Using this we can apply the rules:
>
> a) ARM_DMA_USE_IOMMU mode always uses either the driver's
>     ops->default_domain, ops->def_domain_type(), or an IDENTITY domain.
>     All ARM32 drivers provide one of these three options.
>
> b) dma-iommu.c mode uses either the driver's ops->default_domain,
>     ops->def_domain_type or the usual DMA API policy logic based on the
>     command line/etc to pick IDENTITY/DMA domain types
>
> c) All other arch's (PPC/S390) use ops->default_domain always.
>
> See the patch "Require a default_domain for all iommu drivers" for a
> per-driver breakdown.
>
> The conversion broadly teaches a bunch of ARM32 drivers that they can do
> IDENTITY domains. There is some educated guessing involved that these are
> actual IDENTITY domains. If this turns out to be wrong the driver can be
> trivially changed to use a BLOCKING domain type instead. Further, the
> domain type only matters for drivers using ARM64's dma-iommu.c mode as it
> will select IDENTITY based on the command line and expect IDENTITY to
> work. For ARM32 and other arch cases it is purely documentation.
>
> Finally, based on all the analysis in this series, we can purge
> IOMMU_DOMAIN_UNMANAGED/DMA constants from most of the drivers. This
> greatly simplifies understanding the driver contract to the core
> code. IOMMU drivers should not be involved in policy for how the DMA API
> works, that should be a core core decision.
>
> The main gain from this work is to remove alot of ARM_DMA_USE_IOMMU
> specific code and behaviors from drivers. All that remains in iommu
> drivers after this series is the calls to arm_iommu_create_mapping().
>
> This is a step toward removing ARM_DMA_USE_IOMMU.
>
> The IDENTITY domains added to the ARM64 supporting drivers can be tested
> by booting in ARM64 mode and enabling CONFIG_IOMMU_DEFAULT_PASSTHROUGH. If
> the system still boots then most likely the implementation is an IDENTITY
> domain. If not we can trivially change it to BLOCKING or at worst PLATFORM
> if there is no detail what is going on in the HW.
>
> I think this is pretty safe for the ARM32 drivers as they don't really
> change, the code that was in detach_dev continues to be called in the same
> places it was called before.

Tested-by: Marek Szyprowski <m.szyprowski at samsung.com>

Works fine on ARM 32bit Exynos based boards.

> This follows the prior series:
>
> https://lore.kernel.org/r/0-v5-1b99ae392328+44574-iommu_err_unwind_jgg@nvidia.com
>
> This is on github: https://protect2.fireeye.com/v1/url?k=773809ed-1645e36e-773982a2-74fe48600158-bd3a7b89de1f2061&q=1&e=7f176af7-9cf3-429b-a0ce-8812c59dfb5c&u=https%3A%2F%2Fgithub.com%2Fjgunthorpe%2Flinux%2Fcommits%2Fiommu_all_defdom
>
> v2:
>   - FSL is an IDENTITY domain
>   - Delete terga-gart instead of trying to carry it
>   - Use the policy determination from iommu_get_default_domain_type() to
>     drive the arm_iommu mode
>   - Reorganize and introduce new patches to do the above:
>      * Split the ops->identity_domain to an independent earlier patch
>      * Remove the UNMANAGED return from def_domain_type in mtk_v1 earlier
>        so the new iommu_get_default_domain_type() can work
>      * Make the driver's def_domain_type have higher policy priority than
>        untrusted
>      * Merge the set_platfom_dma_ops hunk from mtk_v1 along with rockchip
>        into the patch that forced IDENTITY on ARM32
>   - Revise sun50i to be cleaner and have a non-NULL internal domain
>   - Reword logging in exynos
>   - Remove the gdev from the group alloc path, instead add a new
>     function __iommu_group_domain_alloc() that takes in the group
>     and uses the first device. Split this to its own patch
>   - New patch to make iommufd's mock selftest into a real driver
>   - New patch to fix power's partial iommu driver
> v1: https://lore.kernel.org/r/0-v1-21cc72fcfb22+a7a-iommu_all_defdom_jgg@nvidia.com
>
> Jason Gunthorpe (25):
>    iommu: Add iommu_ops->identity_domain
>    iommu: Add IOMMU_DOMAIN_PLATFORM
>    powerpc/iommu: Setup a default domain and remove set_platform_dma_ops
>    iommu: Add IOMMU_DOMAIN_PLATFORM for S390
>    iommu/tegra-gart: Remove tegra-gart
>    iommu/mtk_iommu_v1: Implement an IDENTITY domain
>    iommu: Reorganize iommu_get_default_domain_type() to respect
>      def_domain_type()
>    iommu: Allow an IDENTITY domain as the default_domain in ARM32
>    iommu/fsl_pamu: Implement an IDENTITY domain
>    iommu/exynos: Implement an IDENTITY domain
>    iommu/tegra-smmu: Implement an IDENTITY domain
>    iommu/tegra-smmu: Support DMA domains in tegra
>    iommu/omap: Implement an IDENTITY domain
>    iommu/msm: Implement an IDENTITY domain
>    iommufd/selftest: Make the mock iommu driver into a real driver
>    iommu: Remove ops->set_platform_dma_ops()
>    iommu/qcom_iommu: Add an IOMMU_IDENTITIY_DOMAIN
>    iommu/ipmmu: Add an IOMMU_IDENTITIY_DOMAIN
>    iommu/mtk_iommu: Add an IOMMU_IDENTITIY_DOMAIN
>    iommu/sun50i: Add an IOMMU_IDENTITIY_DOMAIN
>    iommu: Require a default_domain for all iommu drivers
>    iommu: Add __iommu_group_domain_alloc()
>    iommu: Add ops->domain_alloc_paging()
>    iommu: Convert simple drivers with DOMAIN_DMA to domain_alloc_paging()
>    iommu: Convert remaining simple drivers to domain_alloc_paging()
>
>   arch/arm/configs/multi_v7_defconfig     |   1 -
>   arch/arm/configs/tegra_defconfig        |   1 -
>   arch/powerpc/kernel/iommu.c             |  38 ++-
>   drivers/iommu/Kconfig                   |  11 -
>   drivers/iommu/Makefile                  |   1 -
>   drivers/iommu/arm/arm-smmu/qcom_iommu.c |  45 ++-
>   drivers/iommu/exynos-iommu.c            |  73 +++--
>   drivers/iommu/fsl_pamu_domain.c         |  39 ++-
>   drivers/iommu/iommu-priv.h              |  16 +
>   drivers/iommu/iommu.c                   | 263 +++++++++++------
>   drivers/iommu/iommufd/iommufd_private.h |   5 +-
>   drivers/iommu/iommufd/main.c            |   8 +-
>   drivers/iommu/iommufd/selftest.c        | 141 ++++-----
>   drivers/iommu/ipmmu-vmsa.c              |  50 +++-
>   drivers/iommu/msm_iommu.c               |  30 +-
>   drivers/iommu/mtk_iommu.c               |  30 +-
>   drivers/iommu/mtk_iommu_v1.c            |  28 +-
>   drivers/iommu/omap-iommu.c              |  28 +-
>   drivers/iommu/rockchip-iommu.c          |  26 +-
>   drivers/iommu/s390-iommu.c              |  28 +-
>   drivers/iommu/sprd-iommu.c              |   7 +-
>   drivers/iommu/sun50i-iommu.c            |  35 ++-
>   drivers/iommu/tegra-gart.c              | 371 ------------------------
>   drivers/iommu/tegra-smmu.c              |  50 +++-
>   drivers/memory/tegra/mc.c               |  34 ---
>   drivers/memory/tegra/tegra20.c          |  28 --
>   include/linux/iommu.h                   |  16 +-
>   include/soc/tegra/mc.h                  |  26 --
>   28 files changed, 622 insertions(+), 807 deletions(-)
>   create mode 100644 drivers/iommu/iommu-priv.h
>   delete mode 100644 drivers/iommu/tegra-gart.c
>
>
> base-commit: 0b355ade2baf262f213da274411c0e05d8232a21

Best regards
-- 
Marek Szyprowski, PhD
Samsung R&D Institute Poland




More information about the linux-arm-kernel mailing list