ARM's arch_setup_dma_ops / arm_setup_iommu_dma_ops creates a custom
IOMMU domain for DMA API usage, and continues to do so when an IDENTITY
default domain type is selected.

When a DMA default domain is requested, however, the core owns the
domain and we need to skip our custom domain management. Add checks to
arm_setup/teardown_iommu_dma_ops for these cases.

Signed-off-by: Mikko Perttunen <[email protected]>
---
 arch/arm/mm/dma-mapping.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
index 48b9a9f26095..b82cf58f8bc7 100644
--- a/arch/arm/mm/dma-mapping.c
+++ b/arch/arm/mm/dma-mapping.c
@@ -1788,9 +1788,12 @@ EXPORT_SYMBOL_GPL(arm_iommu_detach_device);
 
 static void arm_setup_iommu_dma_ops(struct device *dev)
 {
-       struct dma_iommu_mapping *mapping;
+       struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev);
        u64 dma_base = 0, size = 1ULL << 32;
 
+       if (mapping)
+               return;
+
        if (dev->dma_range_map) {
                dma_base = dma_range_map_min(dev->dma_range_map);
                size = dma_range_map_max(dev->dma_range_map) - dma_base;
@@ -1816,7 +1819,7 @@ static void arm_teardown_iommu_dma_ops(struct device *dev)
 {
        struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev);
 
-       if (!mapping)
+       if (!mapping || iommu_is_dma_domain(mapping->domain))
                return;
 
        arm_iommu_detach_device(dev);

-- 
2.55.0

Reply via email to