From acdbd3cb6cdd3c0b43a2f0bfd48c83cc3ca02393 Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Fri, 6 Jan 2017 10:49:12 +0000 Subject: [PATCH] arm64: dma-mapping: Only swizzle DMA ops for IOMMU_DOMAIN_DMA The arm64 DMA-mapping implementation sets the DMA ops to the IOMMU DMA ops if we detect that an IOMMU is present for the master and the DMA ranges are valid. In the case when the IOMMU domain for the device is not of type IOMMU_DOMAIN_DMA, then we have no business swizzling the ops, since we're not in control of the underlying address space. This patch leaves the DMA ops alone for masters attached to non-DMA IOMMU domains. BugLink: http://bugs.launchpad.net/bugs/1688158 Reviewed-by: Robin Murphy Signed-off-by: Will Deacon (cherry picked from commit 4a8d8a14c0d08c2437cb80c05e88f6cc1ca3fb2c) Signed-off-by: Manoj Iyer Acked-by: Stefan Bader Acked-by: Thadeu Lima de Souza Cascardo Signed-off-by: Kleber Sacilotto de Souza --- arch/arm64/mm/dma-mapping.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c index 1ffb7d5d299a..50abd2cbbb85 100644 --- a/arch/arm64/mm/dma-mapping.c +++ b/arch/arm64/mm/dma-mapping.c @@ -838,14 +838,21 @@ static bool do_iommu_attach(struct device *dev, const struct iommu_ops *ops, * then the IOMMU core will have already configured a group for this * device, and allocated the default domain for that group. */ - if (!domain || iommu_dma_init_domain(domain, dma_base, size, dev)) { - pr_warn("Failed to set up IOMMU for device %s; retaining platform DMA ops\n", - dev_name(dev)); - return false; + if (!domain) + goto out_err; + + if (domain->type == IOMMU_DOMAIN_DMA) { + if (iommu_dma_init_domain(domain, dma_base, size, dev)) + goto out_err; + + dev->archdata.dma_ops = &iommu_dma_ops; } - dev->archdata.dma_ops = &iommu_dma_ops; return true; +out_err: + pr_warn("Failed to set up IOMMU for device %s; retaining platform DMA ops\n", + dev_name(dev)); + return false; } static void queue_iommu_attach(struct device *dev, const struct iommu_ops *ops, -- 2.39.5