]> git.ipfire.org Git - thirdparty/kernel/stable.git/blame - drivers/iommu/arm-smmu.c
iommu: Add iommu_device_set_fwnode() interface
[thirdparty/kernel/stable.git] / drivers / iommu / arm-smmu.c
CommitLineData
45ae7cff
WD
1/*
2 * IOMMU API for ARM architected SMMU 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, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 *
17 * Copyright (C) 2013 ARM Limited
18 *
19 * Author: Will Deacon <will.deacon@arm.com>
20 *
21 * This driver currently supports:
22 * - SMMUv1 and v2 implementations
23 * - Stream-matching and stream-indexing
24 * - v7/v8 long-descriptor format
25 * - Non-secure access to the SMMU
45ae7cff
WD
26 * - Context fault reporting
27 */
28
29#define pr_fmt(fmt) "arm-smmu: " fmt
30
d6fcd3b1
LP
31#include <linux/acpi.h>
32#include <linux/acpi_iort.h>
1f3d5ca4 33#include <linux/atomic.h>
45ae7cff 34#include <linux/delay.h>
9adb9594 35#include <linux/dma-iommu.h>
45ae7cff
WD
36#include <linux/dma-mapping.h>
37#include <linux/err.h>
38#include <linux/interrupt.h>
39#include <linux/io.h>
f9a05f05 40#include <linux/io-64-nonatomic-hi-lo.h>
45ae7cff 41#include <linux/iommu.h>
859a732e 42#include <linux/iopoll.h>
45ae7cff
WD
43#include <linux/module.h>
44#include <linux/of.h>
bae2c2d4 45#include <linux/of_address.h>
d6fc5d97 46#include <linux/of_device.h>
adfec2e7 47#include <linux/of_iommu.h>
a9a1b0b5 48#include <linux/pci.h>
45ae7cff
WD
49#include <linux/platform_device.h>
50#include <linux/slab.h>
51#include <linux/spinlock.h>
52
53#include <linux/amba/bus.h>
54
518f7136 55#include "io-pgtable.h"
45ae7cff 56
45ae7cff
WD
57/* Maximum number of context banks per SMMU */
58#define ARM_SMMU_MAX_CBS 128
59
45ae7cff
WD
60/* SMMU global address space */
61#define ARM_SMMU_GR0(smmu) ((smmu)->base)
c757e852 62#define ARM_SMMU_GR1(smmu) ((smmu)->base + (1 << (smmu)->pgshift))
45ae7cff 63
3a5df8ff
AH
64/*
65 * SMMU global address space with conditional offset to access secure
66 * aliases of non-secure registers (e.g. nsCR0: 0x400, nsGFSR: 0x448,
67 * nsGFSYNR0: 0x450)
68 */
69#define ARM_SMMU_GR0_NS(smmu) \
70 ((smmu)->base + \
71 ((smmu->options & ARM_SMMU_OPT_SECURE_CFG_ACCESS) \
72 ? 0x400 : 0))
73
f9a05f05
RM
74/*
75 * Some 64-bit registers only make sense to write atomically, but in such
76 * cases all the data relevant to AArch32 formats lies within the lower word,
77 * therefore this actually makes more sense than it might first appear.
78 */
668b4ada 79#ifdef CONFIG_64BIT
f9a05f05 80#define smmu_write_atomic_lq writeq_relaxed
668b4ada 81#else
f9a05f05 82#define smmu_write_atomic_lq writel_relaxed
668b4ada
TC
83#endif
84
45ae7cff
WD
85/* Configuration registers */
86#define ARM_SMMU_GR0_sCR0 0x0
87#define sCR0_CLIENTPD (1 << 0)
88#define sCR0_GFRE (1 << 1)
89#define sCR0_GFIE (1 << 2)
90#define sCR0_GCFGFRE (1 << 4)
91#define sCR0_GCFGFIE (1 << 5)
92#define sCR0_USFCFG (1 << 10)
93#define sCR0_VMIDPNE (1 << 11)
94#define sCR0_PTM (1 << 12)
95#define sCR0_FB (1 << 13)
4e3e9b69 96#define sCR0_VMID16EN (1 << 31)
45ae7cff
WD
97#define sCR0_BSU_SHIFT 14
98#define sCR0_BSU_MASK 0x3
99
3ca3712a
PF
100/* Auxiliary Configuration register */
101#define ARM_SMMU_GR0_sACR 0x10
102
45ae7cff
WD
103/* Identification registers */
104#define ARM_SMMU_GR0_ID0 0x20
105#define ARM_SMMU_GR0_ID1 0x24
106#define ARM_SMMU_GR0_ID2 0x28
107#define ARM_SMMU_GR0_ID3 0x2c
108#define ARM_SMMU_GR0_ID4 0x30
109#define ARM_SMMU_GR0_ID5 0x34
110#define ARM_SMMU_GR0_ID6 0x38
111#define ARM_SMMU_GR0_ID7 0x3c
112#define ARM_SMMU_GR0_sGFSR 0x48
113#define ARM_SMMU_GR0_sGFSYNR0 0x50
114#define ARM_SMMU_GR0_sGFSYNR1 0x54
115#define ARM_SMMU_GR0_sGFSYNR2 0x58
45ae7cff
WD
116
117#define ID0_S1TS (1 << 30)
118#define ID0_S2TS (1 << 29)
119#define ID0_NTS (1 << 28)
120#define ID0_SMS (1 << 27)
859a732e 121#define ID0_ATOSNS (1 << 26)
7602b871
RM
122#define ID0_PTFS_NO_AARCH32 (1 << 25)
123#define ID0_PTFS_NO_AARCH32S (1 << 24)
45ae7cff
WD
124#define ID0_CTTW (1 << 14)
125#define ID0_NUMIRPT_SHIFT 16
126#define ID0_NUMIRPT_MASK 0xff
3c8766d0
OH
127#define ID0_NUMSIDB_SHIFT 9
128#define ID0_NUMSIDB_MASK 0xf
45ae7cff
WD
129#define ID0_NUMSMRG_SHIFT 0
130#define ID0_NUMSMRG_MASK 0xff
131
132#define ID1_PAGESIZE (1 << 31)
133#define ID1_NUMPAGENDXB_SHIFT 28
134#define ID1_NUMPAGENDXB_MASK 7
135#define ID1_NUMS2CB_SHIFT 16
136#define ID1_NUMS2CB_MASK 0xff
137#define ID1_NUMCB_SHIFT 0
138#define ID1_NUMCB_MASK 0xff
139
140#define ID2_OAS_SHIFT 4
141#define ID2_OAS_MASK 0xf
142#define ID2_IAS_SHIFT 0
143#define ID2_IAS_MASK 0xf
144#define ID2_UBS_SHIFT 8
145#define ID2_UBS_MASK 0xf
146#define ID2_PTFS_4K (1 << 12)
147#define ID2_PTFS_16K (1 << 13)
148#define ID2_PTFS_64K (1 << 14)
4e3e9b69 149#define ID2_VMID16 (1 << 15)
45ae7cff 150
3ca3712a
PF
151#define ID7_MAJOR_SHIFT 4
152#define ID7_MAJOR_MASK 0xf
45ae7cff 153
45ae7cff 154/* Global TLB invalidation */
45ae7cff
WD
155#define ARM_SMMU_GR0_TLBIVMID 0x64
156#define ARM_SMMU_GR0_TLBIALLNSNH 0x68
157#define ARM_SMMU_GR0_TLBIALLH 0x6c
158#define ARM_SMMU_GR0_sTLBGSYNC 0x70
159#define ARM_SMMU_GR0_sTLBGSTATUS 0x74
160#define sTLBGSTATUS_GSACTIVE (1 << 0)
161#define TLB_LOOP_TIMEOUT 1000000 /* 1s! */
162
163/* Stream mapping registers */
164#define ARM_SMMU_GR0_SMR(n) (0x800 + ((n) << 2))
165#define SMR_VALID (1 << 31)
166#define SMR_MASK_SHIFT 16
45ae7cff 167#define SMR_ID_SHIFT 0
45ae7cff
WD
168
169#define ARM_SMMU_GR0_S2CR(n) (0xc00 + ((n) << 2))
170#define S2CR_CBNDX_SHIFT 0
171#define S2CR_CBNDX_MASK 0xff
172#define S2CR_TYPE_SHIFT 16
173#define S2CR_TYPE_MASK 0x3
8e8b203e
RM
174enum arm_smmu_s2cr_type {
175 S2CR_TYPE_TRANS,
176 S2CR_TYPE_BYPASS,
177 S2CR_TYPE_FAULT,
178};
45ae7cff 179
d346180e 180#define S2CR_PRIVCFG_SHIFT 24
8e8b203e
RM
181#define S2CR_PRIVCFG_MASK 0x3
182enum arm_smmu_s2cr_privcfg {
183 S2CR_PRIVCFG_DEFAULT,
184 S2CR_PRIVCFG_DIPAN,
185 S2CR_PRIVCFG_UNPRIV,
186 S2CR_PRIVCFG_PRIV,
187};
d346180e 188
45ae7cff
WD
189/* Context bank attribute registers */
190#define ARM_SMMU_GR1_CBAR(n) (0x0 + ((n) << 2))
191#define CBAR_VMID_SHIFT 0
192#define CBAR_VMID_MASK 0xff
57ca90f6
WD
193#define CBAR_S1_BPSHCFG_SHIFT 8
194#define CBAR_S1_BPSHCFG_MASK 3
195#define CBAR_S1_BPSHCFG_NSH 3
45ae7cff
WD
196#define CBAR_S1_MEMATTR_SHIFT 12
197#define CBAR_S1_MEMATTR_MASK 0xf
198#define CBAR_S1_MEMATTR_WB 0xf
199#define CBAR_TYPE_SHIFT 16
200#define CBAR_TYPE_MASK 0x3
201#define CBAR_TYPE_S2_TRANS (0 << CBAR_TYPE_SHIFT)
202#define CBAR_TYPE_S1_TRANS_S2_BYPASS (1 << CBAR_TYPE_SHIFT)
203#define CBAR_TYPE_S1_TRANS_S2_FAULT (2 << CBAR_TYPE_SHIFT)
204#define CBAR_TYPE_S1_TRANS_S2_TRANS (3 << CBAR_TYPE_SHIFT)
205#define CBAR_IRPTNDX_SHIFT 24
206#define CBAR_IRPTNDX_MASK 0xff
207
208#define ARM_SMMU_GR1_CBA2R(n) (0x800 + ((n) << 2))
209#define CBA2R_RW64_32BIT (0 << 0)
210#define CBA2R_RW64_64BIT (1 << 0)
4e3e9b69
TC
211#define CBA2R_VMID_SHIFT 16
212#define CBA2R_VMID_MASK 0xffff
45ae7cff
WD
213
214/* Translation context bank */
215#define ARM_SMMU_CB_BASE(smmu) ((smmu)->base + ((smmu)->size >> 1))
c757e852 216#define ARM_SMMU_CB(smmu, n) ((n) * (1 << (smmu)->pgshift))
45ae7cff
WD
217
218#define ARM_SMMU_CB_SCTLR 0x0
f0cfffc4 219#define ARM_SMMU_CB_ACTLR 0x4
45ae7cff
WD
220#define ARM_SMMU_CB_RESUME 0x8
221#define ARM_SMMU_CB_TTBCR2 0x10
668b4ada
TC
222#define ARM_SMMU_CB_TTBR0 0x20
223#define ARM_SMMU_CB_TTBR1 0x28
45ae7cff 224#define ARM_SMMU_CB_TTBCR 0x30
6070529b 225#define ARM_SMMU_CB_CONTEXTIDR 0x34
45ae7cff 226#define ARM_SMMU_CB_S1_MAIR0 0x38
518f7136 227#define ARM_SMMU_CB_S1_MAIR1 0x3c
f9a05f05 228#define ARM_SMMU_CB_PAR 0x50
45ae7cff 229#define ARM_SMMU_CB_FSR 0x58
f9a05f05 230#define ARM_SMMU_CB_FAR 0x60
45ae7cff 231#define ARM_SMMU_CB_FSYNR0 0x68
518f7136 232#define ARM_SMMU_CB_S1_TLBIVA 0x600
1463fe44 233#define ARM_SMMU_CB_S1_TLBIASID 0x610
518f7136
WD
234#define ARM_SMMU_CB_S1_TLBIVAL 0x620
235#define ARM_SMMU_CB_S2_TLBIIPAS2 0x630
236#define ARM_SMMU_CB_S2_TLBIIPAS2L 0x638
661d962f 237#define ARM_SMMU_CB_ATS1PR 0x800
859a732e 238#define ARM_SMMU_CB_ATSR 0x8f0
45ae7cff
WD
239
240#define SCTLR_S1_ASIDPNE (1 << 12)
241#define SCTLR_CFCFG (1 << 7)
242#define SCTLR_CFIE (1 << 6)
243#define SCTLR_CFRE (1 << 5)
244#define SCTLR_E (1 << 4)
245#define SCTLR_AFE (1 << 2)
246#define SCTLR_TRE (1 << 1)
247#define SCTLR_M (1 << 0)
45ae7cff 248
f0cfffc4
RM
249#define ARM_MMU500_ACTLR_CPRE (1 << 1)
250
3ca3712a 251#define ARM_MMU500_ACR_CACHE_LOCK (1 << 26)
6eb18d4a 252#define ARM_MMU500_ACR_SMTNMB_TLBEN (1 << 8)
3ca3712a 253
859a732e
MH
254#define CB_PAR_F (1 << 0)
255
256#define ATSR_ACTIVE (1 << 0)
257
45ae7cff
WD
258#define RESUME_RETRY (0 << 0)
259#define RESUME_TERMINATE (1 << 0)
260
45ae7cff 261#define TTBCR2_SEP_SHIFT 15
5dc5616e 262#define TTBCR2_SEP_UPSTREAM (0x7 << TTBCR2_SEP_SHIFT)
45ae7cff 263
668b4ada 264#define TTBRn_ASID_SHIFT 48
45ae7cff
WD
265
266#define FSR_MULTI (1 << 31)
267#define FSR_SS (1 << 30)
268#define FSR_UUT (1 << 8)
269#define FSR_ASF (1 << 7)
270#define FSR_TLBLKF (1 << 6)
271#define FSR_TLBMCF (1 << 5)
272#define FSR_EF (1 << 4)
273#define FSR_PF (1 << 3)
274#define FSR_AFF (1 << 2)
275#define FSR_TF (1 << 1)
276
2907320d
MH
277#define FSR_IGN (FSR_AFF | FSR_ASF | \
278 FSR_TLBMCF | FSR_TLBLKF)
279#define FSR_FAULT (FSR_MULTI | FSR_SS | FSR_UUT | \
adaba320 280 FSR_EF | FSR_PF | FSR_TF | FSR_IGN)
45ae7cff
WD
281
282#define FSYNR0_WNR (1 << 4)
283
4cf740b0 284static int force_stage;
25a1c96c 285module_param(force_stage, int, S_IRUGO);
4cf740b0
WD
286MODULE_PARM_DESC(force_stage,
287 "Force SMMU mappings to be installed at a particular stage of translation. A value of '1' or '2' forces the corresponding stage. All other values are ignored (i.e. no stage is forced). Note that selecting a specific stage will disable support for nested translation.");
25a1c96c
RM
288static bool disable_bypass;
289module_param(disable_bypass, bool, S_IRUGO);
290MODULE_PARM_DESC(disable_bypass,
291 "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.");
4cf740b0 292
09360403 293enum arm_smmu_arch_version {
b7862e35
RM
294 ARM_SMMU_V1,
295 ARM_SMMU_V1_64K,
09360403
RM
296 ARM_SMMU_V2,
297};
298
67b65a3f
RM
299enum arm_smmu_implementation {
300 GENERIC_SMMU,
f0cfffc4 301 ARM_MMU500,
e086d912 302 CAVIUM_SMMUV2,
67b65a3f
RM
303};
304
8e8b203e 305struct arm_smmu_s2cr {
588888a7
RM
306 struct iommu_group *group;
307 int count;
8e8b203e
RM
308 enum arm_smmu_s2cr_type type;
309 enum arm_smmu_s2cr_privcfg privcfg;
310 u8 cbndx;
311};
312
313#define s2cr_init_val (struct arm_smmu_s2cr){ \
314 .type = disable_bypass ? S2CR_TYPE_FAULT : S2CR_TYPE_BYPASS, \
315}
316
45ae7cff 317struct arm_smmu_smr {
45ae7cff
WD
318 u16 mask;
319 u16 id;
1f3d5ca4 320 bool valid;
45ae7cff
WD
321};
322
a9a1b0b5 323struct arm_smmu_master_cfg {
f80cd885 324 struct arm_smmu_device *smmu;
adfec2e7 325 s16 smendx[];
45ae7cff 326};
1f3d5ca4 327#define INVALID_SMENDX -1
adfec2e7
RM
328#define __fwspec_cfg(fw) ((struct arm_smmu_master_cfg *)fw->iommu_priv)
329#define fwspec_smmu(fw) (__fwspec_cfg(fw)->smmu)
8c82d6ec
RM
330#define fwspec_smendx(fw, i) \
331 (i >= fw->num_ids ? INVALID_SMENDX : __fwspec_cfg(fw)->smendx[i])
adfec2e7 332#define for_each_cfg_sme(fw, i, idx) \
8c82d6ec 333 for (i = 0; idx = fwspec_smendx(fw, i), i < fw->num_ids; ++i)
45ae7cff
WD
334
335struct arm_smmu_device {
336 struct device *dev;
45ae7cff
WD
337
338 void __iomem *base;
339 unsigned long size;
c757e852 340 unsigned long pgshift;
45ae7cff
WD
341
342#define ARM_SMMU_FEAT_COHERENT_WALK (1 << 0)
343#define ARM_SMMU_FEAT_STREAM_MATCH (1 << 1)
344#define ARM_SMMU_FEAT_TRANS_S1 (1 << 2)
345#define ARM_SMMU_FEAT_TRANS_S2 (1 << 3)
346#define ARM_SMMU_FEAT_TRANS_NESTED (1 << 4)
859a732e 347#define ARM_SMMU_FEAT_TRANS_OPS (1 << 5)
4e3e9b69 348#define ARM_SMMU_FEAT_VMID16 (1 << 6)
7602b871
RM
349#define ARM_SMMU_FEAT_FMT_AARCH64_4K (1 << 7)
350#define ARM_SMMU_FEAT_FMT_AARCH64_16K (1 << 8)
351#define ARM_SMMU_FEAT_FMT_AARCH64_64K (1 << 9)
352#define ARM_SMMU_FEAT_FMT_AARCH32_L (1 << 10)
353#define ARM_SMMU_FEAT_FMT_AARCH32_S (1 << 11)
45ae7cff 354 u32 features;
3a5df8ff
AH
355
356#define ARM_SMMU_OPT_SECURE_CFG_ACCESS (1 << 0)
357 u32 options;
09360403 358 enum arm_smmu_arch_version version;
67b65a3f 359 enum arm_smmu_implementation model;
45ae7cff
WD
360
361 u32 num_context_banks;
362 u32 num_s2_context_banks;
363 DECLARE_BITMAP(context_map, ARM_SMMU_MAX_CBS);
364 atomic_t irptndx;
365
366 u32 num_mapping_groups;
21174240
RM
367 u16 streamid_mask;
368 u16 smr_mask_mask;
1f3d5ca4 369 struct arm_smmu_smr *smrs;
8e8b203e 370 struct arm_smmu_s2cr *s2crs;
588888a7 371 struct mutex stream_map_mutex;
45ae7cff 372
518f7136
WD
373 unsigned long va_size;
374 unsigned long ipa_size;
375 unsigned long pa_size;
d5466357 376 unsigned long pgsize_bitmap;
45ae7cff
WD
377
378 u32 num_global_irqs;
379 u32 num_context_irqs;
380 unsigned int *irqs;
381
1bd37a68 382 u32 cavium_id_base; /* Specific to Cavium */
45ae7cff
WD
383};
384
7602b871
RM
385enum arm_smmu_context_fmt {
386 ARM_SMMU_CTX_FMT_NONE,
387 ARM_SMMU_CTX_FMT_AARCH64,
388 ARM_SMMU_CTX_FMT_AARCH32_L,
389 ARM_SMMU_CTX_FMT_AARCH32_S,
45ae7cff
WD
390};
391
392struct arm_smmu_cfg {
45ae7cff
WD
393 u8 cbndx;
394 u8 irptndx;
395 u32 cbar;
7602b871 396 enum arm_smmu_context_fmt fmt;
45ae7cff 397};
faea13b7 398#define INVALID_IRPTNDX 0xff
45ae7cff 399
1bd37a68
TC
400#define ARM_SMMU_CB_ASID(smmu, cfg) ((u16)(smmu)->cavium_id_base + (cfg)->cbndx)
401#define ARM_SMMU_CB_VMID(smmu, cfg) ((u16)(smmu)->cavium_id_base + (cfg)->cbndx + 1)
ecfadb6e 402
c752ce45
WD
403enum arm_smmu_domain_stage {
404 ARM_SMMU_DOMAIN_S1 = 0,
405 ARM_SMMU_DOMAIN_S2,
406 ARM_SMMU_DOMAIN_NESTED,
407};
408
45ae7cff 409struct arm_smmu_domain {
44680eed 410 struct arm_smmu_device *smmu;
518f7136
WD
411 struct io_pgtable_ops *pgtbl_ops;
412 spinlock_t pgtbl_lock;
44680eed 413 struct arm_smmu_cfg cfg;
c752ce45 414 enum arm_smmu_domain_stage stage;
518f7136 415 struct mutex init_mutex; /* Protects smmu pointer */
1d672638 416 struct iommu_domain domain;
45ae7cff
WD
417};
418
3a5df8ff
AH
419struct arm_smmu_option_prop {
420 u32 opt;
421 const char *prop;
422};
423
1bd37a68
TC
424static atomic_t cavium_smmu_context_count = ATOMIC_INIT(0);
425
021bb842
RM
426static bool using_legacy_binding, using_generic_binding;
427
2907320d 428static struct arm_smmu_option_prop arm_smmu_options[] = {
3a5df8ff
AH
429 { ARM_SMMU_OPT_SECURE_CFG_ACCESS, "calxeda,smmu-secure-config-access" },
430 { 0, NULL},
431};
432
1d672638
JR
433static struct arm_smmu_domain *to_smmu_domain(struct iommu_domain *dom)
434{
435 return container_of(dom, struct arm_smmu_domain, domain);
436}
437
3a5df8ff
AH
438static void parse_driver_options(struct arm_smmu_device *smmu)
439{
440 int i = 0;
2907320d 441
3a5df8ff
AH
442 do {
443 if (of_property_read_bool(smmu->dev->of_node,
444 arm_smmu_options[i].prop)) {
445 smmu->options |= arm_smmu_options[i].opt;
446 dev_notice(smmu->dev, "option %s\n",
447 arm_smmu_options[i].prop);
448 }
449 } while (arm_smmu_options[++i].opt);
450}
451
8f68f8e2 452static struct device_node *dev_get_dev_node(struct device *dev)
a9a1b0b5
WD
453{
454 if (dev_is_pci(dev)) {
455 struct pci_bus *bus = to_pci_dev(dev)->bus;
2907320d 456
a9a1b0b5
WD
457 while (!pci_is_root_bus(bus))
458 bus = bus->parent;
f80cd885 459 return of_node_get(bus->bridge->parent->of_node);
a9a1b0b5
WD
460 }
461
f80cd885 462 return of_node_get(dev->of_node);
a9a1b0b5
WD
463}
464
f80cd885 465static int __arm_smmu_get_pci_sid(struct pci_dev *pdev, u16 alias, void *data)
45ae7cff 466{
f80cd885
RM
467 *((__be32 *)data) = cpu_to_be32(alias);
468 return 0; /* Continue walking */
45ae7cff
WD
469}
470
f80cd885 471static int __find_legacy_master_phandle(struct device *dev, void *data)
a9a1b0b5 472{
f80cd885
RM
473 struct of_phandle_iterator *it = *(void **)data;
474 struct device_node *np = it->node;
475 int err;
476
477 of_for_each_phandle(it, err, dev->of_node, "mmu-masters",
478 "#stream-id-cells", 0)
479 if (it->node == np) {
480 *(void **)data = dev;
481 return 1;
482 }
483 it->node = np;
484 return err == -ENOENT ? 0 : err;
a9a1b0b5
WD
485}
486
d6fc5d97 487static struct platform_driver arm_smmu_driver;
adfec2e7 488static struct iommu_ops arm_smmu_ops;
d6fc5d97 489
adfec2e7
RM
490static int arm_smmu_register_legacy_master(struct device *dev,
491 struct arm_smmu_device **smmu)
45ae7cff 492{
adfec2e7 493 struct device *smmu_dev;
f80cd885
RM
494 struct device_node *np;
495 struct of_phandle_iterator it;
496 void *data = &it;
adfec2e7 497 u32 *sids;
f80cd885
RM
498 __be32 pci_sid;
499 int err;
45ae7cff 500
f80cd885
RM
501 np = dev_get_dev_node(dev);
502 if (!np || !of_find_property(np, "#stream-id-cells", NULL)) {
503 of_node_put(np);
504 return -ENODEV;
505 }
45ae7cff 506
f80cd885 507 it.node = np;
d6fc5d97
RM
508 err = driver_for_each_device(&arm_smmu_driver.driver, NULL, &data,
509 __find_legacy_master_phandle);
adfec2e7 510 smmu_dev = data;
f80cd885
RM
511 of_node_put(np);
512 if (err == 0)
513 return -ENODEV;
514 if (err < 0)
515 return err;
45ae7cff 516
f80cd885
RM
517 if (dev_is_pci(dev)) {
518 /* "mmu-masters" assumes Stream ID == Requester ID */
519 pci_for_each_dma_alias(to_pci_dev(dev), __arm_smmu_get_pci_sid,
520 &pci_sid);
521 it.cur = &pci_sid;
522 it.cur_count = 1;
523 }
45ae7cff 524
adfec2e7
RM
525 err = iommu_fwspec_init(dev, &smmu_dev->of_node->fwnode,
526 &arm_smmu_ops);
527 if (err)
528 return err;
45ae7cff 529
adfec2e7
RM
530 sids = kcalloc(it.cur_count, sizeof(*sids), GFP_KERNEL);
531 if (!sids)
532 return -ENOMEM;
44680eed 533
adfec2e7
RM
534 *smmu = dev_get_drvdata(smmu_dev);
535 of_phandle_iterator_args(&it, sids, it.cur_count);
536 err = iommu_fwspec_add_ids(dev, sids, it.cur_count);
537 kfree(sids);
538 return err;
45ae7cff
WD
539}
540
541static int __arm_smmu_alloc_bitmap(unsigned long *map, int start, int end)
542{
543 int idx;
544
545 do {
546 idx = find_next_zero_bit(map, end, start);
547 if (idx == end)
548 return -ENOSPC;
549 } while (test_and_set_bit(idx, map));
550
551 return idx;
552}
553
554static void __arm_smmu_free_bitmap(unsigned long *map, int idx)
555{
556 clear_bit(idx, map);
557}
558
559/* Wait for any pending TLB invalidations to complete */
518f7136 560static void __arm_smmu_tlb_sync(struct arm_smmu_device *smmu)
45ae7cff
WD
561{
562 int count = 0;
563 void __iomem *gr0_base = ARM_SMMU_GR0(smmu);
564
565 writel_relaxed(0, gr0_base + ARM_SMMU_GR0_sTLBGSYNC);
566 while (readl_relaxed(gr0_base + ARM_SMMU_GR0_sTLBGSTATUS)
567 & sTLBGSTATUS_GSACTIVE) {
568 cpu_relax();
569 if (++count == TLB_LOOP_TIMEOUT) {
570 dev_err_ratelimited(smmu->dev,
571 "TLB sync timed out -- SMMU may be deadlocked\n");
572 return;
573 }
574 udelay(1);
575 }
576}
577
518f7136
WD
578static void arm_smmu_tlb_sync(void *cookie)
579{
580 struct arm_smmu_domain *smmu_domain = cookie;
581 __arm_smmu_tlb_sync(smmu_domain->smmu);
582}
583
584static void arm_smmu_tlb_inv_context(void *cookie)
1463fe44 585{
518f7136 586 struct arm_smmu_domain *smmu_domain = cookie;
44680eed
WD
587 struct arm_smmu_cfg *cfg = &smmu_domain->cfg;
588 struct arm_smmu_device *smmu = smmu_domain->smmu;
1463fe44 589 bool stage1 = cfg->cbar != CBAR_TYPE_S2_TRANS;
518f7136 590 void __iomem *base;
1463fe44
WD
591
592 if (stage1) {
593 base = ARM_SMMU_CB_BASE(smmu) + ARM_SMMU_CB(smmu, cfg->cbndx);
1bd37a68 594 writel_relaxed(ARM_SMMU_CB_ASID(smmu, cfg),
ecfadb6e 595 base + ARM_SMMU_CB_S1_TLBIASID);
1463fe44
WD
596 } else {
597 base = ARM_SMMU_GR0(smmu);
1bd37a68 598 writel_relaxed(ARM_SMMU_CB_VMID(smmu, cfg),
ecfadb6e 599 base + ARM_SMMU_GR0_TLBIVMID);
1463fe44
WD
600 }
601
518f7136
WD
602 __arm_smmu_tlb_sync(smmu);
603}
604
605static void arm_smmu_tlb_inv_range_nosync(unsigned long iova, size_t size,
06c610e8 606 size_t granule, bool leaf, void *cookie)
518f7136
WD
607{
608 struct arm_smmu_domain *smmu_domain = cookie;
609 struct arm_smmu_cfg *cfg = &smmu_domain->cfg;
610 struct arm_smmu_device *smmu = smmu_domain->smmu;
611 bool stage1 = cfg->cbar != CBAR_TYPE_S2_TRANS;
612 void __iomem *reg;
613
614 if (stage1) {
615 reg = ARM_SMMU_CB_BASE(smmu) + ARM_SMMU_CB(smmu, cfg->cbndx);
616 reg += leaf ? ARM_SMMU_CB_S1_TLBIVAL : ARM_SMMU_CB_S1_TLBIVA;
617
7602b871 618 if (cfg->fmt != ARM_SMMU_CTX_FMT_AARCH64) {
518f7136 619 iova &= ~12UL;
1bd37a68 620 iova |= ARM_SMMU_CB_ASID(smmu, cfg);
75df1386
RM
621 do {
622 writel_relaxed(iova, reg);
623 iova += granule;
624 } while (size -= granule);
518f7136
WD
625 } else {
626 iova >>= 12;
1bd37a68 627 iova |= (u64)ARM_SMMU_CB_ASID(smmu, cfg) << 48;
75df1386
RM
628 do {
629 writeq_relaxed(iova, reg);
630 iova += granule >> 12;
631 } while (size -= granule);
518f7136 632 }
518f7136
WD
633 } else if (smmu->version == ARM_SMMU_V2) {
634 reg = ARM_SMMU_CB_BASE(smmu) + ARM_SMMU_CB(smmu, cfg->cbndx);
635 reg += leaf ? ARM_SMMU_CB_S2_TLBIIPAS2L :
636 ARM_SMMU_CB_S2_TLBIIPAS2;
75df1386
RM
637 iova >>= 12;
638 do {
f9a05f05 639 smmu_write_atomic_lq(iova, reg);
75df1386
RM
640 iova += granule >> 12;
641 } while (size -= granule);
518f7136
WD
642 } else {
643 reg = ARM_SMMU_GR0(smmu) + ARM_SMMU_GR0_TLBIVMID;
1bd37a68 644 writel_relaxed(ARM_SMMU_CB_VMID(smmu, cfg), reg);
518f7136
WD
645 }
646}
647
5896f3a3 648static const struct iommu_gather_ops arm_smmu_gather_ops = {
518f7136
WD
649 .tlb_flush_all = arm_smmu_tlb_inv_context,
650 .tlb_add_flush = arm_smmu_tlb_inv_range_nosync,
651 .tlb_sync = arm_smmu_tlb_sync,
518f7136
WD
652};
653
45ae7cff
WD
654static irqreturn_t arm_smmu_context_fault(int irq, void *dev)
655{
3714ce1d 656 u32 fsr, fsynr;
45ae7cff
WD
657 unsigned long iova;
658 struct iommu_domain *domain = dev;
1d672638 659 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
44680eed
WD
660 struct arm_smmu_cfg *cfg = &smmu_domain->cfg;
661 struct arm_smmu_device *smmu = smmu_domain->smmu;
45ae7cff
WD
662 void __iomem *cb_base;
663
44680eed 664 cb_base = ARM_SMMU_CB_BASE(smmu) + ARM_SMMU_CB(smmu, cfg->cbndx);
45ae7cff
WD
665 fsr = readl_relaxed(cb_base + ARM_SMMU_CB_FSR);
666
667 if (!(fsr & FSR_FAULT))
668 return IRQ_NONE;
669
45ae7cff 670 fsynr = readl_relaxed(cb_base + ARM_SMMU_CB_FSYNR0);
f9a05f05 671 iova = readq_relaxed(cb_base + ARM_SMMU_CB_FAR);
45ae7cff 672
3714ce1d
WD
673 dev_err_ratelimited(smmu->dev,
674 "Unhandled context fault: fsr=0x%x, iova=0x%08lx, fsynr=0x%x, cb=%d\n",
675 fsr, iova, fsynr, cfg->cbndx);
45ae7cff 676
3714ce1d
WD
677 writel(fsr, cb_base + ARM_SMMU_CB_FSR);
678 return IRQ_HANDLED;
45ae7cff
WD
679}
680
681static irqreturn_t arm_smmu_global_fault(int irq, void *dev)
682{
683 u32 gfsr, gfsynr0, gfsynr1, gfsynr2;
684 struct arm_smmu_device *smmu = dev;
3a5df8ff 685 void __iomem *gr0_base = ARM_SMMU_GR0_NS(smmu);
45ae7cff
WD
686
687 gfsr = readl_relaxed(gr0_base + ARM_SMMU_GR0_sGFSR);
688 gfsynr0 = readl_relaxed(gr0_base + ARM_SMMU_GR0_sGFSYNR0);
689 gfsynr1 = readl_relaxed(gr0_base + ARM_SMMU_GR0_sGFSYNR1);
690 gfsynr2 = readl_relaxed(gr0_base + ARM_SMMU_GR0_sGFSYNR2);
691
3a5df8ff
AH
692 if (!gfsr)
693 return IRQ_NONE;
694
45ae7cff
WD
695 dev_err_ratelimited(smmu->dev,
696 "Unexpected global fault, this could be serious\n");
697 dev_err_ratelimited(smmu->dev,
698 "\tGFSR 0x%08x, GFSYNR0 0x%08x, GFSYNR1 0x%08x, GFSYNR2 0x%08x\n",
699 gfsr, gfsynr0, gfsynr1, gfsynr2);
700
701 writel(gfsr, gr0_base + ARM_SMMU_GR0_sGFSR);
adaba320 702 return IRQ_HANDLED;
45ae7cff
WD
703}
704
518f7136
WD
705static void arm_smmu_init_context_bank(struct arm_smmu_domain *smmu_domain,
706 struct io_pgtable_cfg *pgtbl_cfg)
45ae7cff 707{
6070529b 708 u32 reg, reg2;
668b4ada 709 u64 reg64;
45ae7cff 710 bool stage1;
44680eed
WD
711 struct arm_smmu_cfg *cfg = &smmu_domain->cfg;
712 struct arm_smmu_device *smmu = smmu_domain->smmu;
c88ae5de 713 void __iomem *cb_base, *gr1_base;
45ae7cff 714
45ae7cff 715 gr1_base = ARM_SMMU_GR1(smmu);
44680eed
WD
716 stage1 = cfg->cbar != CBAR_TYPE_S2_TRANS;
717 cb_base = ARM_SMMU_CB_BASE(smmu) + ARM_SMMU_CB(smmu, cfg->cbndx);
45ae7cff 718
4a1c93cb 719 if (smmu->version > ARM_SMMU_V1) {
7602b871
RM
720 if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH64)
721 reg = CBA2R_RW64_64BIT;
722 else
723 reg = CBA2R_RW64_32BIT;
4e3e9b69
TC
724 /* 16-bit VMIDs live in CBA2R */
725 if (smmu->features & ARM_SMMU_FEAT_VMID16)
1bd37a68 726 reg |= ARM_SMMU_CB_VMID(smmu, cfg) << CBA2R_VMID_SHIFT;
4e3e9b69 727
4a1c93cb
WD
728 writel_relaxed(reg, gr1_base + ARM_SMMU_GR1_CBA2R(cfg->cbndx));
729 }
730
45ae7cff 731 /* CBAR */
44680eed 732 reg = cfg->cbar;
b7862e35 733 if (smmu->version < ARM_SMMU_V2)
2907320d 734 reg |= cfg->irptndx << CBAR_IRPTNDX_SHIFT;
45ae7cff 735
57ca90f6
WD
736 /*
737 * Use the weakest shareability/memory types, so they are
738 * overridden by the ttbcr/pte.
739 */
740 if (stage1) {
741 reg |= (CBAR_S1_BPSHCFG_NSH << CBAR_S1_BPSHCFG_SHIFT) |
742 (CBAR_S1_MEMATTR_WB << CBAR_S1_MEMATTR_SHIFT);
4e3e9b69
TC
743 } else if (!(smmu->features & ARM_SMMU_FEAT_VMID16)) {
744 /* 8-bit VMIDs live in CBAR */
1bd37a68 745 reg |= ARM_SMMU_CB_VMID(smmu, cfg) << CBAR_VMID_SHIFT;
57ca90f6 746 }
44680eed 747 writel_relaxed(reg, gr1_base + ARM_SMMU_GR1_CBAR(cfg->cbndx));
45ae7cff 748
518f7136
WD
749 /* TTBRs */
750 if (stage1) {
6070529b
RM
751 u16 asid = ARM_SMMU_CB_ASID(smmu, cfg);
752
753 if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH32_S) {
754 reg = pgtbl_cfg->arm_v7s_cfg.ttbr[0];
755 writel_relaxed(reg, cb_base + ARM_SMMU_CB_TTBR0);
756 reg = pgtbl_cfg->arm_v7s_cfg.ttbr[1];
757 writel_relaxed(reg, cb_base + ARM_SMMU_CB_TTBR1);
758 writel_relaxed(asid, cb_base + ARM_SMMU_CB_CONTEXTIDR);
759 } else {
760 reg64 = pgtbl_cfg->arm_lpae_s1_cfg.ttbr[0];
761 reg64 |= (u64)asid << TTBRn_ASID_SHIFT;
762 writeq_relaxed(reg64, cb_base + ARM_SMMU_CB_TTBR0);
763 reg64 = pgtbl_cfg->arm_lpae_s1_cfg.ttbr[1];
764 reg64 |= (u64)asid << TTBRn_ASID_SHIFT;
765 writeq_relaxed(reg64, cb_base + ARM_SMMU_CB_TTBR1);
766 }
518f7136 767 } else {
668b4ada 768 reg64 = pgtbl_cfg->arm_lpae_s2_cfg.vttbr;
f9a05f05 769 writeq_relaxed(reg64, cb_base + ARM_SMMU_CB_TTBR0);
518f7136 770 }
a65217a4 771
518f7136
WD
772 /* TTBCR */
773 if (stage1) {
6070529b
RM
774 if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH32_S) {
775 reg = pgtbl_cfg->arm_v7s_cfg.tcr;
776 reg2 = 0;
777 } else {
778 reg = pgtbl_cfg->arm_lpae_s1_cfg.tcr;
779 reg2 = pgtbl_cfg->arm_lpae_s1_cfg.tcr >> 32;
780 reg2 |= TTBCR2_SEP_UPSTREAM;
45ae7cff 781 }
6070529b
RM
782 if (smmu->version > ARM_SMMU_V1)
783 writel_relaxed(reg2, cb_base + ARM_SMMU_CB_TTBCR2);
45ae7cff 784 } else {
518f7136 785 reg = pgtbl_cfg->arm_lpae_s2_cfg.vtcr;
45ae7cff 786 }
6070529b 787 writel_relaxed(reg, cb_base + ARM_SMMU_CB_TTBCR);
45ae7cff 788
518f7136 789 /* MAIRs (stage-1 only) */
45ae7cff 790 if (stage1) {
6070529b
RM
791 if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH32_S) {
792 reg = pgtbl_cfg->arm_v7s_cfg.prrr;
793 reg2 = pgtbl_cfg->arm_v7s_cfg.nmrr;
794 } else {
795 reg = pgtbl_cfg->arm_lpae_s1_cfg.mair[0];
796 reg2 = pgtbl_cfg->arm_lpae_s1_cfg.mair[1];
797 }
45ae7cff 798 writel_relaxed(reg, cb_base + ARM_SMMU_CB_S1_MAIR0);
6070529b 799 writel_relaxed(reg2, cb_base + ARM_SMMU_CB_S1_MAIR1);
45ae7cff
WD
800 }
801
45ae7cff 802 /* SCTLR */
6070529b 803 reg = SCTLR_CFIE | SCTLR_CFRE | SCTLR_AFE | SCTLR_TRE | SCTLR_M;
45ae7cff
WD
804 if (stage1)
805 reg |= SCTLR_S1_ASIDPNE;
806#ifdef __BIG_ENDIAN
807 reg |= SCTLR_E;
808#endif
25724841 809 writel_relaxed(reg, cb_base + ARM_SMMU_CB_SCTLR);
45ae7cff
WD
810}
811
812static int arm_smmu_init_domain_context(struct iommu_domain *domain,
44680eed 813 struct arm_smmu_device *smmu)
45ae7cff 814{
a18037b2 815 int irq, start, ret = 0;
518f7136
WD
816 unsigned long ias, oas;
817 struct io_pgtable_ops *pgtbl_ops;
818 struct io_pgtable_cfg pgtbl_cfg;
819 enum io_pgtable_fmt fmt;
1d672638 820 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
44680eed 821 struct arm_smmu_cfg *cfg = &smmu_domain->cfg;
45ae7cff 822
518f7136 823 mutex_lock(&smmu_domain->init_mutex);
a18037b2
MH
824 if (smmu_domain->smmu)
825 goto out_unlock;
826
c752ce45
WD
827 /*
828 * Mapping the requested stage onto what we support is surprisingly
829 * complicated, mainly because the spec allows S1+S2 SMMUs without
830 * support for nested translation. That means we end up with the
831 * following table:
832 *
833 * Requested Supported Actual
834 * S1 N S1
835 * S1 S1+S2 S1
836 * S1 S2 S2
837 * S1 S1 S1
838 * N N N
839 * N S1+S2 S2
840 * N S2 S2
841 * N S1 S1
842 *
843 * Note that you can't actually request stage-2 mappings.
844 */
845 if (!(smmu->features & ARM_SMMU_FEAT_TRANS_S1))
846 smmu_domain->stage = ARM_SMMU_DOMAIN_S2;
847 if (!(smmu->features & ARM_SMMU_FEAT_TRANS_S2))
848 smmu_domain->stage = ARM_SMMU_DOMAIN_S1;
849
7602b871
RM
850 /*
851 * Choosing a suitable context format is even more fiddly. Until we
852 * grow some way for the caller to express a preference, and/or move
853 * the decision into the io-pgtable code where it arguably belongs,
854 * just aim for the closest thing to the rest of the system, and hope
855 * that the hardware isn't esoteric enough that we can't assume AArch64
856 * support to be a superset of AArch32 support...
857 */
858 if (smmu->features & ARM_SMMU_FEAT_FMT_AARCH32_L)
859 cfg->fmt = ARM_SMMU_CTX_FMT_AARCH32_L;
6070529b
RM
860 if (IS_ENABLED(CONFIG_IOMMU_IO_PGTABLE_ARMV7S) &&
861 !IS_ENABLED(CONFIG_64BIT) && !IS_ENABLED(CONFIG_ARM_LPAE) &&
862 (smmu->features & ARM_SMMU_FEAT_FMT_AARCH32_S) &&
863 (smmu_domain->stage == ARM_SMMU_DOMAIN_S1))
864 cfg->fmt = ARM_SMMU_CTX_FMT_AARCH32_S;
7602b871
RM
865 if ((IS_ENABLED(CONFIG_64BIT) || cfg->fmt == ARM_SMMU_CTX_FMT_NONE) &&
866 (smmu->features & (ARM_SMMU_FEAT_FMT_AARCH64_64K |
867 ARM_SMMU_FEAT_FMT_AARCH64_16K |
868 ARM_SMMU_FEAT_FMT_AARCH64_4K)))
869 cfg->fmt = ARM_SMMU_CTX_FMT_AARCH64;
870
871 if (cfg->fmt == ARM_SMMU_CTX_FMT_NONE) {
872 ret = -EINVAL;
873 goto out_unlock;
874 }
875
c752ce45
WD
876 switch (smmu_domain->stage) {
877 case ARM_SMMU_DOMAIN_S1:
878 cfg->cbar = CBAR_TYPE_S1_TRANS_S2_BYPASS;
879 start = smmu->num_s2_context_banks;
518f7136
WD
880 ias = smmu->va_size;
881 oas = smmu->ipa_size;
7602b871 882 if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH64) {
518f7136 883 fmt = ARM_64_LPAE_S1;
6070529b 884 } else if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH32_L) {
518f7136 885 fmt = ARM_32_LPAE_S1;
7602b871
RM
886 ias = min(ias, 32UL);
887 oas = min(oas, 40UL);
6070529b
RM
888 } else {
889 fmt = ARM_V7S;
890 ias = min(ias, 32UL);
891 oas = min(oas, 32UL);
7602b871 892 }
c752ce45
WD
893 break;
894 case ARM_SMMU_DOMAIN_NESTED:
45ae7cff
WD
895 /*
896 * We will likely want to change this if/when KVM gets
897 * involved.
898 */
c752ce45 899 case ARM_SMMU_DOMAIN_S2:
9c5c92e3
WD
900 cfg->cbar = CBAR_TYPE_S2_TRANS;
901 start = 0;
518f7136
WD
902 ias = smmu->ipa_size;
903 oas = smmu->pa_size;
7602b871 904 if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH64) {
518f7136 905 fmt = ARM_64_LPAE_S2;
7602b871 906 } else {
518f7136 907 fmt = ARM_32_LPAE_S2;
7602b871
RM
908 ias = min(ias, 40UL);
909 oas = min(oas, 40UL);
910 }
c752ce45
WD
911 break;
912 default:
913 ret = -EINVAL;
914 goto out_unlock;
45ae7cff
WD
915 }
916
917 ret = __arm_smmu_alloc_bitmap(smmu->context_map, start,
918 smmu->num_context_banks);
287980e4 919 if (ret < 0)
a18037b2 920 goto out_unlock;
45ae7cff 921
44680eed 922 cfg->cbndx = ret;
b7862e35 923 if (smmu->version < ARM_SMMU_V2) {
44680eed
WD
924 cfg->irptndx = atomic_inc_return(&smmu->irptndx);
925 cfg->irptndx %= smmu->num_context_irqs;
45ae7cff 926 } else {
44680eed 927 cfg->irptndx = cfg->cbndx;
45ae7cff
WD
928 }
929
518f7136 930 pgtbl_cfg = (struct io_pgtable_cfg) {
d5466357 931 .pgsize_bitmap = smmu->pgsize_bitmap,
518f7136
WD
932 .ias = ias,
933 .oas = oas,
934 .tlb = &arm_smmu_gather_ops,
2df7a25c 935 .iommu_dev = smmu->dev,
518f7136
WD
936 };
937
938 smmu_domain->smmu = smmu;
939 pgtbl_ops = alloc_io_pgtable_ops(fmt, &pgtbl_cfg, smmu_domain);
940 if (!pgtbl_ops) {
941 ret = -ENOMEM;
942 goto out_clear_smmu;
943 }
944
d5466357
RM
945 /* Update the domain's page sizes to reflect the page table format */
946 domain->pgsize_bitmap = pgtbl_cfg.pgsize_bitmap;
455eb7d3
RM
947 domain->geometry.aperture_end = (1UL << ias) - 1;
948 domain->geometry.force_aperture = true;
a18037b2 949
518f7136
WD
950 /* Initialise the context bank with our page table cfg */
951 arm_smmu_init_context_bank(smmu_domain, &pgtbl_cfg);
952
953 /*
954 * Request context fault interrupt. Do this last to avoid the
955 * handler seeing a half-initialised domain state.
956 */
44680eed 957 irq = smmu->irqs[smmu->num_global_irqs + cfg->irptndx];
bee14004
PF
958 ret = devm_request_irq(smmu->dev, irq, arm_smmu_context_fault,
959 IRQF_SHARED, "arm-smmu-context-fault", domain);
287980e4 960 if (ret < 0) {
45ae7cff 961 dev_err(smmu->dev, "failed to request context IRQ %d (%u)\n",
44680eed
WD
962 cfg->irptndx, irq);
963 cfg->irptndx = INVALID_IRPTNDX;
45ae7cff
WD
964 }
965
518f7136
WD
966 mutex_unlock(&smmu_domain->init_mutex);
967
968 /* Publish page table ops for map/unmap */
969 smmu_domain->pgtbl_ops = pgtbl_ops;
a9a1b0b5 970 return 0;
45ae7cff 971
518f7136
WD
972out_clear_smmu:
973 smmu_domain->smmu = NULL;
a18037b2 974out_unlock:
518f7136 975 mutex_unlock(&smmu_domain->init_mutex);
45ae7cff
WD
976 return ret;
977}
978
979static void arm_smmu_destroy_domain_context(struct iommu_domain *domain)
980{
1d672638 981 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
44680eed
WD
982 struct arm_smmu_device *smmu = smmu_domain->smmu;
983 struct arm_smmu_cfg *cfg = &smmu_domain->cfg;
1463fe44 984 void __iomem *cb_base;
45ae7cff
WD
985 int irq;
986
021bb842 987 if (!smmu)
45ae7cff
WD
988 return;
989
518f7136
WD
990 /*
991 * Disable the context bank and free the page tables before freeing
992 * it.
993 */
44680eed 994 cb_base = ARM_SMMU_CB_BASE(smmu) + ARM_SMMU_CB(smmu, cfg->cbndx);
1463fe44 995 writel_relaxed(0, cb_base + ARM_SMMU_CB_SCTLR);
1463fe44 996
44680eed
WD
997 if (cfg->irptndx != INVALID_IRPTNDX) {
998 irq = smmu->irqs[smmu->num_global_irqs + cfg->irptndx];
bee14004 999 devm_free_irq(smmu->dev, irq, domain);
45ae7cff
WD
1000 }
1001
44830b0c 1002 free_io_pgtable_ops(smmu_domain->pgtbl_ops);
44680eed 1003 __arm_smmu_free_bitmap(smmu->context_map, cfg->cbndx);
45ae7cff
WD
1004}
1005
1d672638 1006static struct iommu_domain *arm_smmu_domain_alloc(unsigned type)
45ae7cff
WD
1007{
1008 struct arm_smmu_domain *smmu_domain;
45ae7cff 1009
9adb9594 1010 if (type != IOMMU_DOMAIN_UNMANAGED && type != IOMMU_DOMAIN_DMA)
1d672638 1011 return NULL;
45ae7cff
WD
1012 /*
1013 * Allocate the domain and initialise some of its data structures.
1014 * We can't really do anything meaningful until we've added a
1015 * master.
1016 */
1017 smmu_domain = kzalloc(sizeof(*smmu_domain), GFP_KERNEL);
1018 if (!smmu_domain)
1d672638 1019 return NULL;
45ae7cff 1020
021bb842
RM
1021 if (type == IOMMU_DOMAIN_DMA && (using_legacy_binding ||
1022 iommu_get_dma_cookie(&smmu_domain->domain))) {
9adb9594
RM
1023 kfree(smmu_domain);
1024 return NULL;
1025 }
1026
518f7136
WD
1027 mutex_init(&smmu_domain->init_mutex);
1028 spin_lock_init(&smmu_domain->pgtbl_lock);
1d672638
JR
1029
1030 return &smmu_domain->domain;
45ae7cff
WD
1031}
1032
1d672638 1033static void arm_smmu_domain_free(struct iommu_domain *domain)
45ae7cff 1034{
1d672638 1035 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
1463fe44
WD
1036
1037 /*
1038 * Free the domain resources. We assume that all devices have
1039 * already been detached.
1040 */
9adb9594 1041 iommu_put_dma_cookie(domain);
45ae7cff 1042 arm_smmu_destroy_domain_context(domain);
45ae7cff
WD
1043 kfree(smmu_domain);
1044}
1045
1f3d5ca4
RM
1046static void arm_smmu_write_smr(struct arm_smmu_device *smmu, int idx)
1047{
1048 struct arm_smmu_smr *smr = smmu->smrs + idx;
f80cd885 1049 u32 reg = smr->id << SMR_ID_SHIFT | smr->mask << SMR_MASK_SHIFT;
1f3d5ca4
RM
1050
1051 if (smr->valid)
1052 reg |= SMR_VALID;
1053 writel_relaxed(reg, ARM_SMMU_GR0(smmu) + ARM_SMMU_GR0_SMR(idx));
1054}
1055
8e8b203e
RM
1056static void arm_smmu_write_s2cr(struct arm_smmu_device *smmu, int idx)
1057{
1058 struct arm_smmu_s2cr *s2cr = smmu->s2crs + idx;
1059 u32 reg = (s2cr->type & S2CR_TYPE_MASK) << S2CR_TYPE_SHIFT |
1060 (s2cr->cbndx & S2CR_CBNDX_MASK) << S2CR_CBNDX_SHIFT |
1061 (s2cr->privcfg & S2CR_PRIVCFG_MASK) << S2CR_PRIVCFG_SHIFT;
1062
1063 writel_relaxed(reg, ARM_SMMU_GR0(smmu) + ARM_SMMU_GR0_S2CR(idx));
1064}
1065
1066static void arm_smmu_write_sme(struct arm_smmu_device *smmu, int idx)
1067{
1068 arm_smmu_write_s2cr(smmu, idx);
1069 if (smmu->smrs)
1070 arm_smmu_write_smr(smmu, idx);
1071}
1072
588888a7 1073static int arm_smmu_find_sme(struct arm_smmu_device *smmu, u16 id, u16 mask)
1f3d5ca4
RM
1074{
1075 struct arm_smmu_smr *smrs = smmu->smrs;
588888a7 1076 int i, free_idx = -ENOSPC;
1f3d5ca4 1077
588888a7
RM
1078 /* Stream indexing is blissfully easy */
1079 if (!smrs)
1080 return id;
1081
1082 /* Validating SMRs is... less so */
1083 for (i = 0; i < smmu->num_mapping_groups; ++i) {
1084 if (!smrs[i].valid) {
1085 /*
1086 * Note the first free entry we come across, which
1087 * we'll claim in the end if nothing else matches.
1088 */
1089 if (free_idx < 0)
1090 free_idx = i;
1f3d5ca4
RM
1091 continue;
1092 }
588888a7
RM
1093 /*
1094 * If the new entry is _entirely_ matched by an existing entry,
1095 * then reuse that, with the guarantee that there also cannot
1096 * be any subsequent conflicting entries. In normal use we'd
1097 * expect simply identical entries for this case, but there's
1098 * no harm in accommodating the generalisation.
1099 */
1100 if ((mask & smrs[i].mask) == mask &&
1101 !((id ^ smrs[i].id) & ~smrs[i].mask))
1102 return i;
1103 /*
1104 * If the new entry has any other overlap with an existing one,
1105 * though, then there always exists at least one stream ID
1106 * which would cause a conflict, and we can't allow that risk.
1107 */
1108 if (!((id ^ smrs[i].id) & ~(smrs[i].mask | mask)))
1109 return -EINVAL;
1110 }
1f3d5ca4 1111
588888a7
RM
1112 return free_idx;
1113}
1114
1115static bool arm_smmu_free_sme(struct arm_smmu_device *smmu, int idx)
1116{
1117 if (--smmu->s2crs[idx].count)
1118 return false;
1119
1120 smmu->s2crs[idx] = s2cr_init_val;
1121 if (smmu->smrs)
1122 smmu->smrs[idx].valid = false;
1123
1124 return true;
1125}
1126
1127static int arm_smmu_master_alloc_smes(struct device *dev)
1128{
adfec2e7
RM
1129 struct iommu_fwspec *fwspec = dev->iommu_fwspec;
1130 struct arm_smmu_master_cfg *cfg = fwspec->iommu_priv;
588888a7
RM
1131 struct arm_smmu_device *smmu = cfg->smmu;
1132 struct arm_smmu_smr *smrs = smmu->smrs;
1133 struct iommu_group *group;
1134 int i, idx, ret;
1135
1136 mutex_lock(&smmu->stream_map_mutex);
1137 /* Figure out a viable stream map entry allocation */
adfec2e7 1138 for_each_cfg_sme(fwspec, i, idx) {
021bb842
RM
1139 u16 sid = fwspec->ids[i];
1140 u16 mask = fwspec->ids[i] >> SMR_MASK_SHIFT;
1141
588888a7
RM
1142 if (idx != INVALID_SMENDX) {
1143 ret = -EEXIST;
1144 goto out_err;
45ae7cff
WD
1145 }
1146
021bb842 1147 ret = arm_smmu_find_sme(smmu, sid, mask);
588888a7
RM
1148 if (ret < 0)
1149 goto out_err;
1150
1151 idx = ret;
1152 if (smrs && smmu->s2crs[idx].count == 0) {
021bb842
RM
1153 smrs[idx].id = sid;
1154 smrs[idx].mask = mask;
588888a7
RM
1155 smrs[idx].valid = true;
1156 }
1157 smmu->s2crs[idx].count++;
1158 cfg->smendx[i] = (s16)idx;
45ae7cff
WD
1159 }
1160
588888a7
RM
1161 group = iommu_group_get_for_dev(dev);
1162 if (!group)
1163 group = ERR_PTR(-ENOMEM);
1164 if (IS_ERR(group)) {
1165 ret = PTR_ERR(group);
1166 goto out_err;
1167 }
1168 iommu_group_put(group);
1f3d5ca4 1169
45ae7cff 1170 /* It worked! Now, poke the actual hardware */
adfec2e7 1171 for_each_cfg_sme(fwspec, i, idx) {
588888a7
RM
1172 arm_smmu_write_sme(smmu, idx);
1173 smmu->s2crs[idx].group = group;
1174 }
45ae7cff 1175
588888a7 1176 mutex_unlock(&smmu->stream_map_mutex);
45ae7cff
WD
1177 return 0;
1178
588888a7 1179out_err:
1f3d5ca4 1180 while (i--) {
588888a7 1181 arm_smmu_free_sme(smmu, cfg->smendx[i]);
1f3d5ca4
RM
1182 cfg->smendx[i] = INVALID_SMENDX;
1183 }
588888a7
RM
1184 mutex_unlock(&smmu->stream_map_mutex);
1185 return ret;
45ae7cff
WD
1186}
1187
adfec2e7 1188static void arm_smmu_master_free_smes(struct iommu_fwspec *fwspec)
45ae7cff 1189{
adfec2e7
RM
1190 struct arm_smmu_device *smmu = fwspec_smmu(fwspec);
1191 struct arm_smmu_master_cfg *cfg = fwspec->iommu_priv;
d3097e39 1192 int i, idx;
43b412be 1193
588888a7 1194 mutex_lock(&smmu->stream_map_mutex);
adfec2e7 1195 for_each_cfg_sme(fwspec, i, idx) {
588888a7
RM
1196 if (arm_smmu_free_sme(smmu, idx))
1197 arm_smmu_write_sme(smmu, idx);
1f3d5ca4 1198 cfg->smendx[i] = INVALID_SMENDX;
45ae7cff 1199 }
588888a7 1200 mutex_unlock(&smmu->stream_map_mutex);
45ae7cff
WD
1201}
1202
45ae7cff 1203static int arm_smmu_domain_add_master(struct arm_smmu_domain *smmu_domain,
adfec2e7 1204 struct iommu_fwspec *fwspec)
45ae7cff 1205{
44680eed 1206 struct arm_smmu_device *smmu = smmu_domain->smmu;
8e8b203e
RM
1207 struct arm_smmu_s2cr *s2cr = smmu->s2crs;
1208 enum arm_smmu_s2cr_type type = S2CR_TYPE_TRANS;
1209 u8 cbndx = smmu_domain->cfg.cbndx;
588888a7 1210 int i, idx;
45ae7cff 1211
adfec2e7 1212 for_each_cfg_sme(fwspec, i, idx) {
8e8b203e 1213 if (type == s2cr[idx].type && cbndx == s2cr[idx].cbndx)
588888a7 1214 continue;
1f3d5ca4 1215
8e8b203e
RM
1216 s2cr[idx].type = type;
1217 s2cr[idx].privcfg = S2CR_PRIVCFG_UNPRIV;
1218 s2cr[idx].cbndx = cbndx;
1219 arm_smmu_write_s2cr(smmu, idx);
43b412be 1220 }
8e8b203e 1221 return 0;
bc7f2ce0
WD
1222}
1223
45ae7cff
WD
1224static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)
1225{
a18037b2 1226 int ret;
adfec2e7
RM
1227 struct iommu_fwspec *fwspec = dev->iommu_fwspec;
1228 struct arm_smmu_device *smmu;
1d672638 1229 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
45ae7cff 1230
adfec2e7 1231 if (!fwspec || fwspec->ops != &arm_smmu_ops) {
45ae7cff
WD
1232 dev_err(dev, "cannot attach to SMMU, is it on the same bus?\n");
1233 return -ENXIO;
1234 }
1235
fba4f8e5
RM
1236 /*
1237 * FIXME: The arch/arm DMA API code tries to attach devices to its own
1238 * domains between of_xlate() and add_device() - we have no way to cope
1239 * with that, so until ARM gets converted to rely on groups and default
1240 * domains, just say no (but more politely than by dereferencing NULL).
1241 * This should be at least a WARN_ON once that's sorted.
1242 */
1243 if (!fwspec->iommu_priv)
1244 return -ENODEV;
1245
adfec2e7 1246 smmu = fwspec_smmu(fwspec);
518f7136 1247 /* Ensure that the domain is finalised */
adfec2e7 1248 ret = arm_smmu_init_domain_context(domain, smmu);
287980e4 1249 if (ret < 0)
518f7136
WD
1250 return ret;
1251
45ae7cff 1252 /*
44680eed
WD
1253 * Sanity check the domain. We don't support domains across
1254 * different SMMUs.
45ae7cff 1255 */
adfec2e7 1256 if (smmu_domain->smmu != smmu) {
45ae7cff
WD
1257 dev_err(dev,
1258 "cannot attach to SMMU %s whilst already attached to domain on SMMU %s\n",
adfec2e7 1259 dev_name(smmu_domain->smmu->dev), dev_name(smmu->dev));
a18037b2 1260 return -EINVAL;
45ae7cff 1261 }
45ae7cff
WD
1262
1263 /* Looks ok, so add the device to the domain */
adfec2e7 1264 return arm_smmu_domain_add_master(smmu_domain, fwspec);
45ae7cff
WD
1265}
1266
45ae7cff 1267static int arm_smmu_map(struct iommu_domain *domain, unsigned long iova,
b410aed9 1268 phys_addr_t paddr, size_t size, int prot)
45ae7cff 1269{
518f7136
WD
1270 int ret;
1271 unsigned long flags;
1d672638 1272 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
518f7136 1273 struct io_pgtable_ops *ops= smmu_domain->pgtbl_ops;
45ae7cff 1274
518f7136 1275 if (!ops)
45ae7cff
WD
1276 return -ENODEV;
1277
518f7136
WD
1278 spin_lock_irqsave(&smmu_domain->pgtbl_lock, flags);
1279 ret = ops->map(ops, iova, paddr, size, prot);
1280 spin_unlock_irqrestore(&smmu_domain->pgtbl_lock, flags);
1281 return ret;
45ae7cff
WD
1282}
1283
1284static size_t arm_smmu_unmap(struct iommu_domain *domain, unsigned long iova,
1285 size_t size)
1286{
518f7136
WD
1287 size_t ret;
1288 unsigned long flags;
1d672638 1289 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
518f7136 1290 struct io_pgtable_ops *ops= smmu_domain->pgtbl_ops;
45ae7cff 1291
518f7136
WD
1292 if (!ops)
1293 return 0;
1294
1295 spin_lock_irqsave(&smmu_domain->pgtbl_lock, flags);
1296 ret = ops->unmap(ops, iova, size);
1297 spin_unlock_irqrestore(&smmu_domain->pgtbl_lock, flags);
1298 return ret;
45ae7cff
WD
1299}
1300
859a732e
MH
1301static phys_addr_t arm_smmu_iova_to_phys_hard(struct iommu_domain *domain,
1302 dma_addr_t iova)
1303{
1d672638 1304 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
859a732e
MH
1305 struct arm_smmu_device *smmu = smmu_domain->smmu;
1306 struct arm_smmu_cfg *cfg = &smmu_domain->cfg;
1307 struct io_pgtable_ops *ops= smmu_domain->pgtbl_ops;
1308 struct device *dev = smmu->dev;
1309 void __iomem *cb_base;
1310 u32 tmp;
1311 u64 phys;
661d962f 1312 unsigned long va;
859a732e
MH
1313
1314 cb_base = ARM_SMMU_CB_BASE(smmu) + ARM_SMMU_CB(smmu, cfg->cbndx);
1315
661d962f
RM
1316 /* ATS1 registers can only be written atomically */
1317 va = iova & ~0xfffUL;
661d962f 1318 if (smmu->version == ARM_SMMU_V2)
f9a05f05
RM
1319 smmu_write_atomic_lq(va, cb_base + ARM_SMMU_CB_ATS1PR);
1320 else /* Register is only 32-bit in v1 */
661d962f 1321 writel_relaxed(va, cb_base + ARM_SMMU_CB_ATS1PR);
859a732e
MH
1322
1323 if (readl_poll_timeout_atomic(cb_base + ARM_SMMU_CB_ATSR, tmp,
1324 !(tmp & ATSR_ACTIVE), 5, 50)) {
1325 dev_err(dev,
077124c9 1326 "iova to phys timed out on %pad. Falling back to software table walk.\n",
859a732e
MH
1327 &iova);
1328 return ops->iova_to_phys(ops, iova);
1329 }
1330
f9a05f05 1331 phys = readq_relaxed(cb_base + ARM_SMMU_CB_PAR);
859a732e
MH
1332 if (phys & CB_PAR_F) {
1333 dev_err(dev, "translation fault!\n");
1334 dev_err(dev, "PAR = 0x%llx\n", phys);
1335 return 0;
1336 }
1337
1338 return (phys & GENMASK_ULL(39, 12)) | (iova & 0xfff);
1339}
1340
45ae7cff 1341static phys_addr_t arm_smmu_iova_to_phys(struct iommu_domain *domain,
859a732e 1342 dma_addr_t iova)
45ae7cff 1343{
518f7136
WD
1344 phys_addr_t ret;
1345 unsigned long flags;
1d672638 1346 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
518f7136 1347 struct io_pgtable_ops *ops= smmu_domain->pgtbl_ops;
45ae7cff 1348
518f7136 1349 if (!ops)
a44a9791 1350 return 0;
45ae7cff 1351
518f7136 1352 spin_lock_irqsave(&smmu_domain->pgtbl_lock, flags);
83a60ed8
BR
1353 if (smmu_domain->smmu->features & ARM_SMMU_FEAT_TRANS_OPS &&
1354 smmu_domain->stage == ARM_SMMU_DOMAIN_S1) {
859a732e 1355 ret = arm_smmu_iova_to_phys_hard(domain, iova);
83a60ed8 1356 } else {
859a732e 1357 ret = ops->iova_to_phys(ops, iova);
83a60ed8
BR
1358 }
1359
518f7136 1360 spin_unlock_irqrestore(&smmu_domain->pgtbl_lock, flags);
859a732e 1361
518f7136 1362 return ret;
45ae7cff
WD
1363}
1364
1fd0c775 1365static bool arm_smmu_capable(enum iommu_cap cap)
45ae7cff 1366{
d0948945
WD
1367 switch (cap) {
1368 case IOMMU_CAP_CACHE_COHERENCY:
1fd0c775
JR
1369 /*
1370 * Return true here as the SMMU can always send out coherent
1371 * requests.
1372 */
1373 return true;
d0948945 1374 case IOMMU_CAP_INTR_REMAP:
1fd0c775 1375 return true; /* MSIs are just memory writes */
0029a8dd
AM
1376 case IOMMU_CAP_NOEXEC:
1377 return true;
d0948945 1378 default:
1fd0c775 1379 return false;
d0948945 1380 }
45ae7cff 1381}
45ae7cff 1382
021bb842
RM
1383static int arm_smmu_match_node(struct device *dev, void *data)
1384{
ce9babe5 1385 return dev->fwnode == data;
021bb842
RM
1386}
1387
ce9babe5
LP
1388static
1389struct arm_smmu_device *arm_smmu_get_by_fwnode(struct fwnode_handle *fwnode)
021bb842
RM
1390{
1391 struct device *dev = driver_find_device(&arm_smmu_driver.driver, NULL,
ce9babe5 1392 fwnode, arm_smmu_match_node);
021bb842
RM
1393 put_device(dev);
1394 return dev ? dev_get_drvdata(dev) : NULL;
1395}
1396
f80cd885 1397static int arm_smmu_add_device(struct device *dev)
45ae7cff 1398{
adfec2e7 1399 struct arm_smmu_device *smmu;
03edb226 1400 struct arm_smmu_master_cfg *cfg;
021bb842 1401 struct iommu_fwspec *fwspec = dev->iommu_fwspec;
f80cd885 1402 int i, ret;
8f68f8e2 1403
021bb842
RM
1404 if (using_legacy_binding) {
1405 ret = arm_smmu_register_legacy_master(dev, &smmu);
1406 fwspec = dev->iommu_fwspec;
1407 if (ret)
1408 goto out_free;
3c117b54 1409 } else if (fwspec && fwspec->ops == &arm_smmu_ops) {
ce9babe5 1410 smmu = arm_smmu_get_by_fwnode(fwspec->iommu_fwnode);
021bb842
RM
1411 } else {
1412 return -ENODEV;
1413 }
a9a1b0b5 1414
f80cd885 1415 ret = -EINVAL;
adfec2e7
RM
1416 for (i = 0; i < fwspec->num_ids; i++) {
1417 u16 sid = fwspec->ids[i];
021bb842 1418 u16 mask = fwspec->ids[i] >> SMR_MASK_SHIFT;
03edb226 1419
adfec2e7 1420 if (sid & ~smmu->streamid_mask) {
f80cd885 1421 dev_err(dev, "stream ID 0x%x out of range for SMMU (0x%x)\n",
021bb842
RM
1422 sid, smmu->streamid_mask);
1423 goto out_free;
1424 }
1425 if (mask & ~smmu->smr_mask_mask) {
1426 dev_err(dev, "SMR mask 0x%x out of range for SMMU (0x%x)\n",
1427 sid, smmu->smr_mask_mask);
f80cd885
RM
1428 goto out_free;
1429 }
1f3d5ca4 1430 }
5fc63a7c 1431
adfec2e7
RM
1432 ret = -ENOMEM;
1433 cfg = kzalloc(offsetof(struct arm_smmu_master_cfg, smendx[i]),
1434 GFP_KERNEL);
1435 if (!cfg)
1436 goto out_free;
1437
1438 cfg->smmu = smmu;
1439 fwspec->iommu_priv = cfg;
1440 while (i--)
1441 cfg->smendx[i] = INVALID_SMENDX;
1442
588888a7 1443 ret = arm_smmu_master_alloc_smes(dev);
adfec2e7
RM
1444 if (ret)
1445 goto out_free;
1446
1447 return 0;
f80cd885
RM
1448
1449out_free:
adfec2e7
RM
1450 if (fwspec)
1451 kfree(fwspec->iommu_priv);
1452 iommu_fwspec_free(dev);
f80cd885 1453 return ret;
03edb226
WD
1454}
1455
45ae7cff
WD
1456static void arm_smmu_remove_device(struct device *dev)
1457{
adfec2e7 1458 struct iommu_fwspec *fwspec = dev->iommu_fwspec;
8e8b203e 1459
adfec2e7 1460 if (!fwspec || fwspec->ops != &arm_smmu_ops)
f80cd885 1461 return;
8e8b203e 1462
adfec2e7 1463 arm_smmu_master_free_smes(fwspec);
5fc63a7c 1464 iommu_group_remove_device(dev);
adfec2e7
RM
1465 kfree(fwspec->iommu_priv);
1466 iommu_fwspec_free(dev);
45ae7cff
WD
1467}
1468
af659932
JR
1469static struct iommu_group *arm_smmu_device_group(struct device *dev)
1470{
adfec2e7
RM
1471 struct iommu_fwspec *fwspec = dev->iommu_fwspec;
1472 struct arm_smmu_device *smmu = fwspec_smmu(fwspec);
588888a7
RM
1473 struct iommu_group *group = NULL;
1474 int i, idx;
1475
adfec2e7 1476 for_each_cfg_sme(fwspec, i, idx) {
588888a7
RM
1477 if (group && smmu->s2crs[idx].group &&
1478 group != smmu->s2crs[idx].group)
1479 return ERR_PTR(-EINVAL);
1480
1481 group = smmu->s2crs[idx].group;
1482 }
1483
1484 if (group)
e1b44cbe 1485 return iommu_group_ref_get(group);
af659932
JR
1486
1487 if (dev_is_pci(dev))
1488 group = pci_device_group(dev);
1489 else
1490 group = generic_device_group(dev);
1491
af659932
JR
1492 return group;
1493}
1494
c752ce45
WD
1495static int arm_smmu_domain_get_attr(struct iommu_domain *domain,
1496 enum iommu_attr attr, void *data)
1497{
1d672638 1498 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
c752ce45
WD
1499
1500 switch (attr) {
1501 case DOMAIN_ATTR_NESTING:
1502 *(int *)data = (smmu_domain->stage == ARM_SMMU_DOMAIN_NESTED);
1503 return 0;
1504 default:
1505 return -ENODEV;
1506 }
1507}
1508
1509static int arm_smmu_domain_set_attr(struct iommu_domain *domain,
1510 enum iommu_attr attr, void *data)
1511{
518f7136 1512 int ret = 0;
1d672638 1513 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
c752ce45 1514
518f7136
WD
1515 mutex_lock(&smmu_domain->init_mutex);
1516
c752ce45
WD
1517 switch (attr) {
1518 case DOMAIN_ATTR_NESTING:
518f7136
WD
1519 if (smmu_domain->smmu) {
1520 ret = -EPERM;
1521 goto out_unlock;
1522 }
1523
c752ce45
WD
1524 if (*(int *)data)
1525 smmu_domain->stage = ARM_SMMU_DOMAIN_NESTED;
1526 else
1527 smmu_domain->stage = ARM_SMMU_DOMAIN_S1;
1528
518f7136 1529 break;
c752ce45 1530 default:
518f7136 1531 ret = -ENODEV;
c752ce45 1532 }
518f7136
WD
1533
1534out_unlock:
1535 mutex_unlock(&smmu_domain->init_mutex);
1536 return ret;
c752ce45
WD
1537}
1538
021bb842
RM
1539static int arm_smmu_of_xlate(struct device *dev, struct of_phandle_args *args)
1540{
1541 u32 fwid = 0;
1542
1543 if (args->args_count > 0)
1544 fwid |= (u16)args->args[0];
1545
1546 if (args->args_count > 1)
1547 fwid |= (u16)args->args[1] << SMR_MASK_SHIFT;
1548
1549 return iommu_fwspec_add_ids(dev, &fwid, 1);
1550}
1551
518f7136 1552static struct iommu_ops arm_smmu_ops = {
c752ce45 1553 .capable = arm_smmu_capable,
1d672638
JR
1554 .domain_alloc = arm_smmu_domain_alloc,
1555 .domain_free = arm_smmu_domain_free,
c752ce45 1556 .attach_dev = arm_smmu_attach_dev,
c752ce45
WD
1557 .map = arm_smmu_map,
1558 .unmap = arm_smmu_unmap,
76771c93 1559 .map_sg = default_iommu_map_sg,
c752ce45
WD
1560 .iova_to_phys = arm_smmu_iova_to_phys,
1561 .add_device = arm_smmu_add_device,
1562 .remove_device = arm_smmu_remove_device,
af659932 1563 .device_group = arm_smmu_device_group,
c752ce45
WD
1564 .domain_get_attr = arm_smmu_domain_get_attr,
1565 .domain_set_attr = arm_smmu_domain_set_attr,
021bb842 1566 .of_xlate = arm_smmu_of_xlate,
518f7136 1567 .pgsize_bitmap = -1UL, /* Restricted during device attach */
45ae7cff
WD
1568};
1569
1570static void arm_smmu_device_reset(struct arm_smmu_device *smmu)
1571{
1572 void __iomem *gr0_base = ARM_SMMU_GR0(smmu);
659db6f6 1573 void __iomem *cb_base;
1f3d5ca4 1574 int i;
3ca3712a 1575 u32 reg, major;
659db6f6 1576
3a5df8ff
AH
1577 /* clear global FSR */
1578 reg = readl_relaxed(ARM_SMMU_GR0_NS(smmu) + ARM_SMMU_GR0_sGFSR);
1579 writel(reg, ARM_SMMU_GR0_NS(smmu) + ARM_SMMU_GR0_sGFSR);
45ae7cff 1580
1f3d5ca4
RM
1581 /*
1582 * Reset stream mapping groups: Initial values mark all SMRn as
1583 * invalid and all S2CRn as bypass unless overridden.
1584 */
8e8b203e
RM
1585 for (i = 0; i < smmu->num_mapping_groups; ++i)
1586 arm_smmu_write_sme(smmu, i);
45ae7cff 1587
6eb18d4a
NG
1588 if (smmu->model == ARM_MMU500) {
1589 /*
1590 * Before clearing ARM_MMU500_ACTLR_CPRE, need to
1591 * clear CACHE_LOCK bit of ACR first. And, CACHE_LOCK
1592 * bit is only present in MMU-500r2 onwards.
1593 */
1594 reg = readl_relaxed(gr0_base + ARM_SMMU_GR0_ID7);
1595 major = (reg >> ID7_MAJOR_SHIFT) & ID7_MAJOR_MASK;
3ca3712a 1596 reg = readl_relaxed(gr0_base + ARM_SMMU_GR0_sACR);
6eb18d4a
NG
1597 if (major >= 2)
1598 reg &= ~ARM_MMU500_ACR_CACHE_LOCK;
1599 /*
1600 * Allow unmatched Stream IDs to allocate bypass
1601 * TLB entries for reduced latency.
1602 */
1603 reg |= ARM_MMU500_ACR_SMTNMB_TLBEN;
3ca3712a
PF
1604 writel_relaxed(reg, gr0_base + ARM_SMMU_GR0_sACR);
1605 }
1606
659db6f6
AH
1607 /* Make sure all context banks are disabled and clear CB_FSR */
1608 for (i = 0; i < smmu->num_context_banks; ++i) {
1609 cb_base = ARM_SMMU_CB_BASE(smmu) + ARM_SMMU_CB(smmu, i);
1610 writel_relaxed(0, cb_base + ARM_SMMU_CB_SCTLR);
1611 writel_relaxed(FSR_FAULT, cb_base + ARM_SMMU_CB_FSR);
f0cfffc4
RM
1612 /*
1613 * Disable MMU-500's not-particularly-beneficial next-page
1614 * prefetcher for the sake of errata #841119 and #826419.
1615 */
1616 if (smmu->model == ARM_MMU500) {
1617 reg = readl_relaxed(cb_base + ARM_SMMU_CB_ACTLR);
1618 reg &= ~ARM_MMU500_ACTLR_CPRE;
1619 writel_relaxed(reg, cb_base + ARM_SMMU_CB_ACTLR);
1620 }
659db6f6 1621 }
1463fe44 1622
45ae7cff 1623 /* Invalidate the TLB, just in case */
45ae7cff
WD
1624 writel_relaxed(0, gr0_base + ARM_SMMU_GR0_TLBIALLH);
1625 writel_relaxed(0, gr0_base + ARM_SMMU_GR0_TLBIALLNSNH);
1626
3a5df8ff 1627 reg = readl_relaxed(ARM_SMMU_GR0_NS(smmu) + ARM_SMMU_GR0_sCR0);
659db6f6 1628
45ae7cff 1629 /* Enable fault reporting */
659db6f6 1630 reg |= (sCR0_GFRE | sCR0_GFIE | sCR0_GCFGFRE | sCR0_GCFGFIE);
45ae7cff
WD
1631
1632 /* Disable TLB broadcasting. */
659db6f6 1633 reg |= (sCR0_VMIDPNE | sCR0_PTM);
45ae7cff 1634
25a1c96c
RM
1635 /* Enable client access, handling unmatched streams as appropriate */
1636 reg &= ~sCR0_CLIENTPD;
1637 if (disable_bypass)
1638 reg |= sCR0_USFCFG;
1639 else
1640 reg &= ~sCR0_USFCFG;
45ae7cff
WD
1641
1642 /* Disable forced broadcasting */
659db6f6 1643 reg &= ~sCR0_FB;
45ae7cff
WD
1644
1645 /* Don't upgrade barriers */
659db6f6 1646 reg &= ~(sCR0_BSU_MASK << sCR0_BSU_SHIFT);
45ae7cff 1647
4e3e9b69
TC
1648 if (smmu->features & ARM_SMMU_FEAT_VMID16)
1649 reg |= sCR0_VMID16EN;
1650
45ae7cff 1651 /* Push the button */
518f7136 1652 __arm_smmu_tlb_sync(smmu);
3a5df8ff 1653 writel(reg, ARM_SMMU_GR0_NS(smmu) + ARM_SMMU_GR0_sCR0);
45ae7cff
WD
1654}
1655
1656static int arm_smmu_id_size_to_bits(int size)
1657{
1658 switch (size) {
1659 case 0:
1660 return 32;
1661 case 1:
1662 return 36;
1663 case 2:
1664 return 40;
1665 case 3:
1666 return 42;
1667 case 4:
1668 return 44;
1669 case 5:
1670 default:
1671 return 48;
1672 }
1673}
1674
1675static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)
1676{
1677 unsigned long size;
1678 void __iomem *gr0_base = ARM_SMMU_GR0(smmu);
1679 u32 id;
bbb8a184 1680 bool cttw_reg, cttw_fw = smmu->features & ARM_SMMU_FEAT_COHERENT_WALK;
8e8b203e 1681 int i;
45ae7cff
WD
1682
1683 dev_notice(smmu->dev, "probing hardware configuration...\n");
b7862e35
RM
1684 dev_notice(smmu->dev, "SMMUv%d with:\n",
1685 smmu->version == ARM_SMMU_V2 ? 2 : 1);
45ae7cff
WD
1686
1687 /* ID0 */
1688 id = readl_relaxed(gr0_base + ARM_SMMU_GR0_ID0);
4cf740b0
WD
1689
1690 /* Restrict available stages based on module parameter */
1691 if (force_stage == 1)
1692 id &= ~(ID0_S2TS | ID0_NTS);
1693 else if (force_stage == 2)
1694 id &= ~(ID0_S1TS | ID0_NTS);
1695
45ae7cff
WD
1696 if (id & ID0_S1TS) {
1697 smmu->features |= ARM_SMMU_FEAT_TRANS_S1;
1698 dev_notice(smmu->dev, "\tstage 1 translation\n");
1699 }
1700
1701 if (id & ID0_S2TS) {
1702 smmu->features |= ARM_SMMU_FEAT_TRANS_S2;
1703 dev_notice(smmu->dev, "\tstage 2 translation\n");
1704 }
1705
1706 if (id & ID0_NTS) {
1707 smmu->features |= ARM_SMMU_FEAT_TRANS_NESTED;
1708 dev_notice(smmu->dev, "\tnested translation\n");
1709 }
1710
1711 if (!(smmu->features &
4cf740b0 1712 (ARM_SMMU_FEAT_TRANS_S1 | ARM_SMMU_FEAT_TRANS_S2))) {
45ae7cff
WD
1713 dev_err(smmu->dev, "\tno translation support!\n");
1714 return -ENODEV;
1715 }
1716
b7862e35
RM
1717 if ((id & ID0_S1TS) &&
1718 ((smmu->version < ARM_SMMU_V2) || !(id & ID0_ATOSNS))) {
859a732e
MH
1719 smmu->features |= ARM_SMMU_FEAT_TRANS_OPS;
1720 dev_notice(smmu->dev, "\taddress translation ops\n");
1721 }
1722
bae2c2d4
RM
1723 /*
1724 * In order for DMA API calls to work properly, we must defer to what
bbb8a184 1725 * the FW says about coherency, regardless of what the hardware claims.
bae2c2d4
RM
1726 * Fortunately, this also opens up a workaround for systems where the
1727 * ID register value has ended up configured incorrectly.
1728 */
bae2c2d4 1729 cttw_reg = !!(id & ID0_CTTW);
bbb8a184 1730 if (cttw_fw || cttw_reg)
bae2c2d4 1731 dev_notice(smmu->dev, "\t%scoherent table walk\n",
bbb8a184
LP
1732 cttw_fw ? "" : "non-");
1733 if (cttw_fw != cttw_reg)
bae2c2d4 1734 dev_notice(smmu->dev,
bbb8a184 1735 "\t(IDR0.CTTW overridden by FW configuration)\n");
45ae7cff 1736
21174240
RM
1737 /* Max. number of entries we have for stream matching/indexing */
1738 size = 1 << ((id >> ID0_NUMSIDB_SHIFT) & ID0_NUMSIDB_MASK);
1739 smmu->streamid_mask = size - 1;
45ae7cff 1740 if (id & ID0_SMS) {
21174240 1741 u32 smr;
45ae7cff
WD
1742
1743 smmu->features |= ARM_SMMU_FEAT_STREAM_MATCH;
21174240
RM
1744 size = (id >> ID0_NUMSMRG_SHIFT) & ID0_NUMSMRG_MASK;
1745 if (size == 0) {
45ae7cff
WD
1746 dev_err(smmu->dev,
1747 "stream-matching supported, but no SMRs present!\n");
1748 return -ENODEV;
1749 }
1750
21174240
RM
1751 /*
1752 * SMR.ID bits may not be preserved if the corresponding MASK
1753 * bits are set, so check each one separately. We can reject
1754 * masters later if they try to claim IDs outside these masks.
1755 */
1756 smr = smmu->streamid_mask << SMR_ID_SHIFT;
45ae7cff
WD
1757 writel_relaxed(smr, gr0_base + ARM_SMMU_GR0_SMR(0));
1758 smr = readl_relaxed(gr0_base + ARM_SMMU_GR0_SMR(0));
21174240 1759 smmu->streamid_mask = smr >> SMR_ID_SHIFT;
45ae7cff 1760
21174240
RM
1761 smr = smmu->streamid_mask << SMR_MASK_SHIFT;
1762 writel_relaxed(smr, gr0_base + ARM_SMMU_GR0_SMR(0));
1763 smr = readl_relaxed(gr0_base + ARM_SMMU_GR0_SMR(0));
1764 smmu->smr_mask_mask = smr >> SMR_MASK_SHIFT;
45ae7cff 1765
1f3d5ca4
RM
1766 /* Zero-initialised to mark as invalid */
1767 smmu->smrs = devm_kcalloc(smmu->dev, size, sizeof(*smmu->smrs),
1768 GFP_KERNEL);
1769 if (!smmu->smrs)
1770 return -ENOMEM;
1771
45ae7cff 1772 dev_notice(smmu->dev,
21174240
RM
1773 "\tstream matching with %lu register groups, mask 0x%x",
1774 size, smmu->smr_mask_mask);
45ae7cff 1775 }
8e8b203e
RM
1776 /* s2cr->type == 0 means translation, so initialise explicitly */
1777 smmu->s2crs = devm_kmalloc_array(smmu->dev, size, sizeof(*smmu->s2crs),
1778 GFP_KERNEL);
1779 if (!smmu->s2crs)
1780 return -ENOMEM;
1781 for (i = 0; i < size; i++)
1782 smmu->s2crs[i] = s2cr_init_val;
1783
21174240 1784 smmu->num_mapping_groups = size;
588888a7 1785 mutex_init(&smmu->stream_map_mutex);
45ae7cff 1786
7602b871
RM
1787 if (smmu->version < ARM_SMMU_V2 || !(id & ID0_PTFS_NO_AARCH32)) {
1788 smmu->features |= ARM_SMMU_FEAT_FMT_AARCH32_L;
1789 if (!(id & ID0_PTFS_NO_AARCH32S))
1790 smmu->features |= ARM_SMMU_FEAT_FMT_AARCH32_S;
1791 }
1792
45ae7cff
WD
1793 /* ID1 */
1794 id = readl_relaxed(gr0_base + ARM_SMMU_GR0_ID1);
c757e852 1795 smmu->pgshift = (id & ID1_PAGESIZE) ? 16 : 12;
45ae7cff 1796
c55af7f7 1797 /* Check for size mismatch of SMMU address space from mapped region */
518f7136 1798 size = 1 << (((id >> ID1_NUMPAGENDXB_SHIFT) & ID1_NUMPAGENDXB_MASK) + 1);
c757e852 1799 size *= 2 << smmu->pgshift;
c55af7f7 1800 if (smmu->size != size)
2907320d
MH
1801 dev_warn(smmu->dev,
1802 "SMMU address space size (0x%lx) differs from mapped region size (0x%lx)!\n",
1803 size, smmu->size);
45ae7cff 1804
518f7136 1805 smmu->num_s2_context_banks = (id >> ID1_NUMS2CB_SHIFT) & ID1_NUMS2CB_MASK;
45ae7cff
WD
1806 smmu->num_context_banks = (id >> ID1_NUMCB_SHIFT) & ID1_NUMCB_MASK;
1807 if (smmu->num_s2_context_banks > smmu->num_context_banks) {
1808 dev_err(smmu->dev, "impossible number of S2 context banks!\n");
1809 return -ENODEV;
1810 }
1811 dev_notice(smmu->dev, "\t%u context banks (%u stage-2 only)\n",
1812 smmu->num_context_banks, smmu->num_s2_context_banks);
e086d912
RM
1813 /*
1814 * Cavium CN88xx erratum #27704.
1815 * Ensure ASID and VMID allocation is unique across all SMMUs in
1816 * the system.
1817 */
1818 if (smmu->model == CAVIUM_SMMUV2) {
1819 smmu->cavium_id_base =
1820 atomic_add_return(smmu->num_context_banks,
1821 &cavium_smmu_context_count);
1822 smmu->cavium_id_base -= smmu->num_context_banks;
1823 }
45ae7cff
WD
1824
1825 /* ID2 */
1826 id = readl_relaxed(gr0_base + ARM_SMMU_GR0_ID2);
1827 size = arm_smmu_id_size_to_bits((id >> ID2_IAS_SHIFT) & ID2_IAS_MASK);
518f7136 1828 smmu->ipa_size = size;
45ae7cff 1829
518f7136 1830 /* The output mask is also applied for bypass */
45ae7cff 1831 size = arm_smmu_id_size_to_bits((id >> ID2_OAS_SHIFT) & ID2_OAS_MASK);
518f7136 1832 smmu->pa_size = size;
45ae7cff 1833
4e3e9b69
TC
1834 if (id & ID2_VMID16)
1835 smmu->features |= ARM_SMMU_FEAT_VMID16;
1836
f1d84548
RM
1837 /*
1838 * What the page table walker can address actually depends on which
1839 * descriptor format is in use, but since a) we don't know that yet,
1840 * and b) it can vary per context bank, this will have to do...
1841 */
1842 if (dma_set_mask_and_coherent(smmu->dev, DMA_BIT_MASK(size)))
1843 dev_warn(smmu->dev,
1844 "failed to set DMA mask for table walker\n");
1845
b7862e35 1846 if (smmu->version < ARM_SMMU_V2) {
518f7136 1847 smmu->va_size = smmu->ipa_size;
b7862e35
RM
1848 if (smmu->version == ARM_SMMU_V1_64K)
1849 smmu->features |= ARM_SMMU_FEAT_FMT_AARCH64_64K;
45ae7cff 1850 } else {
45ae7cff 1851 size = (id >> ID2_UBS_SHIFT) & ID2_UBS_MASK;
518f7136 1852 smmu->va_size = arm_smmu_id_size_to_bits(size);
518f7136 1853 if (id & ID2_PTFS_4K)
7602b871 1854 smmu->features |= ARM_SMMU_FEAT_FMT_AARCH64_4K;
518f7136 1855 if (id & ID2_PTFS_16K)
7602b871 1856 smmu->features |= ARM_SMMU_FEAT_FMT_AARCH64_16K;
518f7136 1857 if (id & ID2_PTFS_64K)
7602b871 1858 smmu->features |= ARM_SMMU_FEAT_FMT_AARCH64_64K;
45ae7cff
WD
1859 }
1860
7602b871 1861 /* Now we've corralled the various formats, what'll it do? */
7602b871 1862 if (smmu->features & ARM_SMMU_FEAT_FMT_AARCH32_S)
d5466357 1863 smmu->pgsize_bitmap |= SZ_4K | SZ_64K | SZ_1M | SZ_16M;
7602b871
RM
1864 if (smmu->features &
1865 (ARM_SMMU_FEAT_FMT_AARCH32_L | ARM_SMMU_FEAT_FMT_AARCH64_4K))
d5466357 1866 smmu->pgsize_bitmap |= SZ_4K | SZ_2M | SZ_1G;
7602b871 1867 if (smmu->features & ARM_SMMU_FEAT_FMT_AARCH64_16K)
d5466357 1868 smmu->pgsize_bitmap |= SZ_16K | SZ_32M;
7602b871 1869 if (smmu->features & ARM_SMMU_FEAT_FMT_AARCH64_64K)
d5466357
RM
1870 smmu->pgsize_bitmap |= SZ_64K | SZ_512M;
1871
1872 if (arm_smmu_ops.pgsize_bitmap == -1UL)
1873 arm_smmu_ops.pgsize_bitmap = smmu->pgsize_bitmap;
1874 else
1875 arm_smmu_ops.pgsize_bitmap |= smmu->pgsize_bitmap;
1876 dev_notice(smmu->dev, "\tSupported page sizes: 0x%08lx\n",
1877 smmu->pgsize_bitmap);
7602b871 1878
518f7136 1879
28d6007b
WD
1880 if (smmu->features & ARM_SMMU_FEAT_TRANS_S1)
1881 dev_notice(smmu->dev, "\tStage-1: %lu-bit VA -> %lu-bit IPA\n",
518f7136 1882 smmu->va_size, smmu->ipa_size);
28d6007b
WD
1883
1884 if (smmu->features & ARM_SMMU_FEAT_TRANS_S2)
1885 dev_notice(smmu->dev, "\tStage-2: %lu-bit IPA -> %lu-bit PA\n",
518f7136 1886 smmu->ipa_size, smmu->pa_size);
28d6007b 1887
45ae7cff
WD
1888 return 0;
1889}
1890
67b65a3f
RM
1891struct arm_smmu_match_data {
1892 enum arm_smmu_arch_version version;
1893 enum arm_smmu_implementation model;
1894};
1895
1896#define ARM_SMMU_MATCH_DATA(name, ver, imp) \
1897static struct arm_smmu_match_data name = { .version = ver, .model = imp }
1898
1899ARM_SMMU_MATCH_DATA(smmu_generic_v1, ARM_SMMU_V1, GENERIC_SMMU);
1900ARM_SMMU_MATCH_DATA(smmu_generic_v2, ARM_SMMU_V2, GENERIC_SMMU);
b7862e35 1901ARM_SMMU_MATCH_DATA(arm_mmu401, ARM_SMMU_V1_64K, GENERIC_SMMU);
f0cfffc4 1902ARM_SMMU_MATCH_DATA(arm_mmu500, ARM_SMMU_V2, ARM_MMU500);
e086d912 1903ARM_SMMU_MATCH_DATA(cavium_smmuv2, ARM_SMMU_V2, CAVIUM_SMMUV2);
67b65a3f 1904
09b5269a 1905static const struct of_device_id arm_smmu_of_match[] = {
67b65a3f
RM
1906 { .compatible = "arm,smmu-v1", .data = &smmu_generic_v1 },
1907 { .compatible = "arm,smmu-v2", .data = &smmu_generic_v2 },
1908 { .compatible = "arm,mmu-400", .data = &smmu_generic_v1 },
b7862e35 1909 { .compatible = "arm,mmu-401", .data = &arm_mmu401 },
f0cfffc4 1910 { .compatible = "arm,mmu-500", .data = &arm_mmu500 },
e086d912 1911 { .compatible = "cavium,smmu-v2", .data = &cavium_smmuv2 },
09360403
RM
1912 { },
1913};
1914MODULE_DEVICE_TABLE(of, arm_smmu_of_match);
1915
d6fcd3b1
LP
1916#ifdef CONFIG_ACPI
1917static int acpi_smmu_get_data(u32 model, struct arm_smmu_device *smmu)
1918{
1919 int ret = 0;
1920
1921 switch (model) {
1922 case ACPI_IORT_SMMU_V1:
1923 case ACPI_IORT_SMMU_CORELINK_MMU400:
1924 smmu->version = ARM_SMMU_V1;
1925 smmu->model = GENERIC_SMMU;
1926 break;
1927 case ACPI_IORT_SMMU_V2:
1928 smmu->version = ARM_SMMU_V2;
1929 smmu->model = GENERIC_SMMU;
1930 break;
1931 case ACPI_IORT_SMMU_CORELINK_MMU500:
1932 smmu->version = ARM_SMMU_V2;
1933 smmu->model = ARM_MMU500;
1934 break;
1935 default:
1936 ret = -ENODEV;
1937 }
1938
1939 return ret;
1940}
1941
1942static int arm_smmu_device_acpi_probe(struct platform_device *pdev,
1943 struct arm_smmu_device *smmu)
1944{
1945 struct device *dev = smmu->dev;
1946 struct acpi_iort_node *node =
1947 *(struct acpi_iort_node **)dev_get_platdata(dev);
1948 struct acpi_iort_smmu *iort_smmu;
1949 int ret;
1950
1951 /* Retrieve SMMU1/2 specific data */
1952 iort_smmu = (struct acpi_iort_smmu *)node->node_data;
1953
1954 ret = acpi_smmu_get_data(iort_smmu->model, smmu);
1955 if (ret < 0)
1956 return ret;
1957
1958 /* Ignore the configuration access interrupt */
1959 smmu->num_global_irqs = 1;
1960
1961 if (iort_smmu->flags & ACPI_IORT_SMMU_COHERENT_WALK)
1962 smmu->features |= ARM_SMMU_FEAT_COHERENT_WALK;
1963
1964 return 0;
1965}
1966#else
1967static inline int arm_smmu_device_acpi_probe(struct platform_device *pdev,
1968 struct arm_smmu_device *smmu)
1969{
1970 return -ENODEV;
1971}
1972#endif
1973
bbb8a184
LP
1974static int arm_smmu_device_dt_probe(struct platform_device *pdev,
1975 struct arm_smmu_device *smmu)
45ae7cff 1976{
67b65a3f 1977 const struct arm_smmu_match_data *data;
45ae7cff 1978 struct device *dev = &pdev->dev;
021bb842
RM
1979 bool legacy_binding;
1980
bbb8a184
LP
1981 if (of_property_read_u32(dev->of_node, "#global-interrupts",
1982 &smmu->num_global_irqs)) {
1983 dev_err(dev, "missing #global-interrupts property\n");
1984 return -ENODEV;
1985 }
1986
1987 data = of_device_get_match_data(dev);
1988 smmu->version = data->version;
1989 smmu->model = data->model;
1990
1991 parse_driver_options(smmu);
1992
021bb842
RM
1993 legacy_binding = of_find_property(dev->of_node, "mmu-masters", NULL);
1994 if (legacy_binding && !using_generic_binding) {
1995 if (!using_legacy_binding)
1996 pr_notice("deprecated \"mmu-masters\" DT property in use; DMA API support unavailable\n");
1997 using_legacy_binding = true;
1998 } else if (!legacy_binding && !using_legacy_binding) {
1999 using_generic_binding = true;
2000 } else {
2001 dev_err(dev, "not probing due to mismatched DT properties\n");
2002 return -ENODEV;
2003 }
45ae7cff 2004
bbb8a184
LP
2005 if (of_dma_is_coherent(dev->of_node))
2006 smmu->features |= ARM_SMMU_FEAT_COHERENT_WALK;
2007
2008 return 0;
2009}
2010
2011static int arm_smmu_device_probe(struct platform_device *pdev)
2012{
2013 struct resource *res;
2014 struct arm_smmu_device *smmu;
2015 struct device *dev = &pdev->dev;
2016 int num_irqs, i, err;
2017
45ae7cff
WD
2018 smmu = devm_kzalloc(dev, sizeof(*smmu), GFP_KERNEL);
2019 if (!smmu) {
2020 dev_err(dev, "failed to allocate arm_smmu_device\n");
2021 return -ENOMEM;
2022 }
2023 smmu->dev = dev;
2024
d6fcd3b1
LP
2025 if (dev->of_node)
2026 err = arm_smmu_device_dt_probe(pdev, smmu);
2027 else
2028 err = arm_smmu_device_acpi_probe(pdev, smmu);
2029
bbb8a184
LP
2030 if (err)
2031 return err;
09360403 2032
45ae7cff 2033 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
8a7f4312
JL
2034 smmu->base = devm_ioremap_resource(dev, res);
2035 if (IS_ERR(smmu->base))
2036 return PTR_ERR(smmu->base);
45ae7cff 2037 smmu->size = resource_size(res);
45ae7cff 2038
45ae7cff
WD
2039 num_irqs = 0;
2040 while ((res = platform_get_resource(pdev, IORESOURCE_IRQ, num_irqs))) {
2041 num_irqs++;
2042 if (num_irqs > smmu->num_global_irqs)
2043 smmu->num_context_irqs++;
2044 }
2045
44a08de2
AH
2046 if (!smmu->num_context_irqs) {
2047 dev_err(dev, "found %d interrupts but expected at least %d\n",
2048 num_irqs, smmu->num_global_irqs + 1);
2049 return -ENODEV;
45ae7cff 2050 }
45ae7cff
WD
2051
2052 smmu->irqs = devm_kzalloc(dev, sizeof(*smmu->irqs) * num_irqs,
2053 GFP_KERNEL);
2054 if (!smmu->irqs) {
2055 dev_err(dev, "failed to allocate %d irqs\n", num_irqs);
2056 return -ENOMEM;
2057 }
2058
2059 for (i = 0; i < num_irqs; ++i) {
2060 int irq = platform_get_irq(pdev, i);
2907320d 2061
45ae7cff
WD
2062 if (irq < 0) {
2063 dev_err(dev, "failed to get irq index %d\n", i);
2064 return -ENODEV;
2065 }
2066 smmu->irqs[i] = irq;
2067 }
2068
3c8766d0
OH
2069 err = arm_smmu_device_cfg_probe(smmu);
2070 if (err)
2071 return err;
2072
b7862e35 2073 if (smmu->version == ARM_SMMU_V2 &&
45ae7cff
WD
2074 smmu->num_context_banks != smmu->num_context_irqs) {
2075 dev_err(dev,
2076 "found only %d context interrupt(s) but %d required\n",
2077 smmu->num_context_irqs, smmu->num_context_banks);
f80cd885 2078 return -ENODEV;
45ae7cff
WD
2079 }
2080
45ae7cff 2081 for (i = 0; i < smmu->num_global_irqs; ++i) {
bee14004
PF
2082 err = devm_request_irq(smmu->dev, smmu->irqs[i],
2083 arm_smmu_global_fault,
2084 IRQF_SHARED,
2085 "arm-smmu global fault",
2086 smmu);
45ae7cff
WD
2087 if (err) {
2088 dev_err(dev, "failed to request global IRQ %d (%u)\n",
2089 i, smmu->irqs[i]);
f80cd885 2090 return err;
45ae7cff
WD
2091 }
2092 }
2093
ce9babe5 2094 iommu_register_instance(dev->fwnode, &arm_smmu_ops);
d6fc5d97 2095 platform_set_drvdata(pdev, smmu);
fd90cecb 2096 arm_smmu_device_reset(smmu);
021bb842
RM
2097
2098 /* Oh, for a proper bus abstraction */
2099 if (!iommu_present(&platform_bus_type))
2100 bus_set_iommu(&platform_bus_type, &arm_smmu_ops);
2101#ifdef CONFIG_ARM_AMBA
2102 if (!iommu_present(&amba_bustype))
2103 bus_set_iommu(&amba_bustype, &arm_smmu_ops);
2104#endif
2105#ifdef CONFIG_PCI
2106 if (!iommu_present(&pci_bus_type)) {
2107 pci_request_acs();
2108 bus_set_iommu(&pci_bus_type, &arm_smmu_ops);
2109 }
2110#endif
45ae7cff 2111 return 0;
45ae7cff
WD
2112}
2113
2114static int arm_smmu_device_remove(struct platform_device *pdev)
2115{
d6fc5d97 2116 struct arm_smmu_device *smmu = platform_get_drvdata(pdev);
45ae7cff
WD
2117
2118 if (!smmu)
2119 return -ENODEV;
2120
ecfadb6e 2121 if (!bitmap_empty(smmu->context_map, ARM_SMMU_MAX_CBS))
d6fc5d97 2122 dev_err(&pdev->dev, "removing device with active domains!\n");
45ae7cff 2123
45ae7cff 2124 /* Turn the thing off */
2907320d 2125 writel(sCR0_CLIENTPD, ARM_SMMU_GR0_NS(smmu) + ARM_SMMU_GR0_sCR0);
45ae7cff
WD
2126 return 0;
2127}
2128
45ae7cff
WD
2129static struct platform_driver arm_smmu_driver = {
2130 .driver = {
45ae7cff
WD
2131 .name = "arm-smmu",
2132 .of_match_table = of_match_ptr(arm_smmu_of_match),
2133 },
bbb8a184 2134 .probe = arm_smmu_device_probe,
45ae7cff
WD
2135 .remove = arm_smmu_device_remove,
2136};
2137
2138static int __init arm_smmu_init(void)
2139{
021bb842
RM
2140 static bool registered;
2141 int ret = 0;
45ae7cff 2142
021bb842
RM
2143 if (!registered) {
2144 ret = platform_driver_register(&arm_smmu_driver);
2145 registered = !ret;
112c898b 2146 }
021bb842 2147 return ret;
45ae7cff
WD
2148}
2149
2150static void __exit arm_smmu_exit(void)
2151{
2152 return platform_driver_unregister(&arm_smmu_driver);
2153}
2154
b1950b27 2155subsys_initcall(arm_smmu_init);
45ae7cff
WD
2156module_exit(arm_smmu_exit);
2157
021bb842
RM
2158static int __init arm_smmu_of_init(struct device_node *np)
2159{
2160 int ret = arm_smmu_init();
2161
2162 if (ret)
2163 return ret;
2164
2165 if (!of_platform_device_create(np, NULL, platform_bus_type.dev_root))
2166 return -ENODEV;
2167
2168 return 0;
2169}
2170IOMMU_OF_DECLARE(arm_smmuv1, "arm,smmu-v1", arm_smmu_of_init);
2171IOMMU_OF_DECLARE(arm_smmuv2, "arm,smmu-v2", arm_smmu_of_init);
2172IOMMU_OF_DECLARE(arm_mmu400, "arm,mmu-400", arm_smmu_of_init);
2173IOMMU_OF_DECLARE(arm_mmu401, "arm,mmu-401", arm_smmu_of_init);
2174IOMMU_OF_DECLARE(arm_mmu500, "arm,mmu-500", arm_smmu_of_init);
2175IOMMU_OF_DECLARE(cavium_smmuv2, "cavium,smmu-v2", arm_smmu_of_init);
2176
d6fcd3b1
LP
2177#ifdef CONFIG_ACPI
2178static int __init arm_smmu_acpi_init(struct acpi_table_header *table)
2179{
2180 if (iort_node_match(ACPI_IORT_NODE_SMMU))
2181 return arm_smmu_init();
2182
2183 return 0;
2184}
2185IORT_ACPI_DECLARE(arm_smmu, ACPI_SIG_IORT, arm_smmu_acpi_init);
2186#endif
2187
45ae7cff
WD
2188MODULE_DESCRIPTION("IOMMU API for ARM architected SMMU implementations");
2189MODULE_AUTHOR("Will Deacon <will.deacon@arm.com>");
2190MODULE_LICENSE("GPL v2");