iommu/exynos: Set correct dma mask for SysMMU v5+
authorSam Protsenko <semen.protsenko@linaro.org>
Thu, 14 Jul 2022 16:55:47 +0000 (19:55 +0300)
committerJoerg Roedel <jroedel@suse.de>
Fri, 15 Jul 2022 08:30:44 +0000 (10:30 +0200)
SysMMU v5+ supports 36 bit physical address space. Set corresponding DMA
mask to avoid falling back to SWTLBIO usage in dma_map_single() because
of failed dma_capable() check.

The original code for this fix was suggested by Marek.

Signed-off-by: Sam Protsenko <semen.protsenko@linaro.org>
Co-developed-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Link: https://lore.kernel.org/r/20220714165550.8884-4-semen.protsenko@linaro.org
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/exynos-iommu.c

index 7058f08..ca3656e 100644 (file)
@@ -646,6 +646,14 @@ static int exynos_sysmmu_probe(struct platform_device *pdev)
                }
        }
 
+       if (MMU_MAJ_VER(data->version) >= 5) {
+               ret = dma_set_mask(dev, DMA_BIT_MASK(36));
+               if (ret) {
+                       dev_err(dev, "Unable to set DMA mask: %d\n", ret);
+                       goto err_dma_set_mask;
+               }
+       }
+
        /*
         * use the first registered sysmmu device for performing
         * dma mapping operations on iommu page tables (cpu cache flush)
@@ -657,6 +665,8 @@ static int exynos_sysmmu_probe(struct platform_device *pdev)
 
        return 0;
 
+err_dma_set_mask:
+       iommu_device_unregister(&data->iommu);
 err_iommu_register:
        iommu_device_sysfs_remove(&data->iommu);
        return ret;