diff options
| -rw-r--r-- | drivers/iommu/tegra-smmu.c | 25 |
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 | ||
