diff options
author | Robin Murphy <robin.murphy@arm.com> | 2018-03-26 08:35:09 -0400 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2018-03-27 09:12:04 -0400 |
commit | 1cf9e54e91aac61e1a6c2bbacd0b571c6ca09131 (patch) | |
tree | ef94caaab995098fd59a605250ff63cb757693c9 | |
parent | 940ded9c21fde7c47c64d5cc74e22300fb89e6b7 (diff) |
iommu/arm-smmu-v3: Clean up address masking
Before trying to add the SMMUv3.1 support for 52-bit addresses, make
things bearable by cleaning up the various address mask definitions to
use GENMASK_ULL() consistently. The fact that doing so reveals (and
fixes) a latent off-by-one in Q_BASE_ADDR_MASK only goes to show what a
jolly good idea it is...
Tested-by: Nate Watterson <nwatters@codeaurora.org>
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
-rw-r--r-- | drivers/iommu/arm-smmu-v3.c | 53 |
1 files changed, 21 insertions, 32 deletions
diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c index d9b944eabf71..87da25815dac 100644 --- a/drivers/iommu/arm-smmu-v3.c +++ b/drivers/iommu/arm-smmu-v3.c | |||
@@ -22,6 +22,7 @@ | |||
22 | 22 | ||
23 | #include <linux/acpi.h> | 23 | #include <linux/acpi.h> |
24 | #include <linux/acpi_iort.h> | 24 | #include <linux/acpi_iort.h> |
25 | #include <linux/bitops.h> | ||
25 | #include <linux/delay.h> | 26 | #include <linux/delay.h> |
26 | #include <linux/dma-iommu.h> | 27 | #include <linux/dma-iommu.h> |
27 | #include <linux/err.h> | 28 | #include <linux/err.h> |
@@ -158,8 +159,7 @@ | |||
158 | 159 | ||
159 | #define ARM_SMMU_STRTAB_BASE 0x80 | 160 | #define ARM_SMMU_STRTAB_BASE 0x80 |
160 | #define STRTAB_BASE_RA (1UL << 62) | 161 | #define STRTAB_BASE_RA (1UL << 62) |
161 | #define STRTAB_BASE_ADDR_SHIFT 6 | 162 | #define STRTAB_BASE_ADDR_MASK GENMASK_ULL(47, 6) |
162 | #define STRTAB_BASE_ADDR_MASK 0x3ffffffffffUL | ||
163 | 163 | ||
164 | #define ARM_SMMU_STRTAB_BASE_CFG 0x88 | 164 | #define ARM_SMMU_STRTAB_BASE_CFG 0x88 |
165 | #define STRTAB_BASE_CFG_LOG2SIZE_SHIFT 0 | 165 | #define STRTAB_BASE_CFG_LOG2SIZE_SHIFT 0 |
@@ -190,8 +190,7 @@ | |||
190 | #define ARM_SMMU_PRIQ_IRQ_CFG2 0xdc | 190 | #define ARM_SMMU_PRIQ_IRQ_CFG2 0xdc |
191 | 191 | ||
192 | /* Common MSI config fields */ | 192 | /* Common MSI config fields */ |
193 | #define MSI_CFG0_ADDR_SHIFT 2 | 193 | #define MSI_CFG0_ADDR_MASK GENMASK_ULL(47, 2) |
194 | #define MSI_CFG0_ADDR_MASK 0x3fffffffffffUL | ||
195 | #define MSI_CFG2_SH_SHIFT 4 | 194 | #define MSI_CFG2_SH_SHIFT 4 |
196 | #define MSI_CFG2_SH_NSH (0UL << MSI_CFG2_SH_SHIFT) | 195 | #define MSI_CFG2_SH_NSH (0UL << MSI_CFG2_SH_SHIFT) |
197 | #define MSI_CFG2_SH_OSH (2UL << MSI_CFG2_SH_SHIFT) | 196 | #define MSI_CFG2_SH_OSH (2UL << MSI_CFG2_SH_SHIFT) |
@@ -207,8 +206,7 @@ | |||
207 | Q_IDX(q, p) * (q)->ent_dwords) | 206 | Q_IDX(q, p) * (q)->ent_dwords) |
208 | 207 | ||
209 | #define Q_BASE_RWA (1UL << 62) | 208 | #define Q_BASE_RWA (1UL << 62) |
210 | #define Q_BASE_ADDR_SHIFT 5 | 209 | #define Q_BASE_ADDR_MASK GENMASK_ULL(47, 5) |
211 | #define Q_BASE_ADDR_MASK 0xfffffffffffUL | ||
212 | #define Q_BASE_LOG2SIZE_SHIFT 0 | 210 | #define Q_BASE_LOG2SIZE_SHIFT 0 |
213 | #define Q_BASE_LOG2SIZE_MASK 0x1fUL | 211 | #define Q_BASE_LOG2SIZE_MASK 0x1fUL |
214 | 212 | ||
@@ -225,8 +223,7 @@ | |||
225 | #define STRTAB_L1_DESC_DWORDS 1 | 223 | #define STRTAB_L1_DESC_DWORDS 1 |
226 | #define STRTAB_L1_DESC_SPAN_SHIFT 0 | 224 | #define STRTAB_L1_DESC_SPAN_SHIFT 0 |
227 | #define STRTAB_L1_DESC_SPAN_MASK 0x1fUL | 225 | #define STRTAB_L1_DESC_SPAN_MASK 0x1fUL |
228 | #define STRTAB_L1_DESC_L2PTR_SHIFT 6 | 226 | #define STRTAB_L1_DESC_L2PTR_MASK GENMASK_ULL(47, 6) |
229 | #define STRTAB_L1_DESC_L2PTR_MASK 0x3ffffffffffUL | ||
230 | 227 | ||
231 | #define STRTAB_STE_DWORDS 8 | 228 | #define STRTAB_STE_DWORDS 8 |
232 | #define STRTAB_STE_0_V (1UL << 0) | 229 | #define STRTAB_STE_0_V (1UL << 0) |
@@ -239,8 +236,7 @@ | |||
239 | 236 | ||
240 | #define STRTAB_STE_0_S1FMT_SHIFT 4 | 237 | #define STRTAB_STE_0_S1FMT_SHIFT 4 |
241 | #define STRTAB_STE_0_S1FMT_LINEAR (0UL << STRTAB_STE_0_S1FMT_SHIFT) | 238 | #define STRTAB_STE_0_S1FMT_LINEAR (0UL << STRTAB_STE_0_S1FMT_SHIFT) |
242 | #define STRTAB_STE_0_S1CTXPTR_SHIFT 6 | 239 | #define STRTAB_STE_0_S1CTXPTR_MASK GENMASK_ULL(47, 6) |
243 | #define STRTAB_STE_0_S1CTXPTR_MASK 0x3ffffffffffUL | ||
244 | #define STRTAB_STE_0_S1CDMAX_SHIFT 59 | 240 | #define STRTAB_STE_0_S1CDMAX_SHIFT 59 |
245 | #define STRTAB_STE_0_S1CDMAX_MASK 0x1fUL | 241 | #define STRTAB_STE_0_S1CDMAX_MASK 0x1fUL |
246 | 242 | ||
@@ -278,8 +274,7 @@ | |||
278 | #define STRTAB_STE_2_S2PTW (1UL << 54) | 274 | #define STRTAB_STE_2_S2PTW (1UL << 54) |
279 | #define STRTAB_STE_2_S2R (1UL << 58) | 275 | #define STRTAB_STE_2_S2R (1UL << 58) |
280 | 276 | ||
281 | #define STRTAB_STE_3_S2TTB_SHIFT 4 | 277 | #define STRTAB_STE_3_S2TTB_MASK GENMASK_ULL(47, 4) |
282 | #define STRTAB_STE_3_S2TTB_MASK 0xfffffffffffUL | ||
283 | 278 | ||
284 | /* Context descriptor (stage-1 only) */ | 279 | /* Context descriptor (stage-1 only) */ |
285 | #define CTXDESC_CD_DWORDS 8 | 280 | #define CTXDESC_CD_DWORDS 8 |
@@ -325,8 +320,7 @@ | |||
325 | #define CTXDESC_CD_0_ASID_SHIFT 48 | 320 | #define CTXDESC_CD_0_ASID_SHIFT 48 |
326 | #define CTXDESC_CD_0_ASID_MASK 0xffffUL | 321 | #define CTXDESC_CD_0_ASID_MASK 0xffffUL |
327 | 322 | ||
328 | #define CTXDESC_CD_1_TTB0_SHIFT 4 | 323 | #define CTXDESC_CD_1_TTB0_MASK GENMASK_ULL(47, 4) |
329 | #define CTXDESC_CD_1_TTB0_MASK 0xfffffffffffUL | ||
330 | 324 | ||
331 | #define CTXDESC_CD_3_MAIR_SHIFT 0 | 325 | #define CTXDESC_CD_3_MAIR_SHIFT 0 |
332 | 326 | ||
@@ -351,7 +345,7 @@ | |||
351 | 345 | ||
352 | #define CMDQ_PREFETCH_0_SID_SHIFT 32 | 346 | #define CMDQ_PREFETCH_0_SID_SHIFT 32 |
353 | #define CMDQ_PREFETCH_1_SIZE_SHIFT 0 | 347 | #define CMDQ_PREFETCH_1_SIZE_SHIFT 0 |
354 | #define CMDQ_PREFETCH_1_ADDR_MASK ~0xfffUL | 348 | #define CMDQ_PREFETCH_1_ADDR_MASK GENMASK_ULL(63, 12) |
355 | 349 | ||
356 | #define CMDQ_CFGI_0_SID_SHIFT 32 | 350 | #define CMDQ_CFGI_0_SID_SHIFT 32 |
357 | #define CMDQ_CFGI_0_SID_MASK 0xffffffffUL | 351 | #define CMDQ_CFGI_0_SID_MASK 0xffffffffUL |
@@ -362,8 +356,8 @@ | |||
362 | #define CMDQ_TLBI_0_VMID_SHIFT 32 | 356 | #define CMDQ_TLBI_0_VMID_SHIFT 32 |
363 | #define CMDQ_TLBI_0_ASID_SHIFT 48 | 357 | #define CMDQ_TLBI_0_ASID_SHIFT 48 |
364 | #define CMDQ_TLBI_1_LEAF (1UL << 0) | 358 | #define CMDQ_TLBI_1_LEAF (1UL << 0) |
365 | #define CMDQ_TLBI_1_VA_MASK ~0xfffUL | 359 | #define CMDQ_TLBI_1_VA_MASK GENMASK_ULL(63, 12) |
366 | #define CMDQ_TLBI_1_IPA_MASK 0xfffffffff000UL | 360 | #define CMDQ_TLBI_1_IPA_MASK GENMASK_ULL(47, 12) |
367 | 361 | ||
368 | #define CMDQ_PRI_0_SSID_SHIFT 12 | 362 | #define CMDQ_PRI_0_SSID_SHIFT 12 |
369 | #define CMDQ_PRI_0_SSID_MASK 0xfffffUL | 363 | #define CMDQ_PRI_0_SSID_MASK 0xfffffUL |
@@ -386,8 +380,7 @@ | |||
386 | #define CMDQ_SYNC_0_MSIATTR_OIWB (0xfUL << CMDQ_SYNC_0_MSIATTR_SHIFT) | 380 | #define CMDQ_SYNC_0_MSIATTR_OIWB (0xfUL << CMDQ_SYNC_0_MSIATTR_SHIFT) |
387 | #define CMDQ_SYNC_0_MSIDATA_SHIFT 32 | 381 | #define CMDQ_SYNC_0_MSIDATA_SHIFT 32 |
388 | #define CMDQ_SYNC_0_MSIDATA_MASK 0xffffffffUL | 382 | #define CMDQ_SYNC_0_MSIDATA_MASK 0xffffffffUL |
389 | #define CMDQ_SYNC_1_MSIADDR_SHIFT 0 | 383 | #define CMDQ_SYNC_1_MSIADDR_MASK GENMASK_ULL(47, 2) |
390 | #define CMDQ_SYNC_1_MSIADDR_MASK 0xffffffffffffcUL | ||
391 | 384 | ||
392 | /* Event queue */ | 385 | /* Event queue */ |
393 | #define EVTQ_ENT_DWORDS 4 | 386 | #define EVTQ_ENT_DWORDS 4 |
@@ -413,8 +406,7 @@ | |||
413 | 406 | ||
414 | #define PRIQ_1_PRG_IDX_SHIFT 0 | 407 | #define PRIQ_1_PRG_IDX_SHIFT 0 |
415 | #define PRIQ_1_PRG_IDX_MASK 0x1ffUL | 408 | #define PRIQ_1_PRG_IDX_MASK 0x1ffUL |
416 | #define PRIQ_1_ADDR_SHIFT 12 | 409 | #define PRIQ_1_ADDR_MASK GENMASK_ULL(63, 12) |
417 | #define PRIQ_1_ADDR_MASK 0xfffffffffffffUL | ||
418 | 410 | ||
419 | /* High-level queue structures */ | 411 | /* High-level queue structures */ |
420 | #define ARM_SMMU_POLL_TIMEOUT_US 100 | 412 | #define ARM_SMMU_POLL_TIMEOUT_US 100 |
@@ -1093,7 +1085,7 @@ static void arm_smmu_write_ctx_desc(struct arm_smmu_device *smmu, | |||
1093 | 1085 | ||
1094 | cfg->cdptr[0] = cpu_to_le64(val); | 1086 | cfg->cdptr[0] = cpu_to_le64(val); |
1095 | 1087 | ||
1096 | val = cfg->cd.ttbr & CTXDESC_CD_1_TTB0_MASK << CTXDESC_CD_1_TTB0_SHIFT; | 1088 | val = cfg->cd.ttbr & CTXDESC_CD_1_TTB0_MASK; |
1097 | cfg->cdptr[1] = cpu_to_le64(val); | 1089 | cfg->cdptr[1] = cpu_to_le64(val); |
1098 | 1090 | ||
1099 | cfg->cdptr[3] = cpu_to_le64(cfg->cd.mair << CTXDESC_CD_3_MAIR_SHIFT); | 1091 | cfg->cdptr[3] = cpu_to_le64(cfg->cd.mair << CTXDESC_CD_3_MAIR_SHIFT); |
@@ -1107,8 +1099,7 @@ arm_smmu_write_strtab_l1_desc(__le64 *dst, struct arm_smmu_strtab_l1_desc *desc) | |||
1107 | 1099 | ||
1108 | val |= (desc->span & STRTAB_L1_DESC_SPAN_MASK) | 1100 | val |= (desc->span & STRTAB_L1_DESC_SPAN_MASK) |
1109 | << STRTAB_L1_DESC_SPAN_SHIFT; | 1101 | << STRTAB_L1_DESC_SPAN_SHIFT; |
1110 | val |= desc->l2ptr_dma & | 1102 | val |= desc->l2ptr_dma & STRTAB_L1_DESC_L2PTR_MASK; |
1111 | STRTAB_L1_DESC_L2PTR_MASK << STRTAB_L1_DESC_L2PTR_SHIFT; | ||
1112 | 1103 | ||
1113 | *dst = cpu_to_le64(val); | 1104 | *dst = cpu_to_le64(val); |
1114 | } | 1105 | } |
@@ -1214,8 +1205,7 @@ static void arm_smmu_write_strtab_ent(struct arm_smmu_device *smmu, u32 sid, | |||
1214 | !(smmu->features & ARM_SMMU_FEAT_STALL_FORCE)) | 1205 | !(smmu->features & ARM_SMMU_FEAT_STALL_FORCE)) |
1215 | dst[1] |= cpu_to_le64(STRTAB_STE_1_S1STALLD); | 1206 | dst[1] |= cpu_to_le64(STRTAB_STE_1_S1STALLD); |
1216 | 1207 | ||
1217 | val |= (ste->s1_cfg->cdptr_dma & STRTAB_STE_0_S1CTXPTR_MASK | 1208 | val |= (ste->s1_cfg->cdptr_dma & STRTAB_STE_0_S1CTXPTR_MASK) | |
1218 | << STRTAB_STE_0_S1CTXPTR_SHIFT) | | ||
1219 | STRTAB_STE_0_CFG_S1_TRANS; | 1209 | STRTAB_STE_0_CFG_S1_TRANS; |
1220 | } | 1210 | } |
1221 | 1211 | ||
@@ -1232,7 +1222,7 @@ static void arm_smmu_write_strtab_ent(struct arm_smmu_device *smmu, u32 sid, | |||
1232 | STRTAB_STE_2_S2R); | 1222 | STRTAB_STE_2_S2R); |
1233 | 1223 | ||
1234 | dst[3] = cpu_to_le64(ste->s2_cfg->vttbr & | 1224 | dst[3] = cpu_to_le64(ste->s2_cfg->vttbr & |
1235 | STRTAB_STE_3_S2TTB_MASK << STRTAB_STE_3_S2TTB_SHIFT); | 1225 | STRTAB_STE_3_S2TTB_MASK); |
1236 | 1226 | ||
1237 | val |= STRTAB_STE_0_CFG_S2_TRANS; | 1227 | val |= STRTAB_STE_0_CFG_S2_TRANS; |
1238 | } | 1228 | } |
@@ -1337,7 +1327,7 @@ static void arm_smmu_handle_ppr(struct arm_smmu_device *smmu, u64 *evt) | |||
1337 | evt[0] & PRIQ_0_PERM_READ ? "R" : "", | 1327 | evt[0] & PRIQ_0_PERM_READ ? "R" : "", |
1338 | evt[0] & PRIQ_0_PERM_WRITE ? "W" : "", | 1328 | evt[0] & PRIQ_0_PERM_WRITE ? "W" : "", |
1339 | evt[0] & PRIQ_0_PERM_EXEC ? "X" : "", | 1329 | evt[0] & PRIQ_0_PERM_EXEC ? "X" : "", |
1340 | evt[1] & PRIQ_1_ADDR_MASK << PRIQ_1_ADDR_SHIFT); | 1330 | evt[1] & PRIQ_1_ADDR_MASK); |
1341 | 1331 | ||
1342 | if (last) { | 1332 | if (last) { |
1343 | struct arm_smmu_cmdq_ent cmd = { | 1333 | struct arm_smmu_cmdq_ent cmd = { |
@@ -2102,7 +2092,7 @@ static int arm_smmu_init_one_queue(struct arm_smmu_device *smmu, | |||
2102 | q->ent_dwords = dwords; | 2092 | q->ent_dwords = dwords; |
2103 | 2093 | ||
2104 | q->q_base = Q_BASE_RWA; | 2094 | q->q_base = Q_BASE_RWA; |
2105 | q->q_base |= q->base_dma & Q_BASE_ADDR_MASK << Q_BASE_ADDR_SHIFT; | 2095 | q->q_base |= q->base_dma & Q_BASE_ADDR_MASK; |
2106 | q->q_base |= (q->max_n_shift & Q_BASE_LOG2SIZE_MASK) | 2096 | q->q_base |= (q->max_n_shift & Q_BASE_LOG2SIZE_MASK) |
2107 | << Q_BASE_LOG2SIZE_SHIFT; | 2097 | << Q_BASE_LOG2SIZE_SHIFT; |
2108 | 2098 | ||
@@ -2239,8 +2229,7 @@ static int arm_smmu_init_strtab(struct arm_smmu_device *smmu) | |||
2239 | return ret; | 2229 | return ret; |
2240 | 2230 | ||
2241 | /* Set the strtab base address */ | 2231 | /* Set the strtab base address */ |
2242 | reg = smmu->strtab_cfg.strtab_dma & | 2232 | reg = smmu->strtab_cfg.strtab_dma & STRTAB_BASE_ADDR_MASK; |
2243 | STRTAB_BASE_ADDR_MASK << STRTAB_BASE_ADDR_SHIFT; | ||
2244 | reg |= STRTAB_BASE_RA; | 2233 | reg |= STRTAB_BASE_RA; |
2245 | smmu->strtab_cfg.strtab_base = reg; | 2234 | smmu->strtab_cfg.strtab_base = reg; |
2246 | 2235 | ||
@@ -2303,7 +2292,7 @@ static void arm_smmu_write_msi_msg(struct msi_desc *desc, struct msi_msg *msg) | |||
2303 | phys_addr_t *cfg = arm_smmu_msi_cfg[desc->platform.msi_index]; | 2292 | phys_addr_t *cfg = arm_smmu_msi_cfg[desc->platform.msi_index]; |
2304 | 2293 | ||
2305 | doorbell = (((u64)msg->address_hi) << 32) | msg->address_lo; | 2294 | doorbell = (((u64)msg->address_hi) << 32) | msg->address_lo; |
2306 | doorbell &= MSI_CFG0_ADDR_MASK << MSI_CFG0_ADDR_SHIFT; | 2295 | doorbell &= MSI_CFG0_ADDR_MASK; |
2307 | 2296 | ||
2308 | writeq_relaxed(doorbell, smmu->base + cfg[0]); | 2297 | writeq_relaxed(doorbell, smmu->base + cfg[0]); |
2309 | writel_relaxed(msg->data, smmu->base + cfg[1]); | 2298 | writel_relaxed(msg->data, smmu->base + cfg[1]); |