aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Roedel <jroedel@suse.de>2018-03-29 04:25:27 -0400
committerJoerg Roedel <jroedel@suse.de>2018-03-29 04:25:27 -0400
commit1543f226335bae25e157fd1e33f43f54458d29c2 (patch)
tree2b5cda15bc7d080d92c8d68c2403073fc206c8ef
parent3eb2ce825ea1ad89d20f7a3b5780df850e4be274 (diff)
parentdcd189e6d2eca4663da6120463fbff0995bc06eb (diff)
Merge branch 'for-joerg/arm-smmu/updates' of git://git.kernel.org/pub/scm/linux/kernel/git/will/linux into arm/smmu
-rw-r--r--drivers/iommu/arm-smmu-v3.c542
-rw-r--r--drivers/iommu/io-pgtable-arm.c67
2 files changed, 292 insertions, 317 deletions
diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c
index 3f2f1fc68b52..1d647104bccc 100644
--- a/drivers/iommu/arm-smmu-v3.c
+++ b/drivers/iommu/arm-smmu-v3.c
@@ -22,6 +22,8 @@
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>
26#include <linux/bitops.h>
25#include <linux/delay.h> 27#include <linux/delay.h>
26#include <linux/dma-iommu.h> 28#include <linux/dma-iommu.h>
27#include <linux/err.h> 29#include <linux/err.h>
@@ -43,18 +45,15 @@
43 45
44/* MMIO registers */ 46/* MMIO registers */
45#define ARM_SMMU_IDR0 0x0 47#define ARM_SMMU_IDR0 0x0
46#define IDR0_ST_LVL_SHIFT 27 48#define IDR0_ST_LVL GENMASK(28, 27)
47#define IDR0_ST_LVL_MASK 0x3 49#define IDR0_ST_LVL_2LVL 1
48#define IDR0_ST_LVL_2LVL (1 << IDR0_ST_LVL_SHIFT) 50#define IDR0_STALL_MODEL GENMASK(25, 24)
49#define IDR0_STALL_MODEL_SHIFT 24 51#define IDR0_STALL_MODEL_STALL 0
50#define IDR0_STALL_MODEL_MASK 0x3 52#define IDR0_STALL_MODEL_FORCE 2
51#define IDR0_STALL_MODEL_STALL (0 << IDR0_STALL_MODEL_SHIFT) 53#define IDR0_TTENDIAN GENMASK(22, 21)
52#define IDR0_STALL_MODEL_FORCE (2 << IDR0_STALL_MODEL_SHIFT) 54#define IDR0_TTENDIAN_MIXED 0
53#define IDR0_TTENDIAN_SHIFT 21 55#define IDR0_TTENDIAN_LE 2
54#define IDR0_TTENDIAN_MASK 0x3 56#define IDR0_TTENDIAN_BE 3
55#define IDR0_TTENDIAN_LE (2 << IDR0_TTENDIAN_SHIFT)
56#define IDR0_TTENDIAN_BE (3 << IDR0_TTENDIAN_SHIFT)
57#define IDR0_TTENDIAN_MIXED (0 << IDR0_TTENDIAN_SHIFT)
58#define IDR0_CD2L (1 << 19) 57#define IDR0_CD2L (1 << 19)
59#define IDR0_VMID16 (1 << 18) 58#define IDR0_VMID16 (1 << 18)
60#define IDR0_PRI (1 << 16) 59#define IDR0_PRI (1 << 16)
@@ -64,10 +63,9 @@
64#define IDR0_ATS (1 << 10) 63#define IDR0_ATS (1 << 10)
65#define IDR0_HYP (1 << 9) 64#define IDR0_HYP (1 << 9)
66#define IDR0_COHACC (1 << 4) 65#define IDR0_COHACC (1 << 4)
67#define IDR0_TTF_SHIFT 2 66#define IDR0_TTF GENMASK(3, 2)
68#define IDR0_TTF_MASK 0x3 67#define IDR0_TTF_AARCH64 2
69#define IDR0_TTF_AARCH64 (2 << IDR0_TTF_SHIFT) 68#define IDR0_TTF_AARCH32_64 3
70#define IDR0_TTF_AARCH32_64 (3 << IDR0_TTF_SHIFT)
71#define IDR0_S1P (1 << 1) 69#define IDR0_S1P (1 << 1)
72#define IDR0_S2P (1 << 0) 70#define IDR0_S2P (1 << 0)
73 71
@@ -75,31 +73,27 @@
75#define IDR1_TABLES_PRESET (1 << 30) 73#define IDR1_TABLES_PRESET (1 << 30)
76#define IDR1_QUEUES_PRESET (1 << 29) 74#define IDR1_QUEUES_PRESET (1 << 29)
77#define IDR1_REL (1 << 28) 75#define IDR1_REL (1 << 28)
78#define IDR1_CMDQ_SHIFT 21 76#define IDR1_CMDQS GENMASK(25, 21)
79#define IDR1_CMDQ_MASK 0x1f 77#define IDR1_EVTQS GENMASK(20, 16)
80#define IDR1_EVTQ_SHIFT 16 78#define IDR1_PRIQS GENMASK(15, 11)
81#define IDR1_EVTQ_MASK 0x1f 79#define IDR1_SSIDSIZE GENMASK(10, 6)
82#define IDR1_PRIQ_SHIFT 11 80#define IDR1_SIDSIZE GENMASK(5, 0)
83#define IDR1_PRIQ_MASK 0x1f
84#define IDR1_SSID_SHIFT 6
85#define IDR1_SSID_MASK 0x1f
86#define IDR1_SID_SHIFT 0
87#define IDR1_SID_MASK 0x3f
88 81
89#define ARM_SMMU_IDR5 0x14 82#define ARM_SMMU_IDR5 0x14
90#define IDR5_STALL_MAX_SHIFT 16 83#define IDR5_STALL_MAX GENMASK(31, 16)
91#define IDR5_STALL_MAX_MASK 0xffff
92#define IDR5_GRAN64K (1 << 6) 84#define IDR5_GRAN64K (1 << 6)
93#define IDR5_GRAN16K (1 << 5) 85#define IDR5_GRAN16K (1 << 5)
94#define IDR5_GRAN4K (1 << 4) 86#define IDR5_GRAN4K (1 << 4)
95#define IDR5_OAS_SHIFT 0 87#define IDR5_OAS GENMASK(2, 0)
96#define IDR5_OAS_MASK 0x7 88#define IDR5_OAS_32_BIT 0
97#define IDR5_OAS_32_BIT (0 << IDR5_OAS_SHIFT) 89#define IDR5_OAS_36_BIT 1
98#define IDR5_OAS_36_BIT (1 << IDR5_OAS_SHIFT) 90#define IDR5_OAS_40_BIT 2
99#define IDR5_OAS_40_BIT (2 << IDR5_OAS_SHIFT) 91#define IDR5_OAS_42_BIT 3
100#define IDR5_OAS_42_BIT (3 << IDR5_OAS_SHIFT) 92#define IDR5_OAS_44_BIT 4
101#define IDR5_OAS_44_BIT (4 << IDR5_OAS_SHIFT) 93#define IDR5_OAS_48_BIT 5
102#define IDR5_OAS_48_BIT (5 << IDR5_OAS_SHIFT) 94#define IDR5_OAS_52_BIT 6
95#define IDR5_VAX GENMASK(11, 10)
96#define IDR5_VAX_52_BIT 1
103 97
104#define ARM_SMMU_CR0 0x20 98#define ARM_SMMU_CR0 0x20
105#define CR0_CMDQEN (1 << 3) 99#define CR0_CMDQEN (1 << 3)
@@ -110,18 +104,16 @@
110#define ARM_SMMU_CR0ACK 0x24 104#define ARM_SMMU_CR0ACK 0x24
111 105
112#define ARM_SMMU_CR1 0x28 106#define ARM_SMMU_CR1 0x28
113#define CR1_SH_NSH 0 107#define CR1_TABLE_SH GENMASK(11, 10)
114#define CR1_SH_OSH 2 108#define CR1_TABLE_OC GENMASK(9, 8)
115#define CR1_SH_ISH 3 109#define CR1_TABLE_IC GENMASK(7, 6)
110#define CR1_QUEUE_SH GENMASK(5, 4)
111#define CR1_QUEUE_OC GENMASK(3, 2)
112#define CR1_QUEUE_IC GENMASK(1, 0)
113/* CR1 cacheability fields don't quite follow the usual TCR-style encoding */
116#define CR1_CACHE_NC 0 114#define CR1_CACHE_NC 0
117#define CR1_CACHE_WB 1 115#define CR1_CACHE_WB 1
118#define CR1_CACHE_WT 2 116#define CR1_CACHE_WT 2
119#define CR1_TABLE_SH_SHIFT 10
120#define CR1_TABLE_OC_SHIFT 8
121#define CR1_TABLE_IC_SHIFT 6
122#define CR1_QUEUE_SH_SHIFT 4
123#define CR1_QUEUE_OC_SHIFT 2
124#define CR1_QUEUE_IC_SHIFT 0
125 117
126#define ARM_SMMU_CR2 0x2c 118#define ARM_SMMU_CR2 0x2c
127#define CR2_PTM (1 << 2) 119#define CR2_PTM (1 << 2)
@@ -129,8 +121,8 @@
129#define CR2_E2H (1 << 0) 121#define CR2_E2H (1 << 0)
130 122
131#define ARM_SMMU_GBPA 0x44 123#define ARM_SMMU_GBPA 0x44
132#define GBPA_ABORT (1 << 20)
133#define GBPA_UPDATE (1 << 31) 124#define GBPA_UPDATE (1 << 31)
125#define GBPA_ABORT (1 << 20)
134 126
135#define ARM_SMMU_IRQ_CTRL 0x50 127#define ARM_SMMU_IRQ_CTRL 0x50
136#define IRQ_CTRL_EVTQ_IRQEN (1 << 2) 128#define IRQ_CTRL_EVTQ_IRQEN (1 << 2)
@@ -158,18 +150,14 @@
158 150
159#define ARM_SMMU_STRTAB_BASE 0x80 151#define ARM_SMMU_STRTAB_BASE 0x80
160#define STRTAB_BASE_RA (1UL << 62) 152#define STRTAB_BASE_RA (1UL << 62)
161#define STRTAB_BASE_ADDR_SHIFT 6 153#define STRTAB_BASE_ADDR_MASK GENMASK_ULL(51, 6)
162#define STRTAB_BASE_ADDR_MASK 0x3ffffffffffUL
163 154
164#define ARM_SMMU_STRTAB_BASE_CFG 0x88 155#define ARM_SMMU_STRTAB_BASE_CFG 0x88
165#define STRTAB_BASE_CFG_LOG2SIZE_SHIFT 0 156#define STRTAB_BASE_CFG_FMT GENMASK(17, 16)
166#define STRTAB_BASE_CFG_LOG2SIZE_MASK 0x3f 157#define STRTAB_BASE_CFG_FMT_LINEAR 0
167#define STRTAB_BASE_CFG_SPLIT_SHIFT 6 158#define STRTAB_BASE_CFG_FMT_2LVL 1
168#define STRTAB_BASE_CFG_SPLIT_MASK 0x1f 159#define STRTAB_BASE_CFG_SPLIT GENMASK(10, 6)
169#define STRTAB_BASE_CFG_FMT_SHIFT 16 160#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 161
174#define ARM_SMMU_CMDQ_BASE 0x90 162#define ARM_SMMU_CMDQ_BASE 0x90
175#define ARM_SMMU_CMDQ_PROD 0x98 163#define ARM_SMMU_CMDQ_PROD 0x98
@@ -190,14 +178,16 @@
190#define ARM_SMMU_PRIQ_IRQ_CFG2 0xdc 178#define ARM_SMMU_PRIQ_IRQ_CFG2 0xdc
191 179
192/* Common MSI config fields */ 180/* Common MSI config fields */
193#define MSI_CFG0_ADDR_SHIFT 2 181#define MSI_CFG0_ADDR_MASK GENMASK_ULL(51, 2)
194#define MSI_CFG0_ADDR_MASK 0x3fffffffffffUL 182#define MSI_CFG2_SH GENMASK(5, 4)
195#define MSI_CFG2_SH_SHIFT 4 183#define MSI_CFG2_MEMATTR GENMASK(3, 0)
196#define MSI_CFG2_SH_NSH (0UL << MSI_CFG2_SH_SHIFT) 184
197#define MSI_CFG2_SH_OSH (2UL << MSI_CFG2_SH_SHIFT) 185/* Common memory attribute values */
198#define MSI_CFG2_SH_ISH (3UL << MSI_CFG2_SH_SHIFT) 186#define ARM_SMMU_SH_NSH 0
199#define MSI_CFG2_MEMATTR_SHIFT 0 187#define ARM_SMMU_SH_OSH 2
200#define MSI_CFG2_MEMATTR_DEVICE_nGnRE (0x1 << MSI_CFG2_MEMATTR_SHIFT) 188#define ARM_SMMU_SH_ISH 3
189#define ARM_SMMU_MEMATTR_DEVICE_nGnRE 0x1
190#define ARM_SMMU_MEMATTR_OIWB 0xf
201 191
202#define Q_IDX(q, p) ((p) & ((1 << (q)->max_n_shift) - 1)) 192#define Q_IDX(q, p) ((p) & ((1 << (q)->max_n_shift) - 1))
203#define Q_WRP(q, p) ((p) & (1 << (q)->max_n_shift)) 193#define Q_WRP(q, p) ((p) & (1 << (q)->max_n_shift))
@@ -207,10 +197,8 @@
207 Q_IDX(q, p) * (q)->ent_dwords) 197 Q_IDX(q, p) * (q)->ent_dwords)
208 198
209#define Q_BASE_RWA (1UL << 62) 199#define Q_BASE_RWA (1UL << 62)
210#define Q_BASE_ADDR_SHIFT 5 200#define Q_BASE_ADDR_MASK GENMASK_ULL(51, 5)
211#define Q_BASE_ADDR_MASK 0xfffffffffffUL 201#define Q_BASE_LOG2SIZE GENMASK(4, 0)
212#define Q_BASE_LOG2SIZE_SHIFT 0
213#define Q_BASE_LOG2SIZE_MASK 0x1fUL
214 202
215/* 203/*
216 * Stream table. 204 * Stream table.
@@ -223,187 +211,143 @@
223#define STRTAB_SPLIT 8 211#define STRTAB_SPLIT 8
224 212
225#define STRTAB_L1_DESC_DWORDS 1 213#define STRTAB_L1_DESC_DWORDS 1
226#define STRTAB_L1_DESC_SPAN_SHIFT 0 214#define STRTAB_L1_DESC_SPAN GENMASK_ULL(4, 0)
227#define STRTAB_L1_DESC_SPAN_MASK 0x1fUL 215#define STRTAB_L1_DESC_L2PTR_MASK GENMASK_ULL(51, 6)
228#define STRTAB_L1_DESC_L2PTR_SHIFT 6
229#define STRTAB_L1_DESC_L2PTR_MASK 0x3ffffffffffUL
230 216
231#define STRTAB_STE_DWORDS 8 217#define STRTAB_STE_DWORDS 8
232#define STRTAB_STE_0_V (1UL << 0) 218#define STRTAB_STE_0_V (1UL << 0)
233#define STRTAB_STE_0_CFG_SHIFT 1 219#define STRTAB_STE_0_CFG GENMASK_ULL(3, 1)
234#define STRTAB_STE_0_CFG_MASK 0x7UL 220#define STRTAB_STE_0_CFG_ABORT 0
235#define STRTAB_STE_0_CFG_ABORT (0UL << STRTAB_STE_0_CFG_SHIFT) 221#define STRTAB_STE_0_CFG_BYPASS 4
236#define STRTAB_STE_0_CFG_BYPASS (4UL << STRTAB_STE_0_CFG_SHIFT) 222#define STRTAB_STE_0_CFG_S1_TRANS 5
237#define STRTAB_STE_0_CFG_S1_TRANS (5UL << STRTAB_STE_0_CFG_SHIFT) 223#define STRTAB_STE_0_CFG_S2_TRANS 6
238#define STRTAB_STE_0_CFG_S2_TRANS (6UL << STRTAB_STE_0_CFG_SHIFT) 224
239 225#define STRTAB_STE_0_S1FMT GENMASK_ULL(5, 4)
240#define STRTAB_STE_0_S1FMT_SHIFT 4 226#define STRTAB_STE_0_S1FMT_LINEAR 0
241#define STRTAB_STE_0_S1FMT_LINEAR (0UL << STRTAB_STE_0_S1FMT_SHIFT) 227#define STRTAB_STE_0_S1CTXPTR_MASK GENMASK_ULL(51, 6)
242#define STRTAB_STE_0_S1CTXPTR_SHIFT 6 228#define STRTAB_STE_0_S1CDMAX GENMASK_ULL(63, 59)
243#define STRTAB_STE_0_S1CTXPTR_MASK 0x3ffffffffffUL
244#define STRTAB_STE_0_S1CDMAX_SHIFT 59
245#define STRTAB_STE_0_S1CDMAX_MASK 0x1fUL
246 229
247#define STRTAB_STE_1_S1C_CACHE_NC 0UL 230#define STRTAB_STE_1_S1C_CACHE_NC 0UL
248#define STRTAB_STE_1_S1C_CACHE_WBRA 1UL 231#define STRTAB_STE_1_S1C_CACHE_WBRA 1UL
249#define STRTAB_STE_1_S1C_CACHE_WT 2UL 232#define STRTAB_STE_1_S1C_CACHE_WT 2UL
250#define STRTAB_STE_1_S1C_CACHE_WB 3UL 233#define STRTAB_STE_1_S1C_CACHE_WB 3UL
251#define STRTAB_STE_1_S1C_SH_NSH 0UL 234#define STRTAB_STE_1_S1CIR GENMASK_ULL(3, 2)
252#define STRTAB_STE_1_S1C_SH_OSH 2UL 235#define STRTAB_STE_1_S1COR GENMASK_ULL(5, 4)
253#define STRTAB_STE_1_S1C_SH_ISH 3UL 236#define STRTAB_STE_1_S1CSH GENMASK_ULL(7, 6)
254#define STRTAB_STE_1_S1CIR_SHIFT 2
255#define STRTAB_STE_1_S1COR_SHIFT 4
256#define STRTAB_STE_1_S1CSH_SHIFT 6
257 237
258#define STRTAB_STE_1_S1STALLD (1UL << 27) 238#define STRTAB_STE_1_S1STALLD (1UL << 27)
259 239
240#define STRTAB_STE_1_EATS GENMASK_ULL(29, 28)
260#define STRTAB_STE_1_EATS_ABT 0UL 241#define STRTAB_STE_1_EATS_ABT 0UL
261#define STRTAB_STE_1_EATS_TRANS 1UL 242#define STRTAB_STE_1_EATS_TRANS 1UL
262#define STRTAB_STE_1_EATS_S1CHK 2UL 243#define STRTAB_STE_1_EATS_S1CHK 2UL
263#define STRTAB_STE_1_EATS_SHIFT 28
264 244
245#define STRTAB_STE_1_STRW GENMASK_ULL(31, 30)
265#define STRTAB_STE_1_STRW_NSEL1 0UL 246#define STRTAB_STE_1_STRW_NSEL1 0UL
266#define STRTAB_STE_1_STRW_EL2 2UL 247#define STRTAB_STE_1_STRW_EL2 2UL
267#define STRTAB_STE_1_STRW_SHIFT 30
268 248
249#define STRTAB_STE_1_SHCFG GENMASK_ULL(45, 44)
269#define STRTAB_STE_1_SHCFG_INCOMING 1UL 250#define STRTAB_STE_1_SHCFG_INCOMING 1UL
270#define STRTAB_STE_1_SHCFG_SHIFT 44
271 251
272#define STRTAB_STE_2_S2VMID_SHIFT 0 252#define STRTAB_STE_2_S2VMID GENMASK_ULL(15, 0)
273#define STRTAB_STE_2_S2VMID_MASK 0xffffUL 253#define STRTAB_STE_2_VTCR GENMASK_ULL(50, 32)
274#define STRTAB_STE_2_VTCR_SHIFT 32
275#define STRTAB_STE_2_VTCR_MASK 0x7ffffUL
276#define STRTAB_STE_2_S2AA64 (1UL << 51) 254#define STRTAB_STE_2_S2AA64 (1UL << 51)
277#define STRTAB_STE_2_S2ENDI (1UL << 52) 255#define STRTAB_STE_2_S2ENDI (1UL << 52)
278#define STRTAB_STE_2_S2PTW (1UL << 54) 256#define STRTAB_STE_2_S2PTW (1UL << 54)
279#define STRTAB_STE_2_S2R (1UL << 58) 257#define STRTAB_STE_2_S2R (1UL << 58)
280 258
281#define STRTAB_STE_3_S2TTB_SHIFT 4 259#define STRTAB_STE_3_S2TTB_MASK GENMASK_ULL(51, 4)
282#define STRTAB_STE_3_S2TTB_MASK 0xfffffffffffUL
283 260
284/* Context descriptor (stage-1 only) */ 261/* Context descriptor (stage-1 only) */
285#define CTXDESC_CD_DWORDS 8 262#define CTXDESC_CD_DWORDS 8
286#define CTXDESC_CD_0_TCR_T0SZ_SHIFT 0 263#define CTXDESC_CD_0_TCR_T0SZ GENMASK_ULL(5, 0)
287#define ARM64_TCR_T0SZ_SHIFT 0 264#define ARM64_TCR_T0SZ GENMASK_ULL(5, 0)
288#define ARM64_TCR_T0SZ_MASK 0x1fUL 265#define CTXDESC_CD_0_TCR_TG0 GENMASK_ULL(7, 6)
289#define CTXDESC_CD_0_TCR_TG0_SHIFT 6 266#define ARM64_TCR_TG0 GENMASK_ULL(15, 14)
290#define ARM64_TCR_TG0_SHIFT 14 267#define CTXDESC_CD_0_TCR_IRGN0 GENMASK_ULL(9, 8)
291#define ARM64_TCR_TG0_MASK 0x3UL 268#define ARM64_TCR_IRGN0 GENMASK_ULL(9, 8)
292#define CTXDESC_CD_0_TCR_IRGN0_SHIFT 8 269#define CTXDESC_CD_0_TCR_ORGN0 GENMASK_ULL(11, 10)
293#define ARM64_TCR_IRGN0_SHIFT 8 270#define ARM64_TCR_ORGN0 GENMASK_ULL(11, 10)
294#define ARM64_TCR_IRGN0_MASK 0x3UL 271#define CTXDESC_CD_0_TCR_SH0 GENMASK_ULL(13, 12)
295#define CTXDESC_CD_0_TCR_ORGN0_SHIFT 10 272#define ARM64_TCR_SH0 GENMASK_ULL(13, 12)
296#define ARM64_TCR_ORGN0_SHIFT 10 273#define CTXDESC_CD_0_TCR_EPD0 (1ULL << 14)
297#define ARM64_TCR_ORGN0_MASK 0x3UL 274#define ARM64_TCR_EPD0 (1ULL << 7)
298#define CTXDESC_CD_0_TCR_SH0_SHIFT 12 275#define CTXDESC_CD_0_TCR_EPD1 (1ULL << 30)
299#define ARM64_TCR_SH0_SHIFT 12 276#define ARM64_TCR_EPD1 (1ULL << 23)
300#define ARM64_TCR_SH0_MASK 0x3UL
301#define CTXDESC_CD_0_TCR_EPD0_SHIFT 14
302#define ARM64_TCR_EPD0_SHIFT 7
303#define ARM64_TCR_EPD0_MASK 0x1UL
304#define CTXDESC_CD_0_TCR_EPD1_SHIFT 30
305#define ARM64_TCR_EPD1_SHIFT 23
306#define ARM64_TCR_EPD1_MASK 0x1UL
307 277
308#define CTXDESC_CD_0_ENDI (1UL << 15) 278#define CTXDESC_CD_0_ENDI (1UL << 15)
309#define CTXDESC_CD_0_V (1UL << 31) 279#define CTXDESC_CD_0_V (1UL << 31)
310 280
311#define CTXDESC_CD_0_TCR_IPS_SHIFT 32 281#define CTXDESC_CD_0_TCR_IPS GENMASK_ULL(34, 32)
312#define ARM64_TCR_IPS_SHIFT 32 282#define ARM64_TCR_IPS GENMASK_ULL(34, 32)
313#define ARM64_TCR_IPS_MASK 0x7UL 283#define CTXDESC_CD_0_TCR_TBI0 (1ULL << 38)
314#define CTXDESC_CD_0_TCR_TBI0_SHIFT 38 284#define ARM64_TCR_TBI0 (1ULL << 37)
315#define ARM64_TCR_TBI0_SHIFT 37
316#define ARM64_TCR_TBI0_MASK 0x1UL
317 285
318#define CTXDESC_CD_0_AA64 (1UL << 41) 286#define CTXDESC_CD_0_AA64 (1UL << 41)
319#define CTXDESC_CD_0_S (1UL << 44) 287#define CTXDESC_CD_0_S (1UL << 44)
320#define CTXDESC_CD_0_R (1UL << 45) 288#define CTXDESC_CD_0_R (1UL << 45)
321#define CTXDESC_CD_0_A (1UL << 46) 289#define CTXDESC_CD_0_A (1UL << 46)
322#define CTXDESC_CD_0_ASET_SHIFT 47 290#define CTXDESC_CD_0_ASET (1UL << 47)
323#define CTXDESC_CD_0_ASET_SHARED (0UL << CTXDESC_CD_0_ASET_SHIFT) 291#define CTXDESC_CD_0_ASID GENMASK_ULL(63, 48)
324#define CTXDESC_CD_0_ASET_PRIVATE (1UL << CTXDESC_CD_0_ASET_SHIFT)
325#define CTXDESC_CD_0_ASID_SHIFT 48
326#define CTXDESC_CD_0_ASID_MASK 0xffffUL
327
328#define CTXDESC_CD_1_TTB0_SHIFT 4
329#define CTXDESC_CD_1_TTB0_MASK 0xfffffffffffUL
330 292
331#define CTXDESC_CD_3_MAIR_SHIFT 0 293#define CTXDESC_CD_1_TTB0_MASK GENMASK_ULL(51, 4)
332 294
333/* Convert between AArch64 (CPU) TCR format and SMMU CD format */ 295/* Convert between AArch64 (CPU) TCR format and SMMU CD format */
334#define ARM_SMMU_TCR2CD(tcr, fld) \ 296#define ARM_SMMU_TCR2CD(tcr, fld) FIELD_PREP(CTXDESC_CD_0_TCR_##fld, \
335 (((tcr) >> ARM64_TCR_##fld##_SHIFT & ARM64_TCR_##fld##_MASK) \ 297 FIELD_GET(ARM64_TCR_##fld, tcr))
336 << CTXDESC_CD_0_TCR_##fld##_SHIFT)
337 298
338/* Command queue */ 299/* Command queue */
339#define CMDQ_ENT_DWORDS 2 300#define CMDQ_ENT_DWORDS 2
340#define CMDQ_MAX_SZ_SHIFT 8 301#define CMDQ_MAX_SZ_SHIFT 8
341 302
342#define CMDQ_ERR_SHIFT 24 303#define CMDQ_CONS_ERR GENMASK(30, 24)
343#define CMDQ_ERR_MASK 0x7f
344#define CMDQ_ERR_CERROR_NONE_IDX 0 304#define CMDQ_ERR_CERROR_NONE_IDX 0
345#define CMDQ_ERR_CERROR_ILL_IDX 1 305#define CMDQ_ERR_CERROR_ILL_IDX 1
346#define CMDQ_ERR_CERROR_ABT_IDX 2 306#define CMDQ_ERR_CERROR_ABT_IDX 2
347 307
348#define CMDQ_0_OP_SHIFT 0 308#define CMDQ_0_OP GENMASK_ULL(7, 0)
349#define CMDQ_0_OP_MASK 0xffUL
350#define CMDQ_0_SSV (1UL << 11) 309#define CMDQ_0_SSV (1UL << 11)
351 310
352#define CMDQ_PREFETCH_0_SID_SHIFT 32 311#define CMDQ_PREFETCH_0_SID GENMASK_ULL(63, 32)
353#define CMDQ_PREFETCH_1_SIZE_SHIFT 0 312#define CMDQ_PREFETCH_1_SIZE GENMASK_ULL(4, 0)
354#define CMDQ_PREFETCH_1_ADDR_MASK ~0xfffUL 313#define CMDQ_PREFETCH_1_ADDR_MASK GENMASK_ULL(63, 12)
355 314
356#define CMDQ_CFGI_0_SID_SHIFT 32 315#define CMDQ_CFGI_0_SID GENMASK_ULL(63, 32)
357#define CMDQ_CFGI_0_SID_MASK 0xffffffffUL
358#define CMDQ_CFGI_1_LEAF (1UL << 0) 316#define CMDQ_CFGI_1_LEAF (1UL << 0)
359#define CMDQ_CFGI_1_RANGE_SHIFT 0 317#define CMDQ_CFGI_1_RANGE GENMASK_ULL(4, 0)
360#define CMDQ_CFGI_1_RANGE_MASK 0x1fUL
361 318
362#define CMDQ_TLBI_0_VMID_SHIFT 32 319#define CMDQ_TLBI_0_VMID GENMASK_ULL(47, 32)
363#define CMDQ_TLBI_0_ASID_SHIFT 48 320#define CMDQ_TLBI_0_ASID GENMASK_ULL(63, 48)
364#define CMDQ_TLBI_1_LEAF (1UL << 0) 321#define CMDQ_TLBI_1_LEAF (1UL << 0)
365#define CMDQ_TLBI_1_VA_MASK ~0xfffUL 322#define CMDQ_TLBI_1_VA_MASK GENMASK_ULL(63, 12)
366#define CMDQ_TLBI_1_IPA_MASK 0xfffffffff000UL 323#define CMDQ_TLBI_1_IPA_MASK GENMASK_ULL(51, 12)
367 324
368#define CMDQ_PRI_0_SSID_SHIFT 12 325#define CMDQ_PRI_0_SSID GENMASK_ULL(31, 12)
369#define CMDQ_PRI_0_SSID_MASK 0xfffffUL 326#define CMDQ_PRI_0_SID GENMASK_ULL(63, 32)
370#define CMDQ_PRI_0_SID_SHIFT 32 327#define CMDQ_PRI_1_GRPID GENMASK_ULL(8, 0)
371#define CMDQ_PRI_0_SID_MASK 0xffffffffUL 328#define CMDQ_PRI_1_RESP GENMASK_ULL(13, 12)
372#define CMDQ_PRI_1_GRPID_SHIFT 0 329
373#define CMDQ_PRI_1_GRPID_MASK 0x1ffUL 330#define CMDQ_SYNC_0_CS GENMASK_ULL(13, 12)
374#define CMDQ_PRI_1_RESP_SHIFT 12 331#define CMDQ_SYNC_0_CS_NONE 0
375#define CMDQ_PRI_1_RESP_DENY (0UL << CMDQ_PRI_1_RESP_SHIFT) 332#define CMDQ_SYNC_0_CS_IRQ 1
376#define CMDQ_PRI_1_RESP_FAIL (1UL << CMDQ_PRI_1_RESP_SHIFT) 333#define CMDQ_SYNC_0_CS_SEV 2
377#define CMDQ_PRI_1_RESP_SUCC (2UL << CMDQ_PRI_1_RESP_SHIFT) 334#define CMDQ_SYNC_0_MSH GENMASK_ULL(23, 22)
378 335#define CMDQ_SYNC_0_MSIATTR GENMASK_ULL(27, 24)
379#define CMDQ_SYNC_0_CS_SHIFT 12 336#define CMDQ_SYNC_0_MSIDATA GENMASK_ULL(63, 32)
380#define CMDQ_SYNC_0_CS_NONE (0UL << CMDQ_SYNC_0_CS_SHIFT) 337#define CMDQ_SYNC_1_MSIADDR_MASK GENMASK_ULL(51, 2)
381#define CMDQ_SYNC_0_CS_IRQ (1UL << CMDQ_SYNC_0_CS_SHIFT)
382#define CMDQ_SYNC_0_CS_SEV (2UL << CMDQ_SYNC_0_CS_SHIFT)
383#define CMDQ_SYNC_0_MSH_SHIFT 22
384#define CMDQ_SYNC_0_MSH_ISH (3UL << CMDQ_SYNC_0_MSH_SHIFT)
385#define CMDQ_SYNC_0_MSIATTR_SHIFT 24
386#define CMDQ_SYNC_0_MSIATTR_OIWB (0xfUL << CMDQ_SYNC_0_MSIATTR_SHIFT)
387#define CMDQ_SYNC_0_MSIDATA_SHIFT 32
388#define CMDQ_SYNC_0_MSIDATA_MASK 0xffffffffUL
389#define CMDQ_SYNC_1_MSIADDR_SHIFT 0
390#define CMDQ_SYNC_1_MSIADDR_MASK 0xffffffffffffcUL
391 338
392/* Event queue */ 339/* Event queue */
393#define EVTQ_ENT_DWORDS 4 340#define EVTQ_ENT_DWORDS 4
394#define EVTQ_MAX_SZ_SHIFT 7 341#define EVTQ_MAX_SZ_SHIFT 7
395 342
396#define EVTQ_0_ID_SHIFT 0 343#define EVTQ_0_ID GENMASK_ULL(7, 0)
397#define EVTQ_0_ID_MASK 0xffUL
398 344
399/* PRI queue */ 345/* PRI queue */
400#define PRIQ_ENT_DWORDS 2 346#define PRIQ_ENT_DWORDS 2
401#define PRIQ_MAX_SZ_SHIFT 8 347#define PRIQ_MAX_SZ_SHIFT 8
402 348
403#define PRIQ_0_SID_SHIFT 0 349#define PRIQ_0_SID GENMASK_ULL(31, 0)
404#define PRIQ_0_SID_MASK 0xffffffffUL 350#define PRIQ_0_SSID GENMASK_ULL(51, 32)
405#define PRIQ_0_SSID_SHIFT 32
406#define PRIQ_0_SSID_MASK 0xfffffUL
407#define PRIQ_0_PERM_PRIV (1UL << 58) 351#define PRIQ_0_PERM_PRIV (1UL << 58)
408#define PRIQ_0_PERM_EXEC (1UL << 59) 352#define PRIQ_0_PERM_EXEC (1UL << 59)
409#define PRIQ_0_PERM_READ (1UL << 60) 353#define PRIQ_0_PERM_READ (1UL << 60)
@@ -411,10 +355,8 @@
411#define PRIQ_0_PRG_LAST (1UL << 62) 355#define PRIQ_0_PRG_LAST (1UL << 62)
412#define PRIQ_0_SSID_V (1UL << 63) 356#define PRIQ_0_SSID_V (1UL << 63)
413 357
414#define PRIQ_1_PRG_IDX_SHIFT 0 358#define PRIQ_1_PRG_IDX GENMASK_ULL(8, 0)
415#define PRIQ_1_PRG_IDX_MASK 0x1ffUL 359#define PRIQ_1_ADDR_MASK GENMASK_ULL(63, 12)
416#define PRIQ_1_ADDR_SHIFT 12
417#define PRIQ_1_ADDR_MASK 0xfffffffffffffUL
418 360
419/* High-level queue structures */ 361/* High-level queue structures */
420#define ARM_SMMU_POLL_TIMEOUT_US 100 362#define ARM_SMMU_POLL_TIMEOUT_US 100
@@ -430,9 +372,9 @@ MODULE_PARM_DESC(disable_bypass,
430 "Disable bypass streams such that incoming transactions from devices that are not attached to an iommu domain will report an abort back to the device and will not be allowed to pass through the SMMU."); 372 "Disable bypass streams such that incoming transactions from devices that are not attached to an iommu domain will report an abort back to the device and will not be allowed to pass through the SMMU.");
431 373
432enum pri_resp { 374enum pri_resp {
433 PRI_RESP_DENY, 375 PRI_RESP_DENY = 0,
434 PRI_RESP_FAIL, 376 PRI_RESP_FAIL = 1,
435 PRI_RESP_SUCC, 377 PRI_RESP_SUCC = 2,
436}; 378};
437 379
438enum arm_smmu_msi_index { 380enum arm_smmu_msi_index {
@@ -611,6 +553,7 @@ struct arm_smmu_device {
611#define ARM_SMMU_FEAT_STALLS (1 << 11) 553#define ARM_SMMU_FEAT_STALLS (1 << 11)
612#define ARM_SMMU_FEAT_HYP (1 << 12) 554#define ARM_SMMU_FEAT_HYP (1 << 12)
613#define ARM_SMMU_FEAT_STALL_FORCE (1 << 13) 555#define ARM_SMMU_FEAT_STALL_FORCE (1 << 13)
556#define ARM_SMMU_FEAT_VAX (1 << 14)
614 u32 features; 557 u32 features;
615 558
616#define ARM_SMMU_OPT_SKIP_PREFETCH (1 << 0) 559#define ARM_SMMU_OPT_SKIP_PREFETCH (1 << 0)
@@ -836,67 +779,64 @@ static int queue_remove_raw(struct arm_smmu_queue *q, u64 *ent)
836static int arm_smmu_cmdq_build_cmd(u64 *cmd, struct arm_smmu_cmdq_ent *ent) 779static int arm_smmu_cmdq_build_cmd(u64 *cmd, struct arm_smmu_cmdq_ent *ent)
837{ 780{
838 memset(cmd, 0, CMDQ_ENT_DWORDS << 3); 781 memset(cmd, 0, CMDQ_ENT_DWORDS << 3);
839 cmd[0] |= (ent->opcode & CMDQ_0_OP_MASK) << CMDQ_0_OP_SHIFT; 782 cmd[0] |= FIELD_PREP(CMDQ_0_OP, ent->opcode);
840 783
841 switch (ent->opcode) { 784 switch (ent->opcode) {
842 case CMDQ_OP_TLBI_EL2_ALL: 785 case CMDQ_OP_TLBI_EL2_ALL:
843 case CMDQ_OP_TLBI_NSNH_ALL: 786 case CMDQ_OP_TLBI_NSNH_ALL:
844 break; 787 break;
845 case CMDQ_OP_PREFETCH_CFG: 788 case CMDQ_OP_PREFETCH_CFG:
846 cmd[0] |= (u64)ent->prefetch.sid << CMDQ_PREFETCH_0_SID_SHIFT; 789 cmd[0] |= FIELD_PREP(CMDQ_PREFETCH_0_SID, ent->prefetch.sid);
847 cmd[1] |= ent->prefetch.size << CMDQ_PREFETCH_1_SIZE_SHIFT; 790 cmd[1] |= FIELD_PREP(CMDQ_PREFETCH_1_SIZE, ent->prefetch.size);
848 cmd[1] |= ent->prefetch.addr & CMDQ_PREFETCH_1_ADDR_MASK; 791 cmd[1] |= ent->prefetch.addr & CMDQ_PREFETCH_1_ADDR_MASK;
849 break; 792 break;
850 case CMDQ_OP_CFGI_STE: 793 case CMDQ_OP_CFGI_STE:
851 cmd[0] |= (u64)ent->cfgi.sid << CMDQ_CFGI_0_SID_SHIFT; 794 cmd[0] |= FIELD_PREP(CMDQ_CFGI_0_SID, ent->cfgi.sid);
852 cmd[1] |= ent->cfgi.leaf ? CMDQ_CFGI_1_LEAF : 0; 795 cmd[1] |= FIELD_PREP(CMDQ_CFGI_1_LEAF, ent->cfgi.leaf);
853 break; 796 break;
854 case CMDQ_OP_CFGI_ALL: 797 case CMDQ_OP_CFGI_ALL:
855 /* Cover the entire SID range */ 798 /* Cover the entire SID range */
856 cmd[1] |= CMDQ_CFGI_1_RANGE_MASK << CMDQ_CFGI_1_RANGE_SHIFT; 799 cmd[1] |= FIELD_PREP(CMDQ_CFGI_1_RANGE, 31);
857 break; 800 break;
858 case CMDQ_OP_TLBI_NH_VA: 801 case CMDQ_OP_TLBI_NH_VA:
859 cmd[0] |= (u64)ent->tlbi.asid << CMDQ_TLBI_0_ASID_SHIFT; 802 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_ASID, ent->tlbi.asid);
860 cmd[1] |= ent->tlbi.leaf ? CMDQ_TLBI_1_LEAF : 0; 803 cmd[1] |= FIELD_PREP(CMDQ_TLBI_1_LEAF, ent->tlbi.leaf);
861 cmd[1] |= ent->tlbi.addr & CMDQ_TLBI_1_VA_MASK; 804 cmd[1] |= ent->tlbi.addr & CMDQ_TLBI_1_VA_MASK;
862 break; 805 break;
863 case CMDQ_OP_TLBI_S2_IPA: 806 case CMDQ_OP_TLBI_S2_IPA:
864 cmd[0] |= (u64)ent->tlbi.vmid << CMDQ_TLBI_0_VMID_SHIFT; 807 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_VMID, ent->tlbi.vmid);
865 cmd[1] |= ent->tlbi.leaf ? CMDQ_TLBI_1_LEAF : 0; 808 cmd[1] |= FIELD_PREP(CMDQ_TLBI_1_LEAF, ent->tlbi.leaf);
866 cmd[1] |= ent->tlbi.addr & CMDQ_TLBI_1_IPA_MASK; 809 cmd[1] |= ent->tlbi.addr & CMDQ_TLBI_1_IPA_MASK;
867 break; 810 break;
868 case CMDQ_OP_TLBI_NH_ASID: 811 case CMDQ_OP_TLBI_NH_ASID:
869 cmd[0] |= (u64)ent->tlbi.asid << CMDQ_TLBI_0_ASID_SHIFT; 812 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_ASID, ent->tlbi.asid);
870 /* Fallthrough */ 813 /* Fallthrough */
871 case CMDQ_OP_TLBI_S12_VMALL: 814 case CMDQ_OP_TLBI_S12_VMALL:
872 cmd[0] |= (u64)ent->tlbi.vmid << CMDQ_TLBI_0_VMID_SHIFT; 815 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_VMID, ent->tlbi.vmid);
873 break; 816 break;
874 case CMDQ_OP_PRI_RESP: 817 case CMDQ_OP_PRI_RESP:
875 cmd[0] |= ent->substream_valid ? CMDQ_0_SSV : 0; 818 cmd[0] |= FIELD_PREP(CMDQ_0_SSV, ent->substream_valid);
876 cmd[0] |= ent->pri.ssid << CMDQ_PRI_0_SSID_SHIFT; 819 cmd[0] |= FIELD_PREP(CMDQ_PRI_0_SSID, ent->pri.ssid);
877 cmd[0] |= (u64)ent->pri.sid << CMDQ_PRI_0_SID_SHIFT; 820 cmd[0] |= FIELD_PREP(CMDQ_PRI_0_SID, ent->pri.sid);
878 cmd[1] |= ent->pri.grpid << CMDQ_PRI_1_GRPID_SHIFT; 821 cmd[1] |= FIELD_PREP(CMDQ_PRI_1_GRPID, ent->pri.grpid);
879 switch (ent->pri.resp) { 822 switch (ent->pri.resp) {
880 case PRI_RESP_DENY: 823 case PRI_RESP_DENY:
881 cmd[1] |= CMDQ_PRI_1_RESP_DENY;
882 break;
883 case PRI_RESP_FAIL: 824 case PRI_RESP_FAIL:
884 cmd[1] |= CMDQ_PRI_1_RESP_FAIL;
885 break;
886 case PRI_RESP_SUCC: 825 case PRI_RESP_SUCC:
887 cmd[1] |= CMDQ_PRI_1_RESP_SUCC;
888 break; 826 break;
889 default: 827 default:
890 return -EINVAL; 828 return -EINVAL;
891 } 829 }
830 cmd[1] |= FIELD_PREP(CMDQ_PRI_1_RESP, ent->pri.resp);
892 break; 831 break;
893 case CMDQ_OP_CMD_SYNC: 832 case CMDQ_OP_CMD_SYNC:
894 if (ent->sync.msiaddr) 833 if (ent->sync.msiaddr)
895 cmd[0] |= CMDQ_SYNC_0_CS_IRQ; 834 cmd[0] |= FIELD_PREP(CMDQ_SYNC_0_CS, CMDQ_SYNC_0_CS_IRQ);
896 else 835 else
897 cmd[0] |= CMDQ_SYNC_0_CS_SEV; 836 cmd[0] |= FIELD_PREP(CMDQ_SYNC_0_CS, CMDQ_SYNC_0_CS_SEV);
898 cmd[0] |= CMDQ_SYNC_0_MSH_ISH | CMDQ_SYNC_0_MSIATTR_OIWB; 837 cmd[0] |= FIELD_PREP(CMDQ_SYNC_0_MSH, ARM_SMMU_SH_ISH);
899 cmd[0] |= (u64)ent->sync.msidata << CMDQ_SYNC_0_MSIDATA_SHIFT; 838 cmd[0] |= FIELD_PREP(CMDQ_SYNC_0_MSIATTR, ARM_SMMU_MEMATTR_OIWB);
839 cmd[0] |= FIELD_PREP(CMDQ_SYNC_0_MSIDATA, ent->sync.msidata);
900 cmd[1] |= ent->sync.msiaddr & CMDQ_SYNC_1_MSIADDR_MASK; 840 cmd[1] |= ent->sync.msiaddr & CMDQ_SYNC_1_MSIADDR_MASK;
901 break; 841 break;
902 default: 842 default:
@@ -918,7 +858,7 @@ static void arm_smmu_cmdq_skip_err(struct arm_smmu_device *smmu)
918 u64 cmd[CMDQ_ENT_DWORDS]; 858 u64 cmd[CMDQ_ENT_DWORDS];
919 struct arm_smmu_queue *q = &smmu->cmdq.q; 859 struct arm_smmu_queue *q = &smmu->cmdq.q;
920 u32 cons = readl_relaxed(q->cons_reg); 860 u32 cons = readl_relaxed(q->cons_reg);
921 u32 idx = cons >> CMDQ_ERR_SHIFT & CMDQ_ERR_MASK; 861 u32 idx = FIELD_GET(CMDQ_CONS_ERR, cons);
922 struct arm_smmu_cmdq_ent cmd_sync = { 862 struct arm_smmu_cmdq_ent cmd_sync = {
923 .opcode = CMDQ_OP_CMD_SYNC, 863 .opcode = CMDQ_OP_CMD_SYNC,
924 }; 864 };
@@ -1083,8 +1023,8 @@ static void arm_smmu_write_ctx_desc(struct arm_smmu_device *smmu,
1083#ifdef __BIG_ENDIAN 1023#ifdef __BIG_ENDIAN
1084 CTXDESC_CD_0_ENDI | 1024 CTXDESC_CD_0_ENDI |
1085#endif 1025#endif
1086 CTXDESC_CD_0_R | CTXDESC_CD_0_A | CTXDESC_CD_0_ASET_PRIVATE | 1026 CTXDESC_CD_0_R | CTXDESC_CD_0_A | CTXDESC_CD_0_ASET |
1087 CTXDESC_CD_0_AA64 | (u64)cfg->cd.asid << CTXDESC_CD_0_ASID_SHIFT | 1027 CTXDESC_CD_0_AA64 | FIELD_PREP(CTXDESC_CD_0_ASID, cfg->cd.asid) |
1088 CTXDESC_CD_0_V; 1028 CTXDESC_CD_0_V;
1089 1029
1090 /* STALL_MODEL==0b10 && CD.S==0 is ILLEGAL */ 1030 /* STALL_MODEL==0b10 && CD.S==0 is ILLEGAL */
@@ -1093,10 +1033,10 @@ static void arm_smmu_write_ctx_desc(struct arm_smmu_device *smmu,
1093 1033
1094 cfg->cdptr[0] = cpu_to_le64(val); 1034 cfg->cdptr[0] = cpu_to_le64(val);
1095 1035
1096 val = cfg->cd.ttbr & CTXDESC_CD_1_TTB0_MASK << CTXDESC_CD_1_TTB0_SHIFT; 1036 val = cfg->cd.ttbr & CTXDESC_CD_1_TTB0_MASK;
1097 cfg->cdptr[1] = cpu_to_le64(val); 1037 cfg->cdptr[1] = cpu_to_le64(val);
1098 1038
1099 cfg->cdptr[3] = cpu_to_le64(cfg->cd.mair << CTXDESC_CD_3_MAIR_SHIFT); 1039 cfg->cdptr[3] = cpu_to_le64(cfg->cd.mair);
1100} 1040}
1101 1041
1102/* Stream table manipulation functions */ 1042/* Stream table manipulation functions */
@@ -1105,10 +1045,8 @@ arm_smmu_write_strtab_l1_desc(__le64 *dst, struct arm_smmu_strtab_l1_desc *desc)
1105{ 1045{
1106 u64 val = 0; 1046 u64 val = 0;
1107 1047
1108 val |= (desc->span & STRTAB_L1_DESC_SPAN_MASK) 1048 val |= FIELD_PREP(STRTAB_L1_DESC_SPAN, desc->span);
1109 << STRTAB_L1_DESC_SPAN_SHIFT; 1049 val |= desc->l2ptr_dma & STRTAB_L1_DESC_L2PTR_MASK;
1110 val |= desc->l2ptr_dma &
1111 STRTAB_L1_DESC_L2PTR_MASK << STRTAB_L1_DESC_L2PTR_SHIFT;
1112 1050
1113 *dst = cpu_to_le64(val); 1051 *dst = cpu_to_le64(val);
1114} 1052}
@@ -1156,10 +1094,7 @@ static void arm_smmu_write_strtab_ent(struct arm_smmu_device *smmu, u32 sid,
1156 }; 1094 };
1157 1095
1158 if (val & STRTAB_STE_0_V) { 1096 if (val & STRTAB_STE_0_V) {
1159 u64 cfg; 1097 switch (FIELD_GET(STRTAB_STE_0_CFG, val)) {
1160
1161 cfg = val & STRTAB_STE_0_CFG_MASK << STRTAB_STE_0_CFG_SHIFT;
1162 switch (cfg) {
1163 case STRTAB_STE_0_CFG_BYPASS: 1098 case STRTAB_STE_0_CFG_BYPASS:
1164 break; 1099 break;
1165 case STRTAB_STE_0_CFG_S1_TRANS: 1100 case STRTAB_STE_0_CFG_S1_TRANS:
@@ -1180,13 +1115,13 @@ static void arm_smmu_write_strtab_ent(struct arm_smmu_device *smmu, u32 sid,
1180 /* Bypass/fault */ 1115 /* Bypass/fault */
1181 if (!ste->assigned || !(ste->s1_cfg || ste->s2_cfg)) { 1116 if (!ste->assigned || !(ste->s1_cfg || ste->s2_cfg)) {
1182 if (!ste->assigned && disable_bypass) 1117 if (!ste->assigned && disable_bypass)
1183 val |= STRTAB_STE_0_CFG_ABORT; 1118 val |= FIELD_PREP(STRTAB_STE_0_CFG, STRTAB_STE_0_CFG_ABORT);
1184 else 1119 else
1185 val |= STRTAB_STE_0_CFG_BYPASS; 1120 val |= FIELD_PREP(STRTAB_STE_0_CFG, STRTAB_STE_0_CFG_BYPASS);
1186 1121
1187 dst[0] = cpu_to_le64(val); 1122 dst[0] = cpu_to_le64(val);
1188 dst[1] = cpu_to_le64(STRTAB_STE_1_SHCFG_INCOMING 1123 dst[1] = cpu_to_le64(FIELD_PREP(STRTAB_STE_1_SHCFG,
1189 << STRTAB_STE_1_SHCFG_SHIFT); 1124 STRTAB_STE_1_SHCFG_INCOMING));
1190 dst[2] = 0; /* Nuke the VMID */ 1125 dst[2] = 0; /* Nuke the VMID */
1191 /* 1126 /*
1192 * The SMMU can perform negative caching, so we must sync 1127 * The SMMU can perform negative caching, so we must sync
@@ -1200,41 +1135,36 @@ static void arm_smmu_write_strtab_ent(struct arm_smmu_device *smmu, u32 sid,
1200 if (ste->s1_cfg) { 1135 if (ste->s1_cfg) {
1201 BUG_ON(ste_live); 1136 BUG_ON(ste_live);
1202 dst[1] = cpu_to_le64( 1137 dst[1] = cpu_to_le64(
1203 STRTAB_STE_1_S1C_CACHE_WBRA 1138 FIELD_PREP(STRTAB_STE_1_S1CIR, STRTAB_STE_1_S1C_CACHE_WBRA) |
1204 << STRTAB_STE_1_S1CIR_SHIFT | 1139 FIELD_PREP(STRTAB_STE_1_S1COR, STRTAB_STE_1_S1C_CACHE_WBRA) |
1205 STRTAB_STE_1_S1C_CACHE_WBRA 1140 FIELD_PREP(STRTAB_STE_1_S1CSH, ARM_SMMU_SH_ISH) |
1206 << STRTAB_STE_1_S1COR_SHIFT |
1207 STRTAB_STE_1_S1C_SH_ISH << STRTAB_STE_1_S1CSH_SHIFT |
1208#ifdef CONFIG_PCI_ATS 1141#ifdef CONFIG_PCI_ATS
1209 STRTAB_STE_1_EATS_TRANS << STRTAB_STE_1_EATS_SHIFT | 1142 FIELD_PREP(STRTAB_STE_1_EATS, STRTAB_STE_1_EATS_TRANS) |
1210#endif 1143#endif
1211 STRTAB_STE_1_STRW_NSEL1 << STRTAB_STE_1_STRW_SHIFT); 1144 FIELD_PREP(STRTAB_STE_1_STRW, STRTAB_STE_1_STRW_NSEL1));
1212 1145
1213 if (smmu->features & ARM_SMMU_FEAT_STALLS && 1146 if (smmu->features & ARM_SMMU_FEAT_STALLS &&
1214 !(smmu->features & ARM_SMMU_FEAT_STALL_FORCE)) 1147 !(smmu->features & ARM_SMMU_FEAT_STALL_FORCE))
1215 dst[1] |= cpu_to_le64(STRTAB_STE_1_S1STALLD); 1148 dst[1] |= cpu_to_le64(STRTAB_STE_1_S1STALLD);
1216 1149
1217 val |= (ste->s1_cfg->cdptr_dma & STRTAB_STE_0_S1CTXPTR_MASK 1150 val |= (ste->s1_cfg->cdptr_dma & STRTAB_STE_0_S1CTXPTR_MASK) |
1218 << STRTAB_STE_0_S1CTXPTR_SHIFT) | 1151 FIELD_PREP(STRTAB_STE_0_CFG, STRTAB_STE_0_CFG_S1_TRANS);
1219 STRTAB_STE_0_CFG_S1_TRANS;
1220 } 1152 }
1221 1153
1222 if (ste->s2_cfg) { 1154 if (ste->s2_cfg) {
1223 BUG_ON(ste_live); 1155 BUG_ON(ste_live);
1224 dst[2] = cpu_to_le64( 1156 dst[2] = cpu_to_le64(
1225 ste->s2_cfg->vmid << STRTAB_STE_2_S2VMID_SHIFT | 1157 FIELD_PREP(STRTAB_STE_2_S2VMID, ste->s2_cfg->vmid) |
1226 (ste->s2_cfg->vtcr & STRTAB_STE_2_VTCR_MASK) 1158 FIELD_PREP(STRTAB_STE_2_VTCR, ste->s2_cfg->vtcr) |
1227 << STRTAB_STE_2_VTCR_SHIFT |
1228#ifdef __BIG_ENDIAN 1159#ifdef __BIG_ENDIAN
1229 STRTAB_STE_2_S2ENDI | 1160 STRTAB_STE_2_S2ENDI |
1230#endif 1161#endif
1231 STRTAB_STE_2_S2PTW | STRTAB_STE_2_S2AA64 | 1162 STRTAB_STE_2_S2PTW | STRTAB_STE_2_S2AA64 |
1232 STRTAB_STE_2_S2R); 1163 STRTAB_STE_2_S2R);
1233 1164
1234 dst[3] = cpu_to_le64(ste->s2_cfg->vttbr & 1165 dst[3] = cpu_to_le64(ste->s2_cfg->vttbr & STRTAB_STE_3_S2TTB_MASK);
1235 STRTAB_STE_3_S2TTB_MASK << STRTAB_STE_3_S2TTB_SHIFT);
1236 1166
1237 val |= STRTAB_STE_0_CFG_S2_TRANS; 1167 val |= FIELD_PREP(STRTAB_STE_0_CFG, STRTAB_STE_0_CFG_S2_TRANS);
1238 } 1168 }
1239 1169
1240 arm_smmu_sync_ste_for_sid(smmu, sid); 1170 arm_smmu_sync_ste_for_sid(smmu, sid);
@@ -1295,7 +1225,7 @@ static irqreturn_t arm_smmu_evtq_thread(int irq, void *dev)
1295 1225
1296 do { 1226 do {
1297 while (!queue_remove_raw(q, evt)) { 1227 while (!queue_remove_raw(q, evt)) {
1298 u8 id = evt[0] >> EVTQ_0_ID_SHIFT & EVTQ_0_ID_MASK; 1228 u8 id = FIELD_GET(EVTQ_0_ID, evt[0]);
1299 1229
1300 dev_info(smmu->dev, "event 0x%02x received:\n", id); 1230 dev_info(smmu->dev, "event 0x%02x received:\n", id);
1301 for (i = 0; i < ARRAY_SIZE(evt); ++i) 1231 for (i = 0; i < ARRAY_SIZE(evt); ++i)
@@ -1323,11 +1253,11 @@ static void arm_smmu_handle_ppr(struct arm_smmu_device *smmu, u64 *evt)
1323 u16 grpid; 1253 u16 grpid;
1324 bool ssv, last; 1254 bool ssv, last;
1325 1255
1326 sid = evt[0] >> PRIQ_0_SID_SHIFT & PRIQ_0_SID_MASK; 1256 sid = FIELD_GET(PRIQ_0_SID, evt[0]);
1327 ssv = evt[0] & PRIQ_0_SSID_V; 1257 ssv = FIELD_GET(PRIQ_0_SSID_V, evt[0]);
1328 ssid = ssv ? evt[0] >> PRIQ_0_SSID_SHIFT & PRIQ_0_SSID_MASK : 0; 1258 ssid = ssv ? FIELD_GET(PRIQ_0_SSID, evt[0]) : 0;
1329 last = evt[0] & PRIQ_0_PRG_LAST; 1259 last = FIELD_GET(PRIQ_0_PRG_LAST, evt[0]);
1330 grpid = evt[1] >> PRIQ_1_PRG_IDX_SHIFT & PRIQ_1_PRG_IDX_MASK; 1260 grpid = FIELD_GET(PRIQ_1_PRG_IDX, evt[1]);
1331 1261
1332 dev_info(smmu->dev, "unexpected PRI request received:\n"); 1262 dev_info(smmu->dev, "unexpected PRI request received:\n");
1333 dev_info(smmu->dev, 1263 dev_info(smmu->dev,
@@ -1337,7 +1267,7 @@ static void arm_smmu_handle_ppr(struct arm_smmu_device *smmu, u64 *evt)
1337 evt[0] & PRIQ_0_PERM_READ ? "R" : "", 1267 evt[0] & PRIQ_0_PERM_READ ? "R" : "",
1338 evt[0] & PRIQ_0_PERM_WRITE ? "W" : "", 1268 evt[0] & PRIQ_0_PERM_WRITE ? "W" : "",
1339 evt[0] & PRIQ_0_PERM_EXEC ? "X" : "", 1269 evt[0] & PRIQ_0_PERM_EXEC ? "X" : "",
1340 evt[1] & PRIQ_1_ADDR_MASK << PRIQ_1_ADDR_SHIFT); 1270 evt[1] & PRIQ_1_ADDR_MASK);
1341 1271
1342 if (last) { 1272 if (last) {
1343 struct arm_smmu_cmdq_ent cmd = { 1273 struct arm_smmu_cmdq_ent cmd = {
@@ -1664,7 +1594,8 @@ static int arm_smmu_domain_finalise(struct iommu_domain *domain)
1664 1594
1665 switch (smmu_domain->stage) { 1595 switch (smmu_domain->stage) {
1666 case ARM_SMMU_DOMAIN_S1: 1596 case ARM_SMMU_DOMAIN_S1:
1667 ias = VA_BITS; 1597 ias = (smmu->features & ARM_SMMU_FEAT_VAX) ? 52 : 48;
1598 ias = min_t(unsigned long, ias, VA_BITS);
1668 oas = smmu->ias; 1599 oas = smmu->ias;
1669 fmt = ARM_64_LPAE_S1; 1600 fmt = ARM_64_LPAE_S1;
1670 finalise_stage_fn = arm_smmu_domain_finalise_s1; 1601 finalise_stage_fn = arm_smmu_domain_finalise_s1;
@@ -1696,7 +1627,7 @@ static int arm_smmu_domain_finalise(struct iommu_domain *domain)
1696 return -ENOMEM; 1627 return -ENOMEM;
1697 1628
1698 domain->pgsize_bitmap = pgtbl_cfg.pgsize_bitmap; 1629 domain->pgsize_bitmap = pgtbl_cfg.pgsize_bitmap;
1699 domain->geometry.aperture_end = (1UL << ias) - 1; 1630 domain->geometry.aperture_end = (1UL << pgtbl_cfg.ias) - 1;
1700 domain->geometry.force_aperture = true; 1631 domain->geometry.force_aperture = true;
1701 1632
1702 ret = finalise_stage_fn(smmu_domain, &pgtbl_cfg); 1633 ret = finalise_stage_fn(smmu_domain, &pgtbl_cfg);
@@ -2102,9 +2033,8 @@ static int arm_smmu_init_one_queue(struct arm_smmu_device *smmu,
2102 q->ent_dwords = dwords; 2033 q->ent_dwords = dwords;
2103 2034
2104 q->q_base = Q_BASE_RWA; 2035 q->q_base = Q_BASE_RWA;
2105 q->q_base |= q->base_dma & Q_BASE_ADDR_MASK << Q_BASE_ADDR_SHIFT; 2036 q->q_base |= q->base_dma & Q_BASE_ADDR_MASK;
2106 q->q_base |= (q->max_n_shift & Q_BASE_LOG2SIZE_MASK) 2037 q->q_base |= FIELD_PREP(Q_BASE_LOG2SIZE, q->max_n_shift);
2107 << Q_BASE_LOG2SIZE_SHIFT;
2108 2038
2109 q->prod = q->cons = 0; 2039 q->prod = q->cons = 0;
2110 return 0; 2040 return 0;
@@ -2186,11 +2116,9 @@ static int arm_smmu_init_strtab_2lvl(struct arm_smmu_device *smmu)
2186 cfg->strtab = strtab; 2116 cfg->strtab = strtab;
2187 2117
2188 /* Configure strtab_base_cfg for 2 levels */ 2118 /* Configure strtab_base_cfg for 2 levels */
2189 reg = STRTAB_BASE_CFG_FMT_2LVL; 2119 reg = FIELD_PREP(STRTAB_BASE_CFG_FMT, STRTAB_BASE_CFG_FMT_2LVL);
2190 reg |= (size & STRTAB_BASE_CFG_LOG2SIZE_MASK) 2120 reg |= FIELD_PREP(STRTAB_BASE_CFG_LOG2SIZE, size);
2191 << STRTAB_BASE_CFG_LOG2SIZE_SHIFT; 2121 reg |= FIELD_PREP(STRTAB_BASE_CFG_SPLIT, STRTAB_SPLIT);
2192 reg |= (STRTAB_SPLIT & STRTAB_BASE_CFG_SPLIT_MASK)
2193 << STRTAB_BASE_CFG_SPLIT_SHIFT;
2194 cfg->strtab_base_cfg = reg; 2122 cfg->strtab_base_cfg = reg;
2195 2123
2196 return arm_smmu_init_l1_strtab(smmu); 2124 return arm_smmu_init_l1_strtab(smmu);
@@ -2216,9 +2144,8 @@ static int arm_smmu_init_strtab_linear(struct arm_smmu_device *smmu)
2216 cfg->num_l1_ents = 1 << smmu->sid_bits; 2144 cfg->num_l1_ents = 1 << smmu->sid_bits;
2217 2145
2218 /* Configure strtab_base_cfg for a linear table covering all SIDs */ 2146 /* Configure strtab_base_cfg for a linear table covering all SIDs */
2219 reg = STRTAB_BASE_CFG_FMT_LINEAR; 2147 reg = FIELD_PREP(STRTAB_BASE_CFG_FMT, STRTAB_BASE_CFG_FMT_LINEAR);
2220 reg |= (smmu->sid_bits & STRTAB_BASE_CFG_LOG2SIZE_MASK) 2148 reg |= FIELD_PREP(STRTAB_BASE_CFG_LOG2SIZE, smmu->sid_bits);
2221 << STRTAB_BASE_CFG_LOG2SIZE_SHIFT;
2222 cfg->strtab_base_cfg = reg; 2149 cfg->strtab_base_cfg = reg;
2223 2150
2224 arm_smmu_init_bypass_stes(strtab, cfg->num_l1_ents); 2151 arm_smmu_init_bypass_stes(strtab, cfg->num_l1_ents);
@@ -2239,8 +2166,7 @@ static int arm_smmu_init_strtab(struct arm_smmu_device *smmu)
2239 return ret; 2166 return ret;
2240 2167
2241 /* Set the strtab base address */ 2168 /* Set the strtab base address */
2242 reg = smmu->strtab_cfg.strtab_dma & 2169 reg = smmu->strtab_cfg.strtab_dma & STRTAB_BASE_ADDR_MASK;
2243 STRTAB_BASE_ADDR_MASK << STRTAB_BASE_ADDR_SHIFT;
2244 reg |= STRTAB_BASE_RA; 2170 reg |= STRTAB_BASE_RA;
2245 smmu->strtab_cfg.strtab_base = reg; 2171 smmu->strtab_cfg.strtab_base = reg;
2246 2172
@@ -2303,11 +2229,11 @@ 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]; 2229 phys_addr_t *cfg = arm_smmu_msi_cfg[desc->platform.msi_index];
2304 2230
2305 doorbell = (((u64)msg->address_hi) << 32) | msg->address_lo; 2231 doorbell = (((u64)msg->address_hi) << 32) | msg->address_lo;
2306 doorbell &= MSI_CFG0_ADDR_MASK << MSI_CFG0_ADDR_SHIFT; 2232 doorbell &= MSI_CFG0_ADDR_MASK;
2307 2233
2308 writeq_relaxed(doorbell, smmu->base + cfg[0]); 2234 writeq_relaxed(doorbell, smmu->base + cfg[0]);
2309 writel_relaxed(msg->data, smmu->base + cfg[1]); 2235 writel_relaxed(msg->data, smmu->base + cfg[1]);
2310 writel_relaxed(MSI_CFG2_MEMATTR_DEVICE_nGnRE, smmu->base + cfg[2]); 2236 writel_relaxed(ARM_SMMU_MEMATTR_DEVICE_nGnRE, smmu->base + cfg[2]);
2311} 2237}
2312 2238
2313static void arm_smmu_setup_msis(struct arm_smmu_device *smmu) 2239static void arm_smmu_setup_msis(struct arm_smmu_device *smmu)
@@ -2328,10 +2254,15 @@ static void arm_smmu_setup_msis(struct arm_smmu_device *smmu)
2328 if (!(smmu->features & ARM_SMMU_FEAT_MSI)) 2254 if (!(smmu->features & ARM_SMMU_FEAT_MSI))
2329 return; 2255 return;
2330 2256
2257 if (!dev->msi_domain) {
2258 dev_info(smmu->dev, "msi_domain absent - falling back to wired irqs\n");
2259 return;
2260 }
2261
2331 /* Allocate MSIs for evtq, gerror and priq. Ignore cmdq */ 2262 /* Allocate MSIs for evtq, gerror and priq. Ignore cmdq */
2332 ret = platform_msi_domain_alloc_irqs(dev, nvec, arm_smmu_write_msi_msg); 2263 ret = platform_msi_domain_alloc_irqs(dev, nvec, arm_smmu_write_msi_msg);
2333 if (ret) { 2264 if (ret) {
2334 dev_warn(dev, "failed to allocate MSIs\n"); 2265 dev_warn(dev, "failed to allocate MSIs - falling back to wired irqs\n");
2335 return; 2266 return;
2336 } 2267 }
2337 2268
@@ -2370,6 +2301,8 @@ static void arm_smmu_setup_unique_irqs(struct arm_smmu_device *smmu)
2370 "arm-smmu-v3-evtq", smmu); 2301 "arm-smmu-v3-evtq", smmu);
2371 if (ret < 0) 2302 if (ret < 0)
2372 dev_warn(smmu->dev, "failed to enable evtq irq\n"); 2303 dev_warn(smmu->dev, "failed to enable evtq irq\n");
2304 } else {
2305 dev_warn(smmu->dev, "no evtq irq - events will not be reported!\n");
2373 } 2306 }
2374 2307
2375 irq = smmu->gerr_irq; 2308 irq = smmu->gerr_irq;
@@ -2378,6 +2311,8 @@ static void arm_smmu_setup_unique_irqs(struct arm_smmu_device *smmu)
2378 0, "arm-smmu-v3-gerror", smmu); 2311 0, "arm-smmu-v3-gerror", smmu);
2379 if (ret < 0) 2312 if (ret < 0)
2380 dev_warn(smmu->dev, "failed to enable gerror irq\n"); 2313 dev_warn(smmu->dev, "failed to enable gerror irq\n");
2314 } else {
2315 dev_warn(smmu->dev, "no gerr irq - errors will not be reported!\n");
2381 } 2316 }
2382 2317
2383 if (smmu->features & ARM_SMMU_FEAT_PRI) { 2318 if (smmu->features & ARM_SMMU_FEAT_PRI) {
@@ -2391,6 +2326,8 @@ static void arm_smmu_setup_unique_irqs(struct arm_smmu_device *smmu)
2391 if (ret < 0) 2326 if (ret < 0)
2392 dev_warn(smmu->dev, 2327 dev_warn(smmu->dev,
2393 "failed to enable priq irq\n"); 2328 "failed to enable priq irq\n");
2329 } else {
2330 dev_warn(smmu->dev, "no priq irq - PRI will be broken\n");
2394 } 2331 }
2395 } 2332 }
2396} 2333}
@@ -2463,12 +2400,12 @@ static int arm_smmu_device_reset(struct arm_smmu_device *smmu, bool bypass)
2463 return ret; 2400 return ret;
2464 2401
2465 /* CR1 (table and queue memory attributes) */ 2402 /* CR1 (table and queue memory attributes) */
2466 reg = (CR1_SH_ISH << CR1_TABLE_SH_SHIFT) | 2403 reg = FIELD_PREP(CR1_TABLE_SH, ARM_SMMU_SH_ISH) |
2467 (CR1_CACHE_WB << CR1_TABLE_OC_SHIFT) | 2404 FIELD_PREP(CR1_TABLE_OC, CR1_CACHE_WB) |
2468 (CR1_CACHE_WB << CR1_TABLE_IC_SHIFT) | 2405 FIELD_PREP(CR1_TABLE_IC, CR1_CACHE_WB) |
2469 (CR1_SH_ISH << CR1_QUEUE_SH_SHIFT) | 2406 FIELD_PREP(CR1_QUEUE_SH, ARM_SMMU_SH_ISH) |
2470 (CR1_CACHE_WB << CR1_QUEUE_OC_SHIFT) | 2407 FIELD_PREP(CR1_QUEUE_OC, CR1_CACHE_WB) |
2471 (CR1_CACHE_WB << CR1_QUEUE_IC_SHIFT); 2408 FIELD_PREP(CR1_QUEUE_IC, CR1_CACHE_WB);
2472 writel_relaxed(reg, smmu->base + ARM_SMMU_CR1); 2409 writel_relaxed(reg, smmu->base + ARM_SMMU_CR1);
2473 2410
2474 /* CR2 (random crap) */ 2411 /* CR2 (random crap) */
@@ -2578,7 +2515,7 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
2578 reg = readl_relaxed(smmu->base + ARM_SMMU_IDR0); 2515 reg = readl_relaxed(smmu->base + ARM_SMMU_IDR0);
2579 2516
2580 /* 2-level structures */ 2517 /* 2-level structures */
2581 if ((reg & IDR0_ST_LVL_MASK << IDR0_ST_LVL_SHIFT) == IDR0_ST_LVL_2LVL) 2518 if (FIELD_GET(IDR0_ST_LVL, reg) == IDR0_ST_LVL_2LVL)
2582 smmu->features |= ARM_SMMU_FEAT_2_LVL_STRTAB; 2519 smmu->features |= ARM_SMMU_FEAT_2_LVL_STRTAB;
2583 2520
2584 if (reg & IDR0_CD2L) 2521 if (reg & IDR0_CD2L)
@@ -2589,7 +2526,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 2526 * We currently require the same endianness as the CPU, but this
2590 * could be changed later by adding a new IO_PGTABLE_QUIRK. 2527 * could be changed later by adding a new IO_PGTABLE_QUIRK.
2591 */ 2528 */
2592 switch (reg & IDR0_TTENDIAN_MASK << IDR0_TTENDIAN_SHIFT) { 2529 switch (FIELD_GET(IDR0_TTENDIAN, reg)) {
2593 case IDR0_TTENDIAN_MIXED: 2530 case IDR0_TTENDIAN_MIXED:
2594 smmu->features |= ARM_SMMU_FEAT_TT_LE | ARM_SMMU_FEAT_TT_BE; 2531 smmu->features |= ARM_SMMU_FEAT_TT_LE | ARM_SMMU_FEAT_TT_BE;
2595 break; 2532 break;
@@ -2631,7 +2568,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", 2568 dev_warn(smmu->dev, "IDR0.COHACC overridden by FW configuration (%s)\n",
2632 coherent ? "true" : "false"); 2569 coherent ? "true" : "false");
2633 2570
2634 switch (reg & IDR0_STALL_MODEL_MASK << IDR0_STALL_MODEL_SHIFT) { 2571 switch (FIELD_GET(IDR0_STALL_MODEL, reg)) {
2635 case IDR0_STALL_MODEL_FORCE: 2572 case IDR0_STALL_MODEL_FORCE:
2636 smmu->features |= ARM_SMMU_FEAT_STALL_FORCE; 2573 smmu->features |= ARM_SMMU_FEAT_STALL_FORCE;
2637 /* Fallthrough */ 2574 /* Fallthrough */
@@ -2651,7 +2588,7 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
2651 } 2588 }
2652 2589
2653 /* We only support the AArch64 table format at present */ 2590 /* We only support the AArch64 table format at present */
2654 switch (reg & IDR0_TTF_MASK << IDR0_TTF_SHIFT) { 2591 switch (FIELD_GET(IDR0_TTF, reg)) {
2655 case IDR0_TTF_AARCH32_64: 2592 case IDR0_TTF_AARCH32_64:
2656 smmu->ias = 40; 2593 smmu->ias = 40;
2657 /* Fallthrough */ 2594 /* Fallthrough */
@@ -2674,22 +2611,22 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
2674 } 2611 }
2675 2612
2676 /* Queue sizes, capped at 4k */ 2613 /* Queue sizes, capped at 4k */
2677 smmu->cmdq.q.max_n_shift = min((u32)CMDQ_MAX_SZ_SHIFT, 2614 smmu->cmdq.q.max_n_shift = min_t(u32, CMDQ_MAX_SZ_SHIFT,
2678 reg >> IDR1_CMDQ_SHIFT & IDR1_CMDQ_MASK); 2615 FIELD_GET(IDR1_CMDQS, reg));
2679 if (!smmu->cmdq.q.max_n_shift) { 2616 if (!smmu->cmdq.q.max_n_shift) {
2680 /* Odd alignment restrictions on the base, so ignore for now */ 2617 /* Odd alignment restrictions on the base, so ignore for now */
2681 dev_err(smmu->dev, "unit-length command queue not supported\n"); 2618 dev_err(smmu->dev, "unit-length command queue not supported\n");
2682 return -ENXIO; 2619 return -ENXIO;
2683 } 2620 }
2684 2621
2685 smmu->evtq.q.max_n_shift = min((u32)EVTQ_MAX_SZ_SHIFT, 2622 smmu->evtq.q.max_n_shift = min_t(u32, EVTQ_MAX_SZ_SHIFT,
2686 reg >> IDR1_EVTQ_SHIFT & IDR1_EVTQ_MASK); 2623 FIELD_GET(IDR1_EVTQS, reg));
2687 smmu->priq.q.max_n_shift = min((u32)PRIQ_MAX_SZ_SHIFT, 2624 smmu->priq.q.max_n_shift = min_t(u32, PRIQ_MAX_SZ_SHIFT,
2688 reg >> IDR1_PRIQ_SHIFT & IDR1_PRIQ_MASK); 2625 FIELD_GET(IDR1_PRIQS, reg));
2689 2626
2690 /* SID/SSID sizes */ 2627 /* SID/SSID sizes */
2691 smmu->ssid_bits = reg >> IDR1_SSID_SHIFT & IDR1_SSID_MASK; 2628 smmu->ssid_bits = FIELD_GET(IDR1_SSIDSIZE, reg);
2692 smmu->sid_bits = reg >> IDR1_SID_SHIFT & IDR1_SID_MASK; 2629 smmu->sid_bits = FIELD_GET(IDR1_SIDSIZE, reg);
2693 2630
2694 /* 2631 /*
2695 * If the SMMU supports fewer bits than would fill a single L2 stream 2632 * If the SMMU supports fewer bits than would fill a single L2 stream
@@ -2702,8 +2639,7 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
2702 reg = readl_relaxed(smmu->base + ARM_SMMU_IDR5); 2639 reg = readl_relaxed(smmu->base + ARM_SMMU_IDR5);
2703 2640
2704 /* Maximum number of outstanding stalls */ 2641 /* Maximum number of outstanding stalls */
2705 smmu->evtq.max_stalls = reg >> IDR5_STALL_MAX_SHIFT 2642 smmu->evtq.max_stalls = FIELD_GET(IDR5_STALL_MAX, reg);
2706 & IDR5_STALL_MAX_MASK;
2707 2643
2708 /* Page sizes */ 2644 /* Page sizes */
2709 if (reg & IDR5_GRAN64K) 2645 if (reg & IDR5_GRAN64K)
@@ -2713,13 +2649,12 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
2713 if (reg & IDR5_GRAN4K) 2649 if (reg & IDR5_GRAN4K)
2714 smmu->pgsize_bitmap |= SZ_4K | SZ_2M | SZ_1G; 2650 smmu->pgsize_bitmap |= SZ_4K | SZ_2M | SZ_1G;
2715 2651
2716 if (arm_smmu_ops.pgsize_bitmap == -1UL) 2652 /* Input address size */
2717 arm_smmu_ops.pgsize_bitmap = smmu->pgsize_bitmap; 2653 if (FIELD_GET(IDR5_VAX, reg) == IDR5_VAX_52_BIT)
2718 else 2654 smmu->features |= ARM_SMMU_FEAT_VAX;
2719 arm_smmu_ops.pgsize_bitmap |= smmu->pgsize_bitmap;
2720 2655
2721 /* Output address size */ 2656 /* Output address size */
2722 switch (reg & IDR5_OAS_MASK << IDR5_OAS_SHIFT) { 2657 switch (FIELD_GET(IDR5_OAS, reg)) {
2723 case IDR5_OAS_32_BIT: 2658 case IDR5_OAS_32_BIT:
2724 smmu->oas = 32; 2659 smmu->oas = 32;
2725 break; 2660 break;
@@ -2735,6 +2670,10 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
2735 case IDR5_OAS_44_BIT: 2670 case IDR5_OAS_44_BIT:
2736 smmu->oas = 44; 2671 smmu->oas = 44;
2737 break; 2672 break;
2673 case IDR5_OAS_52_BIT:
2674 smmu->oas = 52;
2675 smmu->pgsize_bitmap |= 1ULL << 42; /* 4TB */
2676 break;
2738 default: 2677 default:
2739 dev_info(smmu->dev, 2678 dev_info(smmu->dev,
2740 "unknown output address size. Truncating to 48-bit\n"); 2679 "unknown output address size. Truncating to 48-bit\n");
@@ -2743,6 +2682,11 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
2743 smmu->oas = 48; 2682 smmu->oas = 48;
2744 } 2683 }
2745 2684
2685 if (arm_smmu_ops.pgsize_bitmap == -1UL)
2686 arm_smmu_ops.pgsize_bitmap = smmu->pgsize_bitmap;
2687 else
2688 arm_smmu_ops.pgsize_bitmap |= smmu->pgsize_bitmap;
2689
2746 /* Set the DMA mask for our table walker */ 2690 /* Set the DMA mask for our table walker */
2747 if (dma_set_mask_and_coherent(smmu->dev, DMA_BIT_MASK(smmu->oas))) 2691 if (dma_set_mask_and_coherent(smmu->dev, DMA_BIT_MASK(smmu->oas)))
2748 dev_warn(smmu->dev, 2692 dev_warn(smmu->dev,
diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c
index 51e5c43caed1..a5be4c92c5c8 100644
--- a/drivers/iommu/io-pgtable-arm.c
+++ b/drivers/iommu/io-pgtable-arm.c
@@ -21,6 +21,7 @@
21#define pr_fmt(fmt) "arm-lpae io-pgtable: " fmt 21#define pr_fmt(fmt) "arm-lpae io-pgtable: " fmt
22 22
23#include <linux/atomic.h> 23#include <linux/atomic.h>
24#include <linux/bitops.h>
24#include <linux/iommu.h> 25#include <linux/iommu.h>
25#include <linux/kernel.h> 26#include <linux/kernel.h>
26#include <linux/sizes.h> 27#include <linux/sizes.h>
@@ -32,7 +33,7 @@
32 33
33#include "io-pgtable.h" 34#include "io-pgtable.h"
34 35
35#define ARM_LPAE_MAX_ADDR_BITS 48 36#define ARM_LPAE_MAX_ADDR_BITS 52
36#define ARM_LPAE_S2_MAX_CONCAT_PAGES 16 37#define ARM_LPAE_S2_MAX_CONCAT_PAGES 16
37#define ARM_LPAE_MAX_LEVELS 4 38#define ARM_LPAE_MAX_LEVELS 4
38 39
@@ -86,6 +87,8 @@
86#define ARM_LPAE_PTE_TYPE_TABLE 3 87#define ARM_LPAE_PTE_TYPE_TABLE 3
87#define ARM_LPAE_PTE_TYPE_PAGE 3 88#define ARM_LPAE_PTE_TYPE_PAGE 3
88 89
90#define ARM_LPAE_PTE_ADDR_MASK GENMASK_ULL(47,12)
91
89#define ARM_LPAE_PTE_NSTABLE (((arm_lpae_iopte)1) << 63) 92#define ARM_LPAE_PTE_NSTABLE (((arm_lpae_iopte)1) << 63)
90#define ARM_LPAE_PTE_XN (((arm_lpae_iopte)3) << 53) 93#define ARM_LPAE_PTE_XN (((arm_lpae_iopte)3) << 53)
91#define ARM_LPAE_PTE_AF (((arm_lpae_iopte)1) << 10) 94#define ARM_LPAE_PTE_AF (((arm_lpae_iopte)1) << 10)
@@ -159,6 +162,7 @@
159#define ARM_LPAE_TCR_PS_42_BIT 0x3ULL 162#define ARM_LPAE_TCR_PS_42_BIT 0x3ULL
160#define ARM_LPAE_TCR_PS_44_BIT 0x4ULL 163#define ARM_LPAE_TCR_PS_44_BIT 0x4ULL
161#define ARM_LPAE_TCR_PS_48_BIT 0x5ULL 164#define ARM_LPAE_TCR_PS_48_BIT 0x5ULL
165#define ARM_LPAE_TCR_PS_52_BIT 0x6ULL
162 166
163#define ARM_LPAE_MAIR_ATTR_SHIFT(n) ((n) << 3) 167#define ARM_LPAE_MAIR_ATTR_SHIFT(n) ((n) << 3)
164#define ARM_LPAE_MAIR_ATTR_MASK 0xff 168#define ARM_LPAE_MAIR_ATTR_MASK 0xff
@@ -170,9 +174,7 @@
170#define ARM_LPAE_MAIR_ATTR_IDX_DEV 2 174#define ARM_LPAE_MAIR_ATTR_IDX_DEV 2
171 175
172/* IOPTE accessors */ 176/* IOPTE accessors */
173#define iopte_deref(pte,d) \ 177#define iopte_deref(pte,d) __va(iopte_to_paddr(pte, d))
174 (__va((pte) & ((1ULL << ARM_LPAE_MAX_ADDR_BITS) - 1) \
175 & ~(ARM_LPAE_GRANULE(d) - 1ULL)))
176 178
177#define iopte_type(pte,l) \ 179#define iopte_type(pte,l) \
178 (((pte) >> ARM_LPAE_PTE_TYPE_SHIFT) & ARM_LPAE_PTE_TYPE_MASK) 180 (((pte) >> ARM_LPAE_PTE_TYPE_SHIFT) & ARM_LPAE_PTE_TYPE_MASK)
@@ -184,12 +186,6 @@
184 (iopte_type(pte,l) == ARM_LPAE_PTE_TYPE_PAGE) : \ 186 (iopte_type(pte,l) == ARM_LPAE_PTE_TYPE_PAGE) : \
185 (iopte_type(pte,l) == ARM_LPAE_PTE_TYPE_BLOCK)) 187 (iopte_type(pte,l) == ARM_LPAE_PTE_TYPE_BLOCK))
186 188
187#define iopte_to_pfn(pte,d) \
188 (((pte) & ((1ULL << ARM_LPAE_MAX_ADDR_BITS) - 1)) >> (d)->pg_shift)
189
190#define pfn_to_iopte(pfn,d) \
191 (((pfn) << (d)->pg_shift) & ((1ULL << ARM_LPAE_MAX_ADDR_BITS) - 1))
192
193struct arm_lpae_io_pgtable { 189struct arm_lpae_io_pgtable {
194 struct io_pgtable iop; 190 struct io_pgtable iop;
195 191
@@ -203,6 +199,27 @@ struct arm_lpae_io_pgtable {
203 199
204typedef u64 arm_lpae_iopte; 200typedef u64 arm_lpae_iopte;
205 201
202static arm_lpae_iopte paddr_to_iopte(phys_addr_t paddr,
203 struct arm_lpae_io_pgtable *data)
204{
205 arm_lpae_iopte pte = paddr;
206
207 /* Of the bits which overlap, either 51:48 or 15:12 are always RES0 */
208 return (pte | (pte >> (48 - 12))) & ARM_LPAE_PTE_ADDR_MASK;
209}
210
211static phys_addr_t iopte_to_paddr(arm_lpae_iopte pte,
212 struct arm_lpae_io_pgtable *data)
213{
214 phys_addr_t paddr = pte & ARM_LPAE_PTE_ADDR_MASK;
215
216 if (data->pg_shift < 16)
217 return paddr;
218
219 /* Rotate the packed high-order bits back to the top */
220 return (paddr | (paddr << (48 - 12))) & (ARM_LPAE_PTE_ADDR_MASK << 4);
221}
222
206static bool selftest_running = false; 223static bool selftest_running = false;
207 224
208static dma_addr_t __arm_lpae_dma_addr(void *pages) 225static dma_addr_t __arm_lpae_dma_addr(void *pages)
@@ -287,7 +304,7 @@ static void __arm_lpae_init_pte(struct arm_lpae_io_pgtable *data,
287 pte |= ARM_LPAE_PTE_TYPE_BLOCK; 304 pte |= ARM_LPAE_PTE_TYPE_BLOCK;
288 305
289 pte |= ARM_LPAE_PTE_AF | ARM_LPAE_PTE_SH_IS; 306 pte |= ARM_LPAE_PTE_AF | ARM_LPAE_PTE_SH_IS;
290 pte |= pfn_to_iopte(paddr >> data->pg_shift, data); 307 pte |= paddr_to_iopte(paddr, data);
291 308
292 __arm_lpae_set_pte(ptep, pte, &data->iop.cfg); 309 __arm_lpae_set_pte(ptep, pte, &data->iop.cfg);
293} 310}
@@ -528,7 +545,7 @@ static int arm_lpae_split_blk_unmap(struct arm_lpae_io_pgtable *data,
528 if (size == split_sz) 545 if (size == split_sz)
529 unmap_idx = ARM_LPAE_LVL_IDX(iova, lvl, data); 546 unmap_idx = ARM_LPAE_LVL_IDX(iova, lvl, data);
530 547
531 blk_paddr = iopte_to_pfn(blk_pte, data) << data->pg_shift; 548 blk_paddr = iopte_to_paddr(blk_pte, data);
532 pte = iopte_prot(blk_pte); 549 pte = iopte_prot(blk_pte);
533 550
534 for (i = 0; i < tablesz / sizeof(pte); i++, blk_paddr += split_sz) { 551 for (i = 0; i < tablesz / sizeof(pte); i++, blk_paddr += split_sz) {
@@ -652,12 +669,13 @@ static phys_addr_t arm_lpae_iova_to_phys(struct io_pgtable_ops *ops,
652 669
653found_translation: 670found_translation:
654 iova &= (ARM_LPAE_BLOCK_SIZE(lvl, data) - 1); 671 iova &= (ARM_LPAE_BLOCK_SIZE(lvl, data) - 1);
655 return ((phys_addr_t)iopte_to_pfn(pte,data) << data->pg_shift) | iova; 672 return iopte_to_paddr(pte, data) | iova;
656} 673}
657 674
658static void arm_lpae_restrict_pgsizes(struct io_pgtable_cfg *cfg) 675static void arm_lpae_restrict_pgsizes(struct io_pgtable_cfg *cfg)
659{ 676{
660 unsigned long granule; 677 unsigned long granule, page_sizes;
678 unsigned int max_addr_bits = 48;
661 679
662 /* 680 /*
663 * We need to restrict the supported page sizes to match the 681 * We need to restrict the supported page sizes to match the
@@ -677,17 +695,24 @@ static void arm_lpae_restrict_pgsizes(struct io_pgtable_cfg *cfg)
677 695
678 switch (granule) { 696 switch (granule) {
679 case SZ_4K: 697 case SZ_4K:
680 cfg->pgsize_bitmap &= (SZ_4K | SZ_2M | SZ_1G); 698 page_sizes = (SZ_4K | SZ_2M | SZ_1G);
681 break; 699 break;
682 case SZ_16K: 700 case SZ_16K:
683 cfg->pgsize_bitmap &= (SZ_16K | SZ_32M); 701 page_sizes = (SZ_16K | SZ_32M);
684 break; 702 break;
685 case SZ_64K: 703 case SZ_64K:
686 cfg->pgsize_bitmap &= (SZ_64K | SZ_512M); 704 max_addr_bits = 52;
705 page_sizes = (SZ_64K | SZ_512M);
706 if (cfg->oas > 48)
707 page_sizes |= 1ULL << 42; /* 4TB */
687 break; 708 break;
688 default: 709 default:
689 cfg->pgsize_bitmap = 0; 710 page_sizes = 0;
690 } 711 }
712
713 cfg->pgsize_bitmap &= page_sizes;
714 cfg->ias = min(cfg->ias, max_addr_bits);
715 cfg->oas = min(cfg->oas, max_addr_bits);
691} 716}
692 717
693static struct arm_lpae_io_pgtable * 718static struct arm_lpae_io_pgtable *
@@ -784,6 +809,9 @@ arm_64_lpae_alloc_pgtable_s1(struct io_pgtable_cfg *cfg, void *cookie)
784 case 48: 809 case 48:
785 reg |= (ARM_LPAE_TCR_PS_48_BIT << ARM_LPAE_TCR_IPS_SHIFT); 810 reg |= (ARM_LPAE_TCR_PS_48_BIT << ARM_LPAE_TCR_IPS_SHIFT);
786 break; 811 break;
812 case 52:
813 reg |= (ARM_LPAE_TCR_PS_52_BIT << ARM_LPAE_TCR_IPS_SHIFT);
814 break;
787 default: 815 default:
788 goto out_free_data; 816 goto out_free_data;
789 } 817 }
@@ -891,6 +919,9 @@ arm_64_lpae_alloc_pgtable_s2(struct io_pgtable_cfg *cfg, void *cookie)
891 case 48: 919 case 48:
892 reg |= (ARM_LPAE_TCR_PS_48_BIT << ARM_LPAE_TCR_PS_SHIFT); 920 reg |= (ARM_LPAE_TCR_PS_48_BIT << ARM_LPAE_TCR_PS_SHIFT);
893 break; 921 break;
922 case 52:
923 reg |= (ARM_LPAE_TCR_PS_52_BIT << ARM_LPAE_TCR_PS_SHIFT);
924 break;
894 default: 925 default:
895 goto out_free_data; 926 goto out_free_data;
896 } 927 }