summaryrefslogtreecommitdiff
path: root/arch/arm64/mm/dma-mapping.c
diff options
context:
space:
mode:
authorLiam Mark <lmark@codeaurora.org>2016-07-29 17:21:35 -0700
committerLiam Mark <lmark@codeaurora.org>2016-08-01 14:35:15 -0700
commit7debeac5bbacb258d41a3f2a5203e6cb4277a99e (patch)
tree822521a54335ced49bb0476d3c468202e46b29ea /arch/arm64/mm/dma-mapping.c
parent805f58d1f5abaa4a58b405b7cf228a83fcb04c02 (diff)
arm64: dma-mapping: don't clear dma ops on bypass detach
On iommu attach and detach we should not be changing the dma ops if the domain is in bypass. Fix the iommu detach call to not clear the dma ops if the domain is in bypass. CRs-Fixed: 1048740 Change-Id: Ie29e7a6a5375e1ec33b000fa09f01aeb7406c8d9 Signed-off-by: Liam Mark <lmark@codeaurora.org>
Diffstat (limited to 'arch/arm64/mm/dma-mapping.c')
-rw-r--r--arch/arm64/mm/dma-mapping.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
index 416b2afc6555..06f9ffccd562 100644
--- a/arch/arm64/mm/dma-mapping.c
+++ b/arch/arm64/mm/dma-mapping.c
@@ -2147,7 +2147,7 @@ EXPORT_SYMBOL(arm_iommu_attach_device);
void arm_iommu_detach_device(struct device *dev)
{
struct dma_iommu_mapping *mapping;
- int is_fast;
+ int is_fast, s1_bypass = 0;
mapping = to_dma_iommu_mapping(dev);
if (!mapping) {
@@ -2161,10 +2161,14 @@ void arm_iommu_detach_device(struct device *dev)
return;
}
+ iommu_domain_get_attr(mapping->domain, DOMAIN_ATTR_S1_BYPASS,
+ &s1_bypass);
+
iommu_detach_device(mapping->domain, dev);
kref_put(&mapping->kref, release_iommu_mapping);
dev->archdata.mapping = NULL;
- set_dma_ops(dev, NULL);
+ if (!s1_bypass)
+ set_dma_ops(dev, NULL);
pr_debug("Detached IOMMU controller from %s device.\n", dev_name(dev));
}