|
@@ -1288,10 +1288,13 @@ static phys_addr_t arm_smmu_iova_to_phys(struct iommu_domain *domain,
|
|
|
return 0;
|
|
|
|
|
|
spin_lock_irqsave(&smmu_domain->pgtbl_lock, flags);
|
|
|
- if (smmu_domain->smmu->features & ARM_SMMU_FEAT_TRANS_OPS)
|
|
|
+ if (smmu_domain->smmu->features & ARM_SMMU_FEAT_TRANS_OPS &&
|
|
|
+ smmu_domain->stage == ARM_SMMU_DOMAIN_S1) {
|
|
|
ret = arm_smmu_iova_to_phys_hard(domain, iova);
|
|
|
- else
|
|
|
+ } else {
|
|
|
ret = ops->iova_to_phys(ops, iova);
|
|
|
+ }
|
|
|
+
|
|
|
spin_unlock_irqrestore(&smmu_domain->pgtbl_lock, flags);
|
|
|
|
|
|
return ret;
|
|
@@ -1556,7 +1559,7 @@ static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
|
|
|
- if (smmu->version == 1 || (!(id & ID0_ATOSNS) && (id & ID0_S1TS))) {
|
|
|
+ if ((id & ID0_S1TS) && ((smmu->version == 1) || (id & ID0_ATOSNS))) {
|
|
|
smmu->features |= ARM_SMMU_FEAT_TRANS_OPS;
|
|
|
dev_notice(smmu->dev, "\taddress translation ops\n");
|
|
|
}
|