blob: db40ce599e9748aed3b286bcb1f0378c640f74ca [file] [log] [blame]
Will Deacon48ec83b2015-05-27 17:25:59 +01001/*
2 * IOMMU API for ARM architected SMMUv3 implementations.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Copyright (C) 2015 ARM Limited
17 *
18 * Author: Will Deacon <will.deacon@arm.com>
19 *
20 * This driver is powered by bad coffee and bombay mix.
21 */
22
23#include <linux/delay.h>
Robin Murphy9adb9592016-01-26 18:06:36 +000024#include <linux/dma-iommu.h>
Will Deacon48ec83b2015-05-27 17:25:59 +010025#include <linux/err.h>
26#include <linux/interrupt.h>
27#include <linux/iommu.h>
28#include <linux/iopoll.h>
29#include <linux/module.h>
Marc Zyngier166bdbd2015-10-13 18:32:30 +010030#include <linux/msi.h>
Will Deacon48ec83b2015-05-27 17:25:59 +010031#include <linux/of.h>
32#include <linux/of_address.h>
Robin Murphy8f785152016-09-12 17:13:45 +010033#include <linux/of_iommu.h>
Will Deacon941a8022015-08-11 16:25:10 +010034#include <linux/of_platform.h>
Will Deacon48ec83b2015-05-27 17:25:59 +010035#include <linux/pci.h>
36#include <linux/platform_device.h>
37
Robin Murphy08d4ca22016-09-12 17:13:46 +010038#include <linux/amba/bus.h>
39
Will Deacon48ec83b2015-05-27 17:25:59 +010040#include "io-pgtable.h"
41
42/* MMIO registers */
43#define ARM_SMMU_IDR0 0x0
44#define IDR0_ST_LVL_SHIFT 27
45#define IDR0_ST_LVL_MASK 0x3
46#define IDR0_ST_LVL_2LVL (1 << IDR0_ST_LVL_SHIFT)
Prem Mallappa6380be02015-12-14 22:01:23 +053047#define IDR0_STALL_MODEL_SHIFT 24
48#define IDR0_STALL_MODEL_MASK 0x3
49#define IDR0_STALL_MODEL_STALL (0 << IDR0_STALL_MODEL_SHIFT)
50#define IDR0_STALL_MODEL_FORCE (2 << IDR0_STALL_MODEL_SHIFT)
Will Deacon48ec83b2015-05-27 17:25:59 +010051#define IDR0_TTENDIAN_SHIFT 21
52#define IDR0_TTENDIAN_MASK 0x3
53#define IDR0_TTENDIAN_LE (2 << IDR0_TTENDIAN_SHIFT)
54#define IDR0_TTENDIAN_BE (3 << IDR0_TTENDIAN_SHIFT)
55#define IDR0_TTENDIAN_MIXED (0 << IDR0_TTENDIAN_SHIFT)
56#define IDR0_CD2L (1 << 19)
57#define IDR0_VMID16 (1 << 18)
58#define IDR0_PRI (1 << 16)
59#define IDR0_SEV (1 << 14)
60#define IDR0_MSI (1 << 13)
61#define IDR0_ASID16 (1 << 12)
62#define IDR0_ATS (1 << 10)
63#define IDR0_HYP (1 << 9)
64#define IDR0_COHACC (1 << 4)
65#define IDR0_TTF_SHIFT 2
66#define IDR0_TTF_MASK 0x3
67#define IDR0_TTF_AARCH64 (2 << IDR0_TTF_SHIFT)
Will Deaconf0c453d2015-08-20 12:12:32 +010068#define IDR0_TTF_AARCH32_64 (3 << IDR0_TTF_SHIFT)
Will Deacon48ec83b2015-05-27 17:25:59 +010069#define IDR0_S1P (1 << 1)
70#define IDR0_S2P (1 << 0)
71
72#define ARM_SMMU_IDR1 0x4
73#define IDR1_TABLES_PRESET (1 << 30)
74#define IDR1_QUEUES_PRESET (1 << 29)
75#define IDR1_REL (1 << 28)
76#define IDR1_CMDQ_SHIFT 21
77#define IDR1_CMDQ_MASK 0x1f
78#define IDR1_EVTQ_SHIFT 16
79#define IDR1_EVTQ_MASK 0x1f
80#define IDR1_PRIQ_SHIFT 11
81#define IDR1_PRIQ_MASK 0x1f
82#define IDR1_SSID_SHIFT 6
83#define IDR1_SSID_MASK 0x1f
84#define IDR1_SID_SHIFT 0
85#define IDR1_SID_MASK 0x3f
86
87#define ARM_SMMU_IDR5 0x14
88#define IDR5_STALL_MAX_SHIFT 16
89#define IDR5_STALL_MAX_MASK 0xffff
90#define IDR5_GRAN64K (1 << 6)
91#define IDR5_GRAN16K (1 << 5)
92#define IDR5_GRAN4K (1 << 4)
93#define IDR5_OAS_SHIFT 0
94#define IDR5_OAS_MASK 0x7
95#define IDR5_OAS_32_BIT (0 << IDR5_OAS_SHIFT)
96#define IDR5_OAS_36_BIT (1 << IDR5_OAS_SHIFT)
97#define IDR5_OAS_40_BIT (2 << IDR5_OAS_SHIFT)
98#define IDR5_OAS_42_BIT (3 << IDR5_OAS_SHIFT)
99#define IDR5_OAS_44_BIT (4 << IDR5_OAS_SHIFT)
100#define IDR5_OAS_48_BIT (5 << IDR5_OAS_SHIFT)
101
102#define ARM_SMMU_CR0 0x20
103#define CR0_CMDQEN (1 << 3)
104#define CR0_EVTQEN (1 << 2)
105#define CR0_PRIQEN (1 << 1)
106#define CR0_SMMUEN (1 << 0)
107
108#define ARM_SMMU_CR0ACK 0x24
109
110#define ARM_SMMU_CR1 0x28
111#define CR1_SH_NSH 0
112#define CR1_SH_OSH 2
113#define CR1_SH_ISH 3
114#define CR1_CACHE_NC 0
115#define CR1_CACHE_WB 1
116#define CR1_CACHE_WT 2
117#define CR1_TABLE_SH_SHIFT 10
118#define CR1_TABLE_OC_SHIFT 8
119#define CR1_TABLE_IC_SHIFT 6
120#define CR1_QUEUE_SH_SHIFT 4
121#define CR1_QUEUE_OC_SHIFT 2
122#define CR1_QUEUE_IC_SHIFT 0
123
124#define ARM_SMMU_CR2 0x2c
125#define CR2_PTM (1 << 2)
126#define CR2_RECINVSID (1 << 1)
127#define CR2_E2H (1 << 0)
128
Robin Murphydc87a982016-09-12 17:13:44 +0100129#define ARM_SMMU_GBPA 0x44
130#define GBPA_ABORT (1 << 20)
131#define GBPA_UPDATE (1 << 31)
132
Will Deacon48ec83b2015-05-27 17:25:59 +0100133#define ARM_SMMU_IRQ_CTRL 0x50
134#define IRQ_CTRL_EVTQ_IRQEN (1 << 2)
Marc Zyngierccd63852015-07-15 11:55:18 +0100135#define IRQ_CTRL_PRIQ_IRQEN (1 << 1)
Will Deacon48ec83b2015-05-27 17:25:59 +0100136#define IRQ_CTRL_GERROR_IRQEN (1 << 0)
137
138#define ARM_SMMU_IRQ_CTRLACK 0x54
139
140#define ARM_SMMU_GERROR 0x60
141#define GERROR_SFM_ERR (1 << 8)
142#define GERROR_MSI_GERROR_ABT_ERR (1 << 7)
143#define GERROR_MSI_PRIQ_ABT_ERR (1 << 6)
144#define GERROR_MSI_EVTQ_ABT_ERR (1 << 5)
145#define GERROR_MSI_CMDQ_ABT_ERR (1 << 4)
146#define GERROR_PRIQ_ABT_ERR (1 << 3)
147#define GERROR_EVTQ_ABT_ERR (1 << 2)
148#define GERROR_CMDQ_ERR (1 << 0)
149#define GERROR_ERR_MASK 0xfd
150
151#define ARM_SMMU_GERRORN 0x64
152
153#define ARM_SMMU_GERROR_IRQ_CFG0 0x68
154#define ARM_SMMU_GERROR_IRQ_CFG1 0x70
155#define ARM_SMMU_GERROR_IRQ_CFG2 0x74
156
157#define ARM_SMMU_STRTAB_BASE 0x80
158#define STRTAB_BASE_RA (1UL << 62)
159#define STRTAB_BASE_ADDR_SHIFT 6
160#define STRTAB_BASE_ADDR_MASK 0x3ffffffffffUL
161
162#define ARM_SMMU_STRTAB_BASE_CFG 0x88
163#define STRTAB_BASE_CFG_LOG2SIZE_SHIFT 0
164#define STRTAB_BASE_CFG_LOG2SIZE_MASK 0x3f
165#define STRTAB_BASE_CFG_SPLIT_SHIFT 6
166#define STRTAB_BASE_CFG_SPLIT_MASK 0x1f
167#define STRTAB_BASE_CFG_FMT_SHIFT 16
168#define STRTAB_BASE_CFG_FMT_MASK 0x3
169#define STRTAB_BASE_CFG_FMT_LINEAR (0 << STRTAB_BASE_CFG_FMT_SHIFT)
170#define STRTAB_BASE_CFG_FMT_2LVL (1 << STRTAB_BASE_CFG_FMT_SHIFT)
171
172#define ARM_SMMU_CMDQ_BASE 0x90
173#define ARM_SMMU_CMDQ_PROD 0x98
174#define ARM_SMMU_CMDQ_CONS 0x9c
175
176#define ARM_SMMU_EVTQ_BASE 0xa0
177#define ARM_SMMU_EVTQ_PROD 0x100a8
178#define ARM_SMMU_EVTQ_CONS 0x100ac
179#define ARM_SMMU_EVTQ_IRQ_CFG0 0xb0
180#define ARM_SMMU_EVTQ_IRQ_CFG1 0xb8
181#define ARM_SMMU_EVTQ_IRQ_CFG2 0xbc
182
183#define ARM_SMMU_PRIQ_BASE 0xc0
184#define ARM_SMMU_PRIQ_PROD 0x100c8
185#define ARM_SMMU_PRIQ_CONS 0x100cc
186#define ARM_SMMU_PRIQ_IRQ_CFG0 0xd0
187#define ARM_SMMU_PRIQ_IRQ_CFG1 0xd8
188#define ARM_SMMU_PRIQ_IRQ_CFG2 0xdc
189
190/* Common MSI config fields */
Will Deacon48ec83b2015-05-27 17:25:59 +0100191#define MSI_CFG0_ADDR_SHIFT 2
192#define MSI_CFG0_ADDR_MASK 0x3fffffffffffUL
Marc Zyngierec11d632015-07-15 11:55:19 +0100193#define MSI_CFG2_SH_SHIFT 4
194#define MSI_CFG2_SH_NSH (0UL << MSI_CFG2_SH_SHIFT)
195#define MSI_CFG2_SH_OSH (2UL << MSI_CFG2_SH_SHIFT)
196#define MSI_CFG2_SH_ISH (3UL << MSI_CFG2_SH_SHIFT)
197#define MSI_CFG2_MEMATTR_SHIFT 0
198#define MSI_CFG2_MEMATTR_DEVICE_nGnRE (0x1 << MSI_CFG2_MEMATTR_SHIFT)
Will Deacon48ec83b2015-05-27 17:25:59 +0100199
200#define Q_IDX(q, p) ((p) & ((1 << (q)->max_n_shift) - 1))
201#define Q_WRP(q, p) ((p) & (1 << (q)->max_n_shift))
202#define Q_OVERFLOW_FLAG (1 << 31)
203#define Q_OVF(q, p) ((p) & Q_OVERFLOW_FLAG)
204#define Q_ENT(q, p) ((q)->base + \
205 Q_IDX(q, p) * (q)->ent_dwords)
206
207#define Q_BASE_RWA (1UL << 62)
208#define Q_BASE_ADDR_SHIFT 5
209#define Q_BASE_ADDR_MASK 0xfffffffffffUL
210#define Q_BASE_LOG2SIZE_SHIFT 0
211#define Q_BASE_LOG2SIZE_MASK 0x1fUL
212
213/*
214 * Stream table.
215 *
216 * Linear: Enough to cover 1 << IDR1.SIDSIZE entries
Zhen Leie2f4c232015-07-07 04:30:17 +0100217 * 2lvl: 128k L1 entries,
218 * 256 lazy entries per table (each table covers a PCI bus)
Will Deacon48ec83b2015-05-27 17:25:59 +0100219 */
Zhen Leie2f4c232015-07-07 04:30:17 +0100220#define STRTAB_L1_SZ_SHIFT 20
Will Deacon48ec83b2015-05-27 17:25:59 +0100221#define STRTAB_SPLIT 8
222
223#define STRTAB_L1_DESC_DWORDS 1
224#define STRTAB_L1_DESC_SPAN_SHIFT 0
225#define STRTAB_L1_DESC_SPAN_MASK 0x1fUL
226#define STRTAB_L1_DESC_L2PTR_SHIFT 6
227#define STRTAB_L1_DESC_L2PTR_MASK 0x3ffffffffffUL
228
229#define STRTAB_STE_DWORDS 8
230#define STRTAB_STE_0_V (1UL << 0)
231#define STRTAB_STE_0_CFG_SHIFT 1
232#define STRTAB_STE_0_CFG_MASK 0x7UL
233#define STRTAB_STE_0_CFG_ABORT (0UL << STRTAB_STE_0_CFG_SHIFT)
234#define STRTAB_STE_0_CFG_BYPASS (4UL << STRTAB_STE_0_CFG_SHIFT)
235#define STRTAB_STE_0_CFG_S1_TRANS (5UL << STRTAB_STE_0_CFG_SHIFT)
236#define STRTAB_STE_0_CFG_S2_TRANS (6UL << STRTAB_STE_0_CFG_SHIFT)
237
238#define STRTAB_STE_0_S1FMT_SHIFT 4
239#define STRTAB_STE_0_S1FMT_LINEAR (0UL << STRTAB_STE_0_S1FMT_SHIFT)
240#define STRTAB_STE_0_S1CTXPTR_SHIFT 6
241#define STRTAB_STE_0_S1CTXPTR_MASK 0x3ffffffffffUL
242#define STRTAB_STE_0_S1CDMAX_SHIFT 59
243#define STRTAB_STE_0_S1CDMAX_MASK 0x1fUL
244
245#define STRTAB_STE_1_S1C_CACHE_NC 0UL
246#define STRTAB_STE_1_S1C_CACHE_WBRA 1UL
247#define STRTAB_STE_1_S1C_CACHE_WT 2UL
248#define STRTAB_STE_1_S1C_CACHE_WB 3UL
249#define STRTAB_STE_1_S1C_SH_NSH 0UL
250#define STRTAB_STE_1_S1C_SH_OSH 2UL
251#define STRTAB_STE_1_S1C_SH_ISH 3UL
252#define STRTAB_STE_1_S1CIR_SHIFT 2
253#define STRTAB_STE_1_S1COR_SHIFT 4
254#define STRTAB_STE_1_S1CSH_SHIFT 6
255
256#define STRTAB_STE_1_S1STALLD (1UL << 27)
257
258#define STRTAB_STE_1_EATS_ABT 0UL
259#define STRTAB_STE_1_EATS_TRANS 1UL
260#define STRTAB_STE_1_EATS_S1CHK 2UL
261#define STRTAB_STE_1_EATS_SHIFT 28
262
263#define STRTAB_STE_1_STRW_NSEL1 0UL
264#define STRTAB_STE_1_STRW_EL2 2UL
265#define STRTAB_STE_1_STRW_SHIFT 30
266
Will Deacona0eacd82015-11-18 18:15:51 +0000267#define STRTAB_STE_1_SHCFG_INCOMING 1UL
268#define STRTAB_STE_1_SHCFG_SHIFT 44
269
Robin Murphy95fa99a2016-09-12 17:13:47 +0100270#define STRTAB_STE_1_PRIVCFG_UNPRIV 2UL
271#define STRTAB_STE_1_PRIVCFG_SHIFT 48
272
Will Deacon48ec83b2015-05-27 17:25:59 +0100273#define STRTAB_STE_2_S2VMID_SHIFT 0
274#define STRTAB_STE_2_S2VMID_MASK 0xffffUL
275#define STRTAB_STE_2_VTCR_SHIFT 32
276#define STRTAB_STE_2_VTCR_MASK 0x7ffffUL
277#define STRTAB_STE_2_S2AA64 (1UL << 51)
278#define STRTAB_STE_2_S2ENDI (1UL << 52)
279#define STRTAB_STE_2_S2PTW (1UL << 54)
280#define STRTAB_STE_2_S2R (1UL << 58)
281
282#define STRTAB_STE_3_S2TTB_SHIFT 4
283#define STRTAB_STE_3_S2TTB_MASK 0xfffffffffffUL
284
285/* Context descriptor (stage-1 only) */
286#define CTXDESC_CD_DWORDS 8
287#define CTXDESC_CD_0_TCR_T0SZ_SHIFT 0
288#define ARM64_TCR_T0SZ_SHIFT 0
289#define ARM64_TCR_T0SZ_MASK 0x1fUL
290#define CTXDESC_CD_0_TCR_TG0_SHIFT 6
291#define ARM64_TCR_TG0_SHIFT 14
292#define ARM64_TCR_TG0_MASK 0x3UL
293#define CTXDESC_CD_0_TCR_IRGN0_SHIFT 8
Zhen Lei5d58c622015-06-26 09:32:59 +0100294#define ARM64_TCR_IRGN0_SHIFT 8
Will Deacon48ec83b2015-05-27 17:25:59 +0100295#define ARM64_TCR_IRGN0_MASK 0x3UL
296#define CTXDESC_CD_0_TCR_ORGN0_SHIFT 10
Zhen Lei5d58c622015-06-26 09:32:59 +0100297#define ARM64_TCR_ORGN0_SHIFT 10
Will Deacon48ec83b2015-05-27 17:25:59 +0100298#define ARM64_TCR_ORGN0_MASK 0x3UL
299#define CTXDESC_CD_0_TCR_SH0_SHIFT 12
300#define ARM64_TCR_SH0_SHIFT 12
301#define ARM64_TCR_SH0_MASK 0x3UL
302#define CTXDESC_CD_0_TCR_EPD0_SHIFT 14
303#define ARM64_TCR_EPD0_SHIFT 7
304#define ARM64_TCR_EPD0_MASK 0x1UL
305#define CTXDESC_CD_0_TCR_EPD1_SHIFT 30
306#define ARM64_TCR_EPD1_SHIFT 23
307#define ARM64_TCR_EPD1_MASK 0x1UL
308
309#define CTXDESC_CD_0_ENDI (1UL << 15)
310#define CTXDESC_CD_0_V (1UL << 31)
311
312#define CTXDESC_CD_0_TCR_IPS_SHIFT 32
313#define ARM64_TCR_IPS_SHIFT 32
314#define ARM64_TCR_IPS_MASK 0x7UL
315#define CTXDESC_CD_0_TCR_TBI0_SHIFT 38
316#define ARM64_TCR_TBI0_SHIFT 37
317#define ARM64_TCR_TBI0_MASK 0x1UL
318
319#define CTXDESC_CD_0_AA64 (1UL << 41)
320#define CTXDESC_CD_0_R (1UL << 45)
321#define CTXDESC_CD_0_A (1UL << 46)
322#define CTXDESC_CD_0_ASET_SHIFT 47
323#define CTXDESC_CD_0_ASET_SHARED (0UL << CTXDESC_CD_0_ASET_SHIFT)
324#define CTXDESC_CD_0_ASET_PRIVATE (1UL << CTXDESC_CD_0_ASET_SHIFT)
325#define CTXDESC_CD_0_ASID_SHIFT 48
326#define CTXDESC_CD_0_ASID_MASK 0xffffUL
327
328#define CTXDESC_CD_1_TTB0_SHIFT 4
329#define CTXDESC_CD_1_TTB0_MASK 0xfffffffffffUL
330
331#define CTXDESC_CD_3_MAIR_SHIFT 0
332
333/* Convert between AArch64 (CPU) TCR format and SMMU CD format */
334#define ARM_SMMU_TCR2CD(tcr, fld) \
335 (((tcr) >> ARM64_TCR_##fld##_SHIFT & ARM64_TCR_##fld##_MASK) \
336 << CTXDESC_CD_0_TCR_##fld##_SHIFT)
337
338/* Command queue */
339#define CMDQ_ENT_DWORDS 2
340#define CMDQ_MAX_SZ_SHIFT 8
341
342#define CMDQ_ERR_SHIFT 24
343#define CMDQ_ERR_MASK 0x7f
344#define CMDQ_ERR_CERROR_NONE_IDX 0
345#define CMDQ_ERR_CERROR_ILL_IDX 1
346#define CMDQ_ERR_CERROR_ABT_IDX 2
347
348#define CMDQ_0_OP_SHIFT 0
349#define CMDQ_0_OP_MASK 0xffUL
350#define CMDQ_0_SSV (1UL << 11)
351
352#define CMDQ_PREFETCH_0_SID_SHIFT 32
353#define CMDQ_PREFETCH_1_SIZE_SHIFT 0
354#define CMDQ_PREFETCH_1_ADDR_MASK ~0xfffUL
355
356#define CMDQ_CFGI_0_SID_SHIFT 32
357#define CMDQ_CFGI_0_SID_MASK 0xffffffffUL
358#define CMDQ_CFGI_1_LEAF (1UL << 0)
359#define CMDQ_CFGI_1_RANGE_SHIFT 0
360#define CMDQ_CFGI_1_RANGE_MASK 0x1fUL
361
362#define CMDQ_TLBI_0_VMID_SHIFT 32
363#define CMDQ_TLBI_0_ASID_SHIFT 48
364#define CMDQ_TLBI_1_LEAF (1UL << 0)
Will Deacon1c27df12015-09-18 16:12:56 +0100365#define CMDQ_TLBI_1_VA_MASK ~0xfffUL
366#define CMDQ_TLBI_1_IPA_MASK 0xfffffffff000UL
Will Deacon48ec83b2015-05-27 17:25:59 +0100367
368#define CMDQ_PRI_0_SSID_SHIFT 12
369#define CMDQ_PRI_0_SSID_MASK 0xfffffUL
370#define CMDQ_PRI_0_SID_SHIFT 32
371#define CMDQ_PRI_0_SID_MASK 0xffffffffUL
372#define CMDQ_PRI_1_GRPID_SHIFT 0
373#define CMDQ_PRI_1_GRPID_MASK 0x1ffUL
374#define CMDQ_PRI_1_RESP_SHIFT 12
375#define CMDQ_PRI_1_RESP_DENY (0UL << CMDQ_PRI_1_RESP_SHIFT)
376#define CMDQ_PRI_1_RESP_FAIL (1UL << CMDQ_PRI_1_RESP_SHIFT)
377#define CMDQ_PRI_1_RESP_SUCC (2UL << CMDQ_PRI_1_RESP_SHIFT)
378
379#define CMDQ_SYNC_0_CS_SHIFT 12
380#define CMDQ_SYNC_0_CS_NONE (0UL << CMDQ_SYNC_0_CS_SHIFT)
381#define CMDQ_SYNC_0_CS_SEV (2UL << CMDQ_SYNC_0_CS_SHIFT)
382
383/* Event queue */
384#define EVTQ_ENT_DWORDS 4
385#define EVTQ_MAX_SZ_SHIFT 7
386
387#define EVTQ_0_ID_SHIFT 0
388#define EVTQ_0_ID_MASK 0xffUL
389
390/* PRI queue */
391#define PRIQ_ENT_DWORDS 2
392#define PRIQ_MAX_SZ_SHIFT 8
393
394#define PRIQ_0_SID_SHIFT 0
395#define PRIQ_0_SID_MASK 0xffffffffUL
396#define PRIQ_0_SSID_SHIFT 32
397#define PRIQ_0_SSID_MASK 0xfffffUL
Will Deacon48ec83b2015-05-27 17:25:59 +0100398#define PRIQ_0_PERM_PRIV (1UL << 58)
399#define PRIQ_0_PERM_EXEC (1UL << 59)
400#define PRIQ_0_PERM_READ (1UL << 60)
401#define PRIQ_0_PERM_WRITE (1UL << 61)
402#define PRIQ_0_PRG_LAST (1UL << 62)
403#define PRIQ_0_SSID_V (1UL << 63)
404
405#define PRIQ_1_PRG_IDX_SHIFT 0
406#define PRIQ_1_PRG_IDX_MASK 0x1ffUL
407#define PRIQ_1_ADDR_SHIFT 12
408#define PRIQ_1_ADDR_MASK 0xfffffffffffffUL
409
410/* High-level queue structures */
411#define ARM_SMMU_POLL_TIMEOUT_US 100
412
413static bool disable_bypass;
414module_param_named(disable_bypass, disable_bypass, bool, S_IRUGO);
415MODULE_PARM_DESC(disable_bypass,
416 "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.");
417
418enum pri_resp {
419 PRI_RESP_DENY,
420 PRI_RESP_FAIL,
421 PRI_RESP_SUCC,
422};
423
Marc Zyngier166bdbd2015-10-13 18:32:30 +0100424enum arm_smmu_msi_index {
425 EVTQ_MSI_INDEX,
426 GERROR_MSI_INDEX,
427 PRIQ_MSI_INDEX,
428 ARM_SMMU_MAX_MSIS,
429};
430
431static phys_addr_t arm_smmu_msi_cfg[ARM_SMMU_MAX_MSIS][3] = {
432 [EVTQ_MSI_INDEX] = {
433 ARM_SMMU_EVTQ_IRQ_CFG0,
434 ARM_SMMU_EVTQ_IRQ_CFG1,
435 ARM_SMMU_EVTQ_IRQ_CFG2,
436 },
437 [GERROR_MSI_INDEX] = {
438 ARM_SMMU_GERROR_IRQ_CFG0,
439 ARM_SMMU_GERROR_IRQ_CFG1,
440 ARM_SMMU_GERROR_IRQ_CFG2,
441 },
442 [PRIQ_MSI_INDEX] = {
443 ARM_SMMU_PRIQ_IRQ_CFG0,
444 ARM_SMMU_PRIQ_IRQ_CFG1,
445 ARM_SMMU_PRIQ_IRQ_CFG2,
446 },
447};
448
Will Deacon48ec83b2015-05-27 17:25:59 +0100449struct arm_smmu_cmdq_ent {
450 /* Common fields */
451 u8 opcode;
452 bool substream_valid;
453
454 /* Command-specific fields */
455 union {
456 #define CMDQ_OP_PREFETCH_CFG 0x1
457 struct {
458 u32 sid;
459 u8 size;
460 u64 addr;
461 } prefetch;
462
463 #define CMDQ_OP_CFGI_STE 0x3
464 #define CMDQ_OP_CFGI_ALL 0x4
465 struct {
466 u32 sid;
467 union {
468 bool leaf;
469 u8 span;
470 };
471 } cfgi;
472
473 #define CMDQ_OP_TLBI_NH_ASID 0x11
474 #define CMDQ_OP_TLBI_NH_VA 0x12
475 #define CMDQ_OP_TLBI_EL2_ALL 0x20
476 #define CMDQ_OP_TLBI_S12_VMALL 0x28
477 #define CMDQ_OP_TLBI_S2_IPA 0x2a
478 #define CMDQ_OP_TLBI_NSNH_ALL 0x30
479 struct {
480 u16 asid;
481 u16 vmid;
482 bool leaf;
483 u64 addr;
484 } tlbi;
485
486 #define CMDQ_OP_PRI_RESP 0x41
487 struct {
488 u32 sid;
489 u32 ssid;
490 u16 grpid;
491 enum pri_resp resp;
492 } pri;
493
494 #define CMDQ_OP_CMD_SYNC 0x46
495 };
496};
497
498struct arm_smmu_queue {
499 int irq; /* Wired interrupt */
500
501 __le64 *base;
502 dma_addr_t base_dma;
503 u64 q_base;
504
505 size_t ent_dwords;
506 u32 max_n_shift;
507 u32 prod;
508 u32 cons;
509
510 u32 __iomem *prod_reg;
511 u32 __iomem *cons_reg;
512};
513
514struct arm_smmu_cmdq {
515 struct arm_smmu_queue q;
516 spinlock_t lock;
517};
518
519struct arm_smmu_evtq {
520 struct arm_smmu_queue q;
521 u32 max_stalls;
522};
523
524struct arm_smmu_priq {
525 struct arm_smmu_queue q;
526};
527
528/* High-level stream table and context descriptor structures */
529struct arm_smmu_strtab_l1_desc {
530 u8 span;
531
532 __le64 *l2ptr;
533 dma_addr_t l2ptr_dma;
534};
535
536struct arm_smmu_s1_cfg {
537 __le64 *cdptr;
538 dma_addr_t cdptr_dma;
539
540 struct arm_smmu_ctx_desc {
541 u16 asid;
542 u64 ttbr;
543 u64 tcr;
544 u64 mair;
545 } cd;
546};
547
548struct arm_smmu_s2_cfg {
549 u16 vmid;
550 u64 vttbr;
551 u64 vtcr;
552};
553
554struct arm_smmu_strtab_ent {
555 bool valid;
556
557 bool bypass; /* Overrides s1/s2 config */
558 struct arm_smmu_s1_cfg *s1_cfg;
559 struct arm_smmu_s2_cfg *s2_cfg;
560};
561
562struct arm_smmu_strtab_cfg {
563 __le64 *strtab;
564 dma_addr_t strtab_dma;
565 struct arm_smmu_strtab_l1_desc *l1_desc;
566 unsigned int num_l1_ents;
567
568 u64 strtab_base;
569 u32 strtab_base_cfg;
570};
571
572/* An SMMUv3 instance */
573struct arm_smmu_device {
574 struct device *dev;
575 void __iomem *base;
576
577#define ARM_SMMU_FEAT_2_LVL_STRTAB (1 << 0)
578#define ARM_SMMU_FEAT_2_LVL_CDTAB (1 << 1)
579#define ARM_SMMU_FEAT_TT_LE (1 << 2)
580#define ARM_SMMU_FEAT_TT_BE (1 << 3)
581#define ARM_SMMU_FEAT_PRI (1 << 4)
582#define ARM_SMMU_FEAT_ATS (1 << 5)
583#define ARM_SMMU_FEAT_SEV (1 << 6)
584#define ARM_SMMU_FEAT_MSI (1 << 7)
585#define ARM_SMMU_FEAT_COHERENCY (1 << 8)
586#define ARM_SMMU_FEAT_TRANS_S1 (1 << 9)
587#define ARM_SMMU_FEAT_TRANS_S2 (1 << 10)
588#define ARM_SMMU_FEAT_STALLS (1 << 11)
589#define ARM_SMMU_FEAT_HYP (1 << 12)
590 u32 features;
591
Zhen Lei5e929462015-07-07 04:30:18 +0100592#define ARM_SMMU_OPT_SKIP_PREFETCH (1 << 0)
593 u32 options;
594
Will Deacon48ec83b2015-05-27 17:25:59 +0100595 struct arm_smmu_cmdq cmdq;
596 struct arm_smmu_evtq evtq;
597 struct arm_smmu_priq priq;
598
599 int gerr_irq;
600
601 unsigned long ias; /* IPA */
602 unsigned long oas; /* PA */
Robin Murphyd5466352016-05-09 17:20:09 +0100603 unsigned long pgsize_bitmap;
Will Deacon48ec83b2015-05-27 17:25:59 +0100604
605#define ARM_SMMU_MAX_ASIDS (1 << 16)
606 unsigned int asid_bits;
607 DECLARE_BITMAP(asid_map, ARM_SMMU_MAX_ASIDS);
608
609#define ARM_SMMU_MAX_VMIDS (1 << 16)
610 unsigned int vmid_bits;
611 DECLARE_BITMAP(vmid_map, ARM_SMMU_MAX_VMIDS);
612
613 unsigned int ssid_bits;
614 unsigned int sid_bits;
615
616 struct arm_smmu_strtab_cfg strtab_cfg;
Will Deacon48ec83b2015-05-27 17:25:59 +0100617};
618
Robin Murphy8f785152016-09-12 17:13:45 +0100619/* SMMU private data for each master */
620struct arm_smmu_master_data {
Will Deacon48ec83b2015-05-27 17:25:59 +0100621 struct arm_smmu_device *smmu;
Will Deacon48ec83b2015-05-27 17:25:59 +0100622 struct arm_smmu_strtab_ent ste;
623};
624
625/* SMMU private data for an IOMMU domain */
626enum arm_smmu_domain_stage {
627 ARM_SMMU_DOMAIN_S1 = 0,
628 ARM_SMMU_DOMAIN_S2,
629 ARM_SMMU_DOMAIN_NESTED,
630};
631
632struct arm_smmu_domain {
633 struct arm_smmu_device *smmu;
634 struct mutex init_mutex; /* Protects smmu pointer */
635
636 struct io_pgtable_ops *pgtbl_ops;
637 spinlock_t pgtbl_lock;
638
639 enum arm_smmu_domain_stage stage;
640 union {
641 struct arm_smmu_s1_cfg s1_cfg;
642 struct arm_smmu_s2_cfg s2_cfg;
643 };
644
645 struct iommu_domain domain;
646};
647
Zhen Lei5e929462015-07-07 04:30:18 +0100648struct arm_smmu_option_prop {
649 u32 opt;
650 const char *prop;
651};
652
653static struct arm_smmu_option_prop arm_smmu_options[] = {
654 { ARM_SMMU_OPT_SKIP_PREFETCH, "hisilicon,broken-prefetch-cmd" },
655 { 0, NULL},
656};
657
Will Deacon48ec83b2015-05-27 17:25:59 +0100658static struct arm_smmu_domain *to_smmu_domain(struct iommu_domain *dom)
659{
660 return container_of(dom, struct arm_smmu_domain, domain);
661}
662
Zhen Lei5e929462015-07-07 04:30:18 +0100663static void parse_driver_options(struct arm_smmu_device *smmu)
664{
665 int i = 0;
666
667 do {
668 if (of_property_read_bool(smmu->dev->of_node,
669 arm_smmu_options[i].prop)) {
670 smmu->options |= arm_smmu_options[i].opt;
671 dev_notice(smmu->dev, "option %s\n",
672 arm_smmu_options[i].prop);
673 }
674 } while (arm_smmu_options[++i].opt);
675}
676
Will Deacon48ec83b2015-05-27 17:25:59 +0100677/* Low-level queue manipulation functions */
678static bool queue_full(struct arm_smmu_queue *q)
679{
680 return Q_IDX(q, q->prod) == Q_IDX(q, q->cons) &&
681 Q_WRP(q, q->prod) != Q_WRP(q, q->cons);
682}
683
684static bool queue_empty(struct arm_smmu_queue *q)
685{
686 return Q_IDX(q, q->prod) == Q_IDX(q, q->cons) &&
687 Q_WRP(q, q->prod) == Q_WRP(q, q->cons);
688}
689
690static void queue_sync_cons(struct arm_smmu_queue *q)
691{
692 q->cons = readl_relaxed(q->cons_reg);
693}
694
695static void queue_inc_cons(struct arm_smmu_queue *q)
696{
697 u32 cons = (Q_WRP(q, q->cons) | Q_IDX(q, q->cons)) + 1;
698
699 q->cons = Q_OVF(q, q->cons) | Q_WRP(q, cons) | Q_IDX(q, cons);
Will Deacond1069fc2018-11-07 22:58:24 +0000700
701 /*
702 * Ensure that all CPU accesses (reads and writes) to the queue
703 * are complete before we update the cons pointer.
704 */
705 mb();
706 writel_relaxed(q->cons, q->cons_reg);
Will Deacon48ec83b2015-05-27 17:25:59 +0100707}
708
709static int queue_sync_prod(struct arm_smmu_queue *q)
710{
711 int ret = 0;
712 u32 prod = readl_relaxed(q->prod_reg);
713
714 if (Q_OVF(q, prod) != Q_OVF(q, q->prod))
715 ret = -EOVERFLOW;
716
717 q->prod = prod;
718 return ret;
719}
720
721static void queue_inc_prod(struct arm_smmu_queue *q)
722{
723 u32 prod = (Q_WRP(q, q->prod) | Q_IDX(q, q->prod)) + 1;
724
725 q->prod = Q_OVF(q, q->prod) | Q_WRP(q, prod) | Q_IDX(q, prod);
726 writel(q->prod, q->prod_reg);
727}
728
Jean-Philippe Bruckerbcfced12016-09-05 14:09:53 +0100729/*
730 * Wait for the SMMU to consume items. If drain is true, wait until the queue
731 * is empty. Otherwise, wait until there is at least one free slot.
732 */
733static int queue_poll_cons(struct arm_smmu_queue *q, bool drain, bool wfe)
Will Deacon48ec83b2015-05-27 17:25:59 +0100734{
735 ktime_t timeout = ktime_add_us(ktime_get(), ARM_SMMU_POLL_TIMEOUT_US);
736
Jean-Philippe Bruckerbcfced12016-09-05 14:09:53 +0100737 while (queue_sync_cons(q), (drain ? !queue_empty(q) : queue_full(q))) {
Will Deacon48ec83b2015-05-27 17:25:59 +0100738 if (ktime_compare(ktime_get(), timeout) > 0)
739 return -ETIMEDOUT;
740
741 if (wfe) {
742 wfe();
743 } else {
744 cpu_relax();
745 udelay(1);
746 }
747 }
748
749 return 0;
750}
751
752static void queue_write(__le64 *dst, u64 *src, size_t n_dwords)
753{
754 int i;
755
756 for (i = 0; i < n_dwords; ++i)
757 *dst++ = cpu_to_le64(*src++);
758}
759
760static int queue_insert_raw(struct arm_smmu_queue *q, u64 *ent)
761{
762 if (queue_full(q))
763 return -ENOSPC;
764
765 queue_write(Q_ENT(q, q->prod), ent, q->ent_dwords);
766 queue_inc_prod(q);
767 return 0;
768}
769
770static void queue_read(__le64 *dst, u64 *src, size_t n_dwords)
771{
772 int i;
773
774 for (i = 0; i < n_dwords; ++i)
775 *dst++ = le64_to_cpu(*src++);
776}
777
778static int queue_remove_raw(struct arm_smmu_queue *q, u64 *ent)
779{
780 if (queue_empty(q))
781 return -EAGAIN;
782
783 queue_read(ent, Q_ENT(q, q->cons), q->ent_dwords);
784 queue_inc_cons(q);
785 return 0;
786}
787
788/* High-level queue accessors */
789static int arm_smmu_cmdq_build_cmd(u64 *cmd, struct arm_smmu_cmdq_ent *ent)
790{
791 memset(cmd, 0, CMDQ_ENT_DWORDS << 3);
792 cmd[0] |= (ent->opcode & CMDQ_0_OP_MASK) << CMDQ_0_OP_SHIFT;
793
794 switch (ent->opcode) {
795 case CMDQ_OP_TLBI_EL2_ALL:
796 case CMDQ_OP_TLBI_NSNH_ALL:
797 break;
798 case CMDQ_OP_PREFETCH_CFG:
799 cmd[0] |= (u64)ent->prefetch.sid << CMDQ_PREFETCH_0_SID_SHIFT;
800 cmd[1] |= ent->prefetch.size << CMDQ_PREFETCH_1_SIZE_SHIFT;
801 cmd[1] |= ent->prefetch.addr & CMDQ_PREFETCH_1_ADDR_MASK;
802 break;
803 case CMDQ_OP_CFGI_STE:
804 cmd[0] |= (u64)ent->cfgi.sid << CMDQ_CFGI_0_SID_SHIFT;
805 cmd[1] |= ent->cfgi.leaf ? CMDQ_CFGI_1_LEAF : 0;
806 break;
807 case CMDQ_OP_CFGI_ALL:
808 /* Cover the entire SID range */
809 cmd[1] |= CMDQ_CFGI_1_RANGE_MASK << CMDQ_CFGI_1_RANGE_SHIFT;
810 break;
811 case CMDQ_OP_TLBI_NH_VA:
812 cmd[0] |= (u64)ent->tlbi.asid << CMDQ_TLBI_0_ASID_SHIFT;
Will Deacon1c27df12015-09-18 16:12:56 +0100813 cmd[1] |= ent->tlbi.leaf ? CMDQ_TLBI_1_LEAF : 0;
814 cmd[1] |= ent->tlbi.addr & CMDQ_TLBI_1_VA_MASK;
815 break;
Will Deacon48ec83b2015-05-27 17:25:59 +0100816 case CMDQ_OP_TLBI_S2_IPA:
817 cmd[0] |= (u64)ent->tlbi.vmid << CMDQ_TLBI_0_VMID_SHIFT;
818 cmd[1] |= ent->tlbi.leaf ? CMDQ_TLBI_1_LEAF : 0;
Will Deacon1c27df12015-09-18 16:12:56 +0100819 cmd[1] |= ent->tlbi.addr & CMDQ_TLBI_1_IPA_MASK;
Will Deacon48ec83b2015-05-27 17:25:59 +0100820 break;
821 case CMDQ_OP_TLBI_NH_ASID:
822 cmd[0] |= (u64)ent->tlbi.asid << CMDQ_TLBI_0_ASID_SHIFT;
823 /* Fallthrough */
824 case CMDQ_OP_TLBI_S12_VMALL:
825 cmd[0] |= (u64)ent->tlbi.vmid << CMDQ_TLBI_0_VMID_SHIFT;
826 break;
827 case CMDQ_OP_PRI_RESP:
828 cmd[0] |= ent->substream_valid ? CMDQ_0_SSV : 0;
829 cmd[0] |= ent->pri.ssid << CMDQ_PRI_0_SSID_SHIFT;
830 cmd[0] |= (u64)ent->pri.sid << CMDQ_PRI_0_SID_SHIFT;
831 cmd[1] |= ent->pri.grpid << CMDQ_PRI_1_GRPID_SHIFT;
832 switch (ent->pri.resp) {
833 case PRI_RESP_DENY:
834 cmd[1] |= CMDQ_PRI_1_RESP_DENY;
835 break;
836 case PRI_RESP_FAIL:
837 cmd[1] |= CMDQ_PRI_1_RESP_FAIL;
838 break;
839 case PRI_RESP_SUCC:
840 cmd[1] |= CMDQ_PRI_1_RESP_SUCC;
841 break;
842 default:
843 return -EINVAL;
844 }
845 break;
846 case CMDQ_OP_CMD_SYNC:
847 cmd[0] |= CMDQ_SYNC_0_CS_SEV;
848 break;
849 default:
850 return -ENOENT;
851 }
852
853 return 0;
854}
855
856static void arm_smmu_cmdq_skip_err(struct arm_smmu_device *smmu)
857{
858 static const char *cerror_str[] = {
859 [CMDQ_ERR_CERROR_NONE_IDX] = "No error",
860 [CMDQ_ERR_CERROR_ILL_IDX] = "Illegal command",
861 [CMDQ_ERR_CERROR_ABT_IDX] = "Abort on command fetch",
862 };
863
864 int i;
865 u64 cmd[CMDQ_ENT_DWORDS];
866 struct arm_smmu_queue *q = &smmu->cmdq.q;
867 u32 cons = readl_relaxed(q->cons_reg);
868 u32 idx = cons >> CMDQ_ERR_SHIFT & CMDQ_ERR_MASK;
869 struct arm_smmu_cmdq_ent cmd_sync = {
870 .opcode = CMDQ_OP_CMD_SYNC,
871 };
872
873 dev_err(smmu->dev, "CMDQ error (cons 0x%08x): %s\n", cons,
Will Deacona0d5c042015-12-04 12:00:29 +0000874 idx < ARRAY_SIZE(cerror_str) ? cerror_str[idx] : "Unknown");
Will Deacon48ec83b2015-05-27 17:25:59 +0100875
876 switch (idx) {
Will Deacon48ec83b2015-05-27 17:25:59 +0100877 case CMDQ_ERR_CERROR_ABT_IDX:
878 dev_err(smmu->dev, "retrying command fetch\n");
879 case CMDQ_ERR_CERROR_NONE_IDX:
880 return;
Will Deacona0d5c042015-12-04 12:00:29 +0000881 case CMDQ_ERR_CERROR_ILL_IDX:
882 /* Fallthrough */
883 default:
884 break;
Will Deacon48ec83b2015-05-27 17:25:59 +0100885 }
886
887 /*
888 * We may have concurrent producers, so we need to be careful
889 * not to touch any of the shadow cmdq state.
890 */
Will Deaconaea20372016-07-29 11:15:37 +0100891 queue_read(cmd, Q_ENT(q, cons), q->ent_dwords);
Will Deacon48ec83b2015-05-27 17:25:59 +0100892 dev_err(smmu->dev, "skipping command in error state:\n");
893 for (i = 0; i < ARRAY_SIZE(cmd); ++i)
894 dev_err(smmu->dev, "\t0x%016llx\n", (unsigned long long)cmd[i]);
895
896 /* Convert the erroneous command into a CMD_SYNC */
897 if (arm_smmu_cmdq_build_cmd(cmd, &cmd_sync)) {
898 dev_err(smmu->dev, "failed to convert to CMD_SYNC\n");
899 return;
900 }
901
Will Deaconaea20372016-07-29 11:15:37 +0100902 queue_write(Q_ENT(q, cons), cmd, q->ent_dwords);
Will Deacon48ec83b2015-05-27 17:25:59 +0100903}
904
905static void arm_smmu_cmdq_issue_cmd(struct arm_smmu_device *smmu,
906 struct arm_smmu_cmdq_ent *ent)
907{
Will Deacon48ec83b2015-05-27 17:25:59 +0100908 u64 cmd[CMDQ_ENT_DWORDS];
Will Deacon8ded2902016-09-09 14:33:59 +0100909 unsigned long flags;
Will Deacon48ec83b2015-05-27 17:25:59 +0100910 bool wfe = !!(smmu->features & ARM_SMMU_FEAT_SEV);
911 struct arm_smmu_queue *q = &smmu->cmdq.q;
912
913 if (arm_smmu_cmdq_build_cmd(cmd, ent)) {
914 dev_warn(smmu->dev, "ignoring unknown CMDQ opcode 0x%x\n",
915 ent->opcode);
916 return;
917 }
918
Will Deacon8ded2902016-09-09 14:33:59 +0100919 spin_lock_irqsave(&smmu->cmdq.lock, flags);
Jean-Philippe Bruckerbcfced12016-09-05 14:09:53 +0100920 while (queue_insert_raw(q, cmd) == -ENOSPC) {
921 if (queue_poll_cons(q, false, wfe))
Will Deacon48ec83b2015-05-27 17:25:59 +0100922 dev_err_ratelimited(smmu->dev, "CMDQ timeout\n");
923 }
924
Jean-Philippe Bruckerbcfced12016-09-05 14:09:53 +0100925 if (ent->opcode == CMDQ_OP_CMD_SYNC && queue_poll_cons(q, true, wfe))
Will Deacon48ec83b2015-05-27 17:25:59 +0100926 dev_err_ratelimited(smmu->dev, "CMD_SYNC timeout\n");
Will Deacon8ded2902016-09-09 14:33:59 +0100927 spin_unlock_irqrestore(&smmu->cmdq.lock, flags);
Will Deacon48ec83b2015-05-27 17:25:59 +0100928}
929
930/* Context descriptor manipulation functions */
931static u64 arm_smmu_cpu_tcr_to_cd(u64 tcr)
932{
933 u64 val = 0;
934
935 /* Repack the TCR. Just care about TTBR0 for now */
936 val |= ARM_SMMU_TCR2CD(tcr, T0SZ);
937 val |= ARM_SMMU_TCR2CD(tcr, TG0);
938 val |= ARM_SMMU_TCR2CD(tcr, IRGN0);
939 val |= ARM_SMMU_TCR2CD(tcr, ORGN0);
940 val |= ARM_SMMU_TCR2CD(tcr, SH0);
941 val |= ARM_SMMU_TCR2CD(tcr, EPD0);
942 val |= ARM_SMMU_TCR2CD(tcr, EPD1);
943 val |= ARM_SMMU_TCR2CD(tcr, IPS);
944 val |= ARM_SMMU_TCR2CD(tcr, TBI0);
945
946 return val;
947}
948
949static void arm_smmu_write_ctx_desc(struct arm_smmu_device *smmu,
950 struct arm_smmu_s1_cfg *cfg)
951{
952 u64 val;
953
954 /*
955 * We don't need to issue any invalidation here, as we'll invalidate
956 * the STE when installing the new entry anyway.
957 */
958 val = arm_smmu_cpu_tcr_to_cd(cfg->cd.tcr) |
959#ifdef __BIG_ENDIAN
960 CTXDESC_CD_0_ENDI |
961#endif
962 CTXDESC_CD_0_R | CTXDESC_CD_0_A | CTXDESC_CD_0_ASET_PRIVATE |
963 CTXDESC_CD_0_AA64 | (u64)cfg->cd.asid << CTXDESC_CD_0_ASID_SHIFT |
964 CTXDESC_CD_0_V;
965 cfg->cdptr[0] = cpu_to_le64(val);
966
967 val = cfg->cd.ttbr & CTXDESC_CD_1_TTB0_MASK << CTXDESC_CD_1_TTB0_SHIFT;
968 cfg->cdptr[1] = cpu_to_le64(val);
969
970 cfg->cdptr[3] = cpu_to_le64(cfg->cd.mair << CTXDESC_CD_3_MAIR_SHIFT);
971}
972
973/* Stream table manipulation functions */
974static void
975arm_smmu_write_strtab_l1_desc(__le64 *dst, struct arm_smmu_strtab_l1_desc *desc)
976{
977 u64 val = 0;
978
979 val |= (desc->span & STRTAB_L1_DESC_SPAN_MASK)
980 << STRTAB_L1_DESC_SPAN_SHIFT;
981 val |= desc->l2ptr_dma &
982 STRTAB_L1_DESC_L2PTR_MASK << STRTAB_L1_DESC_L2PTR_SHIFT;
983
984 *dst = cpu_to_le64(val);
985}
986
987static void arm_smmu_sync_ste_for_sid(struct arm_smmu_device *smmu, u32 sid)
988{
989 struct arm_smmu_cmdq_ent cmd = {
990 .opcode = CMDQ_OP_CFGI_STE,
991 .cfgi = {
992 .sid = sid,
993 .leaf = true,
994 },
995 };
996
997 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
998 cmd.opcode = CMDQ_OP_CMD_SYNC;
999 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
1000}
1001
1002static void arm_smmu_write_strtab_ent(struct arm_smmu_device *smmu, u32 sid,
1003 __le64 *dst, struct arm_smmu_strtab_ent *ste)
1004{
1005 /*
1006 * This is hideously complicated, but we only really care about
1007 * three cases at the moment:
1008 *
1009 * 1. Invalid (all zero) -> bypass (init)
1010 * 2. Bypass -> translation (attach)
1011 * 3. Translation -> bypass (detach)
1012 *
1013 * Given that we can't update the STE atomically and the SMMU
1014 * doesn't read the thing in a defined order, that leaves us
1015 * with the following maintenance requirements:
1016 *
1017 * 1. Update Config, return (init time STEs aren't live)
1018 * 2. Write everything apart from dword 0, sync, write dword 0, sync
1019 * 3. Update Config, sync
1020 */
1021 u64 val = le64_to_cpu(dst[0]);
1022 bool ste_live = false;
1023 struct arm_smmu_cmdq_ent prefetch_cmd = {
1024 .opcode = CMDQ_OP_PREFETCH_CFG,
1025 .prefetch = {
1026 .sid = sid,
1027 },
1028 };
1029
1030 if (val & STRTAB_STE_0_V) {
1031 u64 cfg;
1032
1033 cfg = val & STRTAB_STE_0_CFG_MASK << STRTAB_STE_0_CFG_SHIFT;
1034 switch (cfg) {
1035 case STRTAB_STE_0_CFG_BYPASS:
1036 break;
1037 case STRTAB_STE_0_CFG_S1_TRANS:
1038 case STRTAB_STE_0_CFG_S2_TRANS:
1039 ste_live = true;
1040 break;
Will Deacon5bc0a112016-08-16 14:29:16 +01001041 case STRTAB_STE_0_CFG_ABORT:
1042 if (disable_bypass)
1043 break;
Will Deacon48ec83b2015-05-27 17:25:59 +01001044 default:
1045 BUG(); /* STE corruption */
1046 }
1047 }
1048
Nate Watterson3a8ab782016-12-20 23:11:48 -05001049 /* Nuke the existing STE_0 value, as we're going to rewrite it */
1050 val = ste->valid ? STRTAB_STE_0_V : 0;
Will Deacon48ec83b2015-05-27 17:25:59 +01001051
1052 if (ste->bypass) {
1053 val |= disable_bypass ? STRTAB_STE_0_CFG_ABORT
1054 : STRTAB_STE_0_CFG_BYPASS;
1055 dst[0] = cpu_to_le64(val);
Will Deacona0eacd82015-11-18 18:15:51 +00001056 dst[1] = cpu_to_le64(STRTAB_STE_1_SHCFG_INCOMING
1057 << STRTAB_STE_1_SHCFG_SHIFT);
Will Deacon48ec83b2015-05-27 17:25:59 +01001058 dst[2] = 0; /* Nuke the VMID */
1059 if (ste_live)
1060 arm_smmu_sync_ste_for_sid(smmu, sid);
1061 return;
1062 }
1063
1064 if (ste->s1_cfg) {
1065 BUG_ON(ste_live);
1066 dst[1] = cpu_to_le64(
1067 STRTAB_STE_1_S1C_CACHE_WBRA
1068 << STRTAB_STE_1_S1CIR_SHIFT |
1069 STRTAB_STE_1_S1C_CACHE_WBRA
1070 << STRTAB_STE_1_S1COR_SHIFT |
1071 STRTAB_STE_1_S1C_SH_ISH << STRTAB_STE_1_S1CSH_SHIFT |
Will Deacon48ec83b2015-05-27 17:25:59 +01001072#ifdef CONFIG_PCI_ATS
1073 STRTAB_STE_1_EATS_TRANS << STRTAB_STE_1_EATS_SHIFT |
1074#endif
Robin Murphy95fa99a2016-09-12 17:13:47 +01001075 STRTAB_STE_1_STRW_NSEL1 << STRTAB_STE_1_STRW_SHIFT |
1076 STRTAB_STE_1_PRIVCFG_UNPRIV <<
1077 STRTAB_STE_1_PRIVCFG_SHIFT);
Will Deacon48ec83b2015-05-27 17:25:59 +01001078
Prem Mallappa6380be02015-12-14 22:01:23 +05301079 if (smmu->features & ARM_SMMU_FEAT_STALLS)
1080 dst[1] |= cpu_to_le64(STRTAB_STE_1_S1STALLD);
1081
Will Deacon48ec83b2015-05-27 17:25:59 +01001082 val |= (ste->s1_cfg->cdptr_dma & STRTAB_STE_0_S1CTXPTR_MASK
1083 << STRTAB_STE_0_S1CTXPTR_SHIFT) |
1084 STRTAB_STE_0_CFG_S1_TRANS;
Will Deacon48ec83b2015-05-27 17:25:59 +01001085 }
1086
1087 if (ste->s2_cfg) {
1088 BUG_ON(ste_live);
1089 dst[2] = cpu_to_le64(
1090 ste->s2_cfg->vmid << STRTAB_STE_2_S2VMID_SHIFT |
1091 (ste->s2_cfg->vtcr & STRTAB_STE_2_VTCR_MASK)
1092 << STRTAB_STE_2_VTCR_SHIFT |
1093#ifdef __BIG_ENDIAN
1094 STRTAB_STE_2_S2ENDI |
1095#endif
1096 STRTAB_STE_2_S2PTW | STRTAB_STE_2_S2AA64 |
1097 STRTAB_STE_2_S2R);
1098
1099 dst[3] = cpu_to_le64(ste->s2_cfg->vttbr &
1100 STRTAB_STE_3_S2TTB_MASK << STRTAB_STE_3_S2TTB_SHIFT);
1101
1102 val |= STRTAB_STE_0_CFG_S2_TRANS;
1103 }
1104
1105 arm_smmu_sync_ste_for_sid(smmu, sid);
Will Deacon712ae1c2020-01-15 15:21:47 +00001106 /* See comment in arm_smmu_write_ctx_desc() */
1107 WRITE_ONCE(dst[0], cpu_to_le64(val));
Will Deacon48ec83b2015-05-27 17:25:59 +01001108 arm_smmu_sync_ste_for_sid(smmu, sid);
1109
1110 /* It's likely that we'll want to use the new STE soon */
Zhen Lei5e929462015-07-07 04:30:18 +01001111 if (!(smmu->options & ARM_SMMU_OPT_SKIP_PREFETCH))
1112 arm_smmu_cmdq_issue_cmd(smmu, &prefetch_cmd);
Will Deacon48ec83b2015-05-27 17:25:59 +01001113}
1114
1115static void arm_smmu_init_bypass_stes(u64 *strtab, unsigned int nent)
1116{
1117 unsigned int i;
1118 struct arm_smmu_strtab_ent ste = {
1119 .valid = true,
1120 .bypass = true,
1121 };
1122
1123 for (i = 0; i < nent; ++i) {
1124 arm_smmu_write_strtab_ent(NULL, -1, strtab, &ste);
1125 strtab += STRTAB_STE_DWORDS;
1126 }
1127}
1128
1129static int arm_smmu_init_l2_strtab(struct arm_smmu_device *smmu, u32 sid)
1130{
1131 size_t size;
1132 void *strtab;
1133 struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg;
1134 struct arm_smmu_strtab_l1_desc *desc = &cfg->l1_desc[sid >> STRTAB_SPLIT];
1135
1136 if (desc->l2ptr)
1137 return 0;
1138
1139 size = 1 << (STRTAB_SPLIT + ilog2(STRTAB_STE_DWORDS) + 3);
Zhen Lei69146e72015-06-26 09:32:58 +01001140 strtab = &cfg->strtab[(sid >> STRTAB_SPLIT) * STRTAB_L1_DESC_DWORDS];
Will Deacon48ec83b2015-05-27 17:25:59 +01001141
1142 desc->span = STRTAB_SPLIT + 1;
Will Deacon04fa26c2015-10-30 18:12:41 +00001143 desc->l2ptr = dmam_alloc_coherent(smmu->dev, size, &desc->l2ptr_dma,
1144 GFP_KERNEL | __GFP_ZERO);
Will Deacon48ec83b2015-05-27 17:25:59 +01001145 if (!desc->l2ptr) {
1146 dev_err(smmu->dev,
1147 "failed to allocate l2 stream table for SID %u\n",
1148 sid);
1149 return -ENOMEM;
1150 }
1151
1152 arm_smmu_init_bypass_stes(desc->l2ptr, 1 << STRTAB_SPLIT);
1153 arm_smmu_write_strtab_l1_desc(strtab, desc);
1154 return 0;
1155}
1156
1157/* IRQ and event handlers */
1158static irqreturn_t arm_smmu_evtq_thread(int irq, void *dev)
1159{
1160 int i;
1161 struct arm_smmu_device *smmu = dev;
1162 struct arm_smmu_queue *q = &smmu->evtq.q;
1163 u64 evt[EVTQ_ENT_DWORDS];
1164
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01001165 do {
1166 while (!queue_remove_raw(q, evt)) {
1167 u8 id = evt[0] >> EVTQ_0_ID_SHIFT & EVTQ_0_ID_MASK;
Will Deacon48ec83b2015-05-27 17:25:59 +01001168
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01001169 dev_info(smmu->dev, "event 0x%02x received:\n", id);
1170 for (i = 0; i < ARRAY_SIZE(evt); ++i)
1171 dev_info(smmu->dev, "\t0x%016llx\n",
1172 (unsigned long long)evt[i]);
1173
Zhou Guanghuiffa04952022-01-19 07:07:54 +00001174 cond_resched();
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01001175 }
1176
1177 /*
1178 * Not much we can do on overflow, so scream and pretend we're
1179 * trying harder.
1180 */
1181 if (queue_sync_prod(q) == -EOVERFLOW)
1182 dev_err(smmu->dev, "EVTQ overflow detected -- events lost\n");
1183 } while (!queue_empty(q));
Will Deacon48ec83b2015-05-27 17:25:59 +01001184
1185 /* Sync our overflow flag, as we believe we're up to speed */
1186 q->cons = Q_OVF(q, q->prod) | Q_WRP(q, q->cons) | Q_IDX(q, q->cons);
1187 return IRQ_HANDLED;
1188}
1189
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01001190static void arm_smmu_handle_ppr(struct arm_smmu_device *smmu, u64 *evt)
Will Deacon48ec83b2015-05-27 17:25:59 +01001191{
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01001192 u32 sid, ssid;
1193 u16 grpid;
1194 bool ssv, last;
Will Deacon48ec83b2015-05-27 17:25:59 +01001195
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01001196 sid = evt[0] >> PRIQ_0_SID_SHIFT & PRIQ_0_SID_MASK;
1197 ssv = evt[0] & PRIQ_0_SSID_V;
1198 ssid = ssv ? evt[0] >> PRIQ_0_SSID_SHIFT & PRIQ_0_SSID_MASK : 0;
1199 last = evt[0] & PRIQ_0_PRG_LAST;
1200 grpid = evt[1] >> PRIQ_1_PRG_IDX_SHIFT & PRIQ_1_PRG_IDX_MASK;
Will Deacon48ec83b2015-05-27 17:25:59 +01001201
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01001202 dev_info(smmu->dev, "unexpected PRI request received:\n");
1203 dev_info(smmu->dev,
1204 "\tsid 0x%08x.0x%05x: [%u%s] %sprivileged %s%s%s access at iova 0x%016llx\n",
1205 sid, ssid, grpid, last ? "L" : "",
1206 evt[0] & PRIQ_0_PERM_PRIV ? "" : "un",
1207 evt[0] & PRIQ_0_PERM_READ ? "R" : "",
1208 evt[0] & PRIQ_0_PERM_WRITE ? "W" : "",
1209 evt[0] & PRIQ_0_PERM_EXEC ? "X" : "",
1210 evt[1] & PRIQ_1_ADDR_MASK << PRIQ_1_ADDR_SHIFT);
1211
1212 if (last) {
1213 struct arm_smmu_cmdq_ent cmd = {
1214 .opcode = CMDQ_OP_PRI_RESP,
1215 .substream_valid = ssv,
1216 .pri = {
1217 .sid = sid,
1218 .ssid = ssid,
1219 .grpid = grpid,
1220 .resp = PRI_RESP_DENY,
1221 },
1222 };
1223
1224 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
1225 }
Will Deacon48ec83b2015-05-27 17:25:59 +01001226}
1227
1228static irqreturn_t arm_smmu_priq_thread(int irq, void *dev)
1229{
1230 struct arm_smmu_device *smmu = dev;
1231 struct arm_smmu_queue *q = &smmu->priq.q;
1232 u64 evt[PRIQ_ENT_DWORDS];
1233
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01001234 do {
1235 while (!queue_remove_raw(q, evt))
1236 arm_smmu_handle_ppr(smmu, evt);
Will Deacon48ec83b2015-05-27 17:25:59 +01001237
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01001238 if (queue_sync_prod(q) == -EOVERFLOW)
1239 dev_err(smmu->dev, "PRIQ overflow detected -- requests lost\n");
1240 } while (!queue_empty(q));
Will Deacon48ec83b2015-05-27 17:25:59 +01001241
1242 /* Sync our overflow flag, as we believe we're up to speed */
1243 q->cons = Q_OVF(q, q->prod) | Q_WRP(q, q->cons) | Q_IDX(q, q->cons);
Miao Zhongbd089742018-07-23 20:56:58 +08001244 writel(q->cons, q->cons_reg);
Will Deacon48ec83b2015-05-27 17:25:59 +01001245 return IRQ_HANDLED;
1246}
1247
Will Deacon48ec83b2015-05-27 17:25:59 +01001248static irqreturn_t arm_smmu_cmdq_sync_handler(int irq, void *dev)
1249{
1250 /* We don't actually use CMD_SYNC interrupts for anything */
1251 return IRQ_HANDLED;
1252}
1253
1254static int arm_smmu_device_disable(struct arm_smmu_device *smmu);
1255
1256static irqreturn_t arm_smmu_gerror_handler(int irq, void *dev)
1257{
Prem Mallappa324ba102015-12-14 22:01:14 +05301258 u32 gerror, gerrorn, active;
Will Deacon48ec83b2015-05-27 17:25:59 +01001259 struct arm_smmu_device *smmu = dev;
1260
1261 gerror = readl_relaxed(smmu->base + ARM_SMMU_GERROR);
1262 gerrorn = readl_relaxed(smmu->base + ARM_SMMU_GERRORN);
1263
Prem Mallappa324ba102015-12-14 22:01:14 +05301264 active = gerror ^ gerrorn;
1265 if (!(active & GERROR_ERR_MASK))
Will Deacon48ec83b2015-05-27 17:25:59 +01001266 return IRQ_NONE; /* No errors pending */
1267
1268 dev_warn(smmu->dev,
1269 "unexpected global error reported (0x%08x), this could be serious\n",
Prem Mallappa324ba102015-12-14 22:01:14 +05301270 active);
Will Deacon48ec83b2015-05-27 17:25:59 +01001271
Prem Mallappa324ba102015-12-14 22:01:14 +05301272 if (active & GERROR_SFM_ERR) {
Will Deacon48ec83b2015-05-27 17:25:59 +01001273 dev_err(smmu->dev, "device has entered Service Failure Mode!\n");
1274 arm_smmu_device_disable(smmu);
1275 }
1276
Prem Mallappa324ba102015-12-14 22:01:14 +05301277 if (active & GERROR_MSI_GERROR_ABT_ERR)
Will Deacon48ec83b2015-05-27 17:25:59 +01001278 dev_warn(smmu->dev, "GERROR MSI write aborted\n");
1279
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01001280 if (active & GERROR_MSI_PRIQ_ABT_ERR)
Will Deacon48ec83b2015-05-27 17:25:59 +01001281 dev_warn(smmu->dev, "PRIQ MSI write aborted\n");
Will Deacon48ec83b2015-05-27 17:25:59 +01001282
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01001283 if (active & GERROR_MSI_EVTQ_ABT_ERR)
Will Deacon48ec83b2015-05-27 17:25:59 +01001284 dev_warn(smmu->dev, "EVTQ MSI write aborted\n");
Will Deacon48ec83b2015-05-27 17:25:59 +01001285
Prem Mallappa324ba102015-12-14 22:01:14 +05301286 if (active & GERROR_MSI_CMDQ_ABT_ERR) {
Will Deacon48ec83b2015-05-27 17:25:59 +01001287 dev_warn(smmu->dev, "CMDQ MSI write aborted\n");
1288 arm_smmu_cmdq_sync_handler(irq, smmu->dev);
1289 }
1290
Prem Mallappa324ba102015-12-14 22:01:14 +05301291 if (active & GERROR_PRIQ_ABT_ERR)
Will Deacon48ec83b2015-05-27 17:25:59 +01001292 dev_err(smmu->dev, "PRIQ write aborted -- events may have been lost\n");
1293
Prem Mallappa324ba102015-12-14 22:01:14 +05301294 if (active & GERROR_EVTQ_ABT_ERR)
Will Deacon48ec83b2015-05-27 17:25:59 +01001295 dev_err(smmu->dev, "EVTQ write aborted -- events may have been lost\n");
1296
Prem Mallappa324ba102015-12-14 22:01:14 +05301297 if (active & GERROR_CMDQ_ERR)
Will Deacon48ec83b2015-05-27 17:25:59 +01001298 arm_smmu_cmdq_skip_err(smmu);
1299
1300 writel(gerror, smmu->base + ARM_SMMU_GERRORN);
1301 return IRQ_HANDLED;
1302}
1303
1304/* IO_PGTABLE API */
1305static void __arm_smmu_tlb_sync(struct arm_smmu_device *smmu)
1306{
1307 struct arm_smmu_cmdq_ent cmd;
1308
1309 cmd.opcode = CMDQ_OP_CMD_SYNC;
1310 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
1311}
1312
1313static void arm_smmu_tlb_sync(void *cookie)
1314{
1315 struct arm_smmu_domain *smmu_domain = cookie;
1316 __arm_smmu_tlb_sync(smmu_domain->smmu);
1317}
1318
1319static void arm_smmu_tlb_inv_context(void *cookie)
1320{
1321 struct arm_smmu_domain *smmu_domain = cookie;
1322 struct arm_smmu_device *smmu = smmu_domain->smmu;
1323 struct arm_smmu_cmdq_ent cmd;
1324
1325 if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) {
1326 cmd.opcode = CMDQ_OP_TLBI_NH_ASID;
1327 cmd.tlbi.asid = smmu_domain->s1_cfg.cd.asid;
1328 cmd.tlbi.vmid = 0;
1329 } else {
1330 cmd.opcode = CMDQ_OP_TLBI_S12_VMALL;
1331 cmd.tlbi.vmid = smmu_domain->s2_cfg.vmid;
1332 }
1333
1334 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
1335 __arm_smmu_tlb_sync(smmu);
1336}
1337
1338static void arm_smmu_tlb_inv_range_nosync(unsigned long iova, size_t size,
Robin Murphy06c610e2015-12-07 18:18:53 +00001339 size_t granule, bool leaf, void *cookie)
Will Deacon48ec83b2015-05-27 17:25:59 +01001340{
1341 struct arm_smmu_domain *smmu_domain = cookie;
1342 struct arm_smmu_device *smmu = smmu_domain->smmu;
1343 struct arm_smmu_cmdq_ent cmd = {
1344 .tlbi = {
1345 .leaf = leaf,
1346 .addr = iova,
1347 },
1348 };
1349
1350 if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) {
1351 cmd.opcode = CMDQ_OP_TLBI_NH_VA;
1352 cmd.tlbi.asid = smmu_domain->s1_cfg.cd.asid;
1353 } else {
1354 cmd.opcode = CMDQ_OP_TLBI_S2_IPA;
1355 cmd.tlbi.vmid = smmu_domain->s2_cfg.vmid;
1356 }
1357
Robin Murphy75df1382015-12-07 18:18:52 +00001358 do {
1359 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
1360 cmd.tlbi.addr += granule;
1361 } while (size -= granule);
Will Deacon48ec83b2015-05-27 17:25:59 +01001362}
1363
Will Deacon48ec83b2015-05-27 17:25:59 +01001364static struct iommu_gather_ops arm_smmu_gather_ops = {
1365 .tlb_flush_all = arm_smmu_tlb_inv_context,
1366 .tlb_add_flush = arm_smmu_tlb_inv_range_nosync,
1367 .tlb_sync = arm_smmu_tlb_sync,
Will Deacon48ec83b2015-05-27 17:25:59 +01001368};
1369
1370/* IOMMU API */
1371static bool arm_smmu_capable(enum iommu_cap cap)
1372{
1373 switch (cap) {
1374 case IOMMU_CAP_CACHE_COHERENCY:
1375 return true;
1376 case IOMMU_CAP_INTR_REMAP:
1377 return true; /* MSIs are just memory writes */
1378 case IOMMU_CAP_NOEXEC:
1379 return true;
1380 default:
1381 return false;
1382 }
1383}
1384
1385static struct iommu_domain *arm_smmu_domain_alloc(unsigned type)
1386{
1387 struct arm_smmu_domain *smmu_domain;
1388
Robin Murphy9adb9592016-01-26 18:06:36 +00001389 if (type != IOMMU_DOMAIN_UNMANAGED && type != IOMMU_DOMAIN_DMA)
Will Deacon48ec83b2015-05-27 17:25:59 +01001390 return NULL;
1391
1392 /*
1393 * Allocate the domain and initialise some of its data structures.
1394 * We can't really do anything meaningful until we've added a
1395 * master.
1396 */
1397 smmu_domain = kzalloc(sizeof(*smmu_domain), GFP_KERNEL);
1398 if (!smmu_domain)
1399 return NULL;
1400
Robin Murphy9adb9592016-01-26 18:06:36 +00001401 if (type == IOMMU_DOMAIN_DMA &&
1402 iommu_get_dma_cookie(&smmu_domain->domain)) {
1403 kfree(smmu_domain);
1404 return NULL;
1405 }
1406
Will Deacon48ec83b2015-05-27 17:25:59 +01001407 mutex_init(&smmu_domain->init_mutex);
1408 spin_lock_init(&smmu_domain->pgtbl_lock);
1409 return &smmu_domain->domain;
1410}
1411
1412static int arm_smmu_bitmap_alloc(unsigned long *map, int span)
1413{
1414 int idx, size = 1 << span;
1415
1416 do {
1417 idx = find_first_zero_bit(map, size);
1418 if (idx == size)
1419 return -ENOSPC;
1420 } while (test_and_set_bit(idx, map));
1421
1422 return idx;
1423}
1424
1425static void arm_smmu_bitmap_free(unsigned long *map, int idx)
1426{
1427 clear_bit(idx, map);
1428}
1429
1430static void arm_smmu_domain_free(struct iommu_domain *domain)
1431{
1432 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
1433 struct arm_smmu_device *smmu = smmu_domain->smmu;
1434
Robin Murphy9adb9592016-01-26 18:06:36 +00001435 iommu_put_dma_cookie(domain);
Markus Elfringa6e08fb2015-06-29 17:47:43 +01001436 free_io_pgtable_ops(smmu_domain->pgtbl_ops);
Will Deacon48ec83b2015-05-27 17:25:59 +01001437
1438 /* Free the CD and ASID, if we allocated them */
1439 if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) {
1440 struct arm_smmu_s1_cfg *cfg = &smmu_domain->s1_cfg;
1441
1442 if (cfg->cdptr) {
Will Deacon04fa26c2015-10-30 18:12:41 +00001443 dmam_free_coherent(smmu_domain->smmu->dev,
1444 CTXDESC_CD_DWORDS << 3,
1445 cfg->cdptr,
1446 cfg->cdptr_dma);
Will Deacon48ec83b2015-05-27 17:25:59 +01001447
1448 arm_smmu_bitmap_free(smmu->asid_map, cfg->cd.asid);
1449 }
1450 } else {
1451 struct arm_smmu_s2_cfg *cfg = &smmu_domain->s2_cfg;
1452 if (cfg->vmid)
1453 arm_smmu_bitmap_free(smmu->vmid_map, cfg->vmid);
1454 }
1455
1456 kfree(smmu_domain);
1457}
1458
1459static int arm_smmu_domain_finalise_s1(struct arm_smmu_domain *smmu_domain,
1460 struct io_pgtable_cfg *pgtbl_cfg)
1461{
1462 int ret;
Will Deaconc0733a22015-10-13 17:51:14 +01001463 int asid;
Will Deacon48ec83b2015-05-27 17:25:59 +01001464 struct arm_smmu_device *smmu = smmu_domain->smmu;
1465 struct arm_smmu_s1_cfg *cfg = &smmu_domain->s1_cfg;
1466
1467 asid = arm_smmu_bitmap_alloc(smmu->asid_map, smmu->asid_bits);
Arnd Bergmann287980e2016-05-27 23:23:25 +02001468 if (asid < 0)
Will Deacon48ec83b2015-05-27 17:25:59 +01001469 return asid;
1470
Will Deacon04fa26c2015-10-30 18:12:41 +00001471 cfg->cdptr = dmam_alloc_coherent(smmu->dev, CTXDESC_CD_DWORDS << 3,
1472 &cfg->cdptr_dma,
1473 GFP_KERNEL | __GFP_ZERO);
Will Deacon48ec83b2015-05-27 17:25:59 +01001474 if (!cfg->cdptr) {
1475 dev_warn(smmu->dev, "failed to allocate context descriptor\n");
Will Deaconc0733a22015-10-13 17:51:14 +01001476 ret = -ENOMEM;
Will Deacon48ec83b2015-05-27 17:25:59 +01001477 goto out_free_asid;
1478 }
1479
Will Deaconc0733a22015-10-13 17:51:14 +01001480 cfg->cd.asid = (u16)asid;
Will Deacon48ec83b2015-05-27 17:25:59 +01001481 cfg->cd.ttbr = pgtbl_cfg->arm_lpae_s1_cfg.ttbr[0];
1482 cfg->cd.tcr = pgtbl_cfg->arm_lpae_s1_cfg.tcr;
1483 cfg->cd.mair = pgtbl_cfg->arm_lpae_s1_cfg.mair[0];
1484 return 0;
1485
1486out_free_asid:
1487 arm_smmu_bitmap_free(smmu->asid_map, asid);
1488 return ret;
1489}
1490
1491static int arm_smmu_domain_finalise_s2(struct arm_smmu_domain *smmu_domain,
1492 struct io_pgtable_cfg *pgtbl_cfg)
1493{
Will Deaconc0733a22015-10-13 17:51:14 +01001494 int vmid;
Will Deacon48ec83b2015-05-27 17:25:59 +01001495 struct arm_smmu_device *smmu = smmu_domain->smmu;
1496 struct arm_smmu_s2_cfg *cfg = &smmu_domain->s2_cfg;
1497
1498 vmid = arm_smmu_bitmap_alloc(smmu->vmid_map, smmu->vmid_bits);
Arnd Bergmann287980e2016-05-27 23:23:25 +02001499 if (vmid < 0)
Will Deacon48ec83b2015-05-27 17:25:59 +01001500 return vmid;
1501
Will Deaconc0733a22015-10-13 17:51:14 +01001502 cfg->vmid = (u16)vmid;
Will Deacon48ec83b2015-05-27 17:25:59 +01001503 cfg->vttbr = pgtbl_cfg->arm_lpae_s2_cfg.vttbr;
1504 cfg->vtcr = pgtbl_cfg->arm_lpae_s2_cfg.vtcr;
1505 return 0;
1506}
1507
Will Deacon48ec83b2015-05-27 17:25:59 +01001508static int arm_smmu_domain_finalise(struct iommu_domain *domain)
1509{
1510 int ret;
1511 unsigned long ias, oas;
1512 enum io_pgtable_fmt fmt;
1513 struct io_pgtable_cfg pgtbl_cfg;
1514 struct io_pgtable_ops *pgtbl_ops;
1515 int (*finalise_stage_fn)(struct arm_smmu_domain *,
1516 struct io_pgtable_cfg *);
1517 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
1518 struct arm_smmu_device *smmu = smmu_domain->smmu;
1519
1520 /* Restrict the stage to what we can actually support */
1521 if (!(smmu->features & ARM_SMMU_FEAT_TRANS_S1))
1522 smmu_domain->stage = ARM_SMMU_DOMAIN_S2;
1523 if (!(smmu->features & ARM_SMMU_FEAT_TRANS_S2))
1524 smmu_domain->stage = ARM_SMMU_DOMAIN_S1;
1525
1526 switch (smmu_domain->stage) {
1527 case ARM_SMMU_DOMAIN_S1:
1528 ias = VA_BITS;
1529 oas = smmu->ias;
1530 fmt = ARM_64_LPAE_S1;
1531 finalise_stage_fn = arm_smmu_domain_finalise_s1;
1532 break;
1533 case ARM_SMMU_DOMAIN_NESTED:
1534 case ARM_SMMU_DOMAIN_S2:
1535 ias = smmu->ias;
1536 oas = smmu->oas;
1537 fmt = ARM_64_LPAE_S2;
1538 finalise_stage_fn = arm_smmu_domain_finalise_s2;
1539 break;
1540 default:
1541 return -EINVAL;
1542 }
1543
1544 pgtbl_cfg = (struct io_pgtable_cfg) {
Robin Murphyd5466352016-05-09 17:20:09 +01001545 .pgsize_bitmap = smmu->pgsize_bitmap,
Will Deacon48ec83b2015-05-27 17:25:59 +01001546 .ias = ias,
1547 .oas = oas,
1548 .tlb = &arm_smmu_gather_ops,
Robin Murphybdc6d972015-07-29 19:46:07 +01001549 .iommu_dev = smmu->dev,
Will Deacon48ec83b2015-05-27 17:25:59 +01001550 };
1551
1552 pgtbl_ops = alloc_io_pgtable_ops(fmt, &pgtbl_cfg, smmu_domain);
1553 if (!pgtbl_ops)
1554 return -ENOMEM;
1555
Robin Murphyd5466352016-05-09 17:20:09 +01001556 domain->pgsize_bitmap = pgtbl_cfg.pgsize_bitmap;
Robin Murphy455eb7d2016-09-12 17:13:58 +01001557 domain->geometry.aperture_end = (1UL << ias) - 1;
1558 domain->geometry.force_aperture = true;
Will Deacon48ec83b2015-05-27 17:25:59 +01001559
1560 ret = finalise_stage_fn(smmu_domain, &pgtbl_cfg);
Jean-Philippe Brucker03975fa2017-12-14 11:03:01 +00001561 if (ret < 0) {
Will Deacon48ec83b2015-05-27 17:25:59 +01001562 free_io_pgtable_ops(pgtbl_ops);
Jean-Philippe Brucker03975fa2017-12-14 11:03:01 +00001563 return ret;
1564 }
Will Deacon48ec83b2015-05-27 17:25:59 +01001565
Jean-Philippe Brucker03975fa2017-12-14 11:03:01 +00001566 smmu_domain->pgtbl_ops = pgtbl_ops;
1567 return 0;
Will Deacon48ec83b2015-05-27 17:25:59 +01001568}
1569
Will Deacon48ec83b2015-05-27 17:25:59 +01001570static __le64 *arm_smmu_get_step_for_sid(struct arm_smmu_device *smmu, u32 sid)
1571{
1572 __le64 *step;
1573 struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg;
1574
1575 if (smmu->features & ARM_SMMU_FEAT_2_LVL_STRTAB) {
1576 struct arm_smmu_strtab_l1_desc *l1_desc;
1577 int idx;
1578
1579 /* Two-level walk */
1580 idx = (sid >> STRTAB_SPLIT) * STRTAB_L1_DESC_DWORDS;
1581 l1_desc = &cfg->l1_desc[idx];
1582 idx = (sid & ((1 << STRTAB_SPLIT) - 1)) * STRTAB_STE_DWORDS;
1583 step = &l1_desc->l2ptr[idx];
1584 } else {
1585 /* Simple linear lookup */
1586 step = &cfg->strtab[sid * STRTAB_STE_DWORDS];
1587 }
1588
1589 return step;
1590}
1591
Robin Murphy8f785152016-09-12 17:13:45 +01001592static int arm_smmu_install_ste_for_dev(struct iommu_fwspec *fwspec)
Will Deacon48ec83b2015-05-27 17:25:59 +01001593{
Robin Murphye6a897a2018-01-02 12:33:14 +00001594 int i, j;
Robin Murphy8f785152016-09-12 17:13:45 +01001595 struct arm_smmu_master_data *master = fwspec->iommu_priv;
1596 struct arm_smmu_device *smmu = master->smmu;
Will Deacon48ec83b2015-05-27 17:25:59 +01001597
Robin Murphy8f785152016-09-12 17:13:45 +01001598 for (i = 0; i < fwspec->num_ids; ++i) {
1599 u32 sid = fwspec->ids[i];
Will Deacon48ec83b2015-05-27 17:25:59 +01001600 __le64 *step = arm_smmu_get_step_for_sid(smmu, sid);
1601
Robin Murphye6a897a2018-01-02 12:33:14 +00001602 /* Bridged PCI devices may end up with duplicated IDs */
1603 for (j = 0; j < i; j++)
1604 if (fwspec->ids[j] == sid)
1605 break;
1606 if (j < i)
1607 continue;
1608
Robin Murphy8f785152016-09-12 17:13:45 +01001609 arm_smmu_write_strtab_ent(smmu, sid, step, &master->ste);
Will Deacon48ec83b2015-05-27 17:25:59 +01001610 }
1611
1612 return 0;
1613}
1614
Will Deaconbc7f2ce2016-02-17 17:41:57 +00001615static void arm_smmu_detach_dev(struct device *dev)
1616{
Robin Murphy8f785152016-09-12 17:13:45 +01001617 struct arm_smmu_master_data *master = dev->iommu_fwspec->iommu_priv;
Will Deaconbc7f2ce2016-02-17 17:41:57 +00001618
Robin Murphy8f785152016-09-12 17:13:45 +01001619 master->ste.bypass = true;
1620 if (arm_smmu_install_ste_for_dev(dev->iommu_fwspec) < 0)
Will Deaconbc7f2ce2016-02-17 17:41:57 +00001621 dev_warn(dev, "failed to install bypass STE\n");
Will Deaconbc7f2ce2016-02-17 17:41:57 +00001622}
1623
Will Deacon48ec83b2015-05-27 17:25:59 +01001624static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)
1625{
1626 int ret = 0;
1627 struct arm_smmu_device *smmu;
1628 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
Robin Murphy8f785152016-09-12 17:13:45 +01001629 struct arm_smmu_master_data *master;
1630 struct arm_smmu_strtab_ent *ste;
Will Deacon48ec83b2015-05-27 17:25:59 +01001631
Robin Murphy8f785152016-09-12 17:13:45 +01001632 if (!dev->iommu_fwspec)
Will Deacon48ec83b2015-05-27 17:25:59 +01001633 return -ENOENT;
1634
Robin Murphy8f785152016-09-12 17:13:45 +01001635 master = dev->iommu_fwspec->iommu_priv;
1636 smmu = master->smmu;
1637 ste = &master->ste;
1638
Will Deacon48ec83b2015-05-27 17:25:59 +01001639 /* Already attached to a different domain? */
Robin Murphy8f785152016-09-12 17:13:45 +01001640 if (!ste->bypass)
Will Deaconbc7f2ce2016-02-17 17:41:57 +00001641 arm_smmu_detach_dev(dev);
Will Deacon48ec83b2015-05-27 17:25:59 +01001642
Will Deacon48ec83b2015-05-27 17:25:59 +01001643 mutex_lock(&smmu_domain->init_mutex);
1644
1645 if (!smmu_domain->smmu) {
1646 smmu_domain->smmu = smmu;
1647 ret = arm_smmu_domain_finalise(domain);
1648 if (ret) {
1649 smmu_domain->smmu = NULL;
1650 goto out_unlock;
1651 }
1652 } else if (smmu_domain->smmu != smmu) {
1653 dev_err(dev,
1654 "cannot attach to SMMU %s (upstream of %s)\n",
1655 dev_name(smmu_domain->smmu->dev),
1656 dev_name(smmu->dev));
1657 ret = -ENXIO;
1658 goto out_unlock;
1659 }
1660
Robin Murphy8f785152016-09-12 17:13:45 +01001661 ste->bypass = false;
1662 ste->valid = true;
Will Deacon48ec83b2015-05-27 17:25:59 +01001663
Robin Murphy8f785152016-09-12 17:13:45 +01001664 if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) {
1665 ste->s1_cfg = &smmu_domain->s1_cfg;
1666 ste->s2_cfg = NULL;
1667 arm_smmu_write_ctx_desc(smmu, ste->s1_cfg);
1668 } else {
1669 ste->s1_cfg = NULL;
1670 ste->s2_cfg = &smmu_domain->s2_cfg;
1671 }
Will Deaconcbf82772016-02-18 12:05:57 +00001672
Robin Murphy8f785152016-09-12 17:13:45 +01001673 ret = arm_smmu_install_ste_for_dev(dev->iommu_fwspec);
Arnd Bergmann287980e2016-05-27 23:23:25 +02001674 if (ret < 0)
Robin Murphy8f785152016-09-12 17:13:45 +01001675 ste->valid = false;
Will Deacon48ec83b2015-05-27 17:25:59 +01001676
1677out_unlock:
1678 mutex_unlock(&smmu_domain->init_mutex);
1679 return ret;
1680}
1681
Will Deacon48ec83b2015-05-27 17:25:59 +01001682static int arm_smmu_map(struct iommu_domain *domain, unsigned long iova,
1683 phys_addr_t paddr, size_t size, int prot)
1684{
1685 int ret;
1686 unsigned long flags;
1687 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
1688 struct io_pgtable_ops *ops = smmu_domain->pgtbl_ops;
1689
1690 if (!ops)
1691 return -ENODEV;
1692
1693 spin_lock_irqsave(&smmu_domain->pgtbl_lock, flags);
1694 ret = ops->map(ops, iova, paddr, size, prot);
1695 spin_unlock_irqrestore(&smmu_domain->pgtbl_lock, flags);
1696 return ret;
1697}
1698
1699static size_t
1700arm_smmu_unmap(struct iommu_domain *domain, unsigned long iova, size_t size)
1701{
1702 size_t ret;
1703 unsigned long flags;
1704 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
1705 struct io_pgtable_ops *ops = smmu_domain->pgtbl_ops;
1706
1707 if (!ops)
1708 return 0;
1709
1710 spin_lock_irqsave(&smmu_domain->pgtbl_lock, flags);
1711 ret = ops->unmap(ops, iova, size);
1712 spin_unlock_irqrestore(&smmu_domain->pgtbl_lock, flags);
1713 return ret;
1714}
1715
1716static phys_addr_t
1717arm_smmu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova)
1718{
1719 phys_addr_t ret;
1720 unsigned long flags;
1721 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
1722 struct io_pgtable_ops *ops = smmu_domain->pgtbl_ops;
1723
1724 if (!ops)
1725 return 0;
1726
1727 spin_lock_irqsave(&smmu_domain->pgtbl_lock, flags);
1728 ret = ops->iova_to_phys(ops, iova);
1729 spin_unlock_irqrestore(&smmu_domain->pgtbl_lock, flags);
1730
1731 return ret;
1732}
1733
Robin Murphy8f785152016-09-12 17:13:45 +01001734static struct platform_driver arm_smmu_driver;
1735
1736static int arm_smmu_match_node(struct device *dev, void *data)
Will Deacon48ec83b2015-05-27 17:25:59 +01001737{
Robin Murphy8f785152016-09-12 17:13:45 +01001738 return dev->of_node == data;
Will Deacon48ec83b2015-05-27 17:25:59 +01001739}
1740
Robin Murphy8f785152016-09-12 17:13:45 +01001741static struct arm_smmu_device *arm_smmu_get_by_node(struct device_node *np)
Will Deacon48ec83b2015-05-27 17:25:59 +01001742{
Robin Murphy8f785152016-09-12 17:13:45 +01001743 struct device *dev = driver_find_device(&arm_smmu_driver.driver, NULL,
1744 np, arm_smmu_match_node);
1745 put_device(dev);
1746 return dev ? dev_get_drvdata(dev) : NULL;
Will Deacon48ec83b2015-05-27 17:25:59 +01001747}
1748
1749static bool arm_smmu_sid_in_range(struct arm_smmu_device *smmu, u32 sid)
1750{
1751 unsigned long limit = smmu->strtab_cfg.num_l1_ents;
1752
1753 if (smmu->features & ARM_SMMU_FEAT_2_LVL_STRTAB)
1754 limit *= 1UL << STRTAB_SPLIT;
1755
1756 return sid < limit;
1757}
1758
Robin Murphy8f785152016-09-12 17:13:45 +01001759static struct iommu_ops arm_smmu_ops;
1760
Will Deacon48ec83b2015-05-27 17:25:59 +01001761static int arm_smmu_add_device(struct device *dev)
1762{
1763 int i, ret;
Will Deacon48ec83b2015-05-27 17:25:59 +01001764 struct arm_smmu_device *smmu;
Robin Murphy8f785152016-09-12 17:13:45 +01001765 struct arm_smmu_master_data *master;
1766 struct iommu_fwspec *fwspec = dev->iommu_fwspec;
1767 struct iommu_group *group;
Will Deacon48ec83b2015-05-27 17:25:59 +01001768
Robin Murphy8f785152016-09-12 17:13:45 +01001769 if (!fwspec || fwspec->ops != &arm_smmu_ops)
Will Deacon48ec83b2015-05-27 17:25:59 +01001770 return -ENODEV;
Robin Murphy8f785152016-09-12 17:13:45 +01001771 /*
1772 * We _can_ actually withstand dodgy bus code re-calling add_device()
1773 * without an intervening remove_device()/of_xlate() sequence, but
1774 * we're not going to do so quietly...
1775 */
1776 if (WARN_ON_ONCE(fwspec->iommu_priv)) {
1777 master = fwspec->iommu_priv;
1778 smmu = master->smmu;
Will Deacon48ec83b2015-05-27 17:25:59 +01001779 } else {
Robin Murphy8f785152016-09-12 17:13:45 +01001780 smmu = arm_smmu_get_by_node(to_of_node(fwspec->iommu_fwnode));
1781 if (!smmu)
1782 return -ENODEV;
1783 master = kzalloc(sizeof(*master), GFP_KERNEL);
1784 if (!master)
1785 return -ENOMEM;
1786
1787 master->smmu = smmu;
1788 fwspec->iommu_priv = master;
Will Deacon48ec83b2015-05-27 17:25:59 +01001789 }
1790
Robin Murphy8f785152016-09-12 17:13:45 +01001791 /* Check the SIDs are in range of the SMMU and our stream table */
1792 for (i = 0; i < fwspec->num_ids; i++) {
1793 u32 sid = fwspec->ids[i];
1794
1795 if (!arm_smmu_sid_in_range(smmu, sid))
1796 return -ERANGE;
1797
1798 /* Ensure l2 strtab is initialised */
1799 if (smmu->features & ARM_SMMU_FEAT_2_LVL_STRTAB) {
1800 ret = arm_smmu_init_l2_strtab(smmu, sid);
1801 if (ret)
1802 return ret;
1803 }
Will Deacon48ec83b2015-05-27 17:25:59 +01001804 }
1805
Robin Murphy8f785152016-09-12 17:13:45 +01001806 group = iommu_group_get_for_dev(dev);
1807 if (!IS_ERR(group))
1808 iommu_group_put(group);
Will Deacon48ec83b2015-05-27 17:25:59 +01001809
Robin Murphy8f785152016-09-12 17:13:45 +01001810 return PTR_ERR_OR_ZERO(group);
Will Deacon48ec83b2015-05-27 17:25:59 +01001811}
1812
1813static void arm_smmu_remove_device(struct device *dev)
1814{
Robin Murphy8f785152016-09-12 17:13:45 +01001815 struct iommu_fwspec *fwspec = dev->iommu_fwspec;
1816 struct arm_smmu_master_data *master;
1817
1818 if (!fwspec || fwspec->ops != &arm_smmu_ops)
1819 return;
1820
1821 master = fwspec->iommu_priv;
1822 if (master && master->ste.valid)
1823 arm_smmu_detach_dev(dev);
Will Deacon48ec83b2015-05-27 17:25:59 +01001824 iommu_group_remove_device(dev);
Robin Murphy8f785152016-09-12 17:13:45 +01001825 kfree(master);
1826 iommu_fwspec_free(dev);
Will Deacon48ec83b2015-05-27 17:25:59 +01001827}
1828
Robin Murphy08d4ca22016-09-12 17:13:46 +01001829static struct iommu_group *arm_smmu_device_group(struct device *dev)
1830{
1831 struct iommu_group *group;
1832
1833 /*
1834 * We don't support devices sharing stream IDs other than PCI RID
1835 * aliases, since the necessary ID-to-device lookup becomes rather
1836 * impractical given a potential sparse 32-bit stream ID space.
1837 */
1838 if (dev_is_pci(dev))
1839 group = pci_device_group(dev);
1840 else
1841 group = generic_device_group(dev);
1842
1843 return group;
1844}
1845
Will Deacon48ec83b2015-05-27 17:25:59 +01001846static int arm_smmu_domain_get_attr(struct iommu_domain *domain,
1847 enum iommu_attr attr, void *data)
1848{
1849 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
1850
1851 switch (attr) {
1852 case DOMAIN_ATTR_NESTING:
1853 *(int *)data = (smmu_domain->stage == ARM_SMMU_DOMAIN_NESTED);
1854 return 0;
1855 default:
1856 return -ENODEV;
1857 }
1858}
1859
1860static int arm_smmu_domain_set_attr(struct iommu_domain *domain,
1861 enum iommu_attr attr, void *data)
1862{
1863 int ret = 0;
1864 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
1865
1866 mutex_lock(&smmu_domain->init_mutex);
1867
1868 switch (attr) {
1869 case DOMAIN_ATTR_NESTING:
1870 if (smmu_domain->smmu) {
1871 ret = -EPERM;
1872 goto out_unlock;
1873 }
1874
1875 if (*(int *)data)
1876 smmu_domain->stage = ARM_SMMU_DOMAIN_NESTED;
1877 else
1878 smmu_domain->stage = ARM_SMMU_DOMAIN_S1;
1879
1880 break;
1881 default:
1882 ret = -ENODEV;
1883 }
1884
1885out_unlock:
1886 mutex_unlock(&smmu_domain->init_mutex);
1887 return ret;
1888}
1889
Robin Murphy8f785152016-09-12 17:13:45 +01001890static int arm_smmu_of_xlate(struct device *dev, struct of_phandle_args *args)
1891{
Robin Murphy8f785152016-09-12 17:13:45 +01001892 return iommu_fwspec_add_ids(dev, args->args, 1);
1893}
1894
Will Deacon48ec83b2015-05-27 17:25:59 +01001895static struct iommu_ops arm_smmu_ops = {
1896 .capable = arm_smmu_capable,
1897 .domain_alloc = arm_smmu_domain_alloc,
1898 .domain_free = arm_smmu_domain_free,
1899 .attach_dev = arm_smmu_attach_dev,
Will Deacon48ec83b2015-05-27 17:25:59 +01001900 .map = arm_smmu_map,
1901 .unmap = arm_smmu_unmap,
Jean-Philippe Brucker9aeb26c2016-06-03 11:50:30 +01001902 .map_sg = default_iommu_map_sg,
Will Deacon48ec83b2015-05-27 17:25:59 +01001903 .iova_to_phys = arm_smmu_iova_to_phys,
1904 .add_device = arm_smmu_add_device,
1905 .remove_device = arm_smmu_remove_device,
Robin Murphy08d4ca22016-09-12 17:13:46 +01001906 .device_group = arm_smmu_device_group,
Will Deacon48ec83b2015-05-27 17:25:59 +01001907 .domain_get_attr = arm_smmu_domain_get_attr,
1908 .domain_set_attr = arm_smmu_domain_set_attr,
Robin Murphy8f785152016-09-12 17:13:45 +01001909 .of_xlate = arm_smmu_of_xlate,
Will Deacon48ec83b2015-05-27 17:25:59 +01001910 .pgsize_bitmap = -1UL, /* Restricted during device attach */
1911};
1912
1913/* Probing and initialisation functions */
1914static int arm_smmu_init_one_queue(struct arm_smmu_device *smmu,
1915 struct arm_smmu_queue *q,
1916 unsigned long prod_off,
1917 unsigned long cons_off,
1918 size_t dwords)
1919{
1920 size_t qsz = ((1 << q->max_n_shift) * dwords) << 3;
1921
Will Deacon04fa26c2015-10-30 18:12:41 +00001922 q->base = dmam_alloc_coherent(smmu->dev, qsz, &q->base_dma, GFP_KERNEL);
Will Deacon48ec83b2015-05-27 17:25:59 +01001923 if (!q->base) {
1924 dev_err(smmu->dev, "failed to allocate queue (0x%zx bytes)\n",
1925 qsz);
1926 return -ENOMEM;
1927 }
1928
1929 q->prod_reg = smmu->base + prod_off;
1930 q->cons_reg = smmu->base + cons_off;
1931 q->ent_dwords = dwords;
1932
1933 q->q_base = Q_BASE_RWA;
1934 q->q_base |= q->base_dma & Q_BASE_ADDR_MASK << Q_BASE_ADDR_SHIFT;
1935 q->q_base |= (q->max_n_shift & Q_BASE_LOG2SIZE_MASK)
1936 << Q_BASE_LOG2SIZE_SHIFT;
1937
1938 q->prod = q->cons = 0;
1939 return 0;
1940}
1941
Will Deacon48ec83b2015-05-27 17:25:59 +01001942static int arm_smmu_init_queues(struct arm_smmu_device *smmu)
1943{
1944 int ret;
1945
1946 /* cmdq */
1947 spin_lock_init(&smmu->cmdq.lock);
1948 ret = arm_smmu_init_one_queue(smmu, &smmu->cmdq.q, ARM_SMMU_CMDQ_PROD,
1949 ARM_SMMU_CMDQ_CONS, CMDQ_ENT_DWORDS);
1950 if (ret)
Will Deacon04fa26c2015-10-30 18:12:41 +00001951 return ret;
Will Deacon48ec83b2015-05-27 17:25:59 +01001952
1953 /* evtq */
1954 ret = arm_smmu_init_one_queue(smmu, &smmu->evtq.q, ARM_SMMU_EVTQ_PROD,
1955 ARM_SMMU_EVTQ_CONS, EVTQ_ENT_DWORDS);
1956 if (ret)
Will Deacon04fa26c2015-10-30 18:12:41 +00001957 return ret;
Will Deacon48ec83b2015-05-27 17:25:59 +01001958
1959 /* priq */
1960 if (!(smmu->features & ARM_SMMU_FEAT_PRI))
1961 return 0;
1962
Will Deacon04fa26c2015-10-30 18:12:41 +00001963 return arm_smmu_init_one_queue(smmu, &smmu->priq.q, ARM_SMMU_PRIQ_PROD,
1964 ARM_SMMU_PRIQ_CONS, PRIQ_ENT_DWORDS);
Will Deacon48ec83b2015-05-27 17:25:59 +01001965}
1966
1967static int arm_smmu_init_l1_strtab(struct arm_smmu_device *smmu)
1968{
1969 unsigned int i;
1970 struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg;
1971 size_t size = sizeof(*cfg->l1_desc) * cfg->num_l1_ents;
1972 void *strtab = smmu->strtab_cfg.strtab;
1973
1974 cfg->l1_desc = devm_kzalloc(smmu->dev, size, GFP_KERNEL);
1975 if (!cfg->l1_desc) {
1976 dev_err(smmu->dev, "failed to allocate l1 stream table desc\n");
1977 return -ENOMEM;
1978 }
1979
1980 for (i = 0; i < cfg->num_l1_ents; ++i) {
1981 arm_smmu_write_strtab_l1_desc(strtab, &cfg->l1_desc[i]);
1982 strtab += STRTAB_L1_DESC_DWORDS << 3;
1983 }
1984
1985 return 0;
1986}
1987
1988static int arm_smmu_init_strtab_2lvl(struct arm_smmu_device *smmu)
1989{
1990 void *strtab;
1991 u64 reg;
Will Deacond2e88e72015-06-30 10:02:28 +01001992 u32 size, l1size;
Will Deacon48ec83b2015-05-27 17:25:59 +01001993 struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg;
1994
Will Deacon28c8b402015-07-16 17:50:12 +01001995 /*
1996 * If we can resolve everything with a single L2 table, then we
1997 * just need a single L1 descriptor. Otherwise, calculate the L1
1998 * size, capped to the SIDSIZE.
1999 */
2000 if (smmu->sid_bits < STRTAB_SPLIT) {
2001 size = 0;
2002 } else {
2003 size = STRTAB_L1_SZ_SHIFT - (ilog2(STRTAB_L1_DESC_DWORDS) + 3);
2004 size = min(size, smmu->sid_bits - STRTAB_SPLIT);
2005 }
Will Deacond2e88e72015-06-30 10:02:28 +01002006 cfg->num_l1_ents = 1 << size;
2007
2008 size += STRTAB_SPLIT;
2009 if (size < smmu->sid_bits)
Will Deacon48ec83b2015-05-27 17:25:59 +01002010 dev_warn(smmu->dev,
2011 "2-level strtab only covers %u/%u bits of SID\n",
Will Deacond2e88e72015-06-30 10:02:28 +01002012 size, smmu->sid_bits);
Will Deacon48ec83b2015-05-27 17:25:59 +01002013
Will Deacond2e88e72015-06-30 10:02:28 +01002014 l1size = cfg->num_l1_ents * (STRTAB_L1_DESC_DWORDS << 3);
Will Deacon04fa26c2015-10-30 18:12:41 +00002015 strtab = dmam_alloc_coherent(smmu->dev, l1size, &cfg->strtab_dma,
2016 GFP_KERNEL | __GFP_ZERO);
Will Deacon48ec83b2015-05-27 17:25:59 +01002017 if (!strtab) {
2018 dev_err(smmu->dev,
2019 "failed to allocate l1 stream table (%u bytes)\n",
2020 size);
2021 return -ENOMEM;
2022 }
2023 cfg->strtab = strtab;
2024
2025 /* Configure strtab_base_cfg for 2 levels */
2026 reg = STRTAB_BASE_CFG_FMT_2LVL;
2027 reg |= (size & STRTAB_BASE_CFG_LOG2SIZE_MASK)
2028 << STRTAB_BASE_CFG_LOG2SIZE_SHIFT;
2029 reg |= (STRTAB_SPLIT & STRTAB_BASE_CFG_SPLIT_MASK)
2030 << STRTAB_BASE_CFG_SPLIT_SHIFT;
2031 cfg->strtab_base_cfg = reg;
2032
Will Deacon04fa26c2015-10-30 18:12:41 +00002033 return arm_smmu_init_l1_strtab(smmu);
Will Deacon48ec83b2015-05-27 17:25:59 +01002034}
2035
2036static int arm_smmu_init_strtab_linear(struct arm_smmu_device *smmu)
2037{
2038 void *strtab;
2039 u64 reg;
2040 u32 size;
2041 struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg;
2042
2043 size = (1 << smmu->sid_bits) * (STRTAB_STE_DWORDS << 3);
Will Deacon04fa26c2015-10-30 18:12:41 +00002044 strtab = dmam_alloc_coherent(smmu->dev, size, &cfg->strtab_dma,
2045 GFP_KERNEL | __GFP_ZERO);
Will Deacon48ec83b2015-05-27 17:25:59 +01002046 if (!strtab) {
2047 dev_err(smmu->dev,
2048 "failed to allocate linear stream table (%u bytes)\n",
2049 size);
2050 return -ENOMEM;
2051 }
2052 cfg->strtab = strtab;
2053 cfg->num_l1_ents = 1 << smmu->sid_bits;
2054
2055 /* Configure strtab_base_cfg for a linear table covering all SIDs */
2056 reg = STRTAB_BASE_CFG_FMT_LINEAR;
2057 reg |= (smmu->sid_bits & STRTAB_BASE_CFG_LOG2SIZE_MASK)
2058 << STRTAB_BASE_CFG_LOG2SIZE_SHIFT;
2059 cfg->strtab_base_cfg = reg;
2060
2061 arm_smmu_init_bypass_stes(strtab, cfg->num_l1_ents);
2062 return 0;
2063}
2064
2065static int arm_smmu_init_strtab(struct arm_smmu_device *smmu)
2066{
2067 u64 reg;
2068 int ret;
2069
2070 if (smmu->features & ARM_SMMU_FEAT_2_LVL_STRTAB)
2071 ret = arm_smmu_init_strtab_2lvl(smmu);
2072 else
2073 ret = arm_smmu_init_strtab_linear(smmu);
2074
2075 if (ret)
2076 return ret;
2077
2078 /* Set the strtab base address */
2079 reg = smmu->strtab_cfg.strtab_dma &
2080 STRTAB_BASE_ADDR_MASK << STRTAB_BASE_ADDR_SHIFT;
2081 reg |= STRTAB_BASE_RA;
2082 smmu->strtab_cfg.strtab_base = reg;
2083
2084 /* Allocate the first VMID for stage-2 bypass STEs */
2085 set_bit(0, smmu->vmid_map);
2086 return 0;
2087}
2088
Will Deacon48ec83b2015-05-27 17:25:59 +01002089static int arm_smmu_init_structures(struct arm_smmu_device *smmu)
2090{
2091 int ret;
2092
2093 ret = arm_smmu_init_queues(smmu);
2094 if (ret)
2095 return ret;
2096
Will Deacon04fa26c2015-10-30 18:12:41 +00002097 return arm_smmu_init_strtab(smmu);
Will Deacon48ec83b2015-05-27 17:25:59 +01002098}
2099
2100static int arm_smmu_write_reg_sync(struct arm_smmu_device *smmu, u32 val,
2101 unsigned int reg_off, unsigned int ack_off)
2102{
2103 u32 reg;
2104
2105 writel_relaxed(val, smmu->base + reg_off);
2106 return readl_relaxed_poll_timeout(smmu->base + ack_off, reg, reg == val,
2107 1, ARM_SMMU_POLL_TIMEOUT_US);
2108}
2109
Robin Murphydc87a982016-09-12 17:13:44 +01002110/* GBPA is "special" */
2111static int arm_smmu_update_gbpa(struct arm_smmu_device *smmu, u32 set, u32 clr)
2112{
2113 int ret;
2114 u32 reg, __iomem *gbpa = smmu->base + ARM_SMMU_GBPA;
2115
2116 ret = readl_relaxed_poll_timeout(gbpa, reg, !(reg & GBPA_UPDATE),
2117 1, ARM_SMMU_POLL_TIMEOUT_US);
2118 if (ret)
2119 return ret;
2120
2121 reg &= ~clr;
2122 reg |= set;
2123 writel_relaxed(reg | GBPA_UPDATE, gbpa);
2124 return readl_relaxed_poll_timeout(gbpa, reg, !(reg & GBPA_UPDATE),
2125 1, ARM_SMMU_POLL_TIMEOUT_US);
2126}
2127
Marc Zyngier166bdbd2015-10-13 18:32:30 +01002128static void arm_smmu_free_msis(void *data)
2129{
2130 struct device *dev = data;
2131 platform_msi_domain_free_irqs(dev);
2132}
2133
2134static void arm_smmu_write_msi_msg(struct msi_desc *desc, struct msi_msg *msg)
2135{
2136 phys_addr_t doorbell;
2137 struct device *dev = msi_desc_to_dev(desc);
2138 struct arm_smmu_device *smmu = dev_get_drvdata(dev);
2139 phys_addr_t *cfg = arm_smmu_msi_cfg[desc->platform.msi_index];
2140
2141 doorbell = (((u64)msg->address_hi) << 32) | msg->address_lo;
2142 doorbell &= MSI_CFG0_ADDR_MASK << MSI_CFG0_ADDR_SHIFT;
2143
2144 writeq_relaxed(doorbell, smmu->base + cfg[0]);
2145 writel_relaxed(msg->data, smmu->base + cfg[1]);
2146 writel_relaxed(MSI_CFG2_MEMATTR_DEVICE_nGnRE, smmu->base + cfg[2]);
2147}
2148
2149static void arm_smmu_setup_msis(struct arm_smmu_device *smmu)
2150{
2151 struct msi_desc *desc;
2152 int ret, nvec = ARM_SMMU_MAX_MSIS;
2153 struct device *dev = smmu->dev;
2154
2155 /* Clear the MSI address regs */
2156 writeq_relaxed(0, smmu->base + ARM_SMMU_GERROR_IRQ_CFG0);
2157 writeq_relaxed(0, smmu->base + ARM_SMMU_EVTQ_IRQ_CFG0);
2158
2159 if (smmu->features & ARM_SMMU_FEAT_PRI)
2160 writeq_relaxed(0, smmu->base + ARM_SMMU_PRIQ_IRQ_CFG0);
2161 else
2162 nvec--;
2163
2164 if (!(smmu->features & ARM_SMMU_FEAT_MSI))
2165 return;
2166
2167 /* Allocate MSIs for evtq, gerror and priq. Ignore cmdq */
2168 ret = platform_msi_domain_alloc_irqs(dev, nvec, arm_smmu_write_msi_msg);
2169 if (ret) {
2170 dev_warn(dev, "failed to allocate MSIs\n");
2171 return;
2172 }
2173
2174 for_each_msi_entry(desc, dev) {
2175 switch (desc->platform.msi_index) {
2176 case EVTQ_MSI_INDEX:
2177 smmu->evtq.q.irq = desc->irq;
2178 break;
2179 case GERROR_MSI_INDEX:
2180 smmu->gerr_irq = desc->irq;
2181 break;
2182 case PRIQ_MSI_INDEX:
2183 smmu->priq.q.irq = desc->irq;
2184 break;
2185 default: /* Unknown */
2186 continue;
2187 }
2188 }
2189
2190 /* Add callback to free MSIs on teardown */
2191 devm_add_action(dev, arm_smmu_free_msis, dev);
2192}
2193
Will Deacon48ec83b2015-05-27 17:25:59 +01002194static int arm_smmu_setup_irqs(struct arm_smmu_device *smmu)
2195{
2196 int ret, irq;
Marc Zyngierccd63852015-07-15 11:55:18 +01002197 u32 irqen_flags = IRQ_CTRL_EVTQ_IRQEN | IRQ_CTRL_GERROR_IRQEN;
Will Deacon48ec83b2015-05-27 17:25:59 +01002198
2199 /* Disable IRQs first */
2200 ret = arm_smmu_write_reg_sync(smmu, 0, ARM_SMMU_IRQ_CTRL,
2201 ARM_SMMU_IRQ_CTRLACK);
2202 if (ret) {
2203 dev_err(smmu->dev, "failed to disable irqs\n");
2204 return ret;
2205 }
2206
Marc Zyngier166bdbd2015-10-13 18:32:30 +01002207 arm_smmu_setup_msis(smmu);
Will Deacon48ec83b2015-05-27 17:25:59 +01002208
Marc Zyngier166bdbd2015-10-13 18:32:30 +01002209 /* Request interrupt lines */
Will Deacon48ec83b2015-05-27 17:25:59 +01002210 irq = smmu->evtq.q.irq;
2211 if (irq) {
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01002212 ret = devm_request_threaded_irq(smmu->dev, irq, NULL,
Will Deacon48ec83b2015-05-27 17:25:59 +01002213 arm_smmu_evtq_thread,
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01002214 IRQF_ONESHOT,
2215 "arm-smmu-v3-evtq", smmu);
Arnd Bergmann287980e2016-05-27 23:23:25 +02002216 if (ret < 0)
Will Deacon48ec83b2015-05-27 17:25:59 +01002217 dev_warn(smmu->dev, "failed to enable evtq irq\n");
2218 }
2219
2220 irq = smmu->cmdq.q.irq;
2221 if (irq) {
2222 ret = devm_request_irq(smmu->dev, irq,
2223 arm_smmu_cmdq_sync_handler, 0,
2224 "arm-smmu-v3-cmdq-sync", smmu);
Arnd Bergmann287980e2016-05-27 23:23:25 +02002225 if (ret < 0)
Will Deacon48ec83b2015-05-27 17:25:59 +01002226 dev_warn(smmu->dev, "failed to enable cmdq-sync irq\n");
2227 }
2228
2229 irq = smmu->gerr_irq;
2230 if (irq) {
2231 ret = devm_request_irq(smmu->dev, irq, arm_smmu_gerror_handler,
2232 0, "arm-smmu-v3-gerror", smmu);
Arnd Bergmann287980e2016-05-27 23:23:25 +02002233 if (ret < 0)
Will Deacon48ec83b2015-05-27 17:25:59 +01002234 dev_warn(smmu->dev, "failed to enable gerror irq\n");
2235 }
2236
2237 if (smmu->features & ARM_SMMU_FEAT_PRI) {
Will Deacon48ec83b2015-05-27 17:25:59 +01002238 irq = smmu->priq.q.irq;
2239 if (irq) {
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01002240 ret = devm_request_threaded_irq(smmu->dev, irq, NULL,
Will Deacon48ec83b2015-05-27 17:25:59 +01002241 arm_smmu_priq_thread,
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01002242 IRQF_ONESHOT,
2243 "arm-smmu-v3-priq",
Will Deacon48ec83b2015-05-27 17:25:59 +01002244 smmu);
Arnd Bergmann287980e2016-05-27 23:23:25 +02002245 if (ret < 0)
Will Deacon48ec83b2015-05-27 17:25:59 +01002246 dev_warn(smmu->dev,
2247 "failed to enable priq irq\n");
Marc Zyngierccd63852015-07-15 11:55:18 +01002248 else
2249 irqen_flags |= IRQ_CTRL_PRIQ_IRQEN;
Will Deacon48ec83b2015-05-27 17:25:59 +01002250 }
2251 }
2252
2253 /* Enable interrupt generation on the SMMU */
Marc Zyngierccd63852015-07-15 11:55:18 +01002254 ret = arm_smmu_write_reg_sync(smmu, irqen_flags,
Will Deacon48ec83b2015-05-27 17:25:59 +01002255 ARM_SMMU_IRQ_CTRL, ARM_SMMU_IRQ_CTRLACK);
2256 if (ret)
2257 dev_warn(smmu->dev, "failed to enable irqs\n");
2258
2259 return 0;
2260}
2261
2262static int arm_smmu_device_disable(struct arm_smmu_device *smmu)
2263{
2264 int ret;
2265
2266 ret = arm_smmu_write_reg_sync(smmu, 0, ARM_SMMU_CR0, ARM_SMMU_CR0ACK);
2267 if (ret)
2268 dev_err(smmu->dev, "failed to clear cr0\n");
2269
2270 return ret;
2271}
2272
Robin Murphydc87a982016-09-12 17:13:44 +01002273static int arm_smmu_device_reset(struct arm_smmu_device *smmu, bool bypass)
Will Deacon48ec83b2015-05-27 17:25:59 +01002274{
2275 int ret;
2276 u32 reg, enables;
2277 struct arm_smmu_cmdq_ent cmd;
2278
2279 /* Clear CR0 and sync (disables SMMU and queue processing) */
2280 reg = readl_relaxed(smmu->base + ARM_SMMU_CR0);
2281 if (reg & CR0_SMMUEN)
2282 dev_warn(smmu->dev, "SMMU currently enabled! Resetting...\n");
2283
2284 ret = arm_smmu_device_disable(smmu);
2285 if (ret)
2286 return ret;
2287
2288 /* CR1 (table and queue memory attributes) */
2289 reg = (CR1_SH_ISH << CR1_TABLE_SH_SHIFT) |
2290 (CR1_CACHE_WB << CR1_TABLE_OC_SHIFT) |
2291 (CR1_CACHE_WB << CR1_TABLE_IC_SHIFT) |
2292 (CR1_SH_ISH << CR1_QUEUE_SH_SHIFT) |
2293 (CR1_CACHE_WB << CR1_QUEUE_OC_SHIFT) |
2294 (CR1_CACHE_WB << CR1_QUEUE_IC_SHIFT);
2295 writel_relaxed(reg, smmu->base + ARM_SMMU_CR1);
2296
2297 /* CR2 (random crap) */
2298 reg = CR2_PTM | CR2_RECINVSID | CR2_E2H;
2299 writel_relaxed(reg, smmu->base + ARM_SMMU_CR2);
2300
2301 /* Stream table */
2302 writeq_relaxed(smmu->strtab_cfg.strtab_base,
2303 smmu->base + ARM_SMMU_STRTAB_BASE);
2304 writel_relaxed(smmu->strtab_cfg.strtab_base_cfg,
2305 smmu->base + ARM_SMMU_STRTAB_BASE_CFG);
2306
2307 /* Command queue */
2308 writeq_relaxed(smmu->cmdq.q.q_base, smmu->base + ARM_SMMU_CMDQ_BASE);
2309 writel_relaxed(smmu->cmdq.q.prod, smmu->base + ARM_SMMU_CMDQ_PROD);
2310 writel_relaxed(smmu->cmdq.q.cons, smmu->base + ARM_SMMU_CMDQ_CONS);
2311
2312 enables = CR0_CMDQEN;
2313 ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
2314 ARM_SMMU_CR0ACK);
2315 if (ret) {
2316 dev_err(smmu->dev, "failed to enable command queue\n");
2317 return ret;
2318 }
2319
2320 /* Invalidate any cached configuration */
2321 cmd.opcode = CMDQ_OP_CFGI_ALL;
2322 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
2323 cmd.opcode = CMDQ_OP_CMD_SYNC;
2324 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
2325
2326 /* Invalidate any stale TLB entries */
2327 if (smmu->features & ARM_SMMU_FEAT_HYP) {
2328 cmd.opcode = CMDQ_OP_TLBI_EL2_ALL;
2329 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
2330 }
2331
2332 cmd.opcode = CMDQ_OP_TLBI_NSNH_ALL;
2333 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
2334 cmd.opcode = CMDQ_OP_CMD_SYNC;
2335 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
2336
2337 /* Event queue */
2338 writeq_relaxed(smmu->evtq.q.q_base, smmu->base + ARM_SMMU_EVTQ_BASE);
2339 writel_relaxed(smmu->evtq.q.prod, smmu->base + ARM_SMMU_EVTQ_PROD);
2340 writel_relaxed(smmu->evtq.q.cons, smmu->base + ARM_SMMU_EVTQ_CONS);
2341
2342 enables |= CR0_EVTQEN;
2343 ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
2344 ARM_SMMU_CR0ACK);
2345 if (ret) {
2346 dev_err(smmu->dev, "failed to enable event queue\n");
2347 return ret;
2348 }
2349
2350 /* PRI queue */
2351 if (smmu->features & ARM_SMMU_FEAT_PRI) {
2352 writeq_relaxed(smmu->priq.q.q_base,
2353 smmu->base + ARM_SMMU_PRIQ_BASE);
2354 writel_relaxed(smmu->priq.q.prod,
2355 smmu->base + ARM_SMMU_PRIQ_PROD);
2356 writel_relaxed(smmu->priq.q.cons,
2357 smmu->base + ARM_SMMU_PRIQ_CONS);
2358
2359 enables |= CR0_PRIQEN;
2360 ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
2361 ARM_SMMU_CR0ACK);
2362 if (ret) {
2363 dev_err(smmu->dev, "failed to enable PRI queue\n");
2364 return ret;
2365 }
2366 }
2367
2368 ret = arm_smmu_setup_irqs(smmu);
2369 if (ret) {
2370 dev_err(smmu->dev, "failed to setup irqs\n");
2371 return ret;
2372 }
2373
Robin Murphydc87a982016-09-12 17:13:44 +01002374
2375 /* Enable the SMMU interface, or ensure bypass */
2376 if (!bypass || disable_bypass) {
2377 enables |= CR0_SMMUEN;
2378 } else {
2379 ret = arm_smmu_update_gbpa(smmu, 0, GBPA_ABORT);
2380 if (ret) {
2381 dev_err(smmu->dev, "GBPA not responding to update\n");
2382 return ret;
2383 }
2384 }
Will Deacon48ec83b2015-05-27 17:25:59 +01002385 ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
2386 ARM_SMMU_CR0ACK);
2387 if (ret) {
2388 dev_err(smmu->dev, "failed to enable SMMU interface\n");
2389 return ret;
2390 }
2391
2392 return 0;
2393}
2394
2395static int arm_smmu_device_probe(struct arm_smmu_device *smmu)
2396{
2397 u32 reg;
2398 bool coherent;
Will Deacon48ec83b2015-05-27 17:25:59 +01002399
2400 /* IDR0 */
2401 reg = readl_relaxed(smmu->base + ARM_SMMU_IDR0);
2402
2403 /* 2-level structures */
2404 if ((reg & IDR0_ST_LVL_MASK << IDR0_ST_LVL_SHIFT) == IDR0_ST_LVL_2LVL)
2405 smmu->features |= ARM_SMMU_FEAT_2_LVL_STRTAB;
2406
2407 if (reg & IDR0_CD2L)
2408 smmu->features |= ARM_SMMU_FEAT_2_LVL_CDTAB;
2409
2410 /*
2411 * Translation table endianness.
2412 * We currently require the same endianness as the CPU, but this
2413 * could be changed later by adding a new IO_PGTABLE_QUIRK.
2414 */
2415 switch (reg & IDR0_TTENDIAN_MASK << IDR0_TTENDIAN_SHIFT) {
2416 case IDR0_TTENDIAN_MIXED:
2417 smmu->features |= ARM_SMMU_FEAT_TT_LE | ARM_SMMU_FEAT_TT_BE;
2418 break;
2419#ifdef __BIG_ENDIAN
2420 case IDR0_TTENDIAN_BE:
2421 smmu->features |= ARM_SMMU_FEAT_TT_BE;
2422 break;
2423#else
2424 case IDR0_TTENDIAN_LE:
2425 smmu->features |= ARM_SMMU_FEAT_TT_LE;
2426 break;
2427#endif
2428 default:
2429 dev_err(smmu->dev, "unknown/unsupported TT endianness!\n");
2430 return -ENXIO;
2431 }
2432
2433 /* Boolean feature flags */
2434 if (IS_ENABLED(CONFIG_PCI_PRI) && reg & IDR0_PRI)
2435 smmu->features |= ARM_SMMU_FEAT_PRI;
2436
2437 if (IS_ENABLED(CONFIG_PCI_ATS) && reg & IDR0_ATS)
2438 smmu->features |= ARM_SMMU_FEAT_ATS;
2439
2440 if (reg & IDR0_SEV)
2441 smmu->features |= ARM_SMMU_FEAT_SEV;
2442
2443 if (reg & IDR0_MSI)
2444 smmu->features |= ARM_SMMU_FEAT_MSI;
2445
2446 if (reg & IDR0_HYP)
2447 smmu->features |= ARM_SMMU_FEAT_HYP;
2448
2449 /*
2450 * The dma-coherent property is used in preference to the ID
2451 * register, but warn on mismatch.
2452 */
2453 coherent = of_dma_is_coherent(smmu->dev->of_node);
2454 if (coherent)
2455 smmu->features |= ARM_SMMU_FEAT_COHERENCY;
2456
2457 if (!!(reg & IDR0_COHACC) != coherent)
2458 dev_warn(smmu->dev, "IDR0.COHACC overridden by dma-coherent property (%s)\n",
2459 coherent ? "true" : "false");
2460
Prem Mallappa6380be02015-12-14 22:01:23 +05302461 switch (reg & IDR0_STALL_MODEL_MASK << IDR0_STALL_MODEL_SHIFT) {
2462 case IDR0_STALL_MODEL_STALL:
2463 /* Fallthrough */
2464 case IDR0_STALL_MODEL_FORCE:
Will Deacon48ec83b2015-05-27 17:25:59 +01002465 smmu->features |= ARM_SMMU_FEAT_STALLS;
Prem Mallappa6380be02015-12-14 22:01:23 +05302466 }
Will Deacon48ec83b2015-05-27 17:25:59 +01002467
2468 if (reg & IDR0_S1P)
2469 smmu->features |= ARM_SMMU_FEAT_TRANS_S1;
2470
2471 if (reg & IDR0_S2P)
2472 smmu->features |= ARM_SMMU_FEAT_TRANS_S2;
2473
2474 if (!(reg & (IDR0_S1P | IDR0_S2P))) {
2475 dev_err(smmu->dev, "no translation support!\n");
2476 return -ENXIO;
2477 }
2478
2479 /* We only support the AArch64 table format at present */
Will Deaconf0c453d2015-08-20 12:12:32 +01002480 switch (reg & IDR0_TTF_MASK << IDR0_TTF_SHIFT) {
2481 case IDR0_TTF_AARCH32_64:
2482 smmu->ias = 40;
2483 /* Fallthrough */
2484 case IDR0_TTF_AARCH64:
2485 break;
2486 default:
Will Deacon48ec83b2015-05-27 17:25:59 +01002487 dev_err(smmu->dev, "AArch64 table format not supported!\n");
2488 return -ENXIO;
2489 }
2490
2491 /* ASID/VMID sizes */
2492 smmu->asid_bits = reg & IDR0_ASID16 ? 16 : 8;
2493 smmu->vmid_bits = reg & IDR0_VMID16 ? 16 : 8;
2494
2495 /* IDR1 */
2496 reg = readl_relaxed(smmu->base + ARM_SMMU_IDR1);
2497 if (reg & (IDR1_TABLES_PRESET | IDR1_QUEUES_PRESET | IDR1_REL)) {
2498 dev_err(smmu->dev, "embedded implementation not supported\n");
2499 return -ENXIO;
2500 }
2501
2502 /* Queue sizes, capped at 4k */
2503 smmu->cmdq.q.max_n_shift = min((u32)CMDQ_MAX_SZ_SHIFT,
2504 reg >> IDR1_CMDQ_SHIFT & IDR1_CMDQ_MASK);
2505 if (!smmu->cmdq.q.max_n_shift) {
2506 /* Odd alignment restrictions on the base, so ignore for now */
2507 dev_err(smmu->dev, "unit-length command queue not supported\n");
2508 return -ENXIO;
2509 }
2510
2511 smmu->evtq.q.max_n_shift = min((u32)EVTQ_MAX_SZ_SHIFT,
2512 reg >> IDR1_EVTQ_SHIFT & IDR1_EVTQ_MASK);
2513 smmu->priq.q.max_n_shift = min((u32)PRIQ_MAX_SZ_SHIFT,
2514 reg >> IDR1_PRIQ_SHIFT & IDR1_PRIQ_MASK);
2515
2516 /* SID/SSID sizes */
2517 smmu->ssid_bits = reg >> IDR1_SSID_SHIFT & IDR1_SSID_MASK;
2518 smmu->sid_bits = reg >> IDR1_SID_SHIFT & IDR1_SID_MASK;
2519
2520 /* IDR5 */
2521 reg = readl_relaxed(smmu->base + ARM_SMMU_IDR5);
2522
2523 /* Maximum number of outstanding stalls */
2524 smmu->evtq.max_stalls = reg >> IDR5_STALL_MAX_SHIFT
2525 & IDR5_STALL_MAX_MASK;
2526
2527 /* Page sizes */
2528 if (reg & IDR5_GRAN64K)
Robin Murphyd5466352016-05-09 17:20:09 +01002529 smmu->pgsize_bitmap |= SZ_64K | SZ_512M;
Will Deacon48ec83b2015-05-27 17:25:59 +01002530 if (reg & IDR5_GRAN16K)
Robin Murphyd5466352016-05-09 17:20:09 +01002531 smmu->pgsize_bitmap |= SZ_16K | SZ_32M;
Will Deacon48ec83b2015-05-27 17:25:59 +01002532 if (reg & IDR5_GRAN4K)
Robin Murphyd5466352016-05-09 17:20:09 +01002533 smmu->pgsize_bitmap |= SZ_4K | SZ_2M | SZ_1G;
Will Deacon48ec83b2015-05-27 17:25:59 +01002534
Robin Murphyd5466352016-05-09 17:20:09 +01002535 if (arm_smmu_ops.pgsize_bitmap == -1UL)
2536 arm_smmu_ops.pgsize_bitmap = smmu->pgsize_bitmap;
2537 else
2538 arm_smmu_ops.pgsize_bitmap |= smmu->pgsize_bitmap;
Will Deacon48ec83b2015-05-27 17:25:59 +01002539
2540 /* Output address size */
2541 switch (reg & IDR5_OAS_MASK << IDR5_OAS_SHIFT) {
2542 case IDR5_OAS_32_BIT:
2543 smmu->oas = 32;
2544 break;
2545 case IDR5_OAS_36_BIT:
2546 smmu->oas = 36;
2547 break;
2548 case IDR5_OAS_40_BIT:
2549 smmu->oas = 40;
2550 break;
2551 case IDR5_OAS_42_BIT:
2552 smmu->oas = 42;
2553 break;
2554 case IDR5_OAS_44_BIT:
2555 smmu->oas = 44;
2556 break;
Will Deacon85430962015-08-03 10:35:40 +01002557 default:
2558 dev_info(smmu->dev,
2559 "unknown output address size. Truncating to 48-bit\n");
2560 /* Fallthrough */
Will Deacon48ec83b2015-05-27 17:25:59 +01002561 case IDR5_OAS_48_BIT:
2562 smmu->oas = 48;
Will Deacon48ec83b2015-05-27 17:25:59 +01002563 }
2564
2565 /* Set the DMA mask for our table walker */
2566 if (dma_set_mask_and_coherent(smmu->dev, DMA_BIT_MASK(smmu->oas)))
2567 dev_warn(smmu->dev,
2568 "failed to set DMA mask for table walker\n");
2569
Will Deaconf0c453d2015-08-20 12:12:32 +01002570 smmu->ias = max(smmu->ias, smmu->oas);
Will Deacon48ec83b2015-05-27 17:25:59 +01002571
2572 dev_info(smmu->dev, "ias %lu-bit, oas %lu-bit (features 0x%08x)\n",
2573 smmu->ias, smmu->oas, smmu->features);
2574 return 0;
2575}
2576
2577static int arm_smmu_device_dt_probe(struct platform_device *pdev)
2578{
2579 int irq, ret;
2580 struct resource *res;
2581 struct arm_smmu_device *smmu;
2582 struct device *dev = &pdev->dev;
Robin Murphydc87a982016-09-12 17:13:44 +01002583 bool bypass = true;
2584 u32 cells;
2585
2586 if (of_property_read_u32(dev->of_node, "#iommu-cells", &cells))
2587 dev_err(dev, "missing #iommu-cells property\n");
2588 else if (cells != 1)
2589 dev_err(dev, "invalid #iommu-cells value (%d)\n", cells);
2590 else
2591 bypass = false;
Will Deacon48ec83b2015-05-27 17:25:59 +01002592
2593 smmu = devm_kzalloc(dev, sizeof(*smmu), GFP_KERNEL);
2594 if (!smmu) {
2595 dev_err(dev, "failed to allocate arm_smmu_device\n");
2596 return -ENOMEM;
2597 }
2598 smmu->dev = dev;
2599
2600 /* Base address */
2601 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2602 if (resource_size(res) + 1 < SZ_128K) {
2603 dev_err(dev, "MMIO region too small (%pr)\n", res);
2604 return -EINVAL;
2605 }
2606
2607 smmu->base = devm_ioremap_resource(dev, res);
2608 if (IS_ERR(smmu->base))
2609 return PTR_ERR(smmu->base);
2610
2611 /* Interrupt lines */
2612 irq = platform_get_irq_byname(pdev, "eventq");
2613 if (irq > 0)
2614 smmu->evtq.q.irq = irq;
2615
2616 irq = platform_get_irq_byname(pdev, "priq");
2617 if (irq > 0)
2618 smmu->priq.q.irq = irq;
2619
2620 irq = platform_get_irq_byname(pdev, "cmdq-sync");
2621 if (irq > 0)
2622 smmu->cmdq.q.irq = irq;
2623
2624 irq = platform_get_irq_byname(pdev, "gerror");
2625 if (irq > 0)
2626 smmu->gerr_irq = irq;
2627
Zhen Lei5e929462015-07-07 04:30:18 +01002628 parse_driver_options(smmu);
2629
Will Deacon48ec83b2015-05-27 17:25:59 +01002630 /* Probe the h/w */
2631 ret = arm_smmu_device_probe(smmu);
2632 if (ret)
2633 return ret;
2634
2635 /* Initialise in-memory data structures */
2636 ret = arm_smmu_init_structures(smmu);
2637 if (ret)
2638 return ret;
2639
Marc Zyngier166bdbd2015-10-13 18:32:30 +01002640 /* Record our private device structure */
2641 platform_set_drvdata(pdev, smmu);
2642
Will Deacon48ec83b2015-05-27 17:25:59 +01002643 /* Reset the device */
Robin Murphy8f785152016-09-12 17:13:45 +01002644 ret = arm_smmu_device_reset(smmu, bypass);
2645 if (ret)
2646 return ret;
2647
2648 /* And we're up. Go go go! */
2649 of_iommu_set_ops(dev->of_node, &arm_smmu_ops);
Robin Murphy08d4ca22016-09-12 17:13:46 +01002650#ifdef CONFIG_PCI
Robin Murphyec615f42016-11-03 17:39:07 +00002651 if (pci_bus_type.iommu_ops != &arm_smmu_ops) {
2652 pci_request_acs();
2653 ret = bus_set_iommu(&pci_bus_type, &arm_smmu_ops);
2654 if (ret)
2655 return ret;
2656 }
Robin Murphy08d4ca22016-09-12 17:13:46 +01002657#endif
2658#ifdef CONFIG_ARM_AMBA
Robin Murphyec615f42016-11-03 17:39:07 +00002659 if (amba_bustype.iommu_ops != &arm_smmu_ops) {
2660 ret = bus_set_iommu(&amba_bustype, &arm_smmu_ops);
2661 if (ret)
2662 return ret;
2663 }
Robin Murphy08d4ca22016-09-12 17:13:46 +01002664#endif
Robin Murphyec615f42016-11-03 17:39:07 +00002665 if (platform_bus_type.iommu_ops != &arm_smmu_ops) {
2666 ret = bus_set_iommu(&platform_bus_type, &arm_smmu_ops);
2667 if (ret)
2668 return ret;
2669 }
2670 return 0;
Will Deacon48ec83b2015-05-27 17:25:59 +01002671}
2672
2673static int arm_smmu_device_remove(struct platform_device *pdev)
2674{
Will Deacon941a8022015-08-11 16:25:10 +01002675 struct arm_smmu_device *smmu = platform_get_drvdata(pdev);
Will Deacon48ec83b2015-05-27 17:25:59 +01002676
2677 arm_smmu_device_disable(smmu);
Will Deacon48ec83b2015-05-27 17:25:59 +01002678 return 0;
2679}
2680
2681static struct of_device_id arm_smmu_of_match[] = {
2682 { .compatible = "arm,smmu-v3", },
2683 { },
2684};
2685MODULE_DEVICE_TABLE(of, arm_smmu_of_match);
2686
2687static struct platform_driver arm_smmu_driver = {
2688 .driver = {
2689 .name = "arm-smmu-v3",
2690 .of_match_table = of_match_ptr(arm_smmu_of_match),
2691 },
2692 .probe = arm_smmu_device_dt_probe,
2693 .remove = arm_smmu_device_remove,
2694};
2695
2696static int __init arm_smmu_init(void)
2697{
Robin Murphy8f785152016-09-12 17:13:45 +01002698 static bool registered;
2699 int ret = 0;
Will Deacon48ec83b2015-05-27 17:25:59 +01002700
Robin Murphy8f785152016-09-12 17:13:45 +01002701 if (!registered) {
2702 ret = platform_driver_register(&arm_smmu_driver);
2703 registered = !ret;
2704 }
2705 return ret;
Will Deacon48ec83b2015-05-27 17:25:59 +01002706}
2707
2708static void __exit arm_smmu_exit(void)
2709{
2710 return platform_driver_unregister(&arm_smmu_driver);
2711}
2712
2713subsys_initcall(arm_smmu_init);
2714module_exit(arm_smmu_exit);
2715
Robin Murphy8f785152016-09-12 17:13:45 +01002716static int __init arm_smmu_of_init(struct device_node *np)
2717{
2718 int ret = arm_smmu_init();
2719
2720 if (ret)
2721 return ret;
2722
2723 if (!of_platform_device_create(np, NULL, platform_bus_type.dev_root))
2724 return -ENODEV;
2725
2726 return 0;
2727}
2728IOMMU_OF_DECLARE(arm_smmuv3, "arm,smmu-v3", arm_smmu_of_init);
2729
Will Deacon48ec83b2015-05-27 17:25:59 +01002730MODULE_DESCRIPTION("IOMMU API for ARM architected SMMUv3 implementations");
2731MODULE_AUTHOR("Will Deacon <will.deacon@arm.com>");
2732MODULE_LICENSE("GPL v2");