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
