aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/iommu/tegra-smmu.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/drivers/iommu/tegra-smmu.c b/drivers/iommu/tegra-smmu.c
index 5182c7d6171e..8d30653cd13a 100644
--- a/drivers/iommu/tegra-smmu.c
+++ b/drivers/iommu/tegra-smmu.c
@@ -102,7 +102,6 @@ static inline u32 smmu_readl(struct tegra_smmu *smmu, unsigned long offset)
102#define SMMU_TLB_FLUSH_VA_MATCH_ALL (0 << 0) 102#define SMMU_TLB_FLUSH_VA_MATCH_ALL (0 << 0)
103#define SMMU_TLB_FLUSH_VA_MATCH_SECTION (2 << 0) 103#define SMMU_TLB_FLUSH_VA_MATCH_SECTION (2 << 0)
104#define SMMU_TLB_FLUSH_VA_MATCH_GROUP (3 << 0) 104#define SMMU_TLB_FLUSH_VA_MATCH_GROUP (3 << 0)
105#define SMMU_TLB_FLUSH_ASID(x) (((x) & 0x7f) << 24)
106#define SMMU_TLB_FLUSH_VA_SECTION(addr) ((((addr) & 0xffc00000) >> 12) | \ 105#define SMMU_TLB_FLUSH_VA_SECTION(addr) ((((addr) & 0xffc00000) >> 12) | \
107 SMMU_TLB_FLUSH_VA_MATCH_SECTION) 106 SMMU_TLB_FLUSH_VA_MATCH_SECTION)
108#define SMMU_TLB_FLUSH_VA_GROUP(addr) ((((addr) & 0xffffc000) >> 12) | \ 107#define SMMU_TLB_FLUSH_VA_GROUP(addr) ((((addr) & 0xffffc000) >> 12) | \
@@ -205,8 +204,12 @@ static inline void smmu_flush_tlb_asid(struct tegra_smmu *smmu,
205{ 204{
206 u32 value; 205 u32 value;
207 206
208 value = SMMU_TLB_FLUSH_ASID_MATCH | SMMU_TLB_FLUSH_ASID(asid) | 207 if (smmu->soc->num_asids == 4)
209 SMMU_TLB_FLUSH_VA_MATCH_ALL; 208 value = (asid & 0x3) << 29;
209 else
210 value = (asid & 0x7f) << 24;
211
212 value |= SMMU_TLB_FLUSH_ASID_MATCH | SMMU_TLB_FLUSH_VA_MATCH_ALL;
210 smmu_writel(smmu, value, SMMU_TLB_FLUSH); 213 smmu_writel(smmu, value, SMMU_TLB_FLUSH);
211} 214}
212 215
@@ -216,8 +219,12 @@ static inline void smmu_flush_tlb_section(struct tegra_smmu *smmu,
216{ 219{
217 u32 value; 220 u32 value;
218 221
219 value = SMMU_TLB_FLUSH_ASID_MATCH | SMMU_TLB_FLUSH_ASID(asid) | 222 if (smmu->soc->num_asids == 4)
220 SMMU_TLB_FLUSH_VA_SECTION(iova); 223 value = (asid & 0x3) << 29;
224 else
225 value = (asid & 0x7f) << 24;
226
227 value |= SMMU_TLB_FLUSH_ASID_MATCH | SMMU_TLB_FLUSH_VA_SECTION(iova);
221 smmu_writel(smmu, value, SMMU_TLB_FLUSH); 228 smmu_writel(smmu, value, SMMU_TLB_FLUSH);
222} 229}
223 230
@@ -227,8 +234,12 @@ static inline void smmu_flush_tlb_group(struct tegra_smmu *smmu,
227{ 234{
228 u32 value; 235 u32 value;
229 236
230 value = SMMU_TLB_FLUSH_ASID_MATCH | SMMU_TLB_FLUSH_ASID(asid) | 237 if (smmu->soc->num_asids == 4)
231 SMMU_TLB_FLUSH_VA_GROUP(iova); 238 value = (asid & 0x3) << 29;
239 else
240 value = (asid & 0x7f) << 24;
241
242 value |= SMMU_TLB_FLUSH_ASID_MATCH | SMMU_TLB_FLUSH_VA_GROUP(iova);
232 smmu_writel(smmu, value, SMMU_TLB_FLUSH); 243 smmu_writel(smmu, value, SMMU_TLB_FLUSH);
233} 244}
234 245