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