diff options
author | Liam Mark <lmark@codeaurora.org> | 2016-07-29 17:21:35 -0700 |
---|---|---|
committer | Liam Mark <lmark@codeaurora.org> | 2016-08-01 14:35:15 -0700 |
commit | 7debeac5bbacb258d41a3f2a5203e6cb4277a99e (patch) | |
tree | 822521a54335ced49bb0476d3c468202e46b29ea /arch/arm64/mm/dma-mapping.c | |
parent | 805f58d1f5abaa4a58b405b7cf228a83fcb04c02 (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.c | 8 |
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)); } |