summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-08-03 21:12:52 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-08-03 21:12:51 -0700
commit1ecb9eaec78fbaa3187574c347165bb70e54fef3 (patch)
treebfcf1f2f106244f513036743a4e630f5cc8fe2b2
parent4cffd9684d63cfa85c262617213d45f7d8b02c41 (diff)
parent7debeac5bbacb258d41a3f2a5203e6cb4277a99e (diff)
Merge "arm64: dma-mapping: don't clear dma ops on bypass detach"
-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));
}