From 5ce5498b6628697d34349d063951f2b9e90e69e4 Mon Sep 17 00:00:00 2001 From: Mitchel Humpherys Date: Tue, 30 Sep 2014 16:14:14 -0700 Subject: [PATCH] iommu/arm-smmu: return 0 on error in ATOS Currently, we return garbage when iova_to_phys fails when we're using hardware translation features (ATOS). iova_to_phys should return 0 when it fails. Fix this. Change-Id: I3bfefce7315e43a684c7c29c4fa7ef5960182ea8 Signed-off-by: Mitchel Humpherys --- drivers/iommu/arm-smmu.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c index e55c6aab5a2c..c49a10c27dc6 100644 --- a/drivers/iommu/arm-smmu.c +++ b/drivers/iommu/arm-smmu.c @@ -1823,12 +1823,12 @@ static phys_addr_t arm_smmu_iova_to_phys_hard(struct iommu_domain *domain, cb_base = ARM_SMMU_CB_BASE(smmu) + ARM_SMMU_CB(smmu, cfg->cbndx); if (smmu->version == 1) { - u32 reg = iova & ~0xFFF; + u32 reg = iova & ~0xfff; writel_relaxed(reg, cb_base + ARM_SMMU_CB_ATS1PR_LO); } else { - u32 reg = iova & ~0xFFF; + u32 reg = iova & ~0xfff; writel_relaxed(reg, cb_base + ARM_SMMU_CB_ATS1PR_LO); - reg = (iova & ~0xFFF) >> 32; + reg = (iova & ~0xfff) >> 32; writel_relaxed(reg, cb_base + ARM_SMMU_CB_ATS1PR_HI); } @@ -1847,8 +1847,10 @@ static phys_addr_t arm_smmu_iova_to_phys_hard(struct iommu_domain *domain, if (phys & CB_PAR_F) { dev_err(dev, "translation fault on %s!\n", dev_name(dev)); dev_err(dev, "PAR = 0x%llx\n", phys); + phys = 0; + } else { + phys = (phys & 0xfffffff000ULL) | (iova & 0x00000fff); } - phys = (phys & 0xFFFFFFF000ULL) | (iova & 0x00000FFF); arm_smmu_disable_clocks(smmu); return phys;