1
2
3
4
5
6
7
8
9
10
11
12#include <linux/acpi.h>
13#include <linux/acpi_iort.h>
14#include <linux/bitfield.h>
15#include <linux/bitops.h>
16#include <linux/crash_dump.h>
17#include <linux/delay.h>
18#include <linux/dma-iommu.h>
19#include <linux/err.h>
20#include <linux/interrupt.h>
21#include <linux/io-pgtable.h>
22#include <linux/iommu.h>
23#include <linux/iopoll.h>
24#include <linux/module.h>
25#include <linux/msi.h>
26#include <linux/of.h>
27#include <linux/of_address.h>
28#include <linux/of_iommu.h>
29#include <linux/of_platform.h>
30#include <linux/pci.h>
31#include <linux/pci-ats.h>
32#include <linux/platform_device.h>
33
34#include <linux/amba/bus.h>
35
36
37#define ARM_SMMU_IDR0 0x0
38#define IDR0_ST_LVL GENMASK(28, 27)
39#define IDR0_ST_LVL_2LVL 1
40#define IDR0_STALL_MODEL GENMASK(25, 24)
41#define IDR0_STALL_MODEL_STALL 0
42#define IDR0_STALL_MODEL_FORCE 2
43#define IDR0_TTENDIAN GENMASK(22, 21)
44#define IDR0_TTENDIAN_MIXED 0
45#define IDR0_TTENDIAN_LE 2
46#define IDR0_TTENDIAN_BE 3
47#define IDR0_CD2L (1 << 19)
48#define IDR0_VMID16 (1 << 18)
49#define IDR0_PRI (1 << 16)
50#define IDR0_SEV (1 << 14)
51#define IDR0_MSI (1 << 13)
52#define IDR0_ASID16 (1 << 12)
53#define IDR0_ATS (1 << 10)
54#define IDR0_HYP (1 << 9)
55#define IDR0_COHACC (1 << 4)
56#define IDR0_TTF GENMASK(3, 2)
57#define IDR0_TTF_AARCH64 2
58#define IDR0_TTF_AARCH32_64 3
59#define IDR0_S1P (1 << 1)
60#define IDR0_S2P (1 << 0)
61
62#define ARM_SMMU_IDR1 0x4
63#define IDR1_TABLES_PRESET (1 << 30)
64#define IDR1_QUEUES_PRESET (1 << 29)
65#define IDR1_REL (1 << 28)
66#define IDR1_CMDQS GENMASK(25, 21)
67#define IDR1_EVTQS GENMASK(20, 16)
68#define IDR1_PRIQS GENMASK(15, 11)
69#define IDR1_SSIDSIZE GENMASK(10, 6)
70#define IDR1_SIDSIZE GENMASK(5, 0)
71
72#define ARM_SMMU_IDR3 0xc
73#define IDR3_RIL (1 << 10)
74
75#define ARM_SMMU_IDR5 0x14
76#define IDR5_STALL_MAX GENMASK(31, 16)
77#define IDR5_GRAN64K (1 << 6)
78#define IDR5_GRAN16K (1 << 5)
79#define IDR5_GRAN4K (1 << 4)
80#define IDR5_OAS GENMASK(2, 0)
81#define IDR5_OAS_32_BIT 0
82#define IDR5_OAS_36_BIT 1
83#define IDR5_OAS_40_BIT 2
84#define IDR5_OAS_42_BIT 3
85#define IDR5_OAS_44_BIT 4
86#define IDR5_OAS_48_BIT 5
87#define IDR5_OAS_52_BIT 6
88#define IDR5_VAX GENMASK(11, 10)
89#define IDR5_VAX_52_BIT 1
90
91#define ARM_SMMU_CR0 0x20
92#define CR0_ATSCHK (1 << 4)
93#define CR0_CMDQEN (1 << 3)
94#define CR0_EVTQEN (1 << 2)
95#define CR0_PRIQEN (1 << 1)
96#define CR0_SMMUEN (1 << 0)
97
98#define ARM_SMMU_CR0ACK 0x24
99
100#define ARM_SMMU_CR1 0x28
101#define CR1_TABLE_SH GENMASK(11, 10)
102#define CR1_TABLE_OC GENMASK(9, 8)
103#define CR1_TABLE_IC GENMASK(7, 6)
104#define CR1_QUEUE_SH GENMASK(5, 4)
105#define CR1_QUEUE_OC GENMASK(3, 2)
106#define CR1_QUEUE_IC GENMASK(1, 0)
107
108#define CR1_CACHE_NC 0
109#define CR1_CACHE_WB 1
110#define CR1_CACHE_WT 2
111
112#define ARM_SMMU_CR2 0x2c
113#define CR2_PTM (1 << 2)
114#define CR2_RECINVSID (1 << 1)
115#define CR2_E2H (1 << 0)
116
117#define ARM_SMMU_GBPA 0x44
118#define GBPA_UPDATE (1 << 31)
119#define GBPA_ABORT (1 << 20)
120
121#define ARM_SMMU_IRQ_CTRL 0x50
122#define IRQ_CTRL_EVTQ_IRQEN (1 << 2)
123#define IRQ_CTRL_PRIQ_IRQEN (1 << 1)
124#define IRQ_CTRL_GERROR_IRQEN (1 << 0)
125
126#define ARM_SMMU_IRQ_CTRLACK 0x54
127
128#define ARM_SMMU_GERROR 0x60
129#define GERROR_SFM_ERR (1 << 8)
130#define GERROR_MSI_GERROR_ABT_ERR (1 << 7)
131#define GERROR_MSI_PRIQ_ABT_ERR (1 << 6)
132#define GERROR_MSI_EVTQ_ABT_ERR (1 << 5)
133#define GERROR_MSI_CMDQ_ABT_ERR (1 << 4)
134#define GERROR_PRIQ_ABT_ERR (1 << 3)
135#define GERROR_EVTQ_ABT_ERR (1 << 2)
136#define GERROR_CMDQ_ERR (1 << 0)
137#define GERROR_ERR_MASK 0xfd
138
139#define ARM_SMMU_GERRORN 0x64
140
141#define ARM_SMMU_GERROR_IRQ_CFG0 0x68
142#define ARM_SMMU_GERROR_IRQ_CFG1 0x70
143#define ARM_SMMU_GERROR_IRQ_CFG2 0x74
144
145#define ARM_SMMU_STRTAB_BASE 0x80
146#define STRTAB_BASE_RA (1UL << 62)
147#define STRTAB_BASE_ADDR_MASK GENMASK_ULL(51, 6)
148
149#define ARM_SMMU_STRTAB_BASE_CFG 0x88
150#define STRTAB_BASE_CFG_FMT GENMASK(17, 16)
151#define STRTAB_BASE_CFG_FMT_LINEAR 0
152#define STRTAB_BASE_CFG_FMT_2LVL 1
153#define STRTAB_BASE_CFG_SPLIT GENMASK(10, 6)
154#define STRTAB_BASE_CFG_LOG2SIZE GENMASK(5, 0)
155
156#define ARM_SMMU_CMDQ_BASE 0x90
157#define ARM_SMMU_CMDQ_PROD 0x98
158#define ARM_SMMU_CMDQ_CONS 0x9c
159
160#define ARM_SMMU_EVTQ_BASE 0xa0
161#define ARM_SMMU_EVTQ_PROD 0x100a8
162#define ARM_SMMU_EVTQ_CONS 0x100ac
163#define ARM_SMMU_EVTQ_IRQ_CFG0 0xb0
164#define ARM_SMMU_EVTQ_IRQ_CFG1 0xb8
165#define ARM_SMMU_EVTQ_IRQ_CFG2 0xbc
166
167#define ARM_SMMU_PRIQ_BASE 0xc0
168#define ARM_SMMU_PRIQ_PROD 0x100c8
169#define ARM_SMMU_PRIQ_CONS 0x100cc
170#define ARM_SMMU_PRIQ_IRQ_CFG0 0xd0
171#define ARM_SMMU_PRIQ_IRQ_CFG1 0xd8
172#define ARM_SMMU_PRIQ_IRQ_CFG2 0xdc
173
174
175#define MSI_CFG0_ADDR_MASK GENMASK_ULL(51, 2)
176#define MSI_CFG2_SH GENMASK(5, 4)
177#define MSI_CFG2_MEMATTR GENMASK(3, 0)
178
179
180#define ARM_SMMU_SH_NSH 0
181#define ARM_SMMU_SH_OSH 2
182#define ARM_SMMU_SH_ISH 3
183#define ARM_SMMU_MEMATTR_DEVICE_nGnRE 0x1
184#define ARM_SMMU_MEMATTR_OIWB 0xf
185
186#define Q_IDX(llq, p) ((p) & ((1 << (llq)->max_n_shift) - 1))
187#define Q_WRP(llq, p) ((p) & (1 << (llq)->max_n_shift))
188#define Q_OVERFLOW_FLAG (1U << 31)
189#define Q_OVF(p) ((p) & Q_OVERFLOW_FLAG)
190#define Q_ENT(q, p) ((q)->base + \
191 Q_IDX(&((q)->llq), p) * \
192 (q)->ent_dwords)
193
194#define Q_BASE_RWA (1UL << 62)
195#define Q_BASE_ADDR_MASK GENMASK_ULL(51, 5)
196#define Q_BASE_LOG2SIZE GENMASK(4, 0)
197
198
199#ifdef CONFIG_CMA_ALIGNMENT
200#define Q_MAX_SZ_SHIFT (PAGE_SHIFT + CONFIG_CMA_ALIGNMENT)
201#else
202#define Q_MAX_SZ_SHIFT (PAGE_SHIFT + MAX_ORDER - 1)
203#endif
204
205
206
207
208
209
210
211
212#define STRTAB_L1_SZ_SHIFT 20
213#define STRTAB_SPLIT 8
214
215#define STRTAB_L1_DESC_DWORDS 1
216#define STRTAB_L1_DESC_SPAN GENMASK_ULL(4, 0)
217#define STRTAB_L1_DESC_L2PTR_MASK GENMASK_ULL(51, 6)
218
219#define STRTAB_STE_DWORDS 8
220#define STRTAB_STE_0_V (1UL << 0)
221#define STRTAB_STE_0_CFG GENMASK_ULL(3, 1)
222#define STRTAB_STE_0_CFG_ABORT 0
223#define STRTAB_STE_0_CFG_BYPASS 4
224#define STRTAB_STE_0_CFG_S1_TRANS 5
225#define STRTAB_STE_0_CFG_S2_TRANS 6
226
227#define STRTAB_STE_0_S1FMT GENMASK_ULL(5, 4)
228#define STRTAB_STE_0_S1FMT_LINEAR 0
229#define STRTAB_STE_0_S1FMT_64K_L2 2
230#define STRTAB_STE_0_S1CTXPTR_MASK GENMASK_ULL(51, 6)
231#define STRTAB_STE_0_S1CDMAX GENMASK_ULL(63, 59)
232
233#define STRTAB_STE_1_S1DSS GENMASK_ULL(1, 0)
234#define STRTAB_STE_1_S1DSS_TERMINATE 0x0
235#define STRTAB_STE_1_S1DSS_BYPASS 0x1
236#define STRTAB_STE_1_S1DSS_SSID0 0x2
237
238#define STRTAB_STE_1_S1C_CACHE_NC 0UL
239#define STRTAB_STE_1_S1C_CACHE_WBRA 1UL
240#define STRTAB_STE_1_S1C_CACHE_WT 2UL
241#define STRTAB_STE_1_S1C_CACHE_WB 3UL
242#define STRTAB_STE_1_S1CIR GENMASK_ULL(3, 2)
243#define STRTAB_STE_1_S1COR GENMASK_ULL(5, 4)
244#define STRTAB_STE_1_S1CSH GENMASK_ULL(7, 6)
245
246#define STRTAB_STE_1_S1STALLD (1UL << 27)
247
248#define STRTAB_STE_1_EATS GENMASK_ULL(29, 28)
249#define STRTAB_STE_1_EATS_ABT 0UL
250#define STRTAB_STE_1_EATS_TRANS 1UL
251#define STRTAB_STE_1_EATS_S1CHK 2UL
252
253#define STRTAB_STE_1_STRW GENMASK_ULL(31, 30)
254#define STRTAB_STE_1_STRW_NSEL1 0UL
255#define STRTAB_STE_1_STRW_EL2 2UL
256
257#define STRTAB_STE_1_SHCFG GENMASK_ULL(45, 44)
258#define STRTAB_STE_1_SHCFG_INCOMING 1UL
259
260#define STRTAB_STE_2_S2VMID GENMASK_ULL(15, 0)
261#define STRTAB_STE_2_VTCR GENMASK_ULL(50, 32)
262#define STRTAB_STE_2_VTCR_S2T0SZ GENMASK_ULL(5, 0)
263#define STRTAB_STE_2_VTCR_S2SL0 GENMASK_ULL(7, 6)
264#define STRTAB_STE_2_VTCR_S2IR0 GENMASK_ULL(9, 8)
265#define STRTAB_STE_2_VTCR_S2OR0 GENMASK_ULL(11, 10)
266#define STRTAB_STE_2_VTCR_S2SH0 GENMASK_ULL(13, 12)
267#define STRTAB_STE_2_VTCR_S2TG GENMASK_ULL(15, 14)
268#define STRTAB_STE_2_VTCR_S2PS GENMASK_ULL(18, 16)
269#define STRTAB_STE_2_S2AA64 (1UL << 51)
270#define STRTAB_STE_2_S2ENDI (1UL << 52)
271#define STRTAB_STE_2_S2PTW (1UL << 54)
272#define STRTAB_STE_2_S2R (1UL << 58)
273
274#define STRTAB_STE_3_S2TTB_MASK GENMASK_ULL(51, 4)
275
276
277
278
279
280
281
282
283#define CTXDESC_SPLIT 10
284#define CTXDESC_L2_ENTRIES (1 << CTXDESC_SPLIT)
285
286#define CTXDESC_L1_DESC_DWORDS 1
287#define CTXDESC_L1_DESC_V (1UL << 0)
288#define CTXDESC_L1_DESC_L2PTR_MASK GENMASK_ULL(51, 12)
289
290#define CTXDESC_CD_DWORDS 8
291#define CTXDESC_CD_0_TCR_T0SZ GENMASK_ULL(5, 0)
292#define CTXDESC_CD_0_TCR_TG0 GENMASK_ULL(7, 6)
293#define CTXDESC_CD_0_TCR_IRGN0 GENMASK_ULL(9, 8)
294#define CTXDESC_CD_0_TCR_ORGN0 GENMASK_ULL(11, 10)
295#define CTXDESC_CD_0_TCR_SH0 GENMASK_ULL(13, 12)
296#define CTXDESC_CD_0_TCR_EPD0 (1ULL << 14)
297#define CTXDESC_CD_0_TCR_EPD1 (1ULL << 30)
298
299#define CTXDESC_CD_0_ENDI (1UL << 15)
300#define CTXDESC_CD_0_V (1UL << 31)
301
302#define CTXDESC_CD_0_TCR_IPS GENMASK_ULL(34, 32)
303#define CTXDESC_CD_0_TCR_TBI0 (1ULL << 38)
304
305#define CTXDESC_CD_0_AA64 (1UL << 41)
306#define CTXDESC_CD_0_S (1UL << 44)
307#define CTXDESC_CD_0_R (1UL << 45)
308#define CTXDESC_CD_0_A (1UL << 46)
309#define CTXDESC_CD_0_ASET (1UL << 47)
310#define CTXDESC_CD_0_ASID GENMASK_ULL(63, 48)
311
312#define CTXDESC_CD_1_TTB0_MASK GENMASK_ULL(51, 4)
313
314
315
316
317
318#define CTXDESC_LINEAR_CDMAX ilog2(SZ_64K / (CTXDESC_CD_DWORDS << 3))
319
320
321#define CMDQ_ENT_SZ_SHIFT 4
322#define CMDQ_ENT_DWORDS ((1 << CMDQ_ENT_SZ_SHIFT) >> 3)
323#define CMDQ_MAX_SZ_SHIFT (Q_MAX_SZ_SHIFT - CMDQ_ENT_SZ_SHIFT)
324
325#define CMDQ_CONS_ERR GENMASK(30, 24)
326#define CMDQ_ERR_CERROR_NONE_IDX 0
327#define CMDQ_ERR_CERROR_ILL_IDX 1
328#define CMDQ_ERR_CERROR_ABT_IDX 2
329#define CMDQ_ERR_CERROR_ATC_INV_IDX 3
330
331#define CMDQ_PROD_OWNED_FLAG Q_OVERFLOW_FLAG
332
333
334
335
336
337
338#define CMDQ_BATCH_ENTRIES BITS_PER_LONG
339
340#define CMDQ_0_OP GENMASK_ULL(7, 0)
341#define CMDQ_0_SSV (1UL << 11)
342
343#define CMDQ_PREFETCH_0_SID GENMASK_ULL(63, 32)
344#define CMDQ_PREFETCH_1_SIZE GENMASK_ULL(4, 0)
345#define CMDQ_PREFETCH_1_ADDR_MASK GENMASK_ULL(63, 12)
346
347#define CMDQ_CFGI_0_SSID GENMASK_ULL(31, 12)
348#define CMDQ_CFGI_0_SID GENMASK_ULL(63, 32)
349#define CMDQ_CFGI_1_LEAF (1UL << 0)
350#define CMDQ_CFGI_1_RANGE GENMASK_ULL(4, 0)
351
352#define CMDQ_TLBI_0_NUM GENMASK_ULL(16, 12)
353#define CMDQ_TLBI_RANGE_NUM_MAX 31
354#define CMDQ_TLBI_0_SCALE GENMASK_ULL(24, 20)
355#define CMDQ_TLBI_0_VMID GENMASK_ULL(47, 32)
356#define CMDQ_TLBI_0_ASID GENMASK_ULL(63, 48)
357#define CMDQ_TLBI_1_LEAF (1UL << 0)
358#define CMDQ_TLBI_1_TTL GENMASK_ULL(9, 8)
359#define CMDQ_TLBI_1_TG GENMASK_ULL(11, 10)
360#define CMDQ_TLBI_1_VA_MASK GENMASK_ULL(63, 12)
361#define CMDQ_TLBI_1_IPA_MASK GENMASK_ULL(51, 12)
362
363#define CMDQ_ATC_0_SSID GENMASK_ULL(31, 12)
364#define CMDQ_ATC_0_SID GENMASK_ULL(63, 32)
365#define CMDQ_ATC_0_GLOBAL (1UL << 9)
366#define CMDQ_ATC_1_SIZE GENMASK_ULL(5, 0)
367#define CMDQ_ATC_1_ADDR_MASK GENMASK_ULL(63, 12)
368
369#define CMDQ_PRI_0_SSID GENMASK_ULL(31, 12)
370#define CMDQ_PRI_0_SID GENMASK_ULL(63, 32)
371#define CMDQ_PRI_1_GRPID GENMASK_ULL(8, 0)
372#define CMDQ_PRI_1_RESP GENMASK_ULL(13, 12)
373
374#define CMDQ_SYNC_0_CS GENMASK_ULL(13, 12)
375#define CMDQ_SYNC_0_CS_NONE 0
376#define CMDQ_SYNC_0_CS_IRQ 1
377#define CMDQ_SYNC_0_CS_SEV 2
378#define CMDQ_SYNC_0_MSH GENMASK_ULL(23, 22)
379#define CMDQ_SYNC_0_MSIATTR GENMASK_ULL(27, 24)
380#define CMDQ_SYNC_0_MSIDATA GENMASK_ULL(63, 32)
381#define CMDQ_SYNC_1_MSIADDR_MASK GENMASK_ULL(51, 2)
382
383
384#define EVTQ_ENT_SZ_SHIFT 5
385#define EVTQ_ENT_DWORDS ((1 << EVTQ_ENT_SZ_SHIFT) >> 3)
386#define EVTQ_MAX_SZ_SHIFT (Q_MAX_SZ_SHIFT - EVTQ_ENT_SZ_SHIFT)
387
388#define EVTQ_0_ID GENMASK_ULL(7, 0)
389
390
391#define PRIQ_ENT_SZ_SHIFT 4
392#define PRIQ_ENT_DWORDS ((1 << PRIQ_ENT_SZ_SHIFT) >> 3)
393#define PRIQ_MAX_SZ_SHIFT (Q_MAX_SZ_SHIFT - PRIQ_ENT_SZ_SHIFT)
394
395#define PRIQ_0_SID GENMASK_ULL(31, 0)
396#define PRIQ_0_SSID GENMASK_ULL(51, 32)
397#define PRIQ_0_PERM_PRIV (1UL << 58)
398#define PRIQ_0_PERM_EXEC (1UL << 59)
399#define PRIQ_0_PERM_READ (1UL << 60)
400#define PRIQ_0_PERM_WRITE (1UL << 61)
401#define PRIQ_0_PRG_LAST (1UL << 62)
402#define PRIQ_0_SSID_V (1UL << 63)
403
404#define PRIQ_1_PRG_IDX GENMASK_ULL(8, 0)
405#define PRIQ_1_ADDR_MASK GENMASK_ULL(63, 12)
406
407
408#define ARM_SMMU_POLL_TIMEOUT_US 1000000
409#define ARM_SMMU_POLL_SPIN_COUNT 10
410
411#define MSI_IOVA_BASE 0x8000000
412#define MSI_IOVA_LENGTH 0x100000
413
414static bool disable_bypass = 1;
415module_param_named(disable_bypass, disable_bypass, bool, S_IRUGO);
416MODULE_PARM_DESC(disable_bypass,
417 "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.");
418
419enum pri_resp {
420 PRI_RESP_DENY = 0,
421 PRI_RESP_FAIL = 1,
422 PRI_RESP_SUCC = 2,
423};
424
425enum arm_smmu_msi_index {
426 EVTQ_MSI_INDEX,
427 GERROR_MSI_INDEX,
428 PRIQ_MSI_INDEX,
429 ARM_SMMU_MAX_MSIS,
430};
431
432static phys_addr_t arm_smmu_msi_cfg[ARM_SMMU_MAX_MSIS][3] = {
433 [EVTQ_MSI_INDEX] = {
434 ARM_SMMU_EVTQ_IRQ_CFG0,
435 ARM_SMMU_EVTQ_IRQ_CFG1,
436 ARM_SMMU_EVTQ_IRQ_CFG2,
437 },
438 [GERROR_MSI_INDEX] = {
439 ARM_SMMU_GERROR_IRQ_CFG0,
440 ARM_SMMU_GERROR_IRQ_CFG1,
441 ARM_SMMU_GERROR_IRQ_CFG2,
442 },
443 [PRIQ_MSI_INDEX] = {
444 ARM_SMMU_PRIQ_IRQ_CFG0,
445 ARM_SMMU_PRIQ_IRQ_CFG1,
446 ARM_SMMU_PRIQ_IRQ_CFG2,
447 },
448};
449
450struct arm_smmu_cmdq_ent {
451
452 u8 opcode;
453 bool substream_valid;
454
455
456 union {
457 #define CMDQ_OP_PREFETCH_CFG 0x1
458 struct {
459 u32 sid;
460 u8 size;
461 u64 addr;
462 } prefetch;
463
464 #define CMDQ_OP_CFGI_STE 0x3
465 #define CMDQ_OP_CFGI_ALL 0x4
466 #define CMDQ_OP_CFGI_CD 0x5
467 #define CMDQ_OP_CFGI_CD_ALL 0x6
468 struct {
469 u32 sid;
470 u32 ssid;
471 union {
472 bool leaf;
473 u8 span;
474 };
475 } cfgi;
476
477 #define CMDQ_OP_TLBI_NH_ASID 0x11
478 #define CMDQ_OP_TLBI_NH_VA 0x12
479 #define CMDQ_OP_TLBI_EL2_ALL 0x20
480 #define CMDQ_OP_TLBI_S12_VMALL 0x28
481 #define CMDQ_OP_TLBI_S2_IPA 0x2a
482 #define CMDQ_OP_TLBI_NSNH_ALL 0x30
483 struct {
484 u8 num;
485 u8 scale;
486 u16 asid;
487 u16 vmid;
488 bool leaf;
489 u8 ttl;
490 u8 tg;
491 u64 addr;
492 } tlbi;
493
494 #define CMDQ_OP_ATC_INV 0x40
495 #define ATC_INV_SIZE_ALL 52
496 struct {
497 u32 sid;
498 u32 ssid;
499 u64 addr;
500 u8 size;
501 bool global;
502 } atc;
503
504 #define CMDQ_OP_PRI_RESP 0x41
505 struct {
506 u32 sid;
507 u32 ssid;
508 u16 grpid;
509 enum pri_resp resp;
510 } pri;
511
512 #define CMDQ_OP_CMD_SYNC 0x46
513 struct {
514 u64 msiaddr;
515 } sync;
516 };
517};
518
519struct arm_smmu_ll_queue {
520 union {
521 u64 val;
522 struct {
523 u32 prod;
524 u32 cons;
525 };
526 struct {
527 atomic_t prod;
528 atomic_t cons;
529 } atomic;
530 u8 __pad[SMP_CACHE_BYTES];
531 } ____cacheline_aligned_in_smp;
532 u32 max_n_shift;
533};
534
535struct arm_smmu_queue {
536 struct arm_smmu_ll_queue llq;
537 int irq;
538
539 __le64 *base;
540 dma_addr_t base_dma;
541 u64 q_base;
542
543 size_t ent_dwords;
544
545 u32 __iomem *prod_reg;
546 u32 __iomem *cons_reg;
547};
548
549struct arm_smmu_queue_poll {
550 ktime_t timeout;
551 unsigned int delay;
552 unsigned int spin_cnt;
553 bool wfe;
554};
555
556struct arm_smmu_cmdq {
557 struct arm_smmu_queue q;
558 atomic_long_t *valid_map;
559 atomic_t owner_prod;
560 atomic_t lock;
561};
562
563struct arm_smmu_cmdq_batch {
564 u64 cmds[CMDQ_BATCH_ENTRIES * CMDQ_ENT_DWORDS];
565 int num;
566};
567
568struct arm_smmu_evtq {
569 struct arm_smmu_queue q;
570 u32 max_stalls;
571};
572
573struct arm_smmu_priq {
574 struct arm_smmu_queue q;
575};
576
577
578struct arm_smmu_strtab_l1_desc {
579 u8 span;
580
581 __le64 *l2ptr;
582 dma_addr_t l2ptr_dma;
583};
584
585struct arm_smmu_ctx_desc {
586 u16 asid;
587 u64 ttbr;
588 u64 tcr;
589 u64 mair;
590};
591
592struct arm_smmu_l1_ctx_desc {
593 __le64 *l2ptr;
594 dma_addr_t l2ptr_dma;
595};
596
597struct arm_smmu_ctx_desc_cfg {
598 __le64 *cdtab;
599 dma_addr_t cdtab_dma;
600 struct arm_smmu_l1_ctx_desc *l1_desc;
601 unsigned int num_l1_ents;
602};
603
604struct arm_smmu_s1_cfg {
605 struct arm_smmu_ctx_desc_cfg cdcfg;
606 struct arm_smmu_ctx_desc cd;
607 u8 s1fmt;
608 u8 s1cdmax;
609};
610
611struct arm_smmu_s2_cfg {
612 u16 vmid;
613 u64 vttbr;
614 u64 vtcr;
615};
616
617struct arm_smmu_strtab_cfg {
618 __le64 *strtab;
619 dma_addr_t strtab_dma;
620 struct arm_smmu_strtab_l1_desc *l1_desc;
621 unsigned int num_l1_ents;
622
623 u64 strtab_base;
624 u32 strtab_base_cfg;
625};
626
627
628struct arm_smmu_device {
629 struct device *dev;
630 void __iomem *base;
631
632#define ARM_SMMU_FEAT_2_LVL_STRTAB (1 << 0)
633#define ARM_SMMU_FEAT_2_LVL_CDTAB (1 << 1)
634#define ARM_SMMU_FEAT_TT_LE (1 << 2)
635#define ARM_SMMU_FEAT_TT_BE (1 << 3)
636#define ARM_SMMU_FEAT_PRI (1 << 4)
637#define ARM_SMMU_FEAT_ATS (1 << 5)
638#define ARM_SMMU_FEAT_SEV (1 << 6)
639#define ARM_SMMU_FEAT_MSI (1 << 7)
640#define ARM_SMMU_FEAT_COHERENCY (1 << 8)
641#define ARM_SMMU_FEAT_TRANS_S1 (1 << 9)
642#define ARM_SMMU_FEAT_TRANS_S2 (1 << 10)
643#define ARM_SMMU_FEAT_STALLS (1 << 11)
644#define ARM_SMMU_FEAT_HYP (1 << 12)
645#define ARM_SMMU_FEAT_STALL_FORCE (1 << 13)
646#define ARM_SMMU_FEAT_VAX (1 << 14)
647#define ARM_SMMU_FEAT_RANGE_INV (1 << 15)
648 u32 features;
649
650#define ARM_SMMU_OPT_SKIP_PREFETCH (1 << 0)
651#define ARM_SMMU_OPT_PAGE0_REGS_ONLY (1 << 1)
652 u32 options;
653
654 struct arm_smmu_cmdq cmdq;
655 struct arm_smmu_evtq evtq;
656 struct arm_smmu_priq priq;
657
658 int gerr_irq;
659 int combined_irq;
660
661 unsigned long ias;
662 unsigned long oas;
663 unsigned long pgsize_bitmap;
664
665#define ARM_SMMU_MAX_ASIDS (1 << 16)
666 unsigned int asid_bits;
667 DECLARE_BITMAP(asid_map, ARM_SMMU_MAX_ASIDS);
668
669#define ARM_SMMU_MAX_VMIDS (1 << 16)
670 unsigned int vmid_bits;
671 DECLARE_BITMAP(vmid_map, ARM_SMMU_MAX_VMIDS);
672
673 unsigned int ssid_bits;
674 unsigned int sid_bits;
675
676 struct arm_smmu_strtab_cfg strtab_cfg;
677
678
679 struct iommu_device iommu;
680};
681
682
683struct arm_smmu_master {
684 struct arm_smmu_device *smmu;
685 struct device *dev;
686 struct arm_smmu_domain *domain;
687 struct list_head domain_head;
688 u32 *sids;
689 unsigned int num_sids;
690 bool ats_enabled;
691 unsigned int ssid_bits;
692};
693
694
695enum arm_smmu_domain_stage {
696 ARM_SMMU_DOMAIN_S1 = 0,
697 ARM_SMMU_DOMAIN_S2,
698 ARM_SMMU_DOMAIN_NESTED,
699 ARM_SMMU_DOMAIN_BYPASS,
700};
701
702struct arm_smmu_domain {
703 struct arm_smmu_device *smmu;
704 struct mutex init_mutex;
705
706 struct io_pgtable_ops *pgtbl_ops;
707 bool non_strict;
708 atomic_t nr_ats_masters;
709
710 enum arm_smmu_domain_stage stage;
711 union {
712 struct arm_smmu_s1_cfg s1_cfg;
713 struct arm_smmu_s2_cfg s2_cfg;
714 };
715
716 struct iommu_domain domain;
717
718 struct list_head devices;
719 spinlock_t devices_lock;
720};
721
722struct arm_smmu_option_prop {
723 u32 opt;
724 const char *prop;
725};
726
727static struct arm_smmu_option_prop arm_smmu_options[] = {
728 { ARM_SMMU_OPT_SKIP_PREFETCH, "hisilicon,broken-prefetch-cmd" },
729 { ARM_SMMU_OPT_PAGE0_REGS_ONLY, "cavium,cn9900-broken-page1-regspace"},
730 { 0, NULL},
731};
732
733static inline void __iomem *arm_smmu_page1_fixup(unsigned long offset,
734 struct arm_smmu_device *smmu)
735{
736 if ((offset > SZ_64K) &&
737 (smmu->options & ARM_SMMU_OPT_PAGE0_REGS_ONLY))
738 offset -= SZ_64K;
739
740 return smmu->base + offset;
741}
742
743static struct arm_smmu_domain *to_smmu_domain(struct iommu_domain *dom)
744{
745 return container_of(dom, struct arm_smmu_domain, domain);
746}
747
748static void parse_driver_options(struct arm_smmu_device *smmu)
749{
750 int i = 0;
751
752 do {
753 if (of_property_read_bool(smmu->dev->of_node,
754 arm_smmu_options[i].prop)) {
755 smmu->options |= arm_smmu_options[i].opt;
756 dev_notice(smmu->dev, "option %s\n",
757 arm_smmu_options[i].prop);
758 }
759 } while (arm_smmu_options[++i].opt);
760}
761
762
763static bool queue_has_space(struct arm_smmu_ll_queue *q, u32 n)
764{
765 u32 space, prod, cons;
766
767 prod = Q_IDX(q, q->prod);
768 cons = Q_IDX(q, q->cons);
769
770 if (Q_WRP(q, q->prod) == Q_WRP(q, q->cons))
771 space = (1 << q->max_n_shift) - (prod - cons);
772 else
773 space = cons - prod;
774
775 return space >= n;
776}
777
778static bool queue_full(struct arm_smmu_ll_queue *q)
779{
780 return Q_IDX(q, q->prod) == Q_IDX(q, q->cons) &&
781 Q_WRP(q, q->prod) != Q_WRP(q, q->cons);
782}
783
784static bool queue_empty(struct arm_smmu_ll_queue *q)
785{
786 return Q_IDX(q, q->prod) == Q_IDX(q, q->cons) &&
787 Q_WRP(q, q->prod) == Q_WRP(q, q->cons);
788}
789
790static bool queue_consumed(struct arm_smmu_ll_queue *q, u32 prod)
791{
792 return ((Q_WRP(q, q->cons) == Q_WRP(q, prod)) &&
793 (Q_IDX(q, q->cons) > Q_IDX(q, prod))) ||
794 ((Q_WRP(q, q->cons) != Q_WRP(q, prod)) &&
795 (Q_IDX(q, q->cons) <= Q_IDX(q, prod)));
796}
797
798static void queue_sync_cons_out(struct arm_smmu_queue *q)
799{
800
801
802
803
804 mb();
805 writel_relaxed(q->llq.cons, q->cons_reg);
806}
807
808static void queue_inc_cons(struct arm_smmu_ll_queue *q)
809{
810 u32 cons = (Q_WRP(q, q->cons) | Q_IDX(q, q->cons)) + 1;
811 q->cons = Q_OVF(q->cons) | Q_WRP(q, cons) | Q_IDX(q, cons);
812}
813
814static int queue_sync_prod_in(struct arm_smmu_queue *q)
815{
816 int ret = 0;
817 u32 prod = readl_relaxed(q->prod_reg);
818
819 if (Q_OVF(prod) != Q_OVF(q->llq.prod))
820 ret = -EOVERFLOW;
821
822 q->llq.prod = prod;
823 return ret;
824}
825
826static u32 queue_inc_prod_n(struct arm_smmu_ll_queue *q, int n)
827{
828 u32 prod = (Q_WRP(q, q->prod) | Q_IDX(q, q->prod)) + n;
829 return Q_OVF(q->prod) | Q_WRP(q, prod) | Q_IDX(q, prod);
830}
831
832static void queue_poll_init(struct arm_smmu_device *smmu,
833 struct arm_smmu_queue_poll *qp)
834{
835 qp->delay = 1;
836 qp->spin_cnt = 0;
837 qp->wfe = !!(smmu->features & ARM_SMMU_FEAT_SEV);
838 qp->timeout = ktime_add_us(ktime_get(), ARM_SMMU_POLL_TIMEOUT_US);
839}
840
841static int queue_poll(struct arm_smmu_queue_poll *qp)
842{
843 if (ktime_compare(ktime_get(), qp->timeout) > 0)
844 return -ETIMEDOUT;
845
846 if (qp->wfe) {
847 wfe();
848 } else if (++qp->spin_cnt < ARM_SMMU_POLL_SPIN_COUNT) {
849 cpu_relax();
850 } else {
851 udelay(qp->delay);
852 qp->delay *= 2;
853 qp->spin_cnt = 0;
854 }
855
856 return 0;
857}
858
859static void queue_write(__le64 *dst, u64 *src, size_t n_dwords)
860{
861 int i;
862
863 for (i = 0; i < n_dwords; ++i)
864 *dst++ = cpu_to_le64(*src++);
865}
866
867static void queue_read(__le64 *dst, u64 *src, size_t n_dwords)
868{
869 int i;
870
871 for (i = 0; i < n_dwords; ++i)
872 *dst++ = le64_to_cpu(*src++);
873}
874
875static int queue_remove_raw(struct arm_smmu_queue *q, u64 *ent)
876{
877 if (queue_empty(&q->llq))
878 return -EAGAIN;
879
880 queue_read(ent, Q_ENT(q, q->llq.cons), q->ent_dwords);
881 queue_inc_cons(&q->llq);
882 queue_sync_cons_out(q);
883 return 0;
884}
885
886
887static int arm_smmu_cmdq_build_cmd(u64 *cmd, struct arm_smmu_cmdq_ent *ent)
888{
889 memset(cmd, 0, 1 << CMDQ_ENT_SZ_SHIFT);
890 cmd[0] |= FIELD_PREP(CMDQ_0_OP, ent->opcode);
891
892 switch (ent->opcode) {
893 case CMDQ_OP_TLBI_EL2_ALL:
894 case CMDQ_OP_TLBI_NSNH_ALL:
895 break;
896 case CMDQ_OP_PREFETCH_CFG:
897 cmd[0] |= FIELD_PREP(CMDQ_PREFETCH_0_SID, ent->prefetch.sid);
898 cmd[1] |= FIELD_PREP(CMDQ_PREFETCH_1_SIZE, ent->prefetch.size);
899 cmd[1] |= ent->prefetch.addr & CMDQ_PREFETCH_1_ADDR_MASK;
900 break;
901 case CMDQ_OP_CFGI_CD:
902 cmd[0] |= FIELD_PREP(CMDQ_CFGI_0_SSID, ent->cfgi.ssid);
903
904 case CMDQ_OP_CFGI_STE:
905 cmd[0] |= FIELD_PREP(CMDQ_CFGI_0_SID, ent->cfgi.sid);
906 cmd[1] |= FIELD_PREP(CMDQ_CFGI_1_LEAF, ent->cfgi.leaf);
907 break;
908 case CMDQ_OP_CFGI_CD_ALL:
909 cmd[0] |= FIELD_PREP(CMDQ_CFGI_0_SID, ent->cfgi.sid);
910 break;
911 case CMDQ_OP_CFGI_ALL:
912
913 cmd[1] |= FIELD_PREP(CMDQ_CFGI_1_RANGE, 31);
914 break;
915 case CMDQ_OP_TLBI_NH_VA:
916 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_NUM, ent->tlbi.num);
917 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_SCALE, ent->tlbi.scale);
918 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_VMID, ent->tlbi.vmid);
919 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_ASID, ent->tlbi.asid);
920 cmd[1] |= FIELD_PREP(CMDQ_TLBI_1_LEAF, ent->tlbi.leaf);
921 cmd[1] |= FIELD_PREP(CMDQ_TLBI_1_TTL, ent->tlbi.ttl);
922 cmd[1] |= FIELD_PREP(CMDQ_TLBI_1_TG, ent->tlbi.tg);
923 cmd[1] |= ent->tlbi.addr & CMDQ_TLBI_1_VA_MASK;
924 break;
925 case CMDQ_OP_TLBI_S2_IPA:
926 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_NUM, ent->tlbi.num);
927 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_SCALE, ent->tlbi.scale);
928 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_VMID, ent->tlbi.vmid);
929 cmd[1] |= FIELD_PREP(CMDQ_TLBI_1_LEAF, ent->tlbi.leaf);
930 cmd[1] |= FIELD_PREP(CMDQ_TLBI_1_TTL, ent->tlbi.ttl);
931 cmd[1] |= FIELD_PREP(CMDQ_TLBI_1_TG, ent->tlbi.tg);
932 cmd[1] |= ent->tlbi.addr & CMDQ_TLBI_1_IPA_MASK;
933 break;
934 case CMDQ_OP_TLBI_NH_ASID:
935 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_ASID, ent->tlbi.asid);
936
937 case CMDQ_OP_TLBI_S12_VMALL:
938 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_VMID, ent->tlbi.vmid);
939 break;
940 case CMDQ_OP_ATC_INV:
941 cmd[0] |= FIELD_PREP(CMDQ_0_SSV, ent->substream_valid);
942 cmd[0] |= FIELD_PREP(CMDQ_ATC_0_GLOBAL, ent->atc.global);
943 cmd[0] |= FIELD_PREP(CMDQ_ATC_0_SSID, ent->atc.ssid);
944 cmd[0] |= FIELD_PREP(CMDQ_ATC_0_SID, ent->atc.sid);
945 cmd[1] |= FIELD_PREP(CMDQ_ATC_1_SIZE, ent->atc.size);
946 cmd[1] |= ent->atc.addr & CMDQ_ATC_1_ADDR_MASK;
947 break;
948 case CMDQ_OP_PRI_RESP:
949 cmd[0] |= FIELD_PREP(CMDQ_0_SSV, ent->substream_valid);
950 cmd[0] |= FIELD_PREP(CMDQ_PRI_0_SSID, ent->pri.ssid);
951 cmd[0] |= FIELD_PREP(CMDQ_PRI_0_SID, ent->pri.sid);
952 cmd[1] |= FIELD_PREP(CMDQ_PRI_1_GRPID, ent->pri.grpid);
953 switch (ent->pri.resp) {
954 case PRI_RESP_DENY:
955 case PRI_RESP_FAIL:
956 case PRI_RESP_SUCC:
957 break;
958 default:
959 return -EINVAL;
960 }
961 cmd[1] |= FIELD_PREP(CMDQ_PRI_1_RESP, ent->pri.resp);
962 break;
963 case CMDQ_OP_CMD_SYNC:
964 if (ent->sync.msiaddr) {
965 cmd[0] |= FIELD_PREP(CMDQ_SYNC_0_CS, CMDQ_SYNC_0_CS_IRQ);
966 cmd[1] |= ent->sync.msiaddr & CMDQ_SYNC_1_MSIADDR_MASK;
967 } else {
968 cmd[0] |= FIELD_PREP(CMDQ_SYNC_0_CS, CMDQ_SYNC_0_CS_SEV);
969 }
970 cmd[0] |= FIELD_PREP(CMDQ_SYNC_0_MSH, ARM_SMMU_SH_ISH);
971 cmd[0] |= FIELD_PREP(CMDQ_SYNC_0_MSIATTR, ARM_SMMU_MEMATTR_OIWB);
972 break;
973 default:
974 return -ENOENT;
975 }
976
977 return 0;
978}
979
980static void arm_smmu_cmdq_build_sync_cmd(u64 *cmd, struct arm_smmu_device *smmu,
981 u32 prod)
982{
983 struct arm_smmu_queue *q = &smmu->cmdq.q;
984 struct arm_smmu_cmdq_ent ent = {
985 .opcode = CMDQ_OP_CMD_SYNC,
986 };
987
988
989
990
991
992 if (smmu->features & ARM_SMMU_FEAT_MSI &&
993 smmu->features & ARM_SMMU_FEAT_COHERENCY) {
994 ent.sync.msiaddr = q->base_dma + Q_IDX(&q->llq, prod) *
995 q->ent_dwords * 8;
996 }
997
998 arm_smmu_cmdq_build_cmd(cmd, &ent);
999}
1000
1001static void arm_smmu_cmdq_skip_err(struct arm_smmu_device *smmu)
1002{
1003 static const char *cerror_str[] = {
1004 [CMDQ_ERR_CERROR_NONE_IDX] = "No error",
1005 [CMDQ_ERR_CERROR_ILL_IDX] = "Illegal command",
1006 [CMDQ_ERR_CERROR_ABT_IDX] = "Abort on command fetch",
1007 [CMDQ_ERR_CERROR_ATC_INV_IDX] = "ATC invalidate timeout",
1008 };
1009
1010 int i;
1011 u64 cmd[CMDQ_ENT_DWORDS];
1012 struct arm_smmu_queue *q = &smmu->cmdq.q;
1013 u32 cons = readl_relaxed(q->cons_reg);
1014 u32 idx = FIELD_GET(CMDQ_CONS_ERR, cons);
1015 struct arm_smmu_cmdq_ent cmd_sync = {
1016 .opcode = CMDQ_OP_CMD_SYNC,
1017 };
1018
1019 dev_err(smmu->dev, "CMDQ error (cons 0x%08x): %s\n", cons,
1020 idx < ARRAY_SIZE(cerror_str) ? cerror_str[idx] : "Unknown");
1021
1022 switch (idx) {
1023 case CMDQ_ERR_CERROR_ABT_IDX:
1024 dev_err(smmu->dev, "retrying command fetch\n");
1025 case CMDQ_ERR_CERROR_NONE_IDX:
1026 return;
1027 case CMDQ_ERR_CERROR_ATC_INV_IDX:
1028
1029
1030
1031
1032
1033
1034 return;
1035 case CMDQ_ERR_CERROR_ILL_IDX:
1036
1037 default:
1038 break;
1039 }
1040
1041
1042
1043
1044
1045 queue_read(cmd, Q_ENT(q, cons), q->ent_dwords);
1046 dev_err(smmu->dev, "skipping command in error state:\n");
1047 for (i = 0; i < ARRAY_SIZE(cmd); ++i)
1048 dev_err(smmu->dev, "\t0x%016llx\n", (unsigned long long)cmd[i]);
1049
1050
1051 if (arm_smmu_cmdq_build_cmd(cmd, &cmd_sync)) {
1052 dev_err(smmu->dev, "failed to convert to CMD_SYNC\n");
1053 return;
1054 }
1055
1056 queue_write(Q_ENT(q, cons), cmd, q->ent_dwords);
1057}
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071static void arm_smmu_cmdq_shared_lock(struct arm_smmu_cmdq *cmdq)
1072{
1073 int val;
1074
1075
1076
1077
1078
1079
1080
1081 if (atomic_fetch_inc_relaxed(&cmdq->lock) >= 0)
1082 return;
1083
1084 do {
1085 val = atomic_cond_read_relaxed(&cmdq->lock, VAL >= 0);
1086 } while (atomic_cmpxchg_relaxed(&cmdq->lock, val, val + 1) != val);
1087}
1088
1089static void arm_smmu_cmdq_shared_unlock(struct arm_smmu_cmdq *cmdq)
1090{
1091 (void)atomic_dec_return_release(&cmdq->lock);
1092}
1093
1094static bool arm_smmu_cmdq_shared_tryunlock(struct arm_smmu_cmdq *cmdq)
1095{
1096 if (atomic_read(&cmdq->lock) == 1)
1097 return false;
1098
1099 arm_smmu_cmdq_shared_unlock(cmdq);
1100 return true;
1101}
1102
1103#define arm_smmu_cmdq_exclusive_trylock_irqsave(cmdq, flags) \
1104({ \
1105 bool __ret; \
1106 local_irq_save(flags); \
1107 __ret = !atomic_cmpxchg_relaxed(&cmdq->lock, 0, INT_MIN); \
1108 if (!__ret) \
1109 local_irq_restore(flags); \
1110 __ret; \
1111})
1112
1113#define arm_smmu_cmdq_exclusive_unlock_irqrestore(cmdq, flags) \
1114({ \
1115 atomic_set_release(&cmdq->lock, 0); \
1116 local_irq_restore(flags); \
1117})
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159static void __arm_smmu_cmdq_poll_set_valid_map(struct arm_smmu_cmdq *cmdq,
1160 u32 sprod, u32 eprod, bool set)
1161{
1162 u32 swidx, sbidx, ewidx, ebidx;
1163 struct arm_smmu_ll_queue llq = {
1164 .max_n_shift = cmdq->q.llq.max_n_shift,
1165 .prod = sprod,
1166 };
1167
1168 ewidx = BIT_WORD(Q_IDX(&llq, eprod));
1169 ebidx = Q_IDX(&llq, eprod) % BITS_PER_LONG;
1170
1171 while (llq.prod != eprod) {
1172 unsigned long mask;
1173 atomic_long_t *ptr;
1174 u32 limit = BITS_PER_LONG;
1175
1176 swidx = BIT_WORD(Q_IDX(&llq, llq.prod));
1177 sbidx = Q_IDX(&llq, llq.prod) % BITS_PER_LONG;
1178
1179 ptr = &cmdq->valid_map[swidx];
1180
1181 if ((swidx == ewidx) && (sbidx < ebidx))
1182 limit = ebidx;
1183
1184 mask = GENMASK(limit - 1, sbidx);
1185
1186
1187
1188
1189
1190
1191
1192 if (set) {
1193 atomic_long_xor(mask, ptr);
1194 } else {
1195 unsigned long valid;
1196
1197 valid = (ULONG_MAX + !!Q_WRP(&llq, llq.prod)) & mask;
1198 atomic_long_cond_read_relaxed(ptr, (VAL & mask) == valid);
1199 }
1200
1201 llq.prod = queue_inc_prod_n(&llq, limit - sbidx);
1202 }
1203}
1204
1205
1206static void arm_smmu_cmdq_set_valid_map(struct arm_smmu_cmdq *cmdq,
1207 u32 sprod, u32 eprod)
1208{
1209 __arm_smmu_cmdq_poll_set_valid_map(cmdq, sprod, eprod, true);
1210}
1211
1212
1213static void arm_smmu_cmdq_poll_valid_map(struct arm_smmu_cmdq *cmdq,
1214 u32 sprod, u32 eprod)
1215{
1216 __arm_smmu_cmdq_poll_set_valid_map(cmdq, sprod, eprod, false);
1217}
1218
1219
1220static int arm_smmu_cmdq_poll_until_not_full(struct arm_smmu_device *smmu,
1221 struct arm_smmu_ll_queue *llq)
1222{
1223 unsigned long flags;
1224 struct arm_smmu_queue_poll qp;
1225 struct arm_smmu_cmdq *cmdq = &smmu->cmdq;
1226 int ret = 0;
1227
1228
1229
1230
1231
1232 if (arm_smmu_cmdq_exclusive_trylock_irqsave(cmdq, flags)) {
1233 WRITE_ONCE(cmdq->q.llq.cons, readl_relaxed(cmdq->q.cons_reg));
1234 arm_smmu_cmdq_exclusive_unlock_irqrestore(cmdq, flags);
1235 llq->val = READ_ONCE(cmdq->q.llq.val);
1236 return 0;
1237 }
1238
1239 queue_poll_init(smmu, &qp);
1240 do {
1241 llq->val = READ_ONCE(smmu->cmdq.q.llq.val);
1242 if (!queue_full(llq))
1243 break;
1244
1245 ret = queue_poll(&qp);
1246 } while (!ret);
1247
1248 return ret;
1249}
1250
1251
1252
1253
1254
1255static int __arm_smmu_cmdq_poll_until_msi(struct arm_smmu_device *smmu,
1256 struct arm_smmu_ll_queue *llq)
1257{
1258 int ret = 0;
1259 struct arm_smmu_queue_poll qp;
1260 struct arm_smmu_cmdq *cmdq = &smmu->cmdq;
1261 u32 *cmd = (u32 *)(Q_ENT(&cmdq->q, llq->prod));
1262
1263 queue_poll_init(smmu, &qp);
1264
1265
1266
1267
1268
1269 qp.wfe = false;
1270 smp_cond_load_relaxed(cmd, !VAL || (ret = queue_poll(&qp)));
1271 llq->cons = ret ? llq->prod : queue_inc_prod_n(llq, 1);
1272 return ret;
1273}
1274
1275
1276
1277
1278
1279static int __arm_smmu_cmdq_poll_until_consumed(struct arm_smmu_device *smmu,
1280 struct arm_smmu_ll_queue *llq)
1281{
1282 struct arm_smmu_queue_poll qp;
1283 struct arm_smmu_cmdq *cmdq = &smmu->cmdq;
1284 u32 prod = llq->prod;
1285 int ret = 0;
1286
1287 queue_poll_init(smmu, &qp);
1288 llq->val = READ_ONCE(smmu->cmdq.q.llq.val);
1289 do {
1290 if (queue_consumed(llq, prod))
1291 break;
1292
1293 ret = queue_poll(&qp);
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323 llq->cons = readl(cmdq->q.cons_reg);
1324 } while (!ret);
1325
1326 return ret;
1327}
1328
1329static int arm_smmu_cmdq_poll_until_sync(struct arm_smmu_device *smmu,
1330 struct arm_smmu_ll_queue *llq)
1331{
1332 if (smmu->features & ARM_SMMU_FEAT_MSI &&
1333 smmu->features & ARM_SMMU_FEAT_COHERENCY)
1334 return __arm_smmu_cmdq_poll_until_msi(smmu, llq);
1335
1336 return __arm_smmu_cmdq_poll_until_consumed(smmu, llq);
1337}
1338
1339static void arm_smmu_cmdq_write_entries(struct arm_smmu_cmdq *cmdq, u64 *cmds,
1340 u32 prod, int n)
1341{
1342 int i;
1343 struct arm_smmu_ll_queue llq = {
1344 .max_n_shift = cmdq->q.llq.max_n_shift,
1345 .prod = prod,
1346 };
1347
1348 for (i = 0; i < n; ++i) {
1349 u64 *cmd = &cmds[i * CMDQ_ENT_DWORDS];
1350
1351 prod = queue_inc_prod_n(&llq, i);
1352 queue_write(Q_ENT(&cmdq->q, prod), cmd, CMDQ_ENT_DWORDS);
1353 }
1354}
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372static int arm_smmu_cmdq_issue_cmdlist(struct arm_smmu_device *smmu,
1373 u64 *cmds, int n, bool sync)
1374{
1375 u64 cmd_sync[CMDQ_ENT_DWORDS];
1376 u32 prod;
1377 unsigned long flags;
1378 bool owner;
1379 struct arm_smmu_cmdq *cmdq = &smmu->cmdq;
1380 struct arm_smmu_ll_queue llq = {
1381 .max_n_shift = cmdq->q.llq.max_n_shift,
1382 }, head = llq;
1383 int ret = 0;
1384
1385
1386 local_irq_save(flags);
1387 llq.val = READ_ONCE(cmdq->q.llq.val);
1388 do {
1389 u64 old;
1390
1391 while (!queue_has_space(&llq, n + sync)) {
1392 local_irq_restore(flags);
1393 if (arm_smmu_cmdq_poll_until_not_full(smmu, &llq))
1394 dev_err_ratelimited(smmu->dev, "CMDQ timeout\n");
1395 local_irq_save(flags);
1396 }
1397
1398 head.cons = llq.cons;
1399 head.prod = queue_inc_prod_n(&llq, n + sync) |
1400 CMDQ_PROD_OWNED_FLAG;
1401
1402 old = cmpxchg_relaxed(&cmdq->q.llq.val, llq.val, head.val);
1403 if (old == llq.val)
1404 break;
1405
1406 llq.val = old;
1407 } while (1);
1408 owner = !(llq.prod & CMDQ_PROD_OWNED_FLAG);
1409 head.prod &= ~CMDQ_PROD_OWNED_FLAG;
1410 llq.prod &= ~CMDQ_PROD_OWNED_FLAG;
1411
1412
1413
1414
1415
1416 arm_smmu_cmdq_write_entries(cmdq, cmds, llq.prod, n);
1417 if (sync) {
1418 prod = queue_inc_prod_n(&llq, n);
1419 arm_smmu_cmdq_build_sync_cmd(cmd_sync, smmu, prod);
1420 queue_write(Q_ENT(&cmdq->q, prod), cmd_sync, CMDQ_ENT_DWORDS);
1421
1422
1423
1424
1425
1426
1427
1428 arm_smmu_cmdq_shared_lock(cmdq);
1429 }
1430
1431
1432 dma_wmb();
1433 arm_smmu_cmdq_set_valid_map(cmdq, llq.prod, head.prod);
1434
1435
1436 if (owner) {
1437
1438 atomic_cond_read_relaxed(&cmdq->owner_prod, VAL == llq.prod);
1439
1440
1441 prod = atomic_fetch_andnot_relaxed(CMDQ_PROD_OWNED_FLAG,
1442 &cmdq->q.llq.atomic.prod);
1443 prod &= ~CMDQ_PROD_OWNED_FLAG;
1444
1445
1446
1447
1448
1449
1450 arm_smmu_cmdq_poll_valid_map(cmdq, llq.prod, prod);
1451
1452
1453
1454
1455
1456 writel_relaxed(prod, cmdq->q.prod_reg);
1457
1458
1459
1460
1461
1462
1463 atomic_set_release(&cmdq->owner_prod, prod);
1464 }
1465
1466
1467 if (sync) {
1468 llq.prod = queue_inc_prod_n(&llq, n);
1469 ret = arm_smmu_cmdq_poll_until_sync(smmu, &llq);
1470 if (ret) {
1471 dev_err_ratelimited(smmu->dev,
1472 "CMD_SYNC timeout at 0x%08x [hwprod 0x%08x, hwcons 0x%08x]\n",
1473 llq.prod,
1474 readl_relaxed(cmdq->q.prod_reg),
1475 readl_relaxed(cmdq->q.cons_reg));
1476 }
1477
1478
1479
1480
1481
1482 if (!arm_smmu_cmdq_shared_tryunlock(cmdq)) {
1483 WRITE_ONCE(cmdq->q.llq.cons, llq.cons);
1484 arm_smmu_cmdq_shared_unlock(cmdq);
1485 }
1486 }
1487
1488 local_irq_restore(flags);
1489 return ret;
1490}
1491
1492static int arm_smmu_cmdq_issue_cmd(struct arm_smmu_device *smmu,
1493 struct arm_smmu_cmdq_ent *ent)
1494{
1495 u64 cmd[CMDQ_ENT_DWORDS];
1496
1497 if (arm_smmu_cmdq_build_cmd(cmd, ent)) {
1498 dev_warn(smmu->dev, "ignoring unknown CMDQ opcode 0x%x\n",
1499 ent->opcode);
1500 return -EINVAL;
1501 }
1502
1503 return arm_smmu_cmdq_issue_cmdlist(smmu, cmd, 1, false);
1504}
1505
1506static int arm_smmu_cmdq_issue_sync(struct arm_smmu_device *smmu)
1507{
1508 return arm_smmu_cmdq_issue_cmdlist(smmu, NULL, 0, true);
1509}
1510
1511static void arm_smmu_cmdq_batch_add(struct arm_smmu_device *smmu,
1512 struct arm_smmu_cmdq_batch *cmds,
1513 struct arm_smmu_cmdq_ent *cmd)
1514{
1515 if (cmds->num == CMDQ_BATCH_ENTRIES) {
1516 arm_smmu_cmdq_issue_cmdlist(smmu, cmds->cmds, cmds->num, false);
1517 cmds->num = 0;
1518 }
1519 arm_smmu_cmdq_build_cmd(&cmds->cmds[cmds->num * CMDQ_ENT_DWORDS], cmd);
1520 cmds->num++;
1521}
1522
1523static int arm_smmu_cmdq_batch_submit(struct arm_smmu_device *smmu,
1524 struct arm_smmu_cmdq_batch *cmds)
1525{
1526 return arm_smmu_cmdq_issue_cmdlist(smmu, cmds->cmds, cmds->num, true);
1527}
1528
1529
1530static void arm_smmu_sync_cd(struct arm_smmu_domain *smmu_domain,
1531 int ssid, bool leaf)
1532{
1533 size_t i;
1534 unsigned long flags;
1535 struct arm_smmu_master *master;
1536 struct arm_smmu_cmdq_batch cmds = {};
1537 struct arm_smmu_device *smmu = smmu_domain->smmu;
1538 struct arm_smmu_cmdq_ent cmd = {
1539 .opcode = CMDQ_OP_CFGI_CD,
1540 .cfgi = {
1541 .ssid = ssid,
1542 .leaf = leaf,
1543 },
1544 };
1545
1546 spin_lock_irqsave(&smmu_domain->devices_lock, flags);
1547 list_for_each_entry(master, &smmu_domain->devices, domain_head) {
1548 for (i = 0; i < master->num_sids; i++) {
1549 cmd.cfgi.sid = master->sids[i];
1550 arm_smmu_cmdq_batch_add(smmu, &cmds, &cmd);
1551 }
1552 }
1553 spin_unlock_irqrestore(&smmu_domain->devices_lock, flags);
1554
1555 arm_smmu_cmdq_batch_submit(smmu, &cmds);
1556}
1557
1558static int arm_smmu_alloc_cd_leaf_table(struct arm_smmu_device *smmu,
1559 struct arm_smmu_l1_ctx_desc *l1_desc)
1560{
1561 size_t size = CTXDESC_L2_ENTRIES * (CTXDESC_CD_DWORDS << 3);
1562
1563 l1_desc->l2ptr = dmam_alloc_coherent(smmu->dev, size,
1564 &l1_desc->l2ptr_dma, GFP_KERNEL);
1565 if (!l1_desc->l2ptr) {
1566 dev_warn(smmu->dev,
1567 "failed to allocate context descriptor table\n");
1568 return -ENOMEM;
1569 }
1570 return 0;
1571}
1572
1573static void arm_smmu_write_cd_l1_desc(__le64 *dst,
1574 struct arm_smmu_l1_ctx_desc *l1_desc)
1575{
1576 u64 val = (l1_desc->l2ptr_dma & CTXDESC_L1_DESC_L2PTR_MASK) |
1577 CTXDESC_L1_DESC_V;
1578
1579
1580 WRITE_ONCE(*dst, cpu_to_le64(val));
1581}
1582
1583static __le64 *arm_smmu_get_cd_ptr(struct arm_smmu_domain *smmu_domain,
1584 u32 ssid)
1585{
1586 __le64 *l1ptr;
1587 unsigned int idx;
1588 struct arm_smmu_l1_ctx_desc *l1_desc;
1589 struct arm_smmu_device *smmu = smmu_domain->smmu;
1590 struct arm_smmu_ctx_desc_cfg *cdcfg = &smmu_domain->s1_cfg.cdcfg;
1591
1592 if (smmu_domain->s1_cfg.s1fmt == STRTAB_STE_0_S1FMT_LINEAR)
1593 return cdcfg->cdtab + ssid * CTXDESC_CD_DWORDS;
1594
1595 idx = ssid >> CTXDESC_SPLIT;
1596 l1_desc = &cdcfg->l1_desc[idx];
1597 if (!l1_desc->l2ptr) {
1598 if (arm_smmu_alloc_cd_leaf_table(smmu, l1_desc))
1599 return NULL;
1600
1601 l1ptr = cdcfg->cdtab + idx * CTXDESC_L1_DESC_DWORDS;
1602 arm_smmu_write_cd_l1_desc(l1ptr, l1_desc);
1603
1604 arm_smmu_sync_cd(smmu_domain, ssid, false);
1605 }
1606 idx = ssid & (CTXDESC_L2_ENTRIES - 1);
1607 return l1_desc->l2ptr + idx * CTXDESC_CD_DWORDS;
1608}
1609
1610static int arm_smmu_write_ctx_desc(struct arm_smmu_domain *smmu_domain,
1611 int ssid, struct arm_smmu_ctx_desc *cd)
1612{
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622 u64 val;
1623 bool cd_live;
1624 __le64 *cdptr;
1625 struct arm_smmu_device *smmu = smmu_domain->smmu;
1626
1627 if (WARN_ON(ssid >= (1 << smmu_domain->s1_cfg.s1cdmax)))
1628 return -E2BIG;
1629
1630 cdptr = arm_smmu_get_cd_ptr(smmu_domain, ssid);
1631 if (!cdptr)
1632 return -ENOMEM;
1633
1634 val = le64_to_cpu(cdptr[0]);
1635 cd_live = !!(val & CTXDESC_CD_0_V);
1636
1637 if (!cd) {
1638 val = 0;
1639 } else if (cd_live) {
1640 val &= ~CTXDESC_CD_0_ASID;
1641 val |= FIELD_PREP(CTXDESC_CD_0_ASID, cd->asid);
1642
1643
1644
1645
1646 } else {
1647 cdptr[1] = cpu_to_le64(cd->ttbr & CTXDESC_CD_1_TTB0_MASK);
1648 cdptr[2] = 0;
1649 cdptr[3] = cpu_to_le64(cd->mair);
1650
1651
1652
1653
1654
1655
1656 arm_smmu_sync_cd(smmu_domain, ssid, true);
1657
1658 val = cd->tcr |
1659#ifdef __BIG_ENDIAN
1660 CTXDESC_CD_0_ENDI |
1661#endif
1662 CTXDESC_CD_0_R | CTXDESC_CD_0_A | CTXDESC_CD_0_ASET |
1663 CTXDESC_CD_0_AA64 |
1664 FIELD_PREP(CTXDESC_CD_0_ASID, cd->asid) |
1665 CTXDESC_CD_0_V;
1666
1667
1668 if (smmu->features & ARM_SMMU_FEAT_STALL_FORCE)
1669 val |= CTXDESC_CD_0_S;
1670 }
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681 WRITE_ONCE(cdptr[0], cpu_to_le64(val));
1682 arm_smmu_sync_cd(smmu_domain, ssid, true);
1683 return 0;
1684}
1685
1686static int arm_smmu_alloc_cd_tables(struct arm_smmu_domain *smmu_domain)
1687{
1688 int ret;
1689 size_t l1size;
1690 size_t max_contexts;
1691 struct arm_smmu_device *smmu = smmu_domain->smmu;
1692 struct arm_smmu_s1_cfg *cfg = &smmu_domain->s1_cfg;
1693 struct arm_smmu_ctx_desc_cfg *cdcfg = &cfg->cdcfg;
1694
1695 max_contexts = 1 << cfg->s1cdmax;
1696
1697 if (!(smmu->features & ARM_SMMU_FEAT_2_LVL_CDTAB) ||
1698 max_contexts <= CTXDESC_L2_ENTRIES) {
1699 cfg->s1fmt = STRTAB_STE_0_S1FMT_LINEAR;
1700 cdcfg->num_l1_ents = max_contexts;
1701
1702 l1size = max_contexts * (CTXDESC_CD_DWORDS << 3);
1703 } else {
1704 cfg->s1fmt = STRTAB_STE_0_S1FMT_64K_L2;
1705 cdcfg->num_l1_ents = DIV_ROUND_UP(max_contexts,
1706 CTXDESC_L2_ENTRIES);
1707
1708 cdcfg->l1_desc = devm_kcalloc(smmu->dev, cdcfg->num_l1_ents,
1709 sizeof(*cdcfg->l1_desc),
1710 GFP_KERNEL);
1711 if (!cdcfg->l1_desc)
1712 return -ENOMEM;
1713
1714 l1size = cdcfg->num_l1_ents * (CTXDESC_L1_DESC_DWORDS << 3);
1715 }
1716
1717 cdcfg->cdtab = dmam_alloc_coherent(smmu->dev, l1size, &cdcfg->cdtab_dma,
1718 GFP_KERNEL);
1719 if (!cdcfg->cdtab) {
1720 dev_warn(smmu->dev, "failed to allocate context descriptor\n");
1721 ret = -ENOMEM;
1722 goto err_free_l1;
1723 }
1724
1725 return 0;
1726
1727err_free_l1:
1728 if (cdcfg->l1_desc) {
1729 devm_kfree(smmu->dev, cdcfg->l1_desc);
1730 cdcfg->l1_desc = NULL;
1731 }
1732 return ret;
1733}
1734
1735static void arm_smmu_free_cd_tables(struct arm_smmu_domain *smmu_domain)
1736{
1737 int i;
1738 size_t size, l1size;
1739 struct arm_smmu_device *smmu = smmu_domain->smmu;
1740 struct arm_smmu_ctx_desc_cfg *cdcfg = &smmu_domain->s1_cfg.cdcfg;
1741
1742 if (cdcfg->l1_desc) {
1743 size = CTXDESC_L2_ENTRIES * (CTXDESC_CD_DWORDS << 3);
1744
1745 for (i = 0; i < cdcfg->num_l1_ents; i++) {
1746 if (!cdcfg->l1_desc[i].l2ptr)
1747 continue;
1748
1749 dmam_free_coherent(smmu->dev, size,
1750 cdcfg->l1_desc[i].l2ptr,
1751 cdcfg->l1_desc[i].l2ptr_dma);
1752 }
1753 devm_kfree(smmu->dev, cdcfg->l1_desc);
1754 cdcfg->l1_desc = NULL;
1755
1756 l1size = cdcfg->num_l1_ents * (CTXDESC_L1_DESC_DWORDS << 3);
1757 } else {
1758 l1size = cdcfg->num_l1_ents * (CTXDESC_CD_DWORDS << 3);
1759 }
1760
1761 dmam_free_coherent(smmu->dev, l1size, cdcfg->cdtab, cdcfg->cdtab_dma);
1762 cdcfg->cdtab_dma = 0;
1763 cdcfg->cdtab = NULL;
1764}
1765
1766
1767static void
1768arm_smmu_write_strtab_l1_desc(__le64 *dst, struct arm_smmu_strtab_l1_desc *desc)
1769{
1770 u64 val = 0;
1771
1772 val |= FIELD_PREP(STRTAB_L1_DESC_SPAN, desc->span);
1773 val |= desc->l2ptr_dma & STRTAB_L1_DESC_L2PTR_MASK;
1774
1775
1776 WRITE_ONCE(*dst, cpu_to_le64(val));
1777}
1778
1779static void arm_smmu_sync_ste_for_sid(struct arm_smmu_device *smmu, u32 sid)
1780{
1781 struct arm_smmu_cmdq_ent cmd = {
1782 .opcode = CMDQ_OP_CFGI_STE,
1783 .cfgi = {
1784 .sid = sid,
1785 .leaf = true,
1786 },
1787 };
1788
1789 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
1790 arm_smmu_cmdq_issue_sync(smmu);
1791}
1792
1793static void arm_smmu_write_strtab_ent(struct arm_smmu_master *master, u32 sid,
1794 __le64 *dst)
1795{
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812 u64 val = le64_to_cpu(dst[0]);
1813 bool ste_live = false;
1814 struct arm_smmu_device *smmu = NULL;
1815 struct arm_smmu_s1_cfg *s1_cfg = NULL;
1816 struct arm_smmu_s2_cfg *s2_cfg = NULL;
1817 struct arm_smmu_domain *smmu_domain = NULL;
1818 struct arm_smmu_cmdq_ent prefetch_cmd = {
1819 .opcode = CMDQ_OP_PREFETCH_CFG,
1820 .prefetch = {
1821 .sid = sid,
1822 },
1823 };
1824
1825 if (master) {
1826 smmu_domain = master->domain;
1827 smmu = master->smmu;
1828 }
1829
1830 if (smmu_domain) {
1831 switch (smmu_domain->stage) {
1832 case ARM_SMMU_DOMAIN_S1:
1833 s1_cfg = &smmu_domain->s1_cfg;
1834 break;
1835 case ARM_SMMU_DOMAIN_S2:
1836 case ARM_SMMU_DOMAIN_NESTED:
1837 s2_cfg = &smmu_domain->s2_cfg;
1838 break;
1839 default:
1840 break;
1841 }
1842 }
1843
1844 if (val & STRTAB_STE_0_V) {
1845 switch (FIELD_GET(STRTAB_STE_0_CFG, val)) {
1846 case STRTAB_STE_0_CFG_BYPASS:
1847 break;
1848 case STRTAB_STE_0_CFG_S1_TRANS:
1849 case STRTAB_STE_0_CFG_S2_TRANS:
1850 ste_live = true;
1851 break;
1852 case STRTAB_STE_0_CFG_ABORT:
1853 BUG_ON(!disable_bypass);
1854 break;
1855 default:
1856 BUG();
1857 }
1858 }
1859
1860
1861 val = STRTAB_STE_0_V;
1862
1863
1864 if (!smmu_domain || !(s1_cfg || s2_cfg)) {
1865 if (!smmu_domain && disable_bypass)
1866 val |= FIELD_PREP(STRTAB_STE_0_CFG, STRTAB_STE_0_CFG_ABORT);
1867 else
1868 val |= FIELD_PREP(STRTAB_STE_0_CFG, STRTAB_STE_0_CFG_BYPASS);
1869
1870 dst[0] = cpu_to_le64(val);
1871 dst[1] = cpu_to_le64(FIELD_PREP(STRTAB_STE_1_SHCFG,
1872 STRTAB_STE_1_SHCFG_INCOMING));
1873 dst[2] = 0;
1874
1875
1876
1877
1878 if (smmu)
1879 arm_smmu_sync_ste_for_sid(smmu, sid);
1880 return;
1881 }
1882
1883 if (s1_cfg) {
1884 BUG_ON(ste_live);
1885 dst[1] = cpu_to_le64(
1886 FIELD_PREP(STRTAB_STE_1_S1DSS, STRTAB_STE_1_S1DSS_SSID0) |
1887 FIELD_PREP(STRTAB_STE_1_S1CIR, STRTAB_STE_1_S1C_CACHE_WBRA) |
1888 FIELD_PREP(STRTAB_STE_1_S1COR, STRTAB_STE_1_S1C_CACHE_WBRA) |
1889 FIELD_PREP(STRTAB_STE_1_S1CSH, ARM_SMMU_SH_ISH) |
1890 FIELD_PREP(STRTAB_STE_1_STRW, STRTAB_STE_1_STRW_NSEL1));
1891
1892 if (smmu->features & ARM_SMMU_FEAT_STALLS &&
1893 !(smmu->features & ARM_SMMU_FEAT_STALL_FORCE))
1894 dst[1] |= cpu_to_le64(STRTAB_STE_1_S1STALLD);
1895
1896 val |= (s1_cfg->cdcfg.cdtab_dma & STRTAB_STE_0_S1CTXPTR_MASK) |
1897 FIELD_PREP(STRTAB_STE_0_CFG, STRTAB_STE_0_CFG_S1_TRANS) |
1898 FIELD_PREP(STRTAB_STE_0_S1CDMAX, s1_cfg->s1cdmax) |
1899 FIELD_PREP(STRTAB_STE_0_S1FMT, s1_cfg->s1fmt);
1900 }
1901
1902 if (s2_cfg) {
1903 BUG_ON(ste_live);
1904 dst[2] = cpu_to_le64(
1905 FIELD_PREP(STRTAB_STE_2_S2VMID, s2_cfg->vmid) |
1906 FIELD_PREP(STRTAB_STE_2_VTCR, s2_cfg->vtcr) |
1907#ifdef __BIG_ENDIAN
1908 STRTAB_STE_2_S2ENDI |
1909#endif
1910 STRTAB_STE_2_S2PTW | STRTAB_STE_2_S2AA64 |
1911 STRTAB_STE_2_S2R);
1912
1913 dst[3] = cpu_to_le64(s2_cfg->vttbr & STRTAB_STE_3_S2TTB_MASK);
1914
1915 val |= FIELD_PREP(STRTAB_STE_0_CFG, STRTAB_STE_0_CFG_S2_TRANS);
1916 }
1917
1918 if (master->ats_enabled)
1919 dst[1] |= cpu_to_le64(FIELD_PREP(STRTAB_STE_1_EATS,
1920 STRTAB_STE_1_EATS_TRANS));
1921
1922 arm_smmu_sync_ste_for_sid(smmu, sid);
1923
1924 WRITE_ONCE(dst[0], cpu_to_le64(val));
1925 arm_smmu_sync_ste_for_sid(smmu, sid);
1926
1927
1928 if (!(smmu->options & ARM_SMMU_OPT_SKIP_PREFETCH))
1929 arm_smmu_cmdq_issue_cmd(smmu, &prefetch_cmd);
1930}
1931
1932static void arm_smmu_init_bypass_stes(u64 *strtab, unsigned int nent)
1933{
1934 unsigned int i;
1935
1936 for (i = 0; i < nent; ++i) {
1937 arm_smmu_write_strtab_ent(NULL, -1, strtab);
1938 strtab += STRTAB_STE_DWORDS;
1939 }
1940}
1941
1942static int arm_smmu_init_l2_strtab(struct arm_smmu_device *smmu, u32 sid)
1943{
1944 size_t size;
1945 void *strtab;
1946 struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg;
1947 struct arm_smmu_strtab_l1_desc *desc = &cfg->l1_desc[sid >> STRTAB_SPLIT];
1948
1949 if (desc->l2ptr)
1950 return 0;
1951
1952 size = 1 << (STRTAB_SPLIT + ilog2(STRTAB_STE_DWORDS) + 3);
1953 strtab = &cfg->strtab[(sid >> STRTAB_SPLIT) * STRTAB_L1_DESC_DWORDS];
1954
1955 desc->span = STRTAB_SPLIT + 1;
1956 desc->l2ptr = dmam_alloc_coherent(smmu->dev, size, &desc->l2ptr_dma,
1957 GFP_KERNEL);
1958 if (!desc->l2ptr) {
1959 dev_err(smmu->dev,
1960 "failed to allocate l2 stream table for SID %u\n",
1961 sid);
1962 return -ENOMEM;
1963 }
1964
1965 arm_smmu_init_bypass_stes(desc->l2ptr, 1 << STRTAB_SPLIT);
1966 arm_smmu_write_strtab_l1_desc(strtab, desc);
1967 return 0;
1968}
1969
1970
1971static irqreturn_t arm_smmu_evtq_thread(int irq, void *dev)
1972{
1973 int i;
1974 struct arm_smmu_device *smmu = dev;
1975 struct arm_smmu_queue *q = &smmu->evtq.q;
1976 struct arm_smmu_ll_queue *llq = &q->llq;
1977 u64 evt[EVTQ_ENT_DWORDS];
1978
1979 do {
1980 while (!queue_remove_raw(q, evt)) {
1981 u8 id = FIELD_GET(EVTQ_0_ID, evt[0]);
1982
1983 dev_info(smmu->dev, "event 0x%02x received:\n", id);
1984 for (i = 0; i < ARRAY_SIZE(evt); ++i)
1985 dev_info(smmu->dev, "\t0x%016llx\n",
1986 (unsigned long long)evt[i]);
1987
1988 }
1989
1990
1991
1992
1993
1994 if (queue_sync_prod_in(q) == -EOVERFLOW)
1995 dev_err(smmu->dev, "EVTQ overflow detected -- events lost\n");
1996 } while (!queue_empty(llq));
1997
1998
1999 llq->cons = Q_OVF(llq->prod) | Q_WRP(llq, llq->cons) |
2000 Q_IDX(llq, llq->cons);
2001 return IRQ_HANDLED;
2002}
2003
2004static void arm_smmu_handle_ppr(struct arm_smmu_device *smmu, u64 *evt)
2005{
2006 u32 sid, ssid;
2007 u16 grpid;
2008 bool ssv, last;
2009
2010 sid = FIELD_GET(PRIQ_0_SID, evt[0]);
2011 ssv = FIELD_GET(PRIQ_0_SSID_V, evt[0]);
2012 ssid = ssv ? FIELD_GET(PRIQ_0_SSID, evt[0]) : 0;
2013 last = FIELD_GET(PRIQ_0_PRG_LAST, evt[0]);
2014 grpid = FIELD_GET(PRIQ_1_PRG_IDX, evt[1]);
2015
2016 dev_info(smmu->dev, "unexpected PRI request received:\n");
2017 dev_info(smmu->dev,
2018 "\tsid 0x%08x.0x%05x: [%u%s] %sprivileged %s%s%s access at iova 0x%016llx\n",
2019 sid, ssid, grpid, last ? "L" : "",
2020 evt[0] & PRIQ_0_PERM_PRIV ? "" : "un",
2021 evt[0] & PRIQ_0_PERM_READ ? "R" : "",
2022 evt[0] & PRIQ_0_PERM_WRITE ? "W" : "",
2023 evt[0] & PRIQ_0_PERM_EXEC ? "X" : "",
2024 evt[1] & PRIQ_1_ADDR_MASK);
2025
2026 if (last) {
2027 struct arm_smmu_cmdq_ent cmd = {
2028 .opcode = CMDQ_OP_PRI_RESP,
2029 .substream_valid = ssv,
2030 .pri = {
2031 .sid = sid,
2032 .ssid = ssid,
2033 .grpid = grpid,
2034 .resp = PRI_RESP_DENY,
2035 },
2036 };
2037
2038 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
2039 }
2040}
2041
2042static irqreturn_t arm_smmu_priq_thread(int irq, void *dev)
2043{
2044 struct arm_smmu_device *smmu = dev;
2045 struct arm_smmu_queue *q = &smmu->priq.q;
2046 struct arm_smmu_ll_queue *llq = &q->llq;
2047 u64 evt[PRIQ_ENT_DWORDS];
2048
2049 do {
2050 while (!queue_remove_raw(q, evt))
2051 arm_smmu_handle_ppr(smmu, evt);
2052
2053 if (queue_sync_prod_in(q) == -EOVERFLOW)
2054 dev_err(smmu->dev, "PRIQ overflow detected -- requests lost\n");
2055 } while (!queue_empty(llq));
2056
2057
2058 llq->cons = Q_OVF(llq->prod) | Q_WRP(llq, llq->cons) |
2059 Q_IDX(llq, llq->cons);
2060 queue_sync_cons_out(q);
2061 return IRQ_HANDLED;
2062}
2063
2064static int arm_smmu_device_disable(struct arm_smmu_device *smmu);
2065
2066static irqreturn_t arm_smmu_gerror_handler(int irq, void *dev)
2067{
2068 u32 gerror, gerrorn, active;
2069 struct arm_smmu_device *smmu = dev;
2070
2071 gerror = readl_relaxed(smmu->base + ARM_SMMU_GERROR);
2072 gerrorn = readl_relaxed(smmu->base + ARM_SMMU_GERRORN);
2073
2074 active = gerror ^ gerrorn;
2075 if (!(active & GERROR_ERR_MASK))
2076 return IRQ_NONE;
2077
2078 dev_warn(smmu->dev,
2079 "unexpected global error reported (0x%08x), this could be serious\n",
2080 active);
2081
2082 if (active & GERROR_SFM_ERR) {
2083 dev_err(smmu->dev, "device has entered Service Failure Mode!\n");
2084 arm_smmu_device_disable(smmu);
2085 }
2086
2087 if (active & GERROR_MSI_GERROR_ABT_ERR)
2088 dev_warn(smmu->dev, "GERROR MSI write aborted\n");
2089
2090 if (active & GERROR_MSI_PRIQ_ABT_ERR)
2091 dev_warn(smmu->dev, "PRIQ MSI write aborted\n");
2092
2093 if (active & GERROR_MSI_EVTQ_ABT_ERR)
2094 dev_warn(smmu->dev, "EVTQ MSI write aborted\n");
2095
2096 if (active & GERROR_MSI_CMDQ_ABT_ERR)
2097 dev_warn(smmu->dev, "CMDQ MSI write aborted\n");
2098
2099 if (active & GERROR_PRIQ_ABT_ERR)
2100 dev_err(smmu->dev, "PRIQ write aborted -- events may have been lost\n");
2101
2102 if (active & GERROR_EVTQ_ABT_ERR)
2103 dev_err(smmu->dev, "EVTQ write aborted -- events may have been lost\n");
2104
2105 if (active & GERROR_CMDQ_ERR)
2106 arm_smmu_cmdq_skip_err(smmu);
2107
2108 writel(gerror, smmu->base + ARM_SMMU_GERRORN);
2109 return IRQ_HANDLED;
2110}
2111
2112static irqreturn_t arm_smmu_combined_irq_thread(int irq, void *dev)
2113{
2114 struct arm_smmu_device *smmu = dev;
2115
2116 arm_smmu_evtq_thread(irq, dev);
2117 if (smmu->features & ARM_SMMU_FEAT_PRI)
2118 arm_smmu_priq_thread(irq, dev);
2119
2120 return IRQ_HANDLED;
2121}
2122
2123static irqreturn_t arm_smmu_combined_irq_handler(int irq, void *dev)
2124{
2125 arm_smmu_gerror_handler(irq, dev);
2126 return IRQ_WAKE_THREAD;
2127}
2128
2129static void
2130arm_smmu_atc_inv_to_cmd(int ssid, unsigned long iova, size_t size,
2131 struct arm_smmu_cmdq_ent *cmd)
2132{
2133 size_t log2_span;
2134 size_t span_mask;
2135
2136 size_t inval_grain_shift = 12;
2137 unsigned long page_start, page_end;
2138
2139 *cmd = (struct arm_smmu_cmdq_ent) {
2140 .opcode = CMDQ_OP_ATC_INV,
2141 .substream_valid = !!ssid,
2142 .atc.ssid = ssid,
2143 };
2144
2145 if (!size) {
2146 cmd->atc.size = ATC_INV_SIZE_ALL;
2147 return;
2148 }
2149
2150 page_start = iova >> inval_grain_shift;
2151 page_end = (iova + size - 1) >> inval_grain_shift;
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173 log2_span = fls_long(page_start ^ page_end);
2174 span_mask = (1ULL << log2_span) - 1;
2175
2176 page_start &= ~span_mask;
2177
2178 cmd->atc.addr = page_start << inval_grain_shift;
2179 cmd->atc.size = log2_span;
2180}
2181
2182static int arm_smmu_atc_inv_master(struct arm_smmu_master *master)
2183{
2184 int i;
2185 struct arm_smmu_cmdq_ent cmd;
2186
2187 arm_smmu_atc_inv_to_cmd(0, 0, 0, &cmd);
2188
2189 for (i = 0; i < master->num_sids; i++) {
2190 cmd.atc.sid = master->sids[i];
2191 arm_smmu_cmdq_issue_cmd(master->smmu, &cmd);
2192 }
2193
2194 return arm_smmu_cmdq_issue_sync(master->smmu);
2195}
2196
2197static int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain,
2198 int ssid, unsigned long iova, size_t size)
2199{
2200 int i;
2201 unsigned long flags;
2202 struct arm_smmu_cmdq_ent cmd;
2203 struct arm_smmu_master *master;
2204 struct arm_smmu_cmdq_batch cmds = {};
2205
2206 if (!(smmu_domain->smmu->features & ARM_SMMU_FEAT_ATS))
2207 return 0;
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222 smp_mb();
2223 if (!atomic_read(&smmu_domain->nr_ats_masters))
2224 return 0;
2225
2226 arm_smmu_atc_inv_to_cmd(ssid, iova, size, &cmd);
2227
2228 spin_lock_irqsave(&smmu_domain->devices_lock, flags);
2229 list_for_each_entry(master, &smmu_domain->devices, domain_head) {
2230 if (!master->ats_enabled)
2231 continue;
2232
2233 for (i = 0; i < master->num_sids; i++) {
2234 cmd.atc.sid = master->sids[i];
2235 arm_smmu_cmdq_batch_add(smmu_domain->smmu, &cmds, &cmd);
2236 }
2237 }
2238 spin_unlock_irqrestore(&smmu_domain->devices_lock, flags);
2239
2240 return arm_smmu_cmdq_batch_submit(smmu_domain->smmu, &cmds);
2241}
2242
2243
2244static void arm_smmu_tlb_inv_context(void *cookie)
2245{
2246 struct arm_smmu_domain *smmu_domain = cookie;
2247 struct arm_smmu_device *smmu = smmu_domain->smmu;
2248 struct arm_smmu_cmdq_ent cmd;
2249
2250 if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) {
2251 cmd.opcode = CMDQ_OP_TLBI_NH_ASID;
2252 cmd.tlbi.asid = smmu_domain->s1_cfg.cd.asid;
2253 cmd.tlbi.vmid = 0;
2254 } else {
2255 cmd.opcode = CMDQ_OP_TLBI_S12_VMALL;
2256 cmd.tlbi.vmid = smmu_domain->s2_cfg.vmid;
2257 }
2258
2259
2260
2261
2262
2263
2264
2265
2266 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
2267 arm_smmu_cmdq_issue_sync(smmu);
2268 arm_smmu_atc_inv_domain(smmu_domain, 0, 0, 0);
2269}
2270
2271static void arm_smmu_tlb_inv_range(unsigned long iova, size_t size,
2272 size_t granule, bool leaf,
2273 struct arm_smmu_domain *smmu_domain)
2274{
2275 struct arm_smmu_device *smmu = smmu_domain->smmu;
2276 unsigned long start = iova, end = iova + size, num_pages = 0, tg = 0;
2277 size_t inv_range = granule;
2278 struct arm_smmu_cmdq_batch cmds = {};
2279 struct arm_smmu_cmdq_ent cmd = {
2280 .tlbi = {
2281 .leaf = leaf,
2282 },
2283 };
2284
2285 if (!size)
2286 return;
2287
2288 if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) {
2289 cmd.opcode = CMDQ_OP_TLBI_NH_VA;
2290 cmd.tlbi.asid = smmu_domain->s1_cfg.cd.asid;
2291 } else {
2292 cmd.opcode = CMDQ_OP_TLBI_S2_IPA;
2293 cmd.tlbi.vmid = smmu_domain->s2_cfg.vmid;
2294 }
2295
2296 if (smmu->features & ARM_SMMU_FEAT_RANGE_INV) {
2297
2298 tg = __ffs(smmu_domain->domain.pgsize_bitmap);
2299
2300
2301 cmd.tlbi.tg = (tg - 10) / 2;
2302
2303
2304 cmd.tlbi.ttl = 4 - ((ilog2(granule) - 3) / (tg - 3));
2305
2306 num_pages = size >> tg;
2307 }
2308
2309 while (iova < end) {
2310 if (smmu->features & ARM_SMMU_FEAT_RANGE_INV) {
2311
2312
2313
2314
2315
2316
2317
2318 unsigned long scale, num;
2319
2320
2321 scale = __ffs(num_pages);
2322 cmd.tlbi.scale = scale;
2323
2324
2325 num = (num_pages >> scale) & CMDQ_TLBI_RANGE_NUM_MAX;
2326 cmd.tlbi.num = num - 1;
2327
2328
2329 inv_range = num << (scale + tg);
2330
2331
2332 num_pages -= num << scale;
2333 }
2334
2335 cmd.tlbi.addr = iova;
2336 arm_smmu_cmdq_batch_add(smmu, &cmds, &cmd);
2337 iova += inv_range;
2338 }
2339 arm_smmu_cmdq_batch_submit(smmu, &cmds);
2340
2341
2342
2343
2344
2345 arm_smmu_atc_inv_domain(smmu_domain, 0, start, size);
2346}
2347
2348static void arm_smmu_tlb_inv_page_nosync(struct iommu_iotlb_gather *gather,
2349 unsigned long iova, size_t granule,
2350 void *cookie)
2351{
2352 struct arm_smmu_domain *smmu_domain = cookie;
2353 struct iommu_domain *domain = &smmu_domain->domain;
2354
2355 iommu_iotlb_gather_add_page(domain, gather, iova, granule);
2356}
2357
2358static void arm_smmu_tlb_inv_walk(unsigned long iova, size_t size,
2359 size_t granule, void *cookie)
2360{
2361 arm_smmu_tlb_inv_range(iova, size, granule, false, cookie);
2362}
2363
2364static void arm_smmu_tlb_inv_leaf(unsigned long iova, size_t size,
2365 size_t granule, void *cookie)
2366{
2367 arm_smmu_tlb_inv_range(iova, size, granule, true, cookie);
2368}
2369
2370static const struct iommu_flush_ops arm_smmu_flush_ops = {
2371 .tlb_flush_all = arm_smmu_tlb_inv_context,
2372 .tlb_flush_walk = arm_smmu_tlb_inv_walk,
2373 .tlb_flush_leaf = arm_smmu_tlb_inv_leaf,
2374 .tlb_add_page = arm_smmu_tlb_inv_page_nosync,
2375};
2376
2377
2378static bool arm_smmu_capable(enum iommu_cap cap)
2379{
2380 switch (cap) {
2381 case IOMMU_CAP_CACHE_COHERENCY:
2382 return true;
2383 case IOMMU_CAP_NOEXEC:
2384 return true;
2385 default:
2386 return false;
2387 }
2388}
2389
2390static struct iommu_domain *arm_smmu_domain_alloc(unsigned type)
2391{
2392 struct arm_smmu_domain *smmu_domain;
2393
2394 if (type != IOMMU_DOMAIN_UNMANAGED &&
2395 type != IOMMU_DOMAIN_DMA &&
2396 type != IOMMU_DOMAIN_IDENTITY)
2397 return NULL;
2398
2399
2400
2401
2402
2403
2404 smmu_domain = kzalloc(sizeof(*smmu_domain), GFP_KERNEL);
2405 if (!smmu_domain)
2406 return NULL;
2407
2408 if (type == IOMMU_DOMAIN_DMA &&
2409 iommu_get_dma_cookie(&smmu_domain->domain)) {
2410 kfree(smmu_domain);
2411 return NULL;
2412 }
2413
2414 mutex_init(&smmu_domain->init_mutex);
2415 INIT_LIST_HEAD(&smmu_domain->devices);
2416 spin_lock_init(&smmu_domain->devices_lock);
2417
2418 return &smmu_domain->domain;
2419}
2420
2421static int arm_smmu_bitmap_alloc(unsigned long *map, int span)
2422{
2423 int idx, size = 1 << span;
2424
2425 do {
2426 idx = find_first_zero_bit(map, size);
2427 if (idx == size)
2428 return -ENOSPC;
2429 } while (test_and_set_bit(idx, map));
2430
2431 return idx;
2432}
2433
2434static void arm_smmu_bitmap_free(unsigned long *map, int idx)
2435{
2436 clear_bit(idx, map);
2437}
2438
2439static void arm_smmu_domain_free(struct iommu_domain *domain)
2440{
2441 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
2442 struct arm_smmu_device *smmu = smmu_domain->smmu;
2443
2444 iommu_put_dma_cookie(domain);
2445 free_io_pgtable_ops(smmu_domain->pgtbl_ops);
2446
2447
2448 if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) {
2449 struct arm_smmu_s1_cfg *cfg = &smmu_domain->s1_cfg;
2450
2451 if (cfg->cdcfg.cdtab) {
2452 arm_smmu_free_cd_tables(smmu_domain);
2453 arm_smmu_bitmap_free(smmu->asid_map, cfg->cd.asid);
2454 }
2455 } else {
2456 struct arm_smmu_s2_cfg *cfg = &smmu_domain->s2_cfg;
2457 if (cfg->vmid)
2458 arm_smmu_bitmap_free(smmu->vmid_map, cfg->vmid);
2459 }
2460
2461 kfree(smmu_domain);
2462}
2463
2464static int arm_smmu_domain_finalise_s1(struct arm_smmu_domain *smmu_domain,
2465 struct arm_smmu_master *master,
2466 struct io_pgtable_cfg *pgtbl_cfg)
2467{
2468 int ret;
2469 int asid;
2470 struct arm_smmu_device *smmu = smmu_domain->smmu;
2471 struct arm_smmu_s1_cfg *cfg = &smmu_domain->s1_cfg;
2472 typeof(&pgtbl_cfg->arm_lpae_s1_cfg.tcr) tcr = &pgtbl_cfg->arm_lpae_s1_cfg.tcr;
2473
2474 asid = arm_smmu_bitmap_alloc(smmu->asid_map, smmu->asid_bits);
2475 if (asid < 0)
2476 return asid;
2477
2478 cfg->s1cdmax = master->ssid_bits;
2479
2480 ret = arm_smmu_alloc_cd_tables(smmu_domain);
2481 if (ret)
2482 goto out_free_asid;
2483
2484 cfg->cd.asid = (u16)asid;
2485 cfg->cd.ttbr = pgtbl_cfg->arm_lpae_s1_cfg.ttbr;
2486 cfg->cd.tcr = FIELD_PREP(CTXDESC_CD_0_TCR_T0SZ, tcr->tsz) |
2487 FIELD_PREP(CTXDESC_CD_0_TCR_TG0, tcr->tg) |
2488 FIELD_PREP(CTXDESC_CD_0_TCR_IRGN0, tcr->irgn) |
2489 FIELD_PREP(CTXDESC_CD_0_TCR_ORGN0, tcr->orgn) |
2490 FIELD_PREP(CTXDESC_CD_0_TCR_SH0, tcr->sh) |
2491 FIELD_PREP(CTXDESC_CD_0_TCR_IPS, tcr->ips) |
2492 CTXDESC_CD_0_TCR_EPD1 | CTXDESC_CD_0_AA64;
2493 cfg->cd.mair = pgtbl_cfg->arm_lpae_s1_cfg.mair;
2494
2495
2496
2497
2498
2499
2500 ret = arm_smmu_write_ctx_desc(smmu_domain, 0, &cfg->cd);
2501 if (ret)
2502 goto out_free_cd_tables;
2503
2504 return 0;
2505
2506out_free_cd_tables:
2507 arm_smmu_free_cd_tables(smmu_domain);
2508out_free_asid:
2509 arm_smmu_bitmap_free(smmu->asid_map, asid);
2510 return ret;
2511}
2512
2513static int arm_smmu_domain_finalise_s2(struct arm_smmu_domain *smmu_domain,
2514 struct arm_smmu_master *master,
2515 struct io_pgtable_cfg *pgtbl_cfg)
2516{
2517 int vmid;
2518 struct arm_smmu_device *smmu = smmu_domain->smmu;
2519 struct arm_smmu_s2_cfg *cfg = &smmu_domain->s2_cfg;
2520 typeof(&pgtbl_cfg->arm_lpae_s2_cfg.vtcr) vtcr;
2521
2522 vmid = arm_smmu_bitmap_alloc(smmu->vmid_map, smmu->vmid_bits);
2523 if (vmid < 0)
2524 return vmid;
2525
2526 vtcr = &pgtbl_cfg->arm_lpae_s2_cfg.vtcr;
2527 cfg->vmid = (u16)vmid;
2528 cfg->vttbr = pgtbl_cfg->arm_lpae_s2_cfg.vttbr;
2529 cfg->vtcr = FIELD_PREP(STRTAB_STE_2_VTCR_S2T0SZ, vtcr->tsz) |
2530 FIELD_PREP(STRTAB_STE_2_VTCR_S2SL0, vtcr->sl) |
2531 FIELD_PREP(STRTAB_STE_2_VTCR_S2IR0, vtcr->irgn) |
2532 FIELD_PREP(STRTAB_STE_2_VTCR_S2OR0, vtcr->orgn) |
2533 FIELD_PREP(STRTAB_STE_2_VTCR_S2SH0, vtcr->sh) |
2534 FIELD_PREP(STRTAB_STE_2_VTCR_S2TG, vtcr->tg) |
2535 FIELD_PREP(STRTAB_STE_2_VTCR_S2PS, vtcr->ps);
2536 return 0;
2537}
2538
2539static int arm_smmu_domain_finalise(struct iommu_domain *domain,
2540 struct arm_smmu_master *master)
2541{
2542 int ret;
2543 unsigned long ias, oas;
2544 enum io_pgtable_fmt fmt;
2545 struct io_pgtable_cfg pgtbl_cfg;
2546 struct io_pgtable_ops *pgtbl_ops;
2547 int (*finalise_stage_fn)(struct arm_smmu_domain *,
2548 struct arm_smmu_master *,
2549 struct io_pgtable_cfg *);
2550 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
2551 struct arm_smmu_device *smmu = smmu_domain->smmu;
2552
2553 if (domain->type == IOMMU_DOMAIN_IDENTITY) {
2554 smmu_domain->stage = ARM_SMMU_DOMAIN_BYPASS;
2555 return 0;
2556 }
2557
2558
2559 if (!(smmu->features & ARM_SMMU_FEAT_TRANS_S1))
2560 smmu_domain->stage = ARM_SMMU_DOMAIN_S2;
2561 if (!(smmu->features & ARM_SMMU_FEAT_TRANS_S2))
2562 smmu_domain->stage = ARM_SMMU_DOMAIN_S1;
2563
2564 switch (smmu_domain->stage) {
2565 case ARM_SMMU_DOMAIN_S1:
2566 ias = (smmu->features & ARM_SMMU_FEAT_VAX) ? 52 : 48;
2567 ias = min_t(unsigned long, ias, VA_BITS);
2568 oas = smmu->ias;
2569 fmt = ARM_64_LPAE_S1;
2570 finalise_stage_fn = arm_smmu_domain_finalise_s1;
2571 break;
2572 case ARM_SMMU_DOMAIN_NESTED:
2573 case ARM_SMMU_DOMAIN_S2:
2574 ias = smmu->ias;
2575 oas = smmu->oas;
2576 fmt = ARM_64_LPAE_S2;
2577 finalise_stage_fn = arm_smmu_domain_finalise_s2;
2578 break;
2579 default:
2580 return -EINVAL;
2581 }
2582
2583 pgtbl_cfg = (struct io_pgtable_cfg) {
2584 .pgsize_bitmap = smmu->pgsize_bitmap,
2585 .ias = ias,
2586 .oas = oas,
2587 .coherent_walk = smmu->features & ARM_SMMU_FEAT_COHERENCY,
2588 .tlb = &arm_smmu_flush_ops,
2589 .iommu_dev = smmu->dev,
2590 };
2591
2592 if (smmu_domain->non_strict)
2593 pgtbl_cfg.quirks |= IO_PGTABLE_QUIRK_NON_STRICT;
2594
2595 pgtbl_ops = alloc_io_pgtable_ops(fmt, &pgtbl_cfg, smmu_domain);
2596 if (!pgtbl_ops)
2597 return -ENOMEM;
2598
2599 domain->pgsize_bitmap = pgtbl_cfg.pgsize_bitmap;
2600 domain->geometry.aperture_end = (1UL << pgtbl_cfg.ias) - 1;
2601 domain->geometry.force_aperture = true;
2602
2603 ret = finalise_stage_fn(smmu_domain, master, &pgtbl_cfg);
2604 if (ret < 0) {
2605 free_io_pgtable_ops(pgtbl_ops);
2606 return ret;
2607 }
2608
2609 smmu_domain->pgtbl_ops = pgtbl_ops;
2610 return 0;
2611}
2612
2613static __le64 *arm_smmu_get_step_for_sid(struct arm_smmu_device *smmu, u32 sid)
2614{
2615 __le64 *step;
2616 struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg;
2617
2618 if (smmu->features & ARM_SMMU_FEAT_2_LVL_STRTAB) {
2619 struct arm_smmu_strtab_l1_desc *l1_desc;
2620 int idx;
2621
2622
2623 idx = (sid >> STRTAB_SPLIT) * STRTAB_L1_DESC_DWORDS;
2624 l1_desc = &cfg->l1_desc[idx];
2625 idx = (sid & ((1 << STRTAB_SPLIT) - 1)) * STRTAB_STE_DWORDS;
2626 step = &l1_desc->l2ptr[idx];
2627 } else {
2628
2629 step = &cfg->strtab[sid * STRTAB_STE_DWORDS];
2630 }
2631
2632 return step;
2633}
2634
2635static void arm_smmu_install_ste_for_dev(struct arm_smmu_master *master)
2636{
2637 int i, j;
2638 struct arm_smmu_device *smmu = master->smmu;
2639
2640 for (i = 0; i < master->num_sids; ++i) {
2641 u32 sid = master->sids[i];
2642 __le64 *step = arm_smmu_get_step_for_sid(smmu, sid);
2643
2644
2645 for (j = 0; j < i; j++)
2646 if (master->sids[j] == sid)
2647 break;
2648 if (j < i)
2649 continue;
2650
2651 arm_smmu_write_strtab_ent(master, sid, step);
2652 }
2653}
2654
2655#ifdef CONFIG_PCI_ATS
2656static bool arm_smmu_ats_supported(struct arm_smmu_master *master)
2657{
2658 struct pci_dev *pdev;
2659 struct arm_smmu_device *smmu = master->smmu;
2660 struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(master->dev);
2661
2662 if (!(smmu->features & ARM_SMMU_FEAT_ATS) || !dev_is_pci(master->dev) ||
2663 !(fwspec->flags & IOMMU_FWSPEC_PCI_RC_ATS) || pci_ats_disabled())
2664 return false;
2665
2666 pdev = to_pci_dev(master->dev);
2667 return !pdev->untrusted && pdev->ats_cap;
2668}
2669#else
2670static bool arm_smmu_ats_supported(struct arm_smmu_master *master)
2671{
2672 return false;
2673}
2674#endif
2675
2676static void arm_smmu_enable_ats(struct arm_smmu_master *master)
2677{
2678 size_t stu;
2679 struct pci_dev *pdev;
2680 struct arm_smmu_device *smmu = master->smmu;
2681 struct arm_smmu_domain *smmu_domain = master->domain;
2682
2683
2684 if (!master->ats_enabled)
2685 return;
2686
2687
2688 stu = __ffs(smmu->pgsize_bitmap);
2689 pdev = to_pci_dev(master->dev);
2690
2691 atomic_inc(&smmu_domain->nr_ats_masters);
2692 arm_smmu_atc_inv_domain(smmu_domain, 0, 0, 0);
2693 if (pci_enable_ats(pdev, stu))
2694 dev_err(master->dev, "Failed to enable ATS (STU %zu)\n", stu);
2695}
2696
2697static void arm_smmu_disable_ats(struct arm_smmu_master *master)
2698{
2699 struct arm_smmu_domain *smmu_domain = master->domain;
2700
2701 if (!master->ats_enabled)
2702 return;
2703
2704 pci_disable_ats(to_pci_dev(master->dev));
2705
2706
2707
2708
2709 wmb();
2710 arm_smmu_atc_inv_master(master);
2711 atomic_dec(&smmu_domain->nr_ats_masters);
2712}
2713
2714static int arm_smmu_enable_pasid(struct arm_smmu_master *master)
2715{
2716 int ret;
2717 int features;
2718 int num_pasids;
2719 struct pci_dev *pdev;
2720
2721 if (!dev_is_pci(master->dev))
2722 return -ENODEV;
2723
2724 pdev = to_pci_dev(master->dev);
2725
2726 features = pci_pasid_features(pdev);
2727 if (features < 0)
2728 return features;
2729
2730 num_pasids = pci_max_pasids(pdev);
2731 if (num_pasids <= 0)
2732 return num_pasids;
2733
2734 ret = pci_enable_pasid(pdev, features);
2735 if (ret) {
2736 dev_err(&pdev->dev, "Failed to enable PASID\n");
2737 return ret;
2738 }
2739
2740 master->ssid_bits = min_t(u8, ilog2(num_pasids),
2741 master->smmu->ssid_bits);
2742 return 0;
2743}
2744
2745static void arm_smmu_disable_pasid(struct arm_smmu_master *master)
2746{
2747 struct pci_dev *pdev;
2748
2749 if (!dev_is_pci(master->dev))
2750 return;
2751
2752 pdev = to_pci_dev(master->dev);
2753
2754 if (!pdev->pasid_enabled)
2755 return;
2756
2757 master->ssid_bits = 0;
2758 pci_disable_pasid(pdev);
2759}
2760
2761static void arm_smmu_detach_dev(struct arm_smmu_master *master)
2762{
2763 unsigned long flags;
2764 struct arm_smmu_domain *smmu_domain = master->domain;
2765
2766 if (!smmu_domain)
2767 return;
2768
2769 arm_smmu_disable_ats(master);
2770
2771 spin_lock_irqsave(&smmu_domain->devices_lock, flags);
2772 list_del(&master->domain_head);
2773 spin_unlock_irqrestore(&smmu_domain->devices_lock, flags);
2774
2775 master->domain = NULL;
2776 master->ats_enabled = false;
2777 arm_smmu_install_ste_for_dev(master);
2778}
2779
2780static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)
2781{
2782 int ret = 0;
2783 unsigned long flags;
2784 struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
2785 struct arm_smmu_device *smmu;
2786 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
2787 struct arm_smmu_master *master;
2788
2789 if (!fwspec)
2790 return -ENOENT;
2791
2792 master = dev_iommu_priv_get(dev);
2793 smmu = master->smmu;
2794
2795 arm_smmu_detach_dev(master);
2796
2797 mutex_lock(&smmu_domain->init_mutex);
2798
2799 if (!smmu_domain->smmu) {
2800 smmu_domain->smmu = smmu;
2801 ret = arm_smmu_domain_finalise(domain, master);
2802 if (ret) {
2803 smmu_domain->smmu = NULL;
2804 goto out_unlock;
2805 }
2806 } else if (smmu_domain->smmu != smmu) {
2807 dev_err(dev,
2808 "cannot attach to SMMU %s (upstream of %s)\n",
2809 dev_name(smmu_domain->smmu->dev),
2810 dev_name(smmu->dev));
2811 ret = -ENXIO;
2812 goto out_unlock;
2813 } else if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1 &&
2814 master->ssid_bits != smmu_domain->s1_cfg.s1cdmax) {
2815 dev_err(dev,
2816 "cannot attach to incompatible domain (%u SSID bits != %u)\n",
2817 smmu_domain->s1_cfg.s1cdmax, master->ssid_bits);
2818 ret = -EINVAL;
2819 goto out_unlock;
2820 }
2821
2822 master->domain = smmu_domain;
2823
2824 if (smmu_domain->stage != ARM_SMMU_DOMAIN_BYPASS)
2825 master->ats_enabled = arm_smmu_ats_supported(master);
2826
2827 arm_smmu_install_ste_for_dev(master);
2828
2829 spin_lock_irqsave(&smmu_domain->devices_lock, flags);
2830 list_add(&master->domain_head, &smmu_domain->devices);
2831 spin_unlock_irqrestore(&smmu_domain->devices_lock, flags);
2832
2833 arm_smmu_enable_ats(master);
2834
2835out_unlock:
2836 mutex_unlock(&smmu_domain->init_mutex);
2837 return ret;
2838}
2839
2840static int arm_smmu_map(struct iommu_domain *domain, unsigned long iova,
2841 phys_addr_t paddr, size_t size, int prot, gfp_t gfp)
2842{
2843 struct io_pgtable_ops *ops = to_smmu_domain(domain)->pgtbl_ops;
2844
2845 if (!ops)
2846 return -ENODEV;
2847
2848 return ops->map(ops, iova, paddr, size, prot);
2849}
2850
2851static size_t arm_smmu_unmap(struct iommu_domain *domain, unsigned long iova,
2852 size_t size, struct iommu_iotlb_gather *gather)
2853{
2854 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
2855 struct io_pgtable_ops *ops = smmu_domain->pgtbl_ops;
2856
2857 if (!ops)
2858 return 0;
2859
2860 return ops->unmap(ops, iova, size, gather);
2861}
2862
2863static void arm_smmu_flush_iotlb_all(struct iommu_domain *domain)
2864{
2865 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
2866
2867 if (smmu_domain->smmu)
2868 arm_smmu_tlb_inv_context(smmu_domain);
2869}
2870
2871static void arm_smmu_iotlb_sync(struct iommu_domain *domain,
2872 struct iommu_iotlb_gather *gather)
2873{
2874 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
2875
2876 arm_smmu_tlb_inv_range(gather->start, gather->end - gather->start,
2877 gather->pgsize, true, smmu_domain);
2878}
2879
2880static phys_addr_t
2881arm_smmu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova)
2882{
2883 struct io_pgtable_ops *ops = to_smmu_domain(domain)->pgtbl_ops;
2884
2885 if (domain->type == IOMMU_DOMAIN_IDENTITY)
2886 return iova;
2887
2888 if (!ops)
2889 return 0;
2890
2891 return ops->iova_to_phys(ops, iova);
2892}
2893
2894static struct platform_driver arm_smmu_driver;
2895
2896static
2897struct arm_smmu_device *arm_smmu_get_by_fwnode(struct fwnode_handle *fwnode)
2898{
2899 struct device *dev = driver_find_device_by_fwnode(&arm_smmu_driver.driver,
2900 fwnode);
2901 put_device(dev);
2902 return dev ? dev_get_drvdata(dev) : NULL;
2903}
2904
2905static bool arm_smmu_sid_in_range(struct arm_smmu_device *smmu, u32 sid)
2906{
2907 unsigned long limit = smmu->strtab_cfg.num_l1_ents;
2908
2909 if (smmu->features & ARM_SMMU_FEAT_2_LVL_STRTAB)
2910 limit *= 1UL << STRTAB_SPLIT;
2911
2912 return sid < limit;
2913}
2914
2915static struct iommu_ops arm_smmu_ops;
2916
2917static int arm_smmu_add_device(struct device *dev)
2918{
2919 int i, ret;
2920 struct arm_smmu_device *smmu;
2921 struct arm_smmu_master *master;
2922 struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
2923 struct iommu_group *group;
2924
2925 if (!fwspec || fwspec->ops != &arm_smmu_ops)
2926 return -ENODEV;
2927
2928 if (WARN_ON_ONCE(dev_iommu_priv_get(dev)))
2929 return -EBUSY;
2930
2931 smmu = arm_smmu_get_by_fwnode(fwspec->iommu_fwnode);
2932 if (!smmu)
2933 return -ENODEV;
2934
2935 master = kzalloc(sizeof(*master), GFP_KERNEL);
2936 if (!master)
2937 return -ENOMEM;
2938
2939 master->dev = dev;
2940 master->smmu = smmu;
2941 master->sids = fwspec->ids;
2942 master->num_sids = fwspec->num_ids;
2943 dev_iommu_priv_set(dev, master);
2944
2945
2946 for (i = 0; i < master->num_sids; i++) {
2947 u32 sid = master->sids[i];
2948
2949 if (!arm_smmu_sid_in_range(smmu, sid)) {
2950 ret = -ERANGE;
2951 goto err_free_master;
2952 }
2953
2954
2955 if (smmu->features & ARM_SMMU_FEAT_2_LVL_STRTAB) {
2956 ret = arm_smmu_init_l2_strtab(smmu, sid);
2957 if (ret)
2958 goto err_free_master;
2959 }
2960 }
2961
2962 master->ssid_bits = min(smmu->ssid_bits, fwspec->num_pasid_bits);
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972 arm_smmu_enable_pasid(master);
2973
2974 if (!(smmu->features & ARM_SMMU_FEAT_2_LVL_CDTAB))
2975 master->ssid_bits = min_t(u8, master->ssid_bits,
2976 CTXDESC_LINEAR_CDMAX);
2977
2978 ret = iommu_device_link(&smmu->iommu, dev);
2979 if (ret)
2980 goto err_disable_pasid;
2981
2982 group = iommu_group_get_for_dev(dev);
2983 if (IS_ERR(group)) {
2984 ret = PTR_ERR(group);
2985 goto err_unlink;
2986 }
2987
2988 iommu_group_put(group);
2989 return 0;
2990
2991err_unlink:
2992 iommu_device_unlink(&smmu->iommu, dev);
2993err_disable_pasid:
2994 arm_smmu_disable_pasid(master);
2995err_free_master:
2996 kfree(master);
2997 dev_iommu_priv_set(dev, NULL);
2998 return ret;
2999}
3000
3001static void arm_smmu_remove_device(struct device *dev)
3002{
3003 struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
3004 struct arm_smmu_master *master;
3005 struct arm_smmu_device *smmu;
3006
3007 if (!fwspec || fwspec->ops != &arm_smmu_ops)
3008 return;
3009
3010 master = dev_iommu_priv_get(dev);
3011 smmu = master->smmu;
3012 arm_smmu_detach_dev(master);
3013 iommu_group_remove_device(dev);
3014 iommu_device_unlink(&smmu->iommu, dev);
3015 arm_smmu_disable_pasid(master);
3016 kfree(master);
3017 iommu_fwspec_free(dev);
3018}
3019
3020static struct iommu_group *arm_smmu_device_group(struct device *dev)
3021{
3022 struct iommu_group *group;
3023
3024
3025
3026
3027
3028
3029 if (dev_is_pci(dev))
3030 group = pci_device_group(dev);
3031 else
3032 group = generic_device_group(dev);
3033
3034 return group;
3035}
3036
3037static int arm_smmu_domain_get_attr(struct iommu_domain *domain,
3038 enum iommu_attr attr, void *data)
3039{
3040 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
3041
3042 switch (domain->type) {
3043 case IOMMU_DOMAIN_UNMANAGED:
3044 switch (attr) {
3045 case DOMAIN_ATTR_NESTING:
3046 *(int *)data = (smmu_domain->stage == ARM_SMMU_DOMAIN_NESTED);
3047 return 0;
3048 default:
3049 return -ENODEV;
3050 }
3051 break;
3052 case IOMMU_DOMAIN_DMA:
3053 switch (attr) {
3054 case DOMAIN_ATTR_DMA_USE_FLUSH_QUEUE:
3055 *(int *)data = smmu_domain->non_strict;
3056 return 0;
3057 default:
3058 return -ENODEV;
3059 }
3060 break;
3061 default:
3062 return -EINVAL;
3063 }
3064}
3065
3066static int arm_smmu_domain_set_attr(struct iommu_domain *domain,
3067 enum iommu_attr attr, void *data)
3068{
3069 int ret = 0;
3070 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
3071
3072 mutex_lock(&smmu_domain->init_mutex);
3073
3074 switch (domain->type) {
3075 case IOMMU_DOMAIN_UNMANAGED:
3076 switch (attr) {
3077 case DOMAIN_ATTR_NESTING:
3078 if (smmu_domain->smmu) {
3079 ret = -EPERM;
3080 goto out_unlock;
3081 }
3082
3083 if (*(int *)data)
3084 smmu_domain->stage = ARM_SMMU_DOMAIN_NESTED;
3085 else
3086 smmu_domain->stage = ARM_SMMU_DOMAIN_S1;
3087 break;
3088 default:
3089 ret = -ENODEV;
3090 }
3091 break;
3092 case IOMMU_DOMAIN_DMA:
3093 switch(attr) {
3094 case DOMAIN_ATTR_DMA_USE_FLUSH_QUEUE:
3095 smmu_domain->non_strict = *(int *)data;
3096 break;
3097 default:
3098 ret = -ENODEV;
3099 }
3100 break;
3101 default:
3102 ret = -EINVAL;
3103 }
3104
3105out_unlock:
3106 mutex_unlock(&smmu_domain->init_mutex);
3107 return ret;
3108}
3109
3110static int arm_smmu_of_xlate(struct device *dev, struct of_phandle_args *args)
3111{
3112 return iommu_fwspec_add_ids(dev, args->args, 1);
3113}
3114
3115static void arm_smmu_get_resv_regions(struct device *dev,
3116 struct list_head *head)
3117{
3118 struct iommu_resv_region *region;
3119 int prot = IOMMU_WRITE | IOMMU_NOEXEC | IOMMU_MMIO;
3120
3121 region = iommu_alloc_resv_region(MSI_IOVA_BASE, MSI_IOVA_LENGTH,
3122 prot, IOMMU_RESV_SW_MSI);
3123 if (!region)
3124 return;
3125
3126 list_add_tail(®ion->list, head);
3127
3128 iommu_dma_get_resv_regions(dev, head);
3129}
3130
3131static struct iommu_ops arm_smmu_ops = {
3132 .capable = arm_smmu_capable,
3133 .domain_alloc = arm_smmu_domain_alloc,
3134 .domain_free = arm_smmu_domain_free,
3135 .attach_dev = arm_smmu_attach_dev,
3136 .map = arm_smmu_map,
3137 .unmap = arm_smmu_unmap,
3138 .flush_iotlb_all = arm_smmu_flush_iotlb_all,
3139 .iotlb_sync = arm_smmu_iotlb_sync,
3140 .iova_to_phys = arm_smmu_iova_to_phys,
3141 .add_device = arm_smmu_add_device,
3142 .remove_device = arm_smmu_remove_device,
3143 .device_group = arm_smmu_device_group,
3144 .domain_get_attr = arm_smmu_domain_get_attr,
3145 .domain_set_attr = arm_smmu_domain_set_attr,
3146 .of_xlate = arm_smmu_of_xlate,
3147 .get_resv_regions = arm_smmu_get_resv_regions,
3148 .put_resv_regions = generic_iommu_put_resv_regions,
3149 .pgsize_bitmap = -1UL,
3150};
3151
3152
3153static int arm_smmu_init_one_queue(struct arm_smmu_device *smmu,
3154 struct arm_smmu_queue *q,
3155 unsigned long prod_off,
3156 unsigned long cons_off,
3157 size_t dwords, const char *name)
3158{
3159 size_t qsz;
3160
3161 do {
3162 qsz = ((1 << q->llq.max_n_shift) * dwords) << 3;
3163 q->base = dmam_alloc_coherent(smmu->dev, qsz, &q->base_dma,
3164 GFP_KERNEL);
3165 if (q->base || qsz < PAGE_SIZE)
3166 break;
3167
3168 q->llq.max_n_shift--;
3169 } while (1);
3170
3171 if (!q->base) {
3172 dev_err(smmu->dev,
3173 "failed to allocate queue (0x%zx bytes) for %s\n",
3174 qsz, name);
3175 return -ENOMEM;
3176 }
3177
3178 if (!WARN_ON(q->base_dma & (qsz - 1))) {
3179 dev_info(smmu->dev, "allocated %u entries for %s\n",
3180 1 << q->llq.max_n_shift, name);
3181 }
3182
3183 q->prod_reg = arm_smmu_page1_fixup(prod_off, smmu);
3184 q->cons_reg = arm_smmu_page1_fixup(cons_off, smmu);
3185 q->ent_dwords = dwords;
3186
3187 q->q_base = Q_BASE_RWA;
3188 q->q_base |= q->base_dma & Q_BASE_ADDR_MASK;
3189 q->q_base |= FIELD_PREP(Q_BASE_LOG2SIZE, q->llq.max_n_shift);
3190
3191 q->llq.prod = q->llq.cons = 0;
3192 return 0;
3193}
3194
3195static void arm_smmu_cmdq_free_bitmap(void *data)
3196{
3197 unsigned long *bitmap = data;
3198 bitmap_free(bitmap);
3199}
3200
3201static int arm_smmu_cmdq_init(struct arm_smmu_device *smmu)
3202{
3203 int ret = 0;
3204 struct arm_smmu_cmdq *cmdq = &smmu->cmdq;
3205 unsigned int nents = 1 << cmdq->q.llq.max_n_shift;
3206 atomic_long_t *bitmap;
3207
3208 atomic_set(&cmdq->owner_prod, 0);
3209 atomic_set(&cmdq->lock, 0);
3210
3211 bitmap = (atomic_long_t *)bitmap_zalloc(nents, GFP_KERNEL);
3212 if (!bitmap) {
3213 dev_err(smmu->dev, "failed to allocate cmdq bitmap\n");
3214 ret = -ENOMEM;
3215 } else {
3216 cmdq->valid_map = bitmap;
3217 devm_add_action(smmu->dev, arm_smmu_cmdq_free_bitmap, bitmap);
3218 }
3219
3220 return ret;
3221}
3222
3223static int arm_smmu_init_queues(struct arm_smmu_device *smmu)
3224{
3225 int ret;
3226
3227
3228 ret = arm_smmu_init_one_queue(smmu, &smmu->cmdq.q, ARM_SMMU_CMDQ_PROD,
3229 ARM_SMMU_CMDQ_CONS, CMDQ_ENT_DWORDS,
3230 "cmdq");
3231 if (ret)
3232 return ret;
3233
3234 ret = arm_smmu_cmdq_init(smmu);
3235 if (ret)
3236 return ret;
3237
3238
3239 ret = arm_smmu_init_one_queue(smmu, &smmu->evtq.q, ARM_SMMU_EVTQ_PROD,
3240 ARM_SMMU_EVTQ_CONS, EVTQ_ENT_DWORDS,
3241 "evtq");
3242 if (ret)
3243 return ret;
3244
3245
3246 if (!(smmu->features & ARM_SMMU_FEAT_PRI))
3247 return 0;
3248
3249 return arm_smmu_init_one_queue(smmu, &smmu->priq.q, ARM_SMMU_PRIQ_PROD,
3250 ARM_SMMU_PRIQ_CONS, PRIQ_ENT_DWORDS,
3251 "priq");
3252}
3253
3254static int arm_smmu_init_l1_strtab(struct arm_smmu_device *smmu)
3255{
3256 unsigned int i;
3257 struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg;
3258 size_t size = sizeof(*cfg->l1_desc) * cfg->num_l1_ents;
3259 void *strtab = smmu->strtab_cfg.strtab;
3260
3261 cfg->l1_desc = devm_kzalloc(smmu->dev, size, GFP_KERNEL);
3262 if (!cfg->l1_desc) {
3263 dev_err(smmu->dev, "failed to allocate l1 stream table desc\n");
3264 return -ENOMEM;
3265 }
3266
3267 for (i = 0; i < cfg->num_l1_ents; ++i) {
3268 arm_smmu_write_strtab_l1_desc(strtab, &cfg->l1_desc[i]);
3269 strtab += STRTAB_L1_DESC_DWORDS << 3;
3270 }
3271
3272 return 0;
3273}
3274
3275static int arm_smmu_init_strtab_2lvl(struct arm_smmu_device *smmu)
3276{
3277 void *strtab;
3278 u64 reg;
3279 u32 size, l1size;
3280 struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg;
3281
3282
3283 size = STRTAB_L1_SZ_SHIFT - (ilog2(STRTAB_L1_DESC_DWORDS) + 3);
3284 size = min(size, smmu->sid_bits - STRTAB_SPLIT);
3285 cfg->num_l1_ents = 1 << size;
3286
3287 size += STRTAB_SPLIT;
3288 if (size < smmu->sid_bits)
3289 dev_warn(smmu->dev,
3290 "2-level strtab only covers %u/%u bits of SID\n",
3291 size, smmu->sid_bits);
3292
3293 l1size = cfg->num_l1_ents * (STRTAB_L1_DESC_DWORDS << 3);
3294 strtab = dmam_alloc_coherent(smmu->dev, l1size, &cfg->strtab_dma,
3295 GFP_KERNEL);
3296 if (!strtab) {
3297 dev_err(smmu->dev,
3298 "failed to allocate l1 stream table (%u bytes)\n",
3299 size);
3300 return -ENOMEM;
3301 }
3302 cfg->strtab = strtab;
3303
3304
3305 reg = FIELD_PREP(STRTAB_BASE_CFG_FMT, STRTAB_BASE_CFG_FMT_2LVL);
3306 reg |= FIELD_PREP(STRTAB_BASE_CFG_LOG2SIZE, size);
3307 reg |= FIELD_PREP(STRTAB_BASE_CFG_SPLIT, STRTAB_SPLIT);
3308 cfg->strtab_base_cfg = reg;
3309
3310 return arm_smmu_init_l1_strtab(smmu);
3311}
3312
3313static int arm_smmu_init_strtab_linear(struct arm_smmu_device *smmu)
3314{
3315 void *strtab;
3316 u64 reg;
3317 u32 size;
3318 struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg;
3319
3320 size = (1 << smmu->sid_bits) * (STRTAB_STE_DWORDS << 3);
3321 strtab = dmam_alloc_coherent(smmu->dev, size, &cfg->strtab_dma,
3322 GFP_KERNEL);
3323 if (!strtab) {
3324 dev_err(smmu->dev,
3325 "failed to allocate linear stream table (%u bytes)\n",
3326 size);
3327 return -ENOMEM;
3328 }
3329 cfg->strtab = strtab;
3330 cfg->num_l1_ents = 1 << smmu->sid_bits;
3331
3332
3333 reg = FIELD_PREP(STRTAB_BASE_CFG_FMT, STRTAB_BASE_CFG_FMT_LINEAR);
3334 reg |= FIELD_PREP(STRTAB_BASE_CFG_LOG2SIZE, smmu->sid_bits);
3335 cfg->strtab_base_cfg = reg;
3336
3337 arm_smmu_init_bypass_stes(strtab, cfg->num_l1_ents);
3338 return 0;
3339}
3340
3341static int arm_smmu_init_strtab(struct arm_smmu_device *smmu)
3342{
3343 u64 reg;
3344 int ret;
3345
3346 if (smmu->features & ARM_SMMU_FEAT_2_LVL_STRTAB)
3347 ret = arm_smmu_init_strtab_2lvl(smmu);
3348 else
3349 ret = arm_smmu_init_strtab_linear(smmu);
3350
3351 if (ret)
3352 return ret;
3353
3354
3355 reg = smmu->strtab_cfg.strtab_dma & STRTAB_BASE_ADDR_MASK;
3356 reg |= STRTAB_BASE_RA;
3357 smmu->strtab_cfg.strtab_base = reg;
3358
3359
3360 set_bit(0, smmu->vmid_map);
3361 return 0;
3362}
3363
3364static int arm_smmu_init_structures(struct arm_smmu_device *smmu)
3365{
3366 int ret;
3367
3368 ret = arm_smmu_init_queues(smmu);
3369 if (ret)
3370 return ret;
3371
3372 return arm_smmu_init_strtab(smmu);
3373}
3374
3375static int arm_smmu_write_reg_sync(struct arm_smmu_device *smmu, u32 val,
3376 unsigned int reg_off, unsigned int ack_off)
3377{
3378 u32 reg;
3379
3380 writel_relaxed(val, smmu->base + reg_off);
3381 return readl_relaxed_poll_timeout(smmu->base + ack_off, reg, reg == val,
3382 1, ARM_SMMU_POLL_TIMEOUT_US);
3383}
3384
3385
3386static int arm_smmu_update_gbpa(struct arm_smmu_device *smmu, u32 set, u32 clr)
3387{
3388 int ret;
3389 u32 reg, __iomem *gbpa = smmu->base + ARM_SMMU_GBPA;
3390
3391 ret = readl_relaxed_poll_timeout(gbpa, reg, !(reg & GBPA_UPDATE),
3392 1, ARM_SMMU_POLL_TIMEOUT_US);
3393 if (ret)
3394 return ret;
3395
3396 reg &= ~clr;
3397 reg |= set;
3398 writel_relaxed(reg | GBPA_UPDATE, gbpa);
3399 ret = readl_relaxed_poll_timeout(gbpa, reg, !(reg & GBPA_UPDATE),
3400 1, ARM_SMMU_POLL_TIMEOUT_US);
3401
3402 if (ret)
3403 dev_err(smmu->dev, "GBPA not responding to update\n");
3404 return ret;
3405}
3406
3407static void arm_smmu_free_msis(void *data)
3408{
3409 struct device *dev = data;
3410 platform_msi_domain_free_irqs(dev);
3411}
3412
3413static void arm_smmu_write_msi_msg(struct msi_desc *desc, struct msi_msg *msg)
3414{
3415 phys_addr_t doorbell;
3416 struct device *dev = msi_desc_to_dev(desc);
3417 struct arm_smmu_device *smmu = dev_get_drvdata(dev);
3418 phys_addr_t *cfg = arm_smmu_msi_cfg[desc->platform.msi_index];
3419
3420 doorbell = (((u64)msg->address_hi) << 32) | msg->address_lo;
3421 doorbell &= MSI_CFG0_ADDR_MASK;
3422
3423 writeq_relaxed(doorbell, smmu->base + cfg[0]);
3424 writel_relaxed(msg->data, smmu->base + cfg[1]);
3425 writel_relaxed(ARM_SMMU_MEMATTR_DEVICE_nGnRE, smmu->base + cfg[2]);
3426}
3427
3428static void arm_smmu_setup_msis(struct arm_smmu_device *smmu)
3429{
3430 struct msi_desc *desc;
3431 int ret, nvec = ARM_SMMU_MAX_MSIS;
3432 struct device *dev = smmu->dev;
3433
3434
3435 writeq_relaxed(0, smmu->base + ARM_SMMU_GERROR_IRQ_CFG0);
3436 writeq_relaxed(0, smmu->base + ARM_SMMU_EVTQ_IRQ_CFG0);
3437
3438 if (smmu->features & ARM_SMMU_FEAT_PRI)
3439 writeq_relaxed(0, smmu->base + ARM_SMMU_PRIQ_IRQ_CFG0);
3440 else
3441 nvec--;
3442
3443 if (!(smmu->features & ARM_SMMU_FEAT_MSI))
3444 return;
3445
3446 if (!dev->msi_domain) {
3447 dev_info(smmu->dev, "msi_domain absent - falling back to wired irqs\n");
3448 return;
3449 }
3450
3451
3452 ret = platform_msi_domain_alloc_irqs(dev, nvec, arm_smmu_write_msi_msg);
3453 if (ret) {
3454 dev_warn(dev, "failed to allocate MSIs - falling back to wired irqs\n");
3455 return;
3456 }
3457
3458 for_each_msi_entry(desc, dev) {
3459 switch (desc->platform.msi_index) {
3460 case EVTQ_MSI_INDEX:
3461 smmu->evtq.q.irq = desc->irq;
3462 break;
3463 case GERROR_MSI_INDEX:
3464 smmu->gerr_irq = desc->irq;
3465 break;
3466 case PRIQ_MSI_INDEX:
3467 smmu->priq.q.irq = desc->irq;
3468 break;
3469 default:
3470 continue;
3471 }
3472 }
3473
3474
3475 devm_add_action(dev, arm_smmu_free_msis, dev);
3476}
3477
3478static void arm_smmu_setup_unique_irqs(struct arm_smmu_device *smmu)
3479{
3480 int irq, ret;
3481
3482 arm_smmu_setup_msis(smmu);
3483
3484
3485 irq = smmu->evtq.q.irq;
3486 if (irq) {
3487 ret = devm_request_threaded_irq(smmu->dev, irq, NULL,
3488 arm_smmu_evtq_thread,
3489 IRQF_ONESHOT,
3490 "arm-smmu-v3-evtq", smmu);
3491 if (ret < 0)
3492 dev_warn(smmu->dev, "failed to enable evtq irq\n");
3493 } else {
3494 dev_warn(smmu->dev, "no evtq irq - events will not be reported!\n");
3495 }
3496
3497 irq = smmu->gerr_irq;
3498 if (irq) {
3499 ret = devm_request_irq(smmu->dev, irq, arm_smmu_gerror_handler,
3500 0, "arm-smmu-v3-gerror", smmu);
3501 if (ret < 0)
3502 dev_warn(smmu->dev, "failed to enable gerror irq\n");
3503 } else {
3504 dev_warn(smmu->dev, "no gerr irq - errors will not be reported!\n");
3505 }
3506
3507 if (smmu->features & ARM_SMMU_FEAT_PRI) {
3508 irq = smmu->priq.q.irq;
3509 if (irq) {
3510 ret = devm_request_threaded_irq(smmu->dev, irq, NULL,
3511 arm_smmu_priq_thread,
3512 IRQF_ONESHOT,
3513 "arm-smmu-v3-priq",
3514 smmu);
3515 if (ret < 0)
3516 dev_warn(smmu->dev,
3517 "failed to enable priq irq\n");
3518 } else {
3519 dev_warn(smmu->dev, "no priq irq - PRI will be broken\n");
3520 }
3521 }
3522}
3523
3524static int arm_smmu_setup_irqs(struct arm_smmu_device *smmu)
3525{
3526 int ret, irq;
3527 u32 irqen_flags = IRQ_CTRL_EVTQ_IRQEN | IRQ_CTRL_GERROR_IRQEN;
3528
3529
3530 ret = arm_smmu_write_reg_sync(smmu, 0, ARM_SMMU_IRQ_CTRL,
3531 ARM_SMMU_IRQ_CTRLACK);
3532 if (ret) {
3533 dev_err(smmu->dev, "failed to disable irqs\n");
3534 return ret;
3535 }
3536
3537 irq = smmu->combined_irq;
3538 if (irq) {
3539
3540
3541
3542
3543 ret = devm_request_threaded_irq(smmu->dev, irq,
3544 arm_smmu_combined_irq_handler,
3545 arm_smmu_combined_irq_thread,
3546 IRQF_ONESHOT,
3547 "arm-smmu-v3-combined-irq", smmu);
3548 if (ret < 0)
3549 dev_warn(smmu->dev, "failed to enable combined irq\n");
3550 } else
3551 arm_smmu_setup_unique_irqs(smmu);
3552
3553 if (smmu->features & ARM_SMMU_FEAT_PRI)
3554 irqen_flags |= IRQ_CTRL_PRIQ_IRQEN;
3555
3556
3557 ret = arm_smmu_write_reg_sync(smmu, irqen_flags,
3558 ARM_SMMU_IRQ_CTRL, ARM_SMMU_IRQ_CTRLACK);
3559 if (ret)
3560 dev_warn(smmu->dev, "failed to enable irqs\n");
3561
3562 return 0;
3563}
3564
3565static int arm_smmu_device_disable(struct arm_smmu_device *smmu)
3566{
3567 int ret;
3568
3569 ret = arm_smmu_write_reg_sync(smmu, 0, ARM_SMMU_CR0, ARM_SMMU_CR0ACK);
3570 if (ret)
3571 dev_err(smmu->dev, "failed to clear cr0\n");
3572
3573 return ret;
3574}
3575
3576static int arm_smmu_device_reset(struct arm_smmu_device *smmu, bool bypass)
3577{
3578 int ret;
3579 u32 reg, enables;
3580 struct arm_smmu_cmdq_ent cmd;
3581
3582
3583 reg = readl_relaxed(smmu->base + ARM_SMMU_CR0);
3584 if (reg & CR0_SMMUEN) {
3585 dev_warn(smmu->dev, "SMMU currently enabled! Resetting...\n");
3586 WARN_ON(is_kdump_kernel() && !disable_bypass);
3587 arm_smmu_update_gbpa(smmu, GBPA_ABORT, 0);
3588 }
3589
3590 ret = arm_smmu_device_disable(smmu);
3591 if (ret)
3592 return ret;
3593
3594
3595 reg = FIELD_PREP(CR1_TABLE_SH, ARM_SMMU_SH_ISH) |
3596 FIELD_PREP(CR1_TABLE_OC, CR1_CACHE_WB) |
3597 FIELD_PREP(CR1_TABLE_IC, CR1_CACHE_WB) |
3598 FIELD_PREP(CR1_QUEUE_SH, ARM_SMMU_SH_ISH) |
3599 FIELD_PREP(CR1_QUEUE_OC, CR1_CACHE_WB) |
3600 FIELD_PREP(CR1_QUEUE_IC, CR1_CACHE_WB);
3601 writel_relaxed(reg, smmu->base + ARM_SMMU_CR1);
3602
3603
3604 reg = CR2_PTM | CR2_RECINVSID | CR2_E2H;
3605 writel_relaxed(reg, smmu->base + ARM_SMMU_CR2);
3606
3607
3608 writeq_relaxed(smmu->strtab_cfg.strtab_base,
3609 smmu->base + ARM_SMMU_STRTAB_BASE);
3610 writel_relaxed(smmu->strtab_cfg.strtab_base_cfg,
3611 smmu->base + ARM_SMMU_STRTAB_BASE_CFG);
3612
3613
3614 writeq_relaxed(smmu->cmdq.q.q_base, smmu->base + ARM_SMMU_CMDQ_BASE);
3615 writel_relaxed(smmu->cmdq.q.llq.prod, smmu->base + ARM_SMMU_CMDQ_PROD);
3616 writel_relaxed(smmu->cmdq.q.llq.cons, smmu->base + ARM_SMMU_CMDQ_CONS);
3617
3618 enables = CR0_CMDQEN;
3619 ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
3620 ARM_SMMU_CR0ACK);
3621 if (ret) {
3622 dev_err(smmu->dev, "failed to enable command queue\n");
3623 return ret;
3624 }
3625
3626
3627 cmd.opcode = CMDQ_OP_CFGI_ALL;
3628 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
3629 arm_smmu_cmdq_issue_sync(smmu);
3630
3631
3632 if (smmu->features & ARM_SMMU_FEAT_HYP) {
3633 cmd.opcode = CMDQ_OP_TLBI_EL2_ALL;
3634 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
3635 }
3636
3637 cmd.opcode = CMDQ_OP_TLBI_NSNH_ALL;
3638 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
3639 arm_smmu_cmdq_issue_sync(smmu);
3640
3641
3642 writeq_relaxed(smmu->evtq.q.q_base, smmu->base + ARM_SMMU_EVTQ_BASE);
3643 writel_relaxed(smmu->evtq.q.llq.prod,
3644 arm_smmu_page1_fixup(ARM_SMMU_EVTQ_PROD, smmu));
3645 writel_relaxed(smmu->evtq.q.llq.cons,
3646 arm_smmu_page1_fixup(ARM_SMMU_EVTQ_CONS, smmu));
3647
3648 enables |= CR0_EVTQEN;
3649 ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
3650 ARM_SMMU_CR0ACK);
3651 if (ret) {
3652 dev_err(smmu->dev, "failed to enable event queue\n");
3653 return ret;
3654 }
3655
3656
3657 if (smmu->features & ARM_SMMU_FEAT_PRI) {
3658 writeq_relaxed(smmu->priq.q.q_base,
3659 smmu->base + ARM_SMMU_PRIQ_BASE);
3660 writel_relaxed(smmu->priq.q.llq.prod,
3661 arm_smmu_page1_fixup(ARM_SMMU_PRIQ_PROD, smmu));
3662 writel_relaxed(smmu->priq.q.llq.cons,
3663 arm_smmu_page1_fixup(ARM_SMMU_PRIQ_CONS, smmu));
3664
3665 enables |= CR0_PRIQEN;
3666 ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
3667 ARM_SMMU_CR0ACK);
3668 if (ret) {
3669 dev_err(smmu->dev, "failed to enable PRI queue\n");
3670 return ret;
3671 }
3672 }
3673
3674 if (smmu->features & ARM_SMMU_FEAT_ATS) {
3675 enables |= CR0_ATSCHK;
3676 ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
3677 ARM_SMMU_CR0ACK);
3678 if (ret) {
3679 dev_err(smmu->dev, "failed to enable ATS check\n");
3680 return ret;
3681 }
3682 }
3683
3684 ret = arm_smmu_setup_irqs(smmu);
3685 if (ret) {
3686 dev_err(smmu->dev, "failed to setup irqs\n");
3687 return ret;
3688 }
3689
3690 if (is_kdump_kernel())
3691 enables &= ~(CR0_EVTQEN | CR0_PRIQEN);
3692
3693
3694 if (!bypass || disable_bypass) {
3695 enables |= CR0_SMMUEN;
3696 } else {
3697 ret = arm_smmu_update_gbpa(smmu, 0, GBPA_ABORT);
3698 if (ret)
3699 return ret;
3700 }
3701 ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
3702 ARM_SMMU_CR0ACK);
3703 if (ret) {
3704 dev_err(smmu->dev, "failed to enable SMMU interface\n");
3705 return ret;
3706 }
3707
3708 return 0;
3709}
3710
3711static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
3712{
3713 u32 reg;
3714 bool coherent = smmu->features & ARM_SMMU_FEAT_COHERENCY;
3715
3716
3717 reg = readl_relaxed(smmu->base + ARM_SMMU_IDR0);
3718
3719
3720 if (FIELD_GET(IDR0_ST_LVL, reg) == IDR0_ST_LVL_2LVL)
3721 smmu->features |= ARM_SMMU_FEAT_2_LVL_STRTAB;
3722
3723 if (reg & IDR0_CD2L)
3724 smmu->features |= ARM_SMMU_FEAT_2_LVL_CDTAB;
3725
3726
3727
3728
3729
3730
3731 switch (FIELD_GET(IDR0_TTENDIAN, reg)) {
3732 case IDR0_TTENDIAN_MIXED:
3733 smmu->features |= ARM_SMMU_FEAT_TT_LE | ARM_SMMU_FEAT_TT_BE;
3734 break;
3735#ifdef __BIG_ENDIAN
3736 case IDR0_TTENDIAN_BE:
3737 smmu->features |= ARM_SMMU_FEAT_TT_BE;
3738 break;
3739#else
3740 case IDR0_TTENDIAN_LE:
3741 smmu->features |= ARM_SMMU_FEAT_TT_LE;
3742 break;
3743#endif
3744 default:
3745 dev_err(smmu->dev, "unknown/unsupported TT endianness!\n");
3746 return -ENXIO;
3747 }
3748
3749
3750 if (IS_ENABLED(CONFIG_PCI_PRI) && reg & IDR0_PRI)
3751 smmu->features |= ARM_SMMU_FEAT_PRI;
3752
3753 if (IS_ENABLED(CONFIG_PCI_ATS) && reg & IDR0_ATS)
3754 smmu->features |= ARM_SMMU_FEAT_ATS;
3755
3756 if (reg & IDR0_SEV)
3757 smmu->features |= ARM_SMMU_FEAT_SEV;
3758
3759 if (reg & IDR0_MSI)
3760 smmu->features |= ARM_SMMU_FEAT_MSI;
3761
3762 if (reg & IDR0_HYP)
3763 smmu->features |= ARM_SMMU_FEAT_HYP;
3764
3765
3766
3767
3768
3769 if (!!(reg & IDR0_COHACC) != coherent)
3770 dev_warn(smmu->dev, "IDR0.COHACC overridden by FW configuration (%s)\n",
3771 coherent ? "true" : "false");
3772
3773 switch (FIELD_GET(IDR0_STALL_MODEL, reg)) {
3774 case IDR0_STALL_MODEL_FORCE:
3775 smmu->features |= ARM_SMMU_FEAT_STALL_FORCE;
3776
3777 case IDR0_STALL_MODEL_STALL:
3778 smmu->features |= ARM_SMMU_FEAT_STALLS;
3779 }
3780
3781 if (reg & IDR0_S1P)
3782 smmu->features |= ARM_SMMU_FEAT_TRANS_S1;
3783
3784 if (reg & IDR0_S2P)
3785 smmu->features |= ARM_SMMU_FEAT_TRANS_S2;
3786
3787 if (!(reg & (IDR0_S1P | IDR0_S2P))) {
3788 dev_err(smmu->dev, "no translation support!\n");
3789 return -ENXIO;
3790 }
3791
3792
3793 switch (FIELD_GET(IDR0_TTF, reg)) {
3794 case IDR0_TTF_AARCH32_64:
3795 smmu->ias = 40;
3796
3797 case IDR0_TTF_AARCH64:
3798 break;
3799 default:
3800 dev_err(smmu->dev, "AArch64 table format not supported!\n");
3801 return -ENXIO;
3802 }
3803
3804
3805 smmu->asid_bits = reg & IDR0_ASID16 ? 16 : 8;
3806 smmu->vmid_bits = reg & IDR0_VMID16 ? 16 : 8;
3807
3808
3809 reg = readl_relaxed(smmu->base + ARM_SMMU_IDR1);
3810 if (reg & (IDR1_TABLES_PRESET | IDR1_QUEUES_PRESET | IDR1_REL)) {
3811 dev_err(smmu->dev, "embedded implementation not supported\n");
3812 return -ENXIO;
3813 }
3814
3815
3816 smmu->cmdq.q.llq.max_n_shift = min_t(u32, CMDQ_MAX_SZ_SHIFT,
3817 FIELD_GET(IDR1_CMDQS, reg));
3818 if (smmu->cmdq.q.llq.max_n_shift <= ilog2(CMDQ_BATCH_ENTRIES)) {
3819
3820
3821
3822
3823
3824
3825 dev_err(smmu->dev, "command queue size <= %d entries not supported\n",
3826 CMDQ_BATCH_ENTRIES);
3827 return -ENXIO;
3828 }
3829
3830 smmu->evtq.q.llq.max_n_shift = min_t(u32, EVTQ_MAX_SZ_SHIFT,
3831 FIELD_GET(IDR1_EVTQS, reg));
3832 smmu->priq.q.llq.max_n_shift = min_t(u32, PRIQ_MAX_SZ_SHIFT,
3833 FIELD_GET(IDR1_PRIQS, reg));
3834
3835
3836 smmu->ssid_bits = FIELD_GET(IDR1_SSIDSIZE, reg);
3837 smmu->sid_bits = FIELD_GET(IDR1_SIDSIZE, reg);
3838
3839
3840
3841
3842
3843 if (smmu->sid_bits <= STRTAB_SPLIT)
3844 smmu->features &= ~ARM_SMMU_FEAT_2_LVL_STRTAB;
3845
3846
3847 reg = readl_relaxed(smmu->base + ARM_SMMU_IDR3);
3848 if (FIELD_GET(IDR3_RIL, reg))
3849 smmu->features |= ARM_SMMU_FEAT_RANGE_INV;
3850
3851
3852 reg = readl_relaxed(smmu->base + ARM_SMMU_IDR5);
3853
3854
3855 smmu->evtq.max_stalls = FIELD_GET(IDR5_STALL_MAX, reg);
3856
3857
3858 if (reg & IDR5_GRAN64K)
3859 smmu->pgsize_bitmap |= SZ_64K | SZ_512M;
3860 if (reg & IDR5_GRAN16K)
3861 smmu->pgsize_bitmap |= SZ_16K | SZ_32M;
3862 if (reg & IDR5_GRAN4K)
3863 smmu->pgsize_bitmap |= SZ_4K | SZ_2M | SZ_1G;
3864
3865
3866 if (FIELD_GET(IDR5_VAX, reg) == IDR5_VAX_52_BIT)
3867 smmu->features |= ARM_SMMU_FEAT_VAX;
3868
3869
3870 switch (FIELD_GET(IDR5_OAS, reg)) {
3871 case IDR5_OAS_32_BIT:
3872 smmu->oas = 32;
3873 break;
3874 case IDR5_OAS_36_BIT:
3875 smmu->oas = 36;
3876 break;
3877 case IDR5_OAS_40_BIT:
3878 smmu->oas = 40;
3879 break;
3880 case IDR5_OAS_42_BIT:
3881 smmu->oas = 42;
3882 break;
3883 case IDR5_OAS_44_BIT:
3884 smmu->oas = 44;
3885 break;
3886 case IDR5_OAS_52_BIT:
3887 smmu->oas = 52;
3888 smmu->pgsize_bitmap |= 1ULL << 42;
3889 break;
3890 default:
3891 dev_info(smmu->dev,
3892 "unknown output address size. Truncating to 48-bit\n");
3893
3894 case IDR5_OAS_48_BIT:
3895 smmu->oas = 48;
3896 }
3897
3898 if (arm_smmu_ops.pgsize_bitmap == -1UL)
3899 arm_smmu_ops.pgsize_bitmap = smmu->pgsize_bitmap;
3900 else
3901 arm_smmu_ops.pgsize_bitmap |= smmu->pgsize_bitmap;
3902
3903
3904 if (dma_set_mask_and_coherent(smmu->dev, DMA_BIT_MASK(smmu->oas)))
3905 dev_warn(smmu->dev,
3906 "failed to set DMA mask for table walker\n");
3907
3908 smmu->ias = max(smmu->ias, smmu->oas);
3909
3910 dev_info(smmu->dev, "ias %lu-bit, oas %lu-bit (features 0x%08x)\n",
3911 smmu->ias, smmu->oas, smmu->features);
3912 return 0;
3913}
3914
3915#ifdef CONFIG_ACPI
3916static void acpi_smmu_get_options(u32 model, struct arm_smmu_device *smmu)
3917{
3918 switch (model) {
3919 case ACPI_IORT_SMMU_V3_CAVIUM_CN99XX:
3920 smmu->options |= ARM_SMMU_OPT_PAGE0_REGS_ONLY;
3921 break;
3922 case ACPI_IORT_SMMU_V3_HISILICON_HI161X:
3923 smmu->options |= ARM_SMMU_OPT_SKIP_PREFETCH;
3924 break;
3925 }
3926
3927 dev_notice(smmu->dev, "option mask 0x%x\n", smmu->options);
3928}
3929
3930static int arm_smmu_device_acpi_probe(struct platform_device *pdev,
3931 struct arm_smmu_device *smmu)
3932{
3933 struct acpi_iort_smmu_v3 *iort_smmu;
3934 struct device *dev = smmu->dev;
3935 struct acpi_iort_node *node;
3936
3937 node = *(struct acpi_iort_node **)dev_get_platdata(dev);
3938
3939
3940 iort_smmu = (struct acpi_iort_smmu_v3 *)node->node_data;
3941
3942 acpi_smmu_get_options(iort_smmu->model, smmu);
3943
3944 if (iort_smmu->flags & ACPI_IORT_SMMU_V3_COHACC_OVERRIDE)
3945 smmu->features |= ARM_SMMU_FEAT_COHERENCY;
3946
3947 return 0;
3948}
3949#else
3950static inline int arm_smmu_device_acpi_probe(struct platform_device *pdev,
3951 struct arm_smmu_device *smmu)
3952{
3953 return -ENODEV;
3954}
3955#endif
3956
3957static int arm_smmu_device_dt_probe(struct platform_device *pdev,
3958 struct arm_smmu_device *smmu)
3959{
3960 struct device *dev = &pdev->dev;
3961 u32 cells;
3962 int ret = -EINVAL;
3963
3964 if (of_property_read_u32(dev->of_node, "#iommu-cells", &cells))
3965 dev_err(dev, "missing #iommu-cells property\n");
3966 else if (cells != 1)
3967 dev_err(dev, "invalid #iommu-cells value (%d)\n", cells);
3968 else
3969 ret = 0;
3970
3971 parse_driver_options(smmu);
3972
3973 if (of_dma_is_coherent(dev->of_node))
3974 smmu->features |= ARM_SMMU_FEAT_COHERENCY;
3975
3976 return ret;
3977}
3978
3979static unsigned long arm_smmu_resource_size(struct arm_smmu_device *smmu)
3980{
3981 if (smmu->options & ARM_SMMU_OPT_PAGE0_REGS_ONLY)
3982 return SZ_64K;
3983 else
3984 return SZ_128K;
3985}
3986
3987static int arm_smmu_set_bus_ops(struct iommu_ops *ops)
3988{
3989 int err;
3990
3991#ifdef CONFIG_PCI
3992 if (pci_bus_type.iommu_ops != ops) {
3993 err = bus_set_iommu(&pci_bus_type, ops);
3994 if (err)
3995 return err;
3996 }
3997#endif
3998#ifdef CONFIG_ARM_AMBA
3999 if (amba_bustype.iommu_ops != ops) {
4000 err = bus_set_iommu(&amba_bustype, ops);
4001 if (err)
4002 goto err_reset_pci_ops;
4003 }
4004#endif
4005 if (platform_bus_type.iommu_ops != ops) {
4006 err = bus_set_iommu(&platform_bus_type, ops);
4007 if (err)
4008 goto err_reset_amba_ops;
4009 }
4010
4011 return 0;
4012
4013err_reset_amba_ops:
4014#ifdef CONFIG_ARM_AMBA
4015 bus_set_iommu(&amba_bustype, NULL);
4016#endif
4017err_reset_pci_ops: __maybe_unused;
4018#ifdef CONFIG_PCI
4019 bus_set_iommu(&pci_bus_type, NULL);
4020#endif
4021 return err;
4022}
4023
4024static int arm_smmu_device_probe(struct platform_device *pdev)
4025{
4026 int irq, ret;
4027 struct resource *res;
4028 resource_size_t ioaddr;
4029 struct arm_smmu_device *smmu;
4030 struct device *dev = &pdev->dev;
4031 bool bypass;
4032
4033 smmu = devm_kzalloc(dev, sizeof(*smmu), GFP_KERNEL);
4034 if (!smmu) {
4035 dev_err(dev, "failed to allocate arm_smmu_device\n");
4036 return -ENOMEM;
4037 }
4038 smmu->dev = dev;
4039
4040 if (dev->of_node) {
4041 ret = arm_smmu_device_dt_probe(pdev, smmu);
4042 } else {
4043 ret = arm_smmu_device_acpi_probe(pdev, smmu);
4044 if (ret == -ENODEV)
4045 return ret;
4046 }
4047
4048
4049 bypass = !!ret;
4050
4051
4052 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
4053 if (resource_size(res) < arm_smmu_resource_size(smmu)) {
4054 dev_err(dev, "MMIO region too small (%pr)\n", res);
4055 return -EINVAL;
4056 }
4057 ioaddr = res->start;
4058
4059 smmu->base = devm_ioremap_resource(dev, res);
4060 if (IS_ERR(smmu->base))
4061 return PTR_ERR(smmu->base);
4062
4063
4064
4065 irq = platform_get_irq_byname_optional(pdev, "combined");
4066 if (irq > 0)
4067 smmu->combined_irq = irq;
4068 else {
4069 irq = platform_get_irq_byname_optional(pdev, "eventq");
4070 if (irq > 0)
4071 smmu->evtq.q.irq = irq;
4072
4073 irq = platform_get_irq_byname_optional(pdev, "priq");
4074 if (irq > 0)
4075 smmu->priq.q.irq = irq;
4076
4077 irq = platform_get_irq_byname_optional(pdev, "gerror");
4078 if (irq > 0)
4079 smmu->gerr_irq = irq;
4080 }
4081
4082 ret = arm_smmu_device_hw_probe(smmu);
4083 if (ret)
4084 return ret;
4085
4086
4087 ret = arm_smmu_init_structures(smmu);
4088 if (ret)
4089 return ret;
4090
4091
4092 platform_set_drvdata(pdev, smmu);
4093
4094
4095 ret = arm_smmu_device_reset(smmu, bypass);
4096 if (ret)
4097 return ret;
4098
4099
4100 ret = iommu_device_sysfs_add(&smmu->iommu, dev, NULL,
4101 "smmu3.%pa", &ioaddr);
4102 if (ret)
4103 return ret;
4104
4105 iommu_device_set_ops(&smmu->iommu, &arm_smmu_ops);
4106 iommu_device_set_fwnode(&smmu->iommu, dev->fwnode);
4107
4108 ret = iommu_device_register(&smmu->iommu);
4109 if (ret) {
4110 dev_err(dev, "Failed to register iommu\n");
4111 return ret;
4112 }
4113
4114 return arm_smmu_set_bus_ops(&arm_smmu_ops);
4115}
4116
4117static int arm_smmu_device_remove(struct platform_device *pdev)
4118{
4119 struct arm_smmu_device *smmu = platform_get_drvdata(pdev);
4120
4121 arm_smmu_set_bus_ops(NULL);
4122 iommu_device_unregister(&smmu->iommu);
4123 iommu_device_sysfs_remove(&smmu->iommu);
4124 arm_smmu_device_disable(smmu);
4125
4126 return 0;
4127}
4128
4129static void arm_smmu_device_shutdown(struct platform_device *pdev)
4130{
4131 arm_smmu_device_remove(pdev);
4132}
4133
4134static const struct of_device_id arm_smmu_of_match[] = {
4135 { .compatible = "arm,smmu-v3", },
4136 { },
4137};
4138MODULE_DEVICE_TABLE(of, arm_smmu_of_match);
4139
4140static struct platform_driver arm_smmu_driver = {
4141 .driver = {
4142 .name = "arm-smmu-v3",
4143 .of_match_table = arm_smmu_of_match,
4144 .suppress_bind_attrs = true,
4145 },
4146 .probe = arm_smmu_device_probe,
4147 .remove = arm_smmu_device_remove,
4148 .shutdown = arm_smmu_device_shutdown,
4149};
4150module_platform_driver(arm_smmu_driver);
4151
4152MODULE_DESCRIPTION("IOMMU API for ARM architected SMMUv3 implementations");
4153MODULE_AUTHOR("Will Deacon <will@kernel.org>");
4154MODULE_ALIAS("platform:arm-smmu-v3");
4155MODULE_LICENSE("GPL v2");
4156