aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Murphy <robin.murphy@arm.com>2018-03-26 08:35:09 -0400
committerWill Deacon <will.deacon@arm.com>2018-03-27 09:12:04 -0400
commit1cf9e54e91aac61e1a6c2bbacd0b571c6ca09131 (patch)
treeef94caaab995098fd59a605250ff63cb757693c9
parent940ded9c21fde7c47c64d5cc74e22300fb89e6b7 (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.c53
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]);