diff options
-rw-r--r-- | drivers/iommu/arm-smmu.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c index 38f8d670afb3..e8d311152203 100644 --- a/drivers/iommu/arm-smmu.c +++ b/drivers/iommu/arm-smmu.c | |||
@@ -1213,6 +1213,11 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) | |||
1213 | return -ENXIO; | 1213 | return -ENXIO; |
1214 | } | 1214 | } |
1215 | 1215 | ||
1216 | if (dev->archdata.iommu) { | ||
1217 | dev_err(dev, "already attached to IOMMU domain\n"); | ||
1218 | return -EEXIST; | ||
1219 | } | ||
1220 | |||
1216 | /* | 1221 | /* |
1217 | * Sanity check the domain. We don't support domains across | 1222 | * Sanity check the domain. We don't support domains across |
1218 | * different SMMUs. | 1223 | * different SMMUs. |
@@ -1239,7 +1244,10 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) | |||
1239 | if (!cfg) | 1244 | if (!cfg) |
1240 | return -ENODEV; | 1245 | return -ENODEV; |
1241 | 1246 | ||
1242 | return arm_smmu_domain_add_master(smmu_domain, cfg); | 1247 | ret = arm_smmu_domain_add_master(smmu_domain, cfg); |
1248 | if (!ret) | ||
1249 | dev->archdata.iommu = domain; | ||
1250 | return ret; | ||
1243 | } | 1251 | } |
1244 | 1252 | ||
1245 | static void arm_smmu_detach_dev(struct iommu_domain *domain, struct device *dev) | 1253 | static void arm_smmu_detach_dev(struct iommu_domain *domain, struct device *dev) |
@@ -1248,8 +1256,11 @@ static void arm_smmu_detach_dev(struct iommu_domain *domain, struct device *dev) | |||
1248 | struct arm_smmu_master_cfg *cfg; | 1256 | struct arm_smmu_master_cfg *cfg; |
1249 | 1257 | ||
1250 | cfg = find_smmu_master_cfg(dev); | 1258 | cfg = find_smmu_master_cfg(dev); |
1251 | if (cfg) | 1259 | if (!cfg) |
1252 | arm_smmu_domain_remove_master(smmu_domain, cfg); | 1260 | return; |
1261 | |||
1262 | dev->archdata.iommu = NULL; | ||
1263 | arm_smmu_domain_remove_master(smmu_domain, cfg); | ||
1253 | } | 1264 | } |
1254 | 1265 | ||
1255 | static bool arm_smmu_pte_is_contiguous_range(unsigned long addr, | 1266 | static bool arm_smmu_pte_is_contiguous_range(unsigned long addr, |