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