aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Murphy <robin.murphy@arm.com>2018-03-26 08:35:10 -0400
committerWill Deacon <will.deacon@arm.com>2018-03-27 09:12:04 -0400
commitcbcee19ac4a2c960d73b8951476f0fe5e5628319 (patch)
tree3246add944192377c35ec3f4fd5f3c8dc11b85d2
parent1cf9e54e91aac61e1a6c2bbacd0b571c6ca09131 (diff)
iommu/arm-smmu-v3: Clean up register definitions
The FIELD_{GET,PREP} accessors provided by linux/bitfield.h allow us to define multi-bit register fields solely in terms of their bit positions via GENMASK(), without needing explicit *_SHIFT and *_MASK definitions. As well as the immediate reduction in lines of code, this avoids the awkwardness of values sometimes being pre-shifted and sometimes not, which means we can factor out some common values like memory attributes. Furthermore, it also makes it trivial to verify the definitions against the architecture spec, on which note let's also fix up a few field names to properly match the current release (IHI0070B). 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.c174
1 files changed, 77 insertions, 97 deletions
diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c
index 87da25815dac..48531c694c60 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/bitfield.h>
25#include <linux/bitops.h> 26#include <linux/bitops.h>
26#include <linux/delay.h> 27#include <linux/delay.h>
27#include <linux/dma-iommu.h> 28#include <linux/dma-iommu.h>
@@ -44,18 +45,15 @@
44 45
45/* MMIO registers */ 46/* MMIO registers */
46#define ARM_SMMU_IDR0 0x0 47#define ARM_SMMU_IDR0 0x0
47#define IDR0_ST_LVL_SHIFT 27 48#define IDR0_ST_LVL GENMASK(28, 27)
48#define IDR0_ST_LVL_MASK 0x3 49#define IDR0_ST_LVL_2LVL 1
49#define IDR0_ST_LVL_2LVL (1 << IDR0_ST_LVL_SHIFT) 50#define IDR0_STALL_MODEL GENMASK(25, 24)
50#define IDR0_STALL_MODEL_SHIFT 24 51#define IDR0_STALL_MODEL_STALL 0
51#define IDR0_STALL_MODEL_MASK 0x3 52#define IDR0_STALL_MODEL_FORCE 2
52#define IDR0_STALL_MODEL_STALL (0 << IDR0_STALL_MODEL_SHIFT) 53#define IDR0_TTENDIAN GENMASK(22, 21)
53#define IDR0_STALL_MODEL_FORCE (2 << IDR0_STALL_MODEL_SHIFT) 54#define IDR0_TTENDIAN_MIXED 0
54#define IDR0_TTENDIAN_SHIFT 21 55#define IDR0_TTENDIAN_LE 2
55#define IDR0_TTENDIAN_MASK 0x3 56#define IDR0_TTENDIAN_BE 3
56#define IDR0_TTENDIAN_LE (2 << IDR0_TTENDIAN_SHIFT)
57#define IDR0_TTENDIAN_BE (3 << IDR0_TTENDIAN_SHIFT)
58#define IDR0_TTENDIAN_MIXED (0 << IDR0_TTENDIAN_SHIFT)
59#define IDR0_CD2L (1 << 19) 57#define IDR0_CD2L (1 << 19)
60#define IDR0_VMID16 (1 << 18) 58#define IDR0_VMID16 (1 << 18)
61#define IDR0_PRI (1 << 16) 59#define IDR0_PRI (1 << 16)
@@ -65,10 +63,9 @@
65#define IDR0_ATS (1 << 10) 63#define IDR0_ATS (1 << 10)
66#define IDR0_HYP (1 << 9) 64#define IDR0_HYP (1 << 9)
67#define IDR0_COHACC (1 << 4) 65#define IDR0_COHACC (1 << 4)
68#define IDR0_TTF_SHIFT 2 66#define IDR0_TTF GENMASK(3, 2)
69#define IDR0_TTF_MASK 0x3 67#define IDR0_TTF_AARCH64 2
70#define IDR0_TTF_AARCH64 (2 << IDR0_TTF_SHIFT) 68#define IDR0_TTF_AARCH32_64 3
71#define IDR0_TTF_AARCH32_64 (3 << IDR0_TTF_SHIFT)
72#define IDR0_S1P (1 << 1) 69#define IDR0_S1P (1 << 1)
73#define IDR0_S2P (1 << 0) 70#define IDR0_S2P (1 << 0)
74 71
@@ -76,31 +73,24 @@
76#define IDR1_TABLES_PRESET (1 << 30) 73#define IDR1_TABLES_PRESET (1 << 30)
77#define IDR1_QUEUES_PRESET (1 << 29) 74#define IDR1_QUEUES_PRESET (1 << 29)
78#define IDR1_REL (1 << 28) 75#define IDR1_REL (1 << 28)
79#define IDR1_CMDQ_SHIFT 21 76#define IDR1_CMDQS GENMASK(25, 21)
80#define IDR1_CMDQ_MASK 0x1f 77#define IDR1_EVTQS GENMASK(20, 16)
81#define IDR1_EVTQ_SHIFT 16 78#define IDR1_PRIQS GENMASK(15, 11)
82#define IDR1_EVTQ_MASK 0x1f 79#define IDR1_SSIDSIZE GENMASK(10, 6)
83#define IDR1_PRIQ_SHIFT 11 80#define IDR1_SIDSIZE GENMASK(5, 0)
84#define IDR1_PRIQ_MASK 0x1f
85#define IDR1_SSID_SHIFT 6
86#define IDR1_SSID_MASK 0x1f
87#define IDR1_SID_SHIFT 0
88#define IDR1_SID_MASK 0x3f
89 81
90#define ARM_SMMU_IDR5 0x14 82#define ARM_SMMU_IDR5 0x14
91#define IDR5_STALL_MAX_SHIFT 16 83#define IDR5_STALL_MAX GENMASK(31, 16)
92#define IDR5_STALL_MAX_MASK 0xffff
93#define IDR5_GRAN64K (1 << 6) 84#define IDR5_GRAN64K (1 << 6)
94#define IDR5_GRAN16K (1 << 5) 85#define IDR5_GRAN16K (1 << 5)
95#define IDR5_GRAN4K (1 << 4) 86#define IDR5_GRAN4K (1 << 4)
96#define IDR5_OAS_SHIFT 0 87#define IDR5_OAS GENMASK(2, 0)
97#define IDR5_OAS_MASK 0x7 88#define IDR5_OAS_32_BIT 0
98#define IDR5_OAS_32_BIT (0 << IDR5_OAS_SHIFT) 89#define IDR5_OAS_36_BIT 1
99#define IDR5_OAS_36_BIT (1 << IDR5_OAS_SHIFT) 90#define IDR5_OAS_40_BIT 2
100#define IDR5_OAS_40_BIT (2 << IDR5_OAS_SHIFT) 91#define IDR5_OAS_42_BIT 3
101#define IDR5_OAS_42_BIT (3 << IDR5_OAS_SHIFT) 92#define IDR5_OAS_44_BIT 4
102#define IDR5_OAS_44_BIT (4 << IDR5_OAS_SHIFT) 93#define IDR5_OAS_48_BIT 5
103#define IDR5_OAS_48_BIT (5 << IDR5_OAS_SHIFT)
104 94
105#define ARM_SMMU_CR0 0x20 95#define ARM_SMMU_CR0 0x20
106#define CR0_CMDQEN (1 << 3) 96#define CR0_CMDQEN (1 << 3)
@@ -111,18 +101,16 @@
111#define ARM_SMMU_CR0ACK 0x24 101#define ARM_SMMU_CR0ACK 0x24
112 102
113#define ARM_SMMU_CR1 0x28 103#define ARM_SMMU_CR1 0x28
114#define CR1_SH_NSH 0 104#define CR1_TABLE_SH GENMASK(11, 10)
115#define CR1_SH_OSH 2 105#define CR1_TABLE_OC GENMASK(9, 8)
116#define CR1_SH_ISH 3 106#define CR1_TABLE_IC GENMASK(7, 6)
107#define CR1_QUEUE_SH GENMASK(5, 4)
108#define CR1_QUEUE_OC GENMASK(3, 2)
109#define CR1_QUEUE_IC GENMASK(1, 0)
110/* CR1 cacheability fields don't quite follow the usual TCR-style encoding */
117#define CR1_CACHE_NC 0 111#define CR1_CACHE_NC 0
118#define CR1_CACHE_WB 1 112#define CR1_CACHE_WB 1
119#define CR1_CACHE_WT 2 113#define CR1_CACHE_WT 2
120#define CR1_TABLE_SH_SHIFT 10
121#define CR1_TABLE_OC_SHIFT 8
122#define CR1_TABLE_IC_SHIFT 6
123#define CR1_QUEUE_SH_SHIFT 4
124#define CR1_QUEUE_OC_SHIFT 2
125#define CR1_QUEUE_IC_SHIFT 0
126 114
127#define ARM_SMMU_CR2 0x2c 115#define ARM_SMMU_CR2 0x2c
128#define CR2_PTM (1 << 2) 116#define CR2_PTM (1 << 2)
@@ -130,8 +118,8 @@
130#define CR2_E2H (1 << 0) 118#define CR2_E2H (1 << 0)
131 119
132#define ARM_SMMU_GBPA 0x44 120#define ARM_SMMU_GBPA 0x44
133#define GBPA_ABORT (1 << 20)
134#define GBPA_UPDATE (1 << 31) 121#define GBPA_UPDATE (1 << 31)
122#define GBPA_ABORT (1 << 20)
135 123
136#define ARM_SMMU_IRQ_CTRL 0x50 124#define ARM_SMMU_IRQ_CTRL 0x50
137#define IRQ_CTRL_EVTQ_IRQEN (1 << 2) 125#define IRQ_CTRL_EVTQ_IRQEN (1 << 2)
@@ -162,14 +150,11 @@
162#define STRTAB_BASE_ADDR_MASK GENMASK_ULL(47, 6) 150#define STRTAB_BASE_ADDR_MASK GENMASK_ULL(47, 6)
163 151
164#define ARM_SMMU_STRTAB_BASE_CFG 0x88 152#define ARM_SMMU_STRTAB_BASE_CFG 0x88
165#define STRTAB_BASE_CFG_LOG2SIZE_SHIFT 0 153#define STRTAB_BASE_CFG_FMT GENMASK(17, 16)
166#define STRTAB_BASE_CFG_LOG2SIZE_MASK 0x3f 154#define STRTAB_BASE_CFG_FMT_LINEAR 0
167#define STRTAB_BASE_CFG_SPLIT_SHIFT 6 155#define STRTAB_BASE_CFG_FMT_2LVL 1
168#define STRTAB_BASE_CFG_SPLIT_MASK 0x1f 156#define STRTAB_BASE_CFG_SPLIT GENMASK(10, 6)
169#define STRTAB_BASE_CFG_FMT_SHIFT 16 157#define STRTAB_BASE_CFG_LOG2SIZE GENMASK(5, 0)
170#define STRTAB_BASE_CFG_FMT_MASK 0x3
171#define STRTAB_BASE_CFG_FMT_LINEAR (0 << STRTAB_BASE_CFG_FMT_SHIFT)
172#define STRTAB_BASE_CFG_FMT_2LVL (1 << STRTAB_BASE_CFG_FMT_SHIFT)
173 158
174#define ARM_SMMU_CMDQ_BASE 0x90 159#define ARM_SMMU_CMDQ_BASE 0x90
175#define ARM_SMMU_CMDQ_PROD 0x98 160#define ARM_SMMU_CMDQ_PROD 0x98
@@ -191,12 +176,14 @@
191 176
192/* Common MSI config fields */ 177/* Common MSI config fields */
193#define MSI_CFG0_ADDR_MASK GENMASK_ULL(47, 2) 178#define MSI_CFG0_ADDR_MASK GENMASK_ULL(47, 2)
194#define MSI_CFG2_SH_SHIFT 4 179#define MSI_CFG2_SH GENMASK(5, 4)
195#define MSI_CFG2_SH_NSH (0UL << MSI_CFG2_SH_SHIFT) 180#define MSI_CFG2_MEMATTR GENMASK(3, 0)
196#define MSI_CFG2_SH_OSH (2UL << MSI_CFG2_SH_SHIFT) 181
197#define MSI_CFG2_SH_ISH (3UL << MSI_CFG2_SH_SHIFT) 182/* Common memory attribute values */
198#define MSI_CFG2_MEMATTR_SHIFT 0 183#define ARM_SMMU_SH_NSH 0
199#define MSI_CFG2_MEMATTR_DEVICE_nGnRE (0x1 << MSI_CFG2_MEMATTR_SHIFT) 184#define ARM_SMMU_SH_OSH 2
185#define ARM_SMMU_SH_ISH 3
186#define ARM_SMMU_MEMATTR_DEVICE_nGnRE 0x1
200 187
201#define Q_IDX(q, p) ((p) & ((1 << (q)->max_n_shift) - 1)) 188#define Q_IDX(q, p) ((p) & ((1 << (q)->max_n_shift) - 1))
202#define Q_WRP(q, p) ((p) & (1 << (q)->max_n_shift)) 189#define Q_WRP(q, p) ((p) & (1 << (q)->max_n_shift))
@@ -207,8 +194,7 @@
207 194
208#define Q_BASE_RWA (1UL << 62) 195#define Q_BASE_RWA (1UL << 62)
209#define Q_BASE_ADDR_MASK GENMASK_ULL(47, 5) 196#define Q_BASE_ADDR_MASK GENMASK_ULL(47, 5)
210#define Q_BASE_LOG2SIZE_SHIFT 0 197#define Q_BASE_LOG2SIZE GENMASK(4, 0)
211#define Q_BASE_LOG2SIZE_MASK 0x1fUL
212 198
213/* 199/*
214 * Stream table. 200 * Stream table.
@@ -333,8 +319,7 @@
333#define CMDQ_ENT_DWORDS 2 319#define CMDQ_ENT_DWORDS 2
334#define CMDQ_MAX_SZ_SHIFT 8 320#define CMDQ_MAX_SZ_SHIFT 8
335 321
336#define CMDQ_ERR_SHIFT 24 322#define CMDQ_CONS_ERR GENMASK(30, 24)
337#define CMDQ_ERR_MASK 0x7f
338#define CMDQ_ERR_CERROR_NONE_IDX 0 323#define CMDQ_ERR_CERROR_NONE_IDX 0
339#define CMDQ_ERR_CERROR_ILL_IDX 1 324#define CMDQ_ERR_CERROR_ILL_IDX 1
340#define CMDQ_ERR_CERROR_ABT_IDX 2 325#define CMDQ_ERR_CERROR_ABT_IDX 2
@@ -910,7 +895,7 @@ static void arm_smmu_cmdq_skip_err(struct arm_smmu_device *smmu)
910 u64 cmd[CMDQ_ENT_DWORDS]; 895 u64 cmd[CMDQ_ENT_DWORDS];
911 struct arm_smmu_queue *q = &smmu->cmdq.q; 896 struct arm_smmu_queue *q = &smmu->cmdq.q;
912 u32 cons = readl_relaxed(q->cons_reg); 897 u32 cons = readl_relaxed(q->cons_reg);
913 u32 idx = cons >> CMDQ_ERR_SHIFT & CMDQ_ERR_MASK; 898 u32 idx = FIELD_GET(CMDQ_CONS_ERR, cons);
914 struct arm_smmu_cmdq_ent cmd_sync = { 899 struct arm_smmu_cmdq_ent cmd_sync = {
915 .opcode = CMDQ_OP_CMD_SYNC, 900 .opcode = CMDQ_OP_CMD_SYNC,
916 }; 901 };
@@ -2093,8 +2078,7 @@ static int arm_smmu_init_one_queue(struct arm_smmu_device *smmu,
2093 2078
2094 q->q_base = Q_BASE_RWA; 2079 q->q_base = Q_BASE_RWA;
2095 q->q_base |= q->base_dma & Q_BASE_ADDR_MASK; 2080 q->q_base |= q->base_dma & Q_BASE_ADDR_MASK;
2096 q->q_base |= (q->max_n_shift & Q_BASE_LOG2SIZE_MASK) 2081 q->q_base |= FIELD_PREP(Q_BASE_LOG2SIZE, q->max_n_shift);
2097 << Q_BASE_LOG2SIZE_SHIFT;
2098 2082
2099 q->prod = q->cons = 0; 2083 q->prod = q->cons = 0;
2100 return 0; 2084 return 0;
@@ -2176,11 +2160,9 @@ static int arm_smmu_init_strtab_2lvl(struct arm_smmu_device *smmu)
2176 cfg->strtab = strtab; 2160 cfg->strtab = strtab;
2177 2161
2178 /* Configure strtab_base_cfg for 2 levels */ 2162 /* Configure strtab_base_cfg for 2 levels */
2179 reg = STRTAB_BASE_CFG_FMT_2LVL; 2163 reg = FIELD_PREP(STRTAB_BASE_CFG_FMT, STRTAB_BASE_CFG_FMT_2LVL);
2180 reg |= (size & STRTAB_BASE_CFG_LOG2SIZE_MASK) 2164 reg |= FIELD_PREP(STRTAB_BASE_CFG_LOG2SIZE, size);
2181 << STRTAB_BASE_CFG_LOG2SIZE_SHIFT; 2165 reg |= FIELD_PREP(STRTAB_BASE_CFG_SPLIT, STRTAB_SPLIT);
2182 reg |= (STRTAB_SPLIT & STRTAB_BASE_CFG_SPLIT_MASK)
2183 << STRTAB_BASE_CFG_SPLIT_SHIFT;
2184 cfg->strtab_base_cfg = reg; 2166 cfg->strtab_base_cfg = reg;
2185 2167
2186 return arm_smmu_init_l1_strtab(smmu); 2168 return arm_smmu_init_l1_strtab(smmu);
@@ -2206,9 +2188,8 @@ static int arm_smmu_init_strtab_linear(struct arm_smmu_device *smmu)
2206 cfg->num_l1_ents = 1 << smmu->sid_bits; 2188 cfg->num_l1_ents = 1 << smmu->sid_bits;
2207 2189
2208 /* Configure strtab_base_cfg for a linear table covering all SIDs */ 2190 /* Configure strtab_base_cfg for a linear table covering all SIDs */
2209 reg = STRTAB_BASE_CFG_FMT_LINEAR; 2191 reg = FIELD_PREP(STRTAB_BASE_CFG_FMT, STRTAB_BASE_CFG_FMT_LINEAR);
2210 reg |= (smmu->sid_bits & STRTAB_BASE_CFG_LOG2SIZE_MASK) 2192 reg |= FIELD_PREP(STRTAB_BASE_CFG_LOG2SIZE, smmu->sid_bits);
2211 << STRTAB_BASE_CFG_LOG2SIZE_SHIFT;
2212 cfg->strtab_base_cfg = reg; 2193 cfg->strtab_base_cfg = reg;
2213 2194
2214 arm_smmu_init_bypass_stes(strtab, cfg->num_l1_ents); 2195 arm_smmu_init_bypass_stes(strtab, cfg->num_l1_ents);
@@ -2296,7 +2277,7 @@ static void arm_smmu_write_msi_msg(struct msi_desc *desc, struct msi_msg *msg)
2296 2277
2297 writeq_relaxed(doorbell, smmu->base + cfg[0]); 2278 writeq_relaxed(doorbell, smmu->base + cfg[0]);
2298 writel_relaxed(msg->data, smmu->base + cfg[1]); 2279 writel_relaxed(msg->data, smmu->base + cfg[1]);
2299 writel_relaxed(MSI_CFG2_MEMATTR_DEVICE_nGnRE, smmu->base + cfg[2]); 2280 writel_relaxed(ARM_SMMU_MEMATTR_DEVICE_nGnRE, smmu->base + cfg[2]);
2300} 2281}
2301 2282
2302static void arm_smmu_setup_msis(struct arm_smmu_device *smmu) 2283static void arm_smmu_setup_msis(struct arm_smmu_device *smmu)
@@ -2463,12 +2444,12 @@ static int arm_smmu_device_reset(struct arm_smmu_device *smmu, bool bypass)
2463 return ret; 2444 return ret;
2464 2445
2465 /* CR1 (table and queue memory attributes) */ 2446 /* CR1 (table and queue memory attributes) */
2466 reg = (CR1_SH_ISH << CR1_TABLE_SH_SHIFT) | 2447 reg = FIELD_PREP(CR1_TABLE_SH, ARM_SMMU_SH_ISH) |
2467 (CR1_CACHE_WB << CR1_TABLE_OC_SHIFT) | 2448 FIELD_PREP(CR1_TABLE_OC, CR1_CACHE_WB) |
2468 (CR1_CACHE_WB << CR1_TABLE_IC_SHIFT) | 2449 FIELD_PREP(CR1_TABLE_IC, CR1_CACHE_WB) |
2469 (CR1_SH_ISH << CR1_QUEUE_SH_SHIFT) | 2450 FIELD_PREP(CR1_QUEUE_SH, ARM_SMMU_SH_ISH) |
2470 (CR1_CACHE_WB << CR1_QUEUE_OC_SHIFT) | 2451 FIELD_PREP(CR1_QUEUE_OC, CR1_CACHE_WB) |
2471 (CR1_CACHE_WB << CR1_QUEUE_IC_SHIFT); 2452 FIELD_PREP(CR1_QUEUE_IC, CR1_CACHE_WB);
2472 writel_relaxed(reg, smmu->base + ARM_SMMU_CR1); 2453 writel_relaxed(reg, smmu->base + ARM_SMMU_CR1);
2473 2454
2474 /* CR2 (random crap) */ 2455 /* CR2 (random crap) */
@@ -2578,7 +2559,7 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
2578 reg = readl_relaxed(smmu->base + ARM_SMMU_IDR0); 2559 reg = readl_relaxed(smmu->base + ARM_SMMU_IDR0);
2579 2560
2580 /* 2-level structures */ 2561 /* 2-level structures */
2581 if ((reg & IDR0_ST_LVL_MASK << IDR0_ST_LVL_SHIFT) == IDR0_ST_LVL_2LVL) 2562 if (FIELD_GET(IDR0_ST_LVL, reg) == IDR0_ST_LVL_2LVL)
2582 smmu->features |= ARM_SMMU_FEAT_2_LVL_STRTAB; 2563 smmu->features |= ARM_SMMU_FEAT_2_LVL_STRTAB;
2583 2564
2584 if (reg & IDR0_CD2L) 2565 if (reg & IDR0_CD2L)
@@ -2589,7 +2570,7 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
2589 * We currently require the same endianness as the CPU, but this 2570 * We currently require the same endianness as the CPU, but this
2590 * could be changed later by adding a new IO_PGTABLE_QUIRK. 2571 * could be changed later by adding a new IO_PGTABLE_QUIRK.
2591 */ 2572 */
2592 switch (reg & IDR0_TTENDIAN_MASK << IDR0_TTENDIAN_SHIFT) { 2573 switch (FIELD_GET(IDR0_TTENDIAN, reg)) {
2593 case IDR0_TTENDIAN_MIXED: 2574 case IDR0_TTENDIAN_MIXED:
2594 smmu->features |= ARM_SMMU_FEAT_TT_LE | ARM_SMMU_FEAT_TT_BE; 2575 smmu->features |= ARM_SMMU_FEAT_TT_LE | ARM_SMMU_FEAT_TT_BE;
2595 break; 2576 break;
@@ -2631,7 +2612,7 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
2631 dev_warn(smmu->dev, "IDR0.COHACC overridden by FW configuration (%s)\n", 2612 dev_warn(smmu->dev, "IDR0.COHACC overridden by FW configuration (%s)\n",
2632 coherent ? "true" : "false"); 2613 coherent ? "true" : "false");
2633 2614
2634 switch (reg & IDR0_STALL_MODEL_MASK << IDR0_STALL_MODEL_SHIFT) { 2615 switch (FIELD_GET(IDR0_STALL_MODEL, reg)) {
2635 case IDR0_STALL_MODEL_FORCE: 2616 case IDR0_STALL_MODEL_FORCE:
2636 smmu->features |= ARM_SMMU_FEAT_STALL_FORCE; 2617 smmu->features |= ARM_SMMU_FEAT_STALL_FORCE;
2637 /* Fallthrough */ 2618 /* Fallthrough */
@@ -2651,7 +2632,7 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
2651 } 2632 }
2652 2633
2653 /* We only support the AArch64 table format at present */ 2634 /* We only support the AArch64 table format at present */
2654 switch (reg & IDR0_TTF_MASK << IDR0_TTF_SHIFT) { 2635 switch (FIELD_GET(IDR0_TTF, reg)) {
2655 case IDR0_TTF_AARCH32_64: 2636 case IDR0_TTF_AARCH32_64:
2656 smmu->ias = 40; 2637 smmu->ias = 40;
2657 /* Fallthrough */ 2638 /* Fallthrough */
@@ -2674,22 +2655,22 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
2674 } 2655 }
2675 2656
2676 /* Queue sizes, capped at 4k */ 2657 /* Queue sizes, capped at 4k */
2677 smmu->cmdq.q.max_n_shift = min((u32)CMDQ_MAX_SZ_SHIFT, 2658 smmu->cmdq.q.max_n_shift = min_t(u32, CMDQ_MAX_SZ_SHIFT,
2678 reg >> IDR1_CMDQ_SHIFT & IDR1_CMDQ_MASK); 2659 FIELD_GET(IDR1_CMDQS, reg));
2679 if (!smmu->cmdq.q.max_n_shift) { 2660 if (!smmu->cmdq.q.max_n_shift) {
2680 /* Odd alignment restrictions on the base, so ignore for now */ 2661 /* Odd alignment restrictions on the base, so ignore for now */
2681 dev_err(smmu->dev, "unit-length command queue not supported\n"); 2662 dev_err(smmu->dev, "unit-length command queue not supported\n");
2682 return -ENXIO; 2663 return -ENXIO;
2683 } 2664 }
2684 2665
2685 smmu->evtq.q.max_n_shift = min((u32)EVTQ_MAX_SZ_SHIFT, 2666 smmu->evtq.q.max_n_shift = min_t(u32, EVTQ_MAX_SZ_SHIFT,
2686 reg >> IDR1_EVTQ_SHIFT & IDR1_EVTQ_MASK); 2667 FIELD_GET(IDR1_EVTQS, reg));
2687 smmu->priq.q.max_n_shift = min((u32)PRIQ_MAX_SZ_SHIFT, 2668 smmu->priq.q.max_n_shift = min_t(u32, PRIQ_MAX_SZ_SHIFT,
2688 reg >> IDR1_PRIQ_SHIFT & IDR1_PRIQ_MASK); 2669 FIELD_GET(IDR1_PRIQS, reg));
2689 2670
2690 /* SID/SSID sizes */ 2671 /* SID/SSID sizes */
2691 smmu->ssid_bits = reg >> IDR1_SSID_SHIFT & IDR1_SSID_MASK; 2672 smmu->ssid_bits = FIELD_GET(IDR1_SSIDSIZE, reg);
2692 smmu->sid_bits = reg >> IDR1_SID_SHIFT & IDR1_SID_MASK; 2673 smmu->sid_bits = FIELD_GET(IDR1_SIDSIZE, reg);
2693 2674
2694 /* 2675 /*
2695 * If the SMMU supports fewer bits than would fill a single L2 stream 2676 * If the SMMU supports fewer bits than would fill a single L2 stream
@@ -2702,8 +2683,7 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
2702 reg = readl_relaxed(smmu->base + ARM_SMMU_IDR5); 2683 reg = readl_relaxed(smmu->base + ARM_SMMU_IDR5);
2703 2684
2704 /* Maximum number of outstanding stalls */ 2685 /* Maximum number of outstanding stalls */
2705 smmu->evtq.max_stalls = reg >> IDR5_STALL_MAX_SHIFT 2686 smmu->evtq.max_stalls = FIELD_GET(IDR5_STALL_MAX, reg);
2706 & IDR5_STALL_MAX_MASK;
2707 2687
2708 /* Page sizes */ 2688 /* Page sizes */
2709 if (reg & IDR5_GRAN64K) 2689 if (reg & IDR5_GRAN64K)
@@ -2719,7 +2699,7 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
2719 arm_smmu_ops.pgsize_bitmap |= smmu->pgsize_bitmap; 2699 arm_smmu_ops.pgsize_bitmap |= smmu->pgsize_bitmap;
2720 2700
2721 /* Output address size */ 2701 /* Output address size */
2722 switch (reg & IDR5_OAS_MASK << IDR5_OAS_SHIFT) { 2702 switch (FIELD_GET(IDR5_OAS, reg)) {
2723 case IDR5_OAS_32_BIT: 2703 case IDR5_OAS_32_BIT:
2724 smmu->oas = 32; 2704 smmu->oas = 32;
2725 break; 2705 break;