iommu/arm-smmu: Treat IOMMU_DOMAIN_DMA as bypass for now
authorWill Deacon <will.deacon@arm.com>
Thu, 18 Feb 2016 12:05:57 +0000 (12:05 +0000)
committerWill Deacon <will.deacon@arm.com>
Thu, 18 Feb 2016 15:02:44 +0000 (15:02 +0000)
Until all upstream devices have their DMA ops swizzled to point at the
SMMU, we need to treat the IOMMU_DOMAIN_DMA domain as bypass to avoid
putting devices into an empty address space when detaching from VFIO.

Signed-off-by: Will Deacon <will.deacon@arm.com>
drivers/iommu/arm-smmu-v3.c
drivers/iommu/arm-smmu.c

index d96d45d..4ff73ff 100644 (file)
@@ -1687,7 +1687,12 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)
                goto out_unlock;
 
        smmu_group->domain      = smmu_domain;
-       smmu_group->ste.bypass  = false;
+
+       /*
+        * FIXME: This should always be "false" once we have IOMMU-backed
+        * DMA ops for all devices behind the SMMU.
+        */
+       smmu_group->ste.bypass  = domain->type == IOMMU_DOMAIN_DMA;
 
        ret = arm_smmu_install_ste_for_group(smmu_group);
        if (IS_ERR_VALUE(ret))
index f21332a..2409e3b 100644 (file)
@@ -1094,6 +1094,13 @@ static int arm_smmu_domain_add_master(struct arm_smmu_domain *smmu_domain,
        if (ret)
                return ret == -EEXIST ? 0 : ret;
 
+       /*
+        * FIXME: This won't be needed once we have IOMMU-backed DMA ops
+        * for all devices behind the SMMU.
+        */
+       if (smmu_domain->domain.type == IOMMU_DOMAIN_DMA)
+               return 0;
+
        for (i = 0; i < cfg->num_streamids; ++i) {
                u32 idx, s2cr;