diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2016-12-20 14:04:40 -0800 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-12-20 14:04:40 -0800 |
| commit | a8dd69178c8ab152111fcb1f0fb2b111002104b7 (patch) | |
| tree | 5a84d5b56fdfee1a6c07ff4c2e4eb63752914c7e | |
| parent | ab84cf7576774764b97f4253236f991c78284372 (diff) | |
| parent | 55889f2e5f9155de1bb7ae21d5413d5986c413ce (diff) | |
Merge "arm: dma_mapping: Support for DOMAIN_ATTR_S1_BYPASS attribute"
| -rw-r--r-- | arch/arm/mm/dma-mapping.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 723e3925dc84..48836eba4ab7 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -2160,12 +2160,16 @@ int arm_iommu_attach_device(struct device *dev, struct dma_iommu_mapping *mapping) { int err; + int s1_bypass = 0; err = __arm_iommu_attach_device(dev, mapping); if (err) return err; - set_dma_ops(dev, &iommu_ops); + iommu_domain_get_attr(mapping->domain, DOMAIN_ATTR_S1_BYPASS, + &s1_bypass); + if (!s1_bypass) + set_dma_ops(dev, &iommu_ops); return 0; } EXPORT_SYMBOL_GPL(arm_iommu_attach_device); @@ -2199,8 +2203,21 @@ static void __arm_iommu_detach_device(struct device *dev) */ void arm_iommu_detach_device(struct device *dev) { + struct dma_iommu_mapping *mapping; + int s1_bypass = 0; + + mapping = to_dma_iommu_mapping(dev); + if (!mapping) { + dev_warn(dev, "Not attached\n"); + return; + } + __arm_iommu_detach_device(dev); - set_dma_ops(dev, NULL); + + iommu_domain_get_attr(mapping->domain, DOMAIN_ATTR_S1_BYPASS, + &s1_bypass); + if (!s1_bypass) + set_dma_ops(dev, NULL); } EXPORT_SYMBOL_GPL(arm_iommu_detach_device); |
