linux-tegra.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 00/20] iommu: Make default_domain's mandatory
@ 2023-05-01 18:02 Jason Gunthorpe
  2023-05-01 18:02 ` [PATCH 01/20] iommu: Add IOMMU_DOMAIN_PLATFORM Jason Gunthorpe
                   ` (21 more replies)
  0 siblings, 22 replies; 50+ messages in thread
From: Jason Gunthorpe @ 2023-05-01 18:02 UTC (permalink / raw)
  To: Andy Gross, Alim Akhtar, Bjorn Andersson,
	AngeloGioacchino Del Regno, Baolin Wang, Gerald Schaefer,
	Heiko Stuebner, iommu, Jernej Skrabec, Jonathan Hunter,
	Joerg Roedel, Konrad Dybcio, Krzysztof Kozlowski,
	linux-arm-kernel, linux-arm-msm, linux-mediatek, linux-rockchip,
	linux-s390, linux-samsung-soc, linux-sunxi, linux-tegra,
	Marek Szyprowski, Matthias Brugger, Matthew Rosato, Orson Zhai,
	Rob Clark, Robin Murphy, Samuel Holland, Niklas Schnelle,
	Thierry Reding, Krishna Reddy, Chen-Yu Tsai, Will Deacon, Yong Wu,
	Chunyan Zhang
  Cc: Lu Baolu, Kevin Tian, Nicolin Chen, Steven Price

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.

This follows the prior series:

https://lore.kernel.org/r/0-v4-79d0c229580a+650-iommu_err_unwind_jgg@nvidia.com

This is on github: https://github.com/jgunthorpe/linux/commits/iommu_all_defdom

Jason Gunthorpe (20):
  iommu: Add IOMMU_DOMAIN_PLATFORM
  iommu/terga-gart: Replace set_platform_dma_ops() with
    IOMMU_DOMAIN_PLATFORM
  iommu/s390: Replace set_platform_dma_ops() with IOMMU_DOMAIN_PLATFORM
  iommu/fsl_pamu: Replace set_platform_dma_ops() with
    IOMMU_DOMAIN_PLATFORM
  iommu: Allow an IDENTITY domain as the default_domain in ARM32
  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
  iommu/mtk_iommu_v1: Implement an IDENTITY domain
  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 ops->domain_alloc_paging()
  iommu: Convert simple drivers with DOMAIN_DMA to domain_alloc_paging()
  iommu: Convert remaining simple drivers to domain_alloc_paging()

 drivers/iommu/arm/arm-smmu/qcom_iommu.c |  45 +++++++++-
 drivers/iommu/exynos-iommu.c            |  71 ++++++++--------
 drivers/iommu/fsl_pamu_domain.c         |  36 ++++++--
 drivers/iommu/iommu.c                   | 108 +++++++++++++-----------
 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            |  30 +++++--
 drivers/iommu/tegra-gart.c              |  37 ++++++--
 drivers/iommu/tegra-smmu.c              |  39 ++++++---
 include/linux/iommu.h                   |  15 +++-
 16 files changed, 407 insertions(+), 201 deletions(-)


base-commit: 91d1e2076e3a796fbf3ec5ddcf5266febc7acb39
-- 
2.40.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

end of thread, other threads:[~2023-05-12 20:52 UTC | newest]

Thread overview: 50+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-01 18:02 [PATCH 00/20] iommu: Make default_domain's mandatory Jason Gunthorpe
2023-05-01 18:02 ` [PATCH 01/20] iommu: Add IOMMU_DOMAIN_PLATFORM Jason Gunthorpe
2023-05-01 18:02 ` [PATCH 02/20] iommu/terga-gart: Replace set_platform_dma_ops() with IOMMU_DOMAIN_PLATFORM Jason Gunthorpe
2023-05-03  9:17   ` Robin Murphy
2023-05-03 11:01     ` Jason Gunthorpe
2023-05-03 12:01       ` Robin Murphy
2023-05-03 13:45         ` Jason Gunthorpe
2023-05-03 14:43           ` Thierry Reding
2023-05-03 17:20             ` Jason Gunthorpe
2023-05-12  2:55               ` Dmitry Osipenko
2023-05-12 16:49                 ` Jason Gunthorpe
2023-05-12 18:12                   ` Robin Murphy
2023-05-12 20:52                     ` Jason Gunthorpe
2023-05-01 18:02 ` [PATCH 03/20] iommu/s390: " Jason Gunthorpe
2023-05-02 17:57   ` Niklas Schnelle
2023-05-01 18:02 ` [PATCH 04/20] iommu/fsl_pamu: " Jason Gunthorpe
2023-05-03 10:57   ` Robin Murphy
2023-05-03 12:54     ` Jason Gunthorpe
2023-05-01 18:02 ` [PATCH 05/20] iommu: Allow an IDENTITY domain as the default_domain in ARM32 Jason Gunthorpe
2023-05-03 13:50   ` Robin Murphy
2023-05-03 14:23     ` Jason Gunthorpe
2023-05-01 18:02 ` [PATCH 06/20] iommu/exynos: Implement an IDENTITY domain Jason Gunthorpe
2023-05-03 15:31   ` Robin Murphy
2023-05-04 14:19     ` Jason Gunthorpe
2023-05-01 18:02 ` [PATCH 07/20] iommu/tegra-smmu: " Jason Gunthorpe
2023-05-01 18:02 ` [PATCH 08/20] iommu/tegra-smmu: Support DMA domains in tegra Jason Gunthorpe
2023-05-01 18:02 ` [PATCH 09/20] iommu/omap: Implement an IDENTITY domain Jason Gunthorpe
2023-05-01 18:02 ` [PATCH 10/20] iommu/msm: " Jason Gunthorpe
2023-05-01 18:02 ` [PATCH 11/20] iommu/mtk_iommu_v1: " Jason Gunthorpe
2023-05-01 18:02 ` [PATCH 12/20] iommu: Remove ops->set_platform_dma_ops() Jason Gunthorpe
2023-05-01 18:02 ` [PATCH 13/20] iommu/qcom_iommu: Add an IOMMU_IDENTITIY_DOMAIN Jason Gunthorpe
2023-05-01 18:02 ` [PATCH 14/20] iommu/ipmmu: " Jason Gunthorpe
2023-05-01 18:02 ` [PATCH 15/20] iommu/mtk_iommu: " Jason Gunthorpe
2023-05-01 18:03 ` [PATCH 16/20] iommu/sun50i: " Jason Gunthorpe
2023-05-03 15:54   ` Robin Murphy
2023-05-03 16:49     ` Jason Gunthorpe
2023-05-01 18:03 ` [PATCH 17/20] iommu: Require a default_domain for all iommu drivers Jason Gunthorpe
2023-05-01 18:03 ` [PATCH 18/20] iommu: Add ops->domain_alloc_paging() Jason Gunthorpe
2023-05-03 17:17   ` Robin Murphy
2023-05-03 19:35     ` Jason Gunthorpe
2023-05-04 12:35       ` Niklas Schnelle
2023-05-04 13:14         ` Jason Gunthorpe
2023-05-01 18:03 ` [PATCH 19/20] iommu: Convert simple drivers with DOMAIN_DMA to domain_alloc_paging() Jason Gunthorpe
2023-05-01 18:03 ` [PATCH 20/20] iommu: Convert remaining simple drivers " Jason Gunthorpe
2023-05-02 14:52   ` Niklas Schnelle
2023-05-02 15:25     ` Jason Gunthorpe
2023-05-02 18:02       ` Niklas Schnelle
2023-05-01 21:34 ` [PATCH 00/20] iommu: Make default_domain's mandatory Heiko Stübner
2023-05-01 22:40   ` Jason Gunthorpe
2023-05-01 22:10 ` Heiko Stübner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).