xref: /OK3568_Linux_fs/kernel/drivers/iommu/arm/arm-smmu/arm-smmu.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * IOMMU API for ARM architected SMMU implementations.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2013 ARM Limited
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Author: Will Deacon <will.deacon@arm.com>
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This driver currently supports:
10*4882a593Smuzhiyun  *	- SMMUv1 and v2 implementations
11*4882a593Smuzhiyun  *	- Stream-matching and stream-indexing
12*4882a593Smuzhiyun  *	- v7/v8 long-descriptor format
13*4882a593Smuzhiyun  *	- Non-secure access to the SMMU
14*4882a593Smuzhiyun  *	- Context fault reporting
15*4882a593Smuzhiyun  *	- Extended Stream ID (16 bit)
16*4882a593Smuzhiyun  */
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define pr_fmt(fmt) "arm-smmu: " fmt
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #include <linux/acpi.h>
21*4882a593Smuzhiyun #include <linux/acpi_iort.h>
22*4882a593Smuzhiyun #include <linux/bitfield.h>
23*4882a593Smuzhiyun #include <linux/delay.h>
24*4882a593Smuzhiyun #include <linux/dma-iommu.h>
25*4882a593Smuzhiyun #include <linux/dma-mapping.h>
26*4882a593Smuzhiyun #include <linux/err.h>
27*4882a593Smuzhiyun #include <linux/interrupt.h>
28*4882a593Smuzhiyun #include <linux/io.h>
29*4882a593Smuzhiyun #include <linux/iopoll.h>
30*4882a593Smuzhiyun #include <linux/module.h>
31*4882a593Smuzhiyun #include <linux/of.h>
32*4882a593Smuzhiyun #include <linux/of_address.h>
33*4882a593Smuzhiyun #include <linux/of_device.h>
34*4882a593Smuzhiyun #include <linux/of_iommu.h>
35*4882a593Smuzhiyun #include <linux/pci.h>
36*4882a593Smuzhiyun #include <linux/platform_device.h>
37*4882a593Smuzhiyun #include <linux/pm_runtime.h>
38*4882a593Smuzhiyun #include <linux/ratelimit.h>
39*4882a593Smuzhiyun #include <linux/slab.h>
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun #include <linux/amba/bus.h>
42*4882a593Smuzhiyun #include <linux/fsl/mc.h>
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #include "arm-smmu.h"
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun /*
47*4882a593Smuzhiyun  * Apparently, some Qualcomm arm64 platforms which appear to expose their SMMU
48*4882a593Smuzhiyun  * global register space are still, in fact, using a hypervisor to mediate it
49*4882a593Smuzhiyun  * by trapping and emulating register accesses. Sadly, some deployed versions
50*4882a593Smuzhiyun  * of said trapping code have bugs wherein they go horribly wrong for stores
51*4882a593Smuzhiyun  * using r31 (i.e. XZR/WZR) as the source register.
52*4882a593Smuzhiyun  */
53*4882a593Smuzhiyun #define QCOM_DUMMY_VAL -1
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define MSI_IOVA_BASE			0x8000000
56*4882a593Smuzhiyun #define MSI_IOVA_LENGTH			0x100000
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun static int force_stage;
59*4882a593Smuzhiyun module_param(force_stage, int, S_IRUGO);
60*4882a593Smuzhiyun MODULE_PARM_DESC(force_stage,
61*4882a593Smuzhiyun 	"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.");
62*4882a593Smuzhiyun static bool disable_bypass =
63*4882a593Smuzhiyun 	IS_ENABLED(CONFIG_ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT);
64*4882a593Smuzhiyun module_param(disable_bypass, bool, S_IRUGO);
65*4882a593Smuzhiyun MODULE_PARM_DESC(disable_bypass,
66*4882a593Smuzhiyun 	"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.");
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun #define s2cr_init_val (struct arm_smmu_s2cr){				\
69*4882a593Smuzhiyun 	.type = disable_bypass ? S2CR_TYPE_FAULT : S2CR_TYPE_BYPASS,	\
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun static bool using_legacy_binding, using_generic_binding;
73*4882a593Smuzhiyun 
arm_smmu_rpm_get(struct arm_smmu_device * smmu)74*4882a593Smuzhiyun static inline int arm_smmu_rpm_get(struct arm_smmu_device *smmu)
75*4882a593Smuzhiyun {
76*4882a593Smuzhiyun 	if (pm_runtime_enabled(smmu->dev))
77*4882a593Smuzhiyun 		return pm_runtime_resume_and_get(smmu->dev);
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 	return 0;
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun 
arm_smmu_rpm_put(struct arm_smmu_device * smmu)82*4882a593Smuzhiyun static inline void arm_smmu_rpm_put(struct arm_smmu_device *smmu)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun 	if (pm_runtime_enabled(smmu->dev))
85*4882a593Smuzhiyun 		pm_runtime_put_autosuspend(smmu->dev);
86*4882a593Smuzhiyun }
87*4882a593Smuzhiyun 
to_smmu_domain(struct iommu_domain * dom)88*4882a593Smuzhiyun static struct arm_smmu_domain *to_smmu_domain(struct iommu_domain *dom)
89*4882a593Smuzhiyun {
90*4882a593Smuzhiyun 	return container_of(dom, struct arm_smmu_domain, domain);
91*4882a593Smuzhiyun }
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun static struct platform_driver arm_smmu_driver;
94*4882a593Smuzhiyun static struct iommu_ops arm_smmu_ops;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun #ifdef CONFIG_ARM_SMMU_LEGACY_DT_BINDINGS
97*4882a593Smuzhiyun static int arm_smmu_bus_init(struct iommu_ops *ops);
98*4882a593Smuzhiyun 
dev_get_dev_node(struct device * dev)99*4882a593Smuzhiyun static struct device_node *dev_get_dev_node(struct device *dev)
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun 	if (dev_is_pci(dev)) {
102*4882a593Smuzhiyun 		struct pci_bus *bus = to_pci_dev(dev)->bus;
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 		while (!pci_is_root_bus(bus))
105*4882a593Smuzhiyun 			bus = bus->parent;
106*4882a593Smuzhiyun 		return of_node_get(bus->bridge->parent->of_node);
107*4882a593Smuzhiyun 	}
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	return of_node_get(dev->of_node);
110*4882a593Smuzhiyun }
111*4882a593Smuzhiyun 
__arm_smmu_get_pci_sid(struct pci_dev * pdev,u16 alias,void * data)112*4882a593Smuzhiyun static int __arm_smmu_get_pci_sid(struct pci_dev *pdev, u16 alias, void *data)
113*4882a593Smuzhiyun {
114*4882a593Smuzhiyun 	*((__be32 *)data) = cpu_to_be32(alias);
115*4882a593Smuzhiyun 	return 0; /* Continue walking */
116*4882a593Smuzhiyun }
117*4882a593Smuzhiyun 
__find_legacy_master_phandle(struct device * dev,void * data)118*4882a593Smuzhiyun static int __find_legacy_master_phandle(struct device *dev, void *data)
119*4882a593Smuzhiyun {
120*4882a593Smuzhiyun 	struct of_phandle_iterator *it = *(void **)data;
121*4882a593Smuzhiyun 	struct device_node *np = it->node;
122*4882a593Smuzhiyun 	int err;
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 	of_for_each_phandle(it, err, dev->of_node, "mmu-masters",
125*4882a593Smuzhiyun 			    "#stream-id-cells", -1)
126*4882a593Smuzhiyun 		if (it->node == np) {
127*4882a593Smuzhiyun 			*(void **)data = dev;
128*4882a593Smuzhiyun 			return 1;
129*4882a593Smuzhiyun 		}
130*4882a593Smuzhiyun 	it->node = np;
131*4882a593Smuzhiyun 	return err == -ENOENT ? 0 : err;
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun 
arm_smmu_register_legacy_master(struct device * dev,struct arm_smmu_device ** smmu)134*4882a593Smuzhiyun static int arm_smmu_register_legacy_master(struct device *dev,
135*4882a593Smuzhiyun 					   struct arm_smmu_device **smmu)
136*4882a593Smuzhiyun {
137*4882a593Smuzhiyun 	struct device *smmu_dev;
138*4882a593Smuzhiyun 	struct device_node *np;
139*4882a593Smuzhiyun 	struct of_phandle_iterator it;
140*4882a593Smuzhiyun 	void *data = &it;
141*4882a593Smuzhiyun 	u32 *sids;
142*4882a593Smuzhiyun 	__be32 pci_sid;
143*4882a593Smuzhiyun 	int err;
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	np = dev_get_dev_node(dev);
146*4882a593Smuzhiyun 	if (!np || !of_find_property(np, "#stream-id-cells", NULL)) {
147*4882a593Smuzhiyun 		of_node_put(np);
148*4882a593Smuzhiyun 		return -ENODEV;
149*4882a593Smuzhiyun 	}
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	it.node = np;
152*4882a593Smuzhiyun 	err = driver_for_each_device(&arm_smmu_driver.driver, NULL, &data,
153*4882a593Smuzhiyun 				     __find_legacy_master_phandle);
154*4882a593Smuzhiyun 	smmu_dev = data;
155*4882a593Smuzhiyun 	of_node_put(np);
156*4882a593Smuzhiyun 	if (err == 0)
157*4882a593Smuzhiyun 		return -ENODEV;
158*4882a593Smuzhiyun 	if (err < 0)
159*4882a593Smuzhiyun 		return err;
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun 	if (dev_is_pci(dev)) {
162*4882a593Smuzhiyun 		/* "mmu-masters" assumes Stream ID == Requester ID */
163*4882a593Smuzhiyun 		pci_for_each_dma_alias(to_pci_dev(dev), __arm_smmu_get_pci_sid,
164*4882a593Smuzhiyun 				       &pci_sid);
165*4882a593Smuzhiyun 		it.cur = &pci_sid;
166*4882a593Smuzhiyun 		it.cur_count = 1;
167*4882a593Smuzhiyun 	}
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	err = iommu_fwspec_init(dev, &smmu_dev->of_node->fwnode,
170*4882a593Smuzhiyun 				&arm_smmu_ops);
171*4882a593Smuzhiyun 	if (err)
172*4882a593Smuzhiyun 		return err;
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	sids = kcalloc(it.cur_count, sizeof(*sids), GFP_KERNEL);
175*4882a593Smuzhiyun 	if (!sids)
176*4882a593Smuzhiyun 		return -ENOMEM;
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun 	*smmu = dev_get_drvdata(smmu_dev);
179*4882a593Smuzhiyun 	of_phandle_iterator_args(&it, sids, it.cur_count);
180*4882a593Smuzhiyun 	err = iommu_fwspec_add_ids(dev, sids, it.cur_count);
181*4882a593Smuzhiyun 	kfree(sids);
182*4882a593Smuzhiyun 	return err;
183*4882a593Smuzhiyun }
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun /*
186*4882a593Smuzhiyun  * With the legacy DT binding in play, we have no guarantees about
187*4882a593Smuzhiyun  * probe order, but then we're also not doing default domains, so we can
188*4882a593Smuzhiyun  * delay setting bus ops until we're sure every possible SMMU is ready,
189*4882a593Smuzhiyun  * and that way ensure that no probe_device() calls get missed.
190*4882a593Smuzhiyun  */
arm_smmu_legacy_bus_init(void)191*4882a593Smuzhiyun static int arm_smmu_legacy_bus_init(void)
192*4882a593Smuzhiyun {
193*4882a593Smuzhiyun 	if (using_legacy_binding)
194*4882a593Smuzhiyun 		return arm_smmu_bus_init(&arm_smmu_ops);
195*4882a593Smuzhiyun 	return 0;
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun device_initcall_sync(arm_smmu_legacy_bus_init);
198*4882a593Smuzhiyun #else
arm_smmu_register_legacy_master(struct device * dev,struct arm_smmu_device ** smmu)199*4882a593Smuzhiyun static int arm_smmu_register_legacy_master(struct device *dev,
200*4882a593Smuzhiyun 					   struct arm_smmu_device **smmu)
201*4882a593Smuzhiyun {
202*4882a593Smuzhiyun 	return -ENODEV;
203*4882a593Smuzhiyun }
204*4882a593Smuzhiyun #endif /* CONFIG_ARM_SMMU_LEGACY_DT_BINDINGS */
205*4882a593Smuzhiyun 
__arm_smmu_free_bitmap(unsigned long * map,int idx)206*4882a593Smuzhiyun static void __arm_smmu_free_bitmap(unsigned long *map, int idx)
207*4882a593Smuzhiyun {
208*4882a593Smuzhiyun 	clear_bit(idx, map);
209*4882a593Smuzhiyun }
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun /* Wait for any pending TLB invalidations to complete */
__arm_smmu_tlb_sync(struct arm_smmu_device * smmu,int page,int sync,int status)212*4882a593Smuzhiyun static void __arm_smmu_tlb_sync(struct arm_smmu_device *smmu, int page,
213*4882a593Smuzhiyun 				int sync, int status)
214*4882a593Smuzhiyun {
215*4882a593Smuzhiyun 	unsigned int spin_cnt, delay;
216*4882a593Smuzhiyun 	u32 reg;
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 	if (smmu->impl && unlikely(smmu->impl->tlb_sync))
219*4882a593Smuzhiyun 		return smmu->impl->tlb_sync(smmu, page, sync, status);
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun 	arm_smmu_writel(smmu, page, sync, QCOM_DUMMY_VAL);
222*4882a593Smuzhiyun 	for (delay = 1; delay < TLB_LOOP_TIMEOUT; delay *= 2) {
223*4882a593Smuzhiyun 		for (spin_cnt = TLB_SPIN_COUNT; spin_cnt > 0; spin_cnt--) {
224*4882a593Smuzhiyun 			reg = arm_smmu_readl(smmu, page, status);
225*4882a593Smuzhiyun 			if (!(reg & ARM_SMMU_sTLBGSTATUS_GSACTIVE))
226*4882a593Smuzhiyun 				return;
227*4882a593Smuzhiyun 			cpu_relax();
228*4882a593Smuzhiyun 		}
229*4882a593Smuzhiyun 		udelay(delay);
230*4882a593Smuzhiyun 	}
231*4882a593Smuzhiyun 	dev_err_ratelimited(smmu->dev,
232*4882a593Smuzhiyun 			    "TLB sync timed out -- SMMU may be deadlocked\n");
233*4882a593Smuzhiyun }
234*4882a593Smuzhiyun 
arm_smmu_tlb_sync_global(struct arm_smmu_device * smmu)235*4882a593Smuzhiyun static void arm_smmu_tlb_sync_global(struct arm_smmu_device *smmu)
236*4882a593Smuzhiyun {
237*4882a593Smuzhiyun 	unsigned long flags;
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun 	spin_lock_irqsave(&smmu->global_sync_lock, flags);
240*4882a593Smuzhiyun 	__arm_smmu_tlb_sync(smmu, ARM_SMMU_GR0, ARM_SMMU_GR0_sTLBGSYNC,
241*4882a593Smuzhiyun 			    ARM_SMMU_GR0_sTLBGSTATUS);
242*4882a593Smuzhiyun 	spin_unlock_irqrestore(&smmu->global_sync_lock, flags);
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun 
arm_smmu_tlb_sync_context(struct arm_smmu_domain * smmu_domain)245*4882a593Smuzhiyun static void arm_smmu_tlb_sync_context(struct arm_smmu_domain *smmu_domain)
246*4882a593Smuzhiyun {
247*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = smmu_domain->smmu;
248*4882a593Smuzhiyun 	unsigned long flags;
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	spin_lock_irqsave(&smmu_domain->cb_lock, flags);
251*4882a593Smuzhiyun 	__arm_smmu_tlb_sync(smmu, ARM_SMMU_CB(smmu, smmu_domain->cfg.cbndx),
252*4882a593Smuzhiyun 			    ARM_SMMU_CB_TLBSYNC, ARM_SMMU_CB_TLBSTATUS);
253*4882a593Smuzhiyun 	spin_unlock_irqrestore(&smmu_domain->cb_lock, flags);
254*4882a593Smuzhiyun }
255*4882a593Smuzhiyun 
arm_smmu_tlb_inv_context_s1(void * cookie)256*4882a593Smuzhiyun static void arm_smmu_tlb_inv_context_s1(void *cookie)
257*4882a593Smuzhiyun {
258*4882a593Smuzhiyun 	struct arm_smmu_domain *smmu_domain = cookie;
259*4882a593Smuzhiyun 	/*
260*4882a593Smuzhiyun 	 * The TLBI write may be relaxed, so ensure that PTEs cleared by the
261*4882a593Smuzhiyun 	 * current CPU are visible beforehand.
262*4882a593Smuzhiyun 	 */
263*4882a593Smuzhiyun 	wmb();
264*4882a593Smuzhiyun 	arm_smmu_cb_write(smmu_domain->smmu, smmu_domain->cfg.cbndx,
265*4882a593Smuzhiyun 			  ARM_SMMU_CB_S1_TLBIASID, smmu_domain->cfg.asid);
266*4882a593Smuzhiyun 	arm_smmu_tlb_sync_context(smmu_domain);
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun 
arm_smmu_tlb_inv_context_s2(void * cookie)269*4882a593Smuzhiyun static void arm_smmu_tlb_inv_context_s2(void *cookie)
270*4882a593Smuzhiyun {
271*4882a593Smuzhiyun 	struct arm_smmu_domain *smmu_domain = cookie;
272*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = smmu_domain->smmu;
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun 	/* See above */
275*4882a593Smuzhiyun 	wmb();
276*4882a593Smuzhiyun 	arm_smmu_gr0_write(smmu, ARM_SMMU_GR0_TLBIVMID, smmu_domain->cfg.vmid);
277*4882a593Smuzhiyun 	arm_smmu_tlb_sync_global(smmu);
278*4882a593Smuzhiyun }
279*4882a593Smuzhiyun 
arm_smmu_tlb_inv_range_s1(unsigned long iova,size_t size,size_t granule,void * cookie,int reg)280*4882a593Smuzhiyun static void arm_smmu_tlb_inv_range_s1(unsigned long iova, size_t size,
281*4882a593Smuzhiyun 				      size_t granule, void *cookie, int reg)
282*4882a593Smuzhiyun {
283*4882a593Smuzhiyun 	struct arm_smmu_domain *smmu_domain = cookie;
284*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = smmu_domain->smmu;
285*4882a593Smuzhiyun 	struct arm_smmu_cfg *cfg = &smmu_domain->cfg;
286*4882a593Smuzhiyun 	int idx = cfg->cbndx;
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun 	if (smmu->features & ARM_SMMU_FEAT_COHERENT_WALK)
289*4882a593Smuzhiyun 		wmb();
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun 	if (cfg->fmt != ARM_SMMU_CTX_FMT_AARCH64) {
292*4882a593Smuzhiyun 		iova = (iova >> 12) << 12;
293*4882a593Smuzhiyun 		iova |= cfg->asid;
294*4882a593Smuzhiyun 		do {
295*4882a593Smuzhiyun 			arm_smmu_cb_write(smmu, idx, reg, iova);
296*4882a593Smuzhiyun 			iova += granule;
297*4882a593Smuzhiyun 		} while (size -= granule);
298*4882a593Smuzhiyun 	} else {
299*4882a593Smuzhiyun 		iova >>= 12;
300*4882a593Smuzhiyun 		iova |= (u64)cfg->asid << 48;
301*4882a593Smuzhiyun 		do {
302*4882a593Smuzhiyun 			arm_smmu_cb_writeq(smmu, idx, reg, iova);
303*4882a593Smuzhiyun 			iova += granule >> 12;
304*4882a593Smuzhiyun 		} while (size -= granule);
305*4882a593Smuzhiyun 	}
306*4882a593Smuzhiyun }
307*4882a593Smuzhiyun 
arm_smmu_tlb_inv_range_s2(unsigned long iova,size_t size,size_t granule,void * cookie,int reg)308*4882a593Smuzhiyun static void arm_smmu_tlb_inv_range_s2(unsigned long iova, size_t size,
309*4882a593Smuzhiyun 				      size_t granule, void *cookie, int reg)
310*4882a593Smuzhiyun {
311*4882a593Smuzhiyun 	struct arm_smmu_domain *smmu_domain = cookie;
312*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = smmu_domain->smmu;
313*4882a593Smuzhiyun 	int idx = smmu_domain->cfg.cbndx;
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun 	if (smmu->features & ARM_SMMU_FEAT_COHERENT_WALK)
316*4882a593Smuzhiyun 		wmb();
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 	iova >>= 12;
319*4882a593Smuzhiyun 	do {
320*4882a593Smuzhiyun 		if (smmu_domain->cfg.fmt == ARM_SMMU_CTX_FMT_AARCH64)
321*4882a593Smuzhiyun 			arm_smmu_cb_writeq(smmu, idx, reg, iova);
322*4882a593Smuzhiyun 		else
323*4882a593Smuzhiyun 			arm_smmu_cb_write(smmu, idx, reg, iova);
324*4882a593Smuzhiyun 		iova += granule >> 12;
325*4882a593Smuzhiyun 	} while (size -= granule);
326*4882a593Smuzhiyun }
327*4882a593Smuzhiyun 
arm_smmu_tlb_inv_walk_s1(unsigned long iova,size_t size,size_t granule,void * cookie)328*4882a593Smuzhiyun static void arm_smmu_tlb_inv_walk_s1(unsigned long iova, size_t size,
329*4882a593Smuzhiyun 				     size_t granule, void *cookie)
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun 	arm_smmu_tlb_inv_range_s1(iova, size, granule, cookie,
332*4882a593Smuzhiyun 				  ARM_SMMU_CB_S1_TLBIVA);
333*4882a593Smuzhiyun 	arm_smmu_tlb_sync_context(cookie);
334*4882a593Smuzhiyun }
335*4882a593Smuzhiyun 
arm_smmu_tlb_add_page_s1(struct iommu_iotlb_gather * gather,unsigned long iova,size_t granule,void * cookie)336*4882a593Smuzhiyun static void arm_smmu_tlb_add_page_s1(struct iommu_iotlb_gather *gather,
337*4882a593Smuzhiyun 				     unsigned long iova, size_t granule,
338*4882a593Smuzhiyun 				     void *cookie)
339*4882a593Smuzhiyun {
340*4882a593Smuzhiyun 	arm_smmu_tlb_inv_range_s1(iova, granule, granule, cookie,
341*4882a593Smuzhiyun 				  ARM_SMMU_CB_S1_TLBIVAL);
342*4882a593Smuzhiyun }
343*4882a593Smuzhiyun 
arm_smmu_tlb_inv_walk_s2(unsigned long iova,size_t size,size_t granule,void * cookie)344*4882a593Smuzhiyun static void arm_smmu_tlb_inv_walk_s2(unsigned long iova, size_t size,
345*4882a593Smuzhiyun 				     size_t granule, void *cookie)
346*4882a593Smuzhiyun {
347*4882a593Smuzhiyun 	arm_smmu_tlb_inv_range_s2(iova, size, granule, cookie,
348*4882a593Smuzhiyun 				  ARM_SMMU_CB_S2_TLBIIPAS2);
349*4882a593Smuzhiyun 	arm_smmu_tlb_sync_context(cookie);
350*4882a593Smuzhiyun }
351*4882a593Smuzhiyun 
arm_smmu_tlb_add_page_s2(struct iommu_iotlb_gather * gather,unsigned long iova,size_t granule,void * cookie)352*4882a593Smuzhiyun static void arm_smmu_tlb_add_page_s2(struct iommu_iotlb_gather *gather,
353*4882a593Smuzhiyun 				     unsigned long iova, size_t granule,
354*4882a593Smuzhiyun 				     void *cookie)
355*4882a593Smuzhiyun {
356*4882a593Smuzhiyun 	arm_smmu_tlb_inv_range_s2(iova, granule, granule, cookie,
357*4882a593Smuzhiyun 				  ARM_SMMU_CB_S2_TLBIIPAS2L);
358*4882a593Smuzhiyun }
359*4882a593Smuzhiyun 
arm_smmu_tlb_inv_walk_s2_v1(unsigned long iova,size_t size,size_t granule,void * cookie)360*4882a593Smuzhiyun static void arm_smmu_tlb_inv_walk_s2_v1(unsigned long iova, size_t size,
361*4882a593Smuzhiyun 					size_t granule, void *cookie)
362*4882a593Smuzhiyun {
363*4882a593Smuzhiyun 	arm_smmu_tlb_inv_context_s2(cookie);
364*4882a593Smuzhiyun }
365*4882a593Smuzhiyun /*
366*4882a593Smuzhiyun  * On MMU-401 at least, the cost of firing off multiple TLBIVMIDs appears
367*4882a593Smuzhiyun  * almost negligible, but the benefit of getting the first one in as far ahead
368*4882a593Smuzhiyun  * of the sync as possible is significant, hence we don't just make this a
369*4882a593Smuzhiyun  * no-op and call arm_smmu_tlb_inv_context_s2() from .iotlb_sync as you might
370*4882a593Smuzhiyun  * think.
371*4882a593Smuzhiyun  */
arm_smmu_tlb_add_page_s2_v1(struct iommu_iotlb_gather * gather,unsigned long iova,size_t granule,void * cookie)372*4882a593Smuzhiyun static void arm_smmu_tlb_add_page_s2_v1(struct iommu_iotlb_gather *gather,
373*4882a593Smuzhiyun 					unsigned long iova, size_t granule,
374*4882a593Smuzhiyun 					void *cookie)
375*4882a593Smuzhiyun {
376*4882a593Smuzhiyun 	struct arm_smmu_domain *smmu_domain = cookie;
377*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = smmu_domain->smmu;
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun 	if (smmu->features & ARM_SMMU_FEAT_COHERENT_WALK)
380*4882a593Smuzhiyun 		wmb();
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun 	arm_smmu_gr0_write(smmu, ARM_SMMU_GR0_TLBIVMID, smmu_domain->cfg.vmid);
383*4882a593Smuzhiyun }
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun static const struct iommu_flush_ops arm_smmu_s1_tlb_ops = {
386*4882a593Smuzhiyun 	.tlb_flush_all	= arm_smmu_tlb_inv_context_s1,
387*4882a593Smuzhiyun 	.tlb_flush_walk	= arm_smmu_tlb_inv_walk_s1,
388*4882a593Smuzhiyun 	.tlb_add_page	= arm_smmu_tlb_add_page_s1,
389*4882a593Smuzhiyun };
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun static const struct iommu_flush_ops arm_smmu_s2_tlb_ops_v2 = {
392*4882a593Smuzhiyun 	.tlb_flush_all	= arm_smmu_tlb_inv_context_s2,
393*4882a593Smuzhiyun 	.tlb_flush_walk	= arm_smmu_tlb_inv_walk_s2,
394*4882a593Smuzhiyun 	.tlb_add_page	= arm_smmu_tlb_add_page_s2,
395*4882a593Smuzhiyun };
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun static const struct iommu_flush_ops arm_smmu_s2_tlb_ops_v1 = {
398*4882a593Smuzhiyun 	.tlb_flush_all	= arm_smmu_tlb_inv_context_s2,
399*4882a593Smuzhiyun 	.tlb_flush_walk	= arm_smmu_tlb_inv_walk_s2_v1,
400*4882a593Smuzhiyun 	.tlb_add_page	= arm_smmu_tlb_add_page_s2_v1,
401*4882a593Smuzhiyun };
402*4882a593Smuzhiyun 
arm_smmu_context_fault(int irq,void * dev)403*4882a593Smuzhiyun static irqreturn_t arm_smmu_context_fault(int irq, void *dev)
404*4882a593Smuzhiyun {
405*4882a593Smuzhiyun 	u32 fsr, fsynr, cbfrsynra;
406*4882a593Smuzhiyun 	unsigned long iova;
407*4882a593Smuzhiyun 	struct iommu_domain *domain = dev;
408*4882a593Smuzhiyun 	struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
409*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = smmu_domain->smmu;
410*4882a593Smuzhiyun 	int idx = smmu_domain->cfg.cbndx;
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun 	fsr = arm_smmu_cb_read(smmu, idx, ARM_SMMU_CB_FSR);
413*4882a593Smuzhiyun 	if (!(fsr & ARM_SMMU_FSR_FAULT))
414*4882a593Smuzhiyun 		return IRQ_NONE;
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun 	fsynr = arm_smmu_cb_read(smmu, idx, ARM_SMMU_CB_FSYNR0);
417*4882a593Smuzhiyun 	iova = arm_smmu_cb_readq(smmu, idx, ARM_SMMU_CB_FAR);
418*4882a593Smuzhiyun 	cbfrsynra = arm_smmu_gr1_read(smmu, ARM_SMMU_GR1_CBFRSYNRA(idx));
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun 	dev_err_ratelimited(smmu->dev,
421*4882a593Smuzhiyun 	"Unhandled context fault: fsr=0x%x, iova=0x%08lx, fsynr=0x%x, cbfrsynra=0x%x, cb=%d\n",
422*4882a593Smuzhiyun 			    fsr, iova, fsynr, cbfrsynra, idx);
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun 	arm_smmu_cb_write(smmu, idx, ARM_SMMU_CB_FSR, fsr);
425*4882a593Smuzhiyun 	return IRQ_HANDLED;
426*4882a593Smuzhiyun }
427*4882a593Smuzhiyun 
arm_smmu_global_fault(int irq,void * dev)428*4882a593Smuzhiyun static irqreturn_t arm_smmu_global_fault(int irq, void *dev)
429*4882a593Smuzhiyun {
430*4882a593Smuzhiyun 	u32 gfsr, gfsynr0, gfsynr1, gfsynr2;
431*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = dev;
432*4882a593Smuzhiyun 	static DEFINE_RATELIMIT_STATE(rs, DEFAULT_RATELIMIT_INTERVAL,
433*4882a593Smuzhiyun 				      DEFAULT_RATELIMIT_BURST);
434*4882a593Smuzhiyun 
435*4882a593Smuzhiyun 	gfsr = arm_smmu_gr0_read(smmu, ARM_SMMU_GR0_sGFSR);
436*4882a593Smuzhiyun 	gfsynr0 = arm_smmu_gr0_read(smmu, ARM_SMMU_GR0_sGFSYNR0);
437*4882a593Smuzhiyun 	gfsynr1 = arm_smmu_gr0_read(smmu, ARM_SMMU_GR0_sGFSYNR1);
438*4882a593Smuzhiyun 	gfsynr2 = arm_smmu_gr0_read(smmu, ARM_SMMU_GR0_sGFSYNR2);
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun 	if (!gfsr)
441*4882a593Smuzhiyun 		return IRQ_NONE;
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun 	if (__ratelimit(&rs)) {
444*4882a593Smuzhiyun 		if (IS_ENABLED(CONFIG_ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT) &&
445*4882a593Smuzhiyun 		    (gfsr & ARM_SMMU_sGFSR_USF))
446*4882a593Smuzhiyun 			dev_err(smmu->dev,
447*4882a593Smuzhiyun 				"Blocked unknown Stream ID 0x%hx; boot with \"arm-smmu.disable_bypass=0\" to allow, but this may have security implications\n",
448*4882a593Smuzhiyun 				(u16)gfsynr1);
449*4882a593Smuzhiyun 		else
450*4882a593Smuzhiyun 			dev_err(smmu->dev,
451*4882a593Smuzhiyun 				"Unexpected global fault, this could be serious\n");
452*4882a593Smuzhiyun 		dev_err(smmu->dev,
453*4882a593Smuzhiyun 			"\tGFSR 0x%08x, GFSYNR0 0x%08x, GFSYNR1 0x%08x, GFSYNR2 0x%08x\n",
454*4882a593Smuzhiyun 			gfsr, gfsynr0, gfsynr1, gfsynr2);
455*4882a593Smuzhiyun 	}
456*4882a593Smuzhiyun 
457*4882a593Smuzhiyun 	arm_smmu_gr0_write(smmu, ARM_SMMU_GR0_sGFSR, gfsr);
458*4882a593Smuzhiyun 	return IRQ_HANDLED;
459*4882a593Smuzhiyun }
460*4882a593Smuzhiyun 
arm_smmu_init_context_bank(struct arm_smmu_domain * smmu_domain,struct io_pgtable_cfg * pgtbl_cfg)461*4882a593Smuzhiyun static void arm_smmu_init_context_bank(struct arm_smmu_domain *smmu_domain,
462*4882a593Smuzhiyun 				       struct io_pgtable_cfg *pgtbl_cfg)
463*4882a593Smuzhiyun {
464*4882a593Smuzhiyun 	struct arm_smmu_cfg *cfg = &smmu_domain->cfg;
465*4882a593Smuzhiyun 	struct arm_smmu_cb *cb = &smmu_domain->smmu->cbs[cfg->cbndx];
466*4882a593Smuzhiyun 	bool stage1 = cfg->cbar != CBAR_TYPE_S2_TRANS;
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun 	cb->cfg = cfg;
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun 	/* TCR */
471*4882a593Smuzhiyun 	if (stage1) {
472*4882a593Smuzhiyun 		if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH32_S) {
473*4882a593Smuzhiyun 			cb->tcr[0] = pgtbl_cfg->arm_v7s_cfg.tcr;
474*4882a593Smuzhiyun 		} else {
475*4882a593Smuzhiyun 			cb->tcr[0] = arm_smmu_lpae_tcr(pgtbl_cfg);
476*4882a593Smuzhiyun 			cb->tcr[1] = arm_smmu_lpae_tcr2(pgtbl_cfg);
477*4882a593Smuzhiyun 			if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH64)
478*4882a593Smuzhiyun 				cb->tcr[1] |= ARM_SMMU_TCR2_AS;
479*4882a593Smuzhiyun 			else
480*4882a593Smuzhiyun 				cb->tcr[0] |= ARM_SMMU_TCR_EAE;
481*4882a593Smuzhiyun 		}
482*4882a593Smuzhiyun 	} else {
483*4882a593Smuzhiyun 		cb->tcr[0] = arm_smmu_lpae_vtcr(pgtbl_cfg);
484*4882a593Smuzhiyun 	}
485*4882a593Smuzhiyun 
486*4882a593Smuzhiyun 	/* TTBRs */
487*4882a593Smuzhiyun 	if (stage1) {
488*4882a593Smuzhiyun 		if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH32_S) {
489*4882a593Smuzhiyun 			cb->ttbr[0] = pgtbl_cfg->arm_v7s_cfg.ttbr;
490*4882a593Smuzhiyun 			cb->ttbr[1] = 0;
491*4882a593Smuzhiyun 		} else {
492*4882a593Smuzhiyun 			cb->ttbr[0] = FIELD_PREP(ARM_SMMU_TTBRn_ASID,
493*4882a593Smuzhiyun 						 cfg->asid);
494*4882a593Smuzhiyun 			cb->ttbr[1] = FIELD_PREP(ARM_SMMU_TTBRn_ASID,
495*4882a593Smuzhiyun 						 cfg->asid);
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun 			if (pgtbl_cfg->quirks & IO_PGTABLE_QUIRK_ARM_TTBR1)
498*4882a593Smuzhiyun 				cb->ttbr[1] |= pgtbl_cfg->arm_lpae_s1_cfg.ttbr;
499*4882a593Smuzhiyun 			else
500*4882a593Smuzhiyun 				cb->ttbr[0] |= pgtbl_cfg->arm_lpae_s1_cfg.ttbr;
501*4882a593Smuzhiyun 		}
502*4882a593Smuzhiyun 	} else {
503*4882a593Smuzhiyun 		cb->ttbr[0] = pgtbl_cfg->arm_lpae_s2_cfg.vttbr;
504*4882a593Smuzhiyun 	}
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun 	/* MAIRs (stage-1 only) */
507*4882a593Smuzhiyun 	if (stage1) {
508*4882a593Smuzhiyun 		if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH32_S) {
509*4882a593Smuzhiyun 			cb->mair[0] = pgtbl_cfg->arm_v7s_cfg.prrr;
510*4882a593Smuzhiyun 			cb->mair[1] = pgtbl_cfg->arm_v7s_cfg.nmrr;
511*4882a593Smuzhiyun 		} else {
512*4882a593Smuzhiyun 			cb->mair[0] = pgtbl_cfg->arm_lpae_s1_cfg.mair;
513*4882a593Smuzhiyun 			cb->mair[1] = pgtbl_cfg->arm_lpae_s1_cfg.mair >> 32;
514*4882a593Smuzhiyun 		}
515*4882a593Smuzhiyun 	}
516*4882a593Smuzhiyun }
517*4882a593Smuzhiyun 
arm_smmu_write_context_bank(struct arm_smmu_device * smmu,int idx)518*4882a593Smuzhiyun void arm_smmu_write_context_bank(struct arm_smmu_device *smmu, int idx)
519*4882a593Smuzhiyun {
520*4882a593Smuzhiyun 	u32 reg;
521*4882a593Smuzhiyun 	bool stage1;
522*4882a593Smuzhiyun 	struct arm_smmu_cb *cb = &smmu->cbs[idx];
523*4882a593Smuzhiyun 	struct arm_smmu_cfg *cfg = cb->cfg;
524*4882a593Smuzhiyun 
525*4882a593Smuzhiyun 	/* Unassigned context banks only need disabling */
526*4882a593Smuzhiyun 	if (!cfg) {
527*4882a593Smuzhiyun 		arm_smmu_cb_write(smmu, idx, ARM_SMMU_CB_SCTLR, 0);
528*4882a593Smuzhiyun 		return;
529*4882a593Smuzhiyun 	}
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun 	stage1 = cfg->cbar != CBAR_TYPE_S2_TRANS;
532*4882a593Smuzhiyun 
533*4882a593Smuzhiyun 	/* CBA2R */
534*4882a593Smuzhiyun 	if (smmu->version > ARM_SMMU_V1) {
535*4882a593Smuzhiyun 		if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH64)
536*4882a593Smuzhiyun 			reg = ARM_SMMU_CBA2R_VA64;
537*4882a593Smuzhiyun 		else
538*4882a593Smuzhiyun 			reg = 0;
539*4882a593Smuzhiyun 		/* 16-bit VMIDs live in CBA2R */
540*4882a593Smuzhiyun 		if (smmu->features & ARM_SMMU_FEAT_VMID16)
541*4882a593Smuzhiyun 			reg |= FIELD_PREP(ARM_SMMU_CBA2R_VMID16, cfg->vmid);
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun 		arm_smmu_gr1_write(smmu, ARM_SMMU_GR1_CBA2R(idx), reg);
544*4882a593Smuzhiyun 	}
545*4882a593Smuzhiyun 
546*4882a593Smuzhiyun 	/* CBAR */
547*4882a593Smuzhiyun 	reg = FIELD_PREP(ARM_SMMU_CBAR_TYPE, cfg->cbar);
548*4882a593Smuzhiyun 	if (smmu->version < ARM_SMMU_V2)
549*4882a593Smuzhiyun 		reg |= FIELD_PREP(ARM_SMMU_CBAR_IRPTNDX, cfg->irptndx);
550*4882a593Smuzhiyun 
551*4882a593Smuzhiyun 	/*
552*4882a593Smuzhiyun 	 * Use the weakest shareability/memory types, so they are
553*4882a593Smuzhiyun 	 * overridden by the ttbcr/pte.
554*4882a593Smuzhiyun 	 */
555*4882a593Smuzhiyun 	if (stage1) {
556*4882a593Smuzhiyun 		reg |= FIELD_PREP(ARM_SMMU_CBAR_S1_BPSHCFG,
557*4882a593Smuzhiyun 				  ARM_SMMU_CBAR_S1_BPSHCFG_NSH) |
558*4882a593Smuzhiyun 		       FIELD_PREP(ARM_SMMU_CBAR_S1_MEMATTR,
559*4882a593Smuzhiyun 				  ARM_SMMU_CBAR_S1_MEMATTR_WB);
560*4882a593Smuzhiyun 	} else if (!(smmu->features & ARM_SMMU_FEAT_VMID16)) {
561*4882a593Smuzhiyun 		/* 8-bit VMIDs live in CBAR */
562*4882a593Smuzhiyun 		reg |= FIELD_PREP(ARM_SMMU_CBAR_VMID, cfg->vmid);
563*4882a593Smuzhiyun 	}
564*4882a593Smuzhiyun 	arm_smmu_gr1_write(smmu, ARM_SMMU_GR1_CBAR(idx), reg);
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun 	/*
567*4882a593Smuzhiyun 	 * TCR
568*4882a593Smuzhiyun 	 * We must write this before the TTBRs, since it determines the
569*4882a593Smuzhiyun 	 * access behaviour of some fields (in particular, ASID[15:8]).
570*4882a593Smuzhiyun 	 */
571*4882a593Smuzhiyun 	if (stage1 && smmu->version > ARM_SMMU_V1)
572*4882a593Smuzhiyun 		arm_smmu_cb_write(smmu, idx, ARM_SMMU_CB_TCR2, cb->tcr[1]);
573*4882a593Smuzhiyun 	arm_smmu_cb_write(smmu, idx, ARM_SMMU_CB_TCR, cb->tcr[0]);
574*4882a593Smuzhiyun 
575*4882a593Smuzhiyun 	/* TTBRs */
576*4882a593Smuzhiyun 	if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH32_S) {
577*4882a593Smuzhiyun 		arm_smmu_cb_write(smmu, idx, ARM_SMMU_CB_CONTEXTIDR, cfg->asid);
578*4882a593Smuzhiyun 		arm_smmu_cb_write(smmu, idx, ARM_SMMU_CB_TTBR0, cb->ttbr[0]);
579*4882a593Smuzhiyun 		arm_smmu_cb_write(smmu, idx, ARM_SMMU_CB_TTBR1, cb->ttbr[1]);
580*4882a593Smuzhiyun 	} else {
581*4882a593Smuzhiyun 		arm_smmu_cb_writeq(smmu, idx, ARM_SMMU_CB_TTBR0, cb->ttbr[0]);
582*4882a593Smuzhiyun 		if (stage1)
583*4882a593Smuzhiyun 			arm_smmu_cb_writeq(smmu, idx, ARM_SMMU_CB_TTBR1,
584*4882a593Smuzhiyun 					   cb->ttbr[1]);
585*4882a593Smuzhiyun 	}
586*4882a593Smuzhiyun 
587*4882a593Smuzhiyun 	/* MAIRs (stage-1 only) */
588*4882a593Smuzhiyun 	if (stage1) {
589*4882a593Smuzhiyun 		arm_smmu_cb_write(smmu, idx, ARM_SMMU_CB_S1_MAIR0, cb->mair[0]);
590*4882a593Smuzhiyun 		arm_smmu_cb_write(smmu, idx, ARM_SMMU_CB_S1_MAIR1, cb->mair[1]);
591*4882a593Smuzhiyun 	}
592*4882a593Smuzhiyun 
593*4882a593Smuzhiyun 	/* SCTLR */
594*4882a593Smuzhiyun 	reg = ARM_SMMU_SCTLR_CFIE | ARM_SMMU_SCTLR_CFRE | ARM_SMMU_SCTLR_AFE |
595*4882a593Smuzhiyun 	      ARM_SMMU_SCTLR_TRE | ARM_SMMU_SCTLR_M;
596*4882a593Smuzhiyun 	if (stage1)
597*4882a593Smuzhiyun 		reg |= ARM_SMMU_SCTLR_S1_ASIDPNE;
598*4882a593Smuzhiyun 	if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
599*4882a593Smuzhiyun 		reg |= ARM_SMMU_SCTLR_E;
600*4882a593Smuzhiyun 
601*4882a593Smuzhiyun 	arm_smmu_cb_write(smmu, idx, ARM_SMMU_CB_SCTLR, reg);
602*4882a593Smuzhiyun }
603*4882a593Smuzhiyun 
arm_smmu_alloc_context_bank(struct arm_smmu_domain * smmu_domain,struct arm_smmu_device * smmu,struct device * dev,unsigned int start)604*4882a593Smuzhiyun static int arm_smmu_alloc_context_bank(struct arm_smmu_domain *smmu_domain,
605*4882a593Smuzhiyun 				       struct arm_smmu_device *smmu,
606*4882a593Smuzhiyun 				       struct device *dev, unsigned int start)
607*4882a593Smuzhiyun {
608*4882a593Smuzhiyun 	if (smmu->impl && smmu->impl->alloc_context_bank)
609*4882a593Smuzhiyun 		return smmu->impl->alloc_context_bank(smmu_domain, smmu, dev, start);
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun 	return __arm_smmu_alloc_bitmap(smmu->context_map, start, smmu->num_context_banks);
612*4882a593Smuzhiyun }
613*4882a593Smuzhiyun 
arm_smmu_init_domain_context(struct iommu_domain * domain,struct arm_smmu_device * smmu,struct device * dev)614*4882a593Smuzhiyun static int arm_smmu_init_domain_context(struct iommu_domain *domain,
615*4882a593Smuzhiyun 					struct arm_smmu_device *smmu,
616*4882a593Smuzhiyun 					struct device *dev)
617*4882a593Smuzhiyun {
618*4882a593Smuzhiyun 	int irq, start, ret = 0;
619*4882a593Smuzhiyun 	unsigned long ias, oas;
620*4882a593Smuzhiyun 	struct io_pgtable_ops *pgtbl_ops;
621*4882a593Smuzhiyun 	struct io_pgtable_cfg pgtbl_cfg;
622*4882a593Smuzhiyun 	enum io_pgtable_fmt fmt;
623*4882a593Smuzhiyun 	struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
624*4882a593Smuzhiyun 	struct arm_smmu_cfg *cfg = &smmu_domain->cfg;
625*4882a593Smuzhiyun 	irqreturn_t (*context_fault)(int irq, void *dev);
626*4882a593Smuzhiyun 
627*4882a593Smuzhiyun 	mutex_lock(&smmu_domain->init_mutex);
628*4882a593Smuzhiyun 	if (smmu_domain->smmu)
629*4882a593Smuzhiyun 		goto out_unlock;
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun 	if (domain->type == IOMMU_DOMAIN_IDENTITY) {
632*4882a593Smuzhiyun 		smmu_domain->stage = ARM_SMMU_DOMAIN_BYPASS;
633*4882a593Smuzhiyun 		smmu_domain->smmu = smmu;
634*4882a593Smuzhiyun 		goto out_unlock;
635*4882a593Smuzhiyun 	}
636*4882a593Smuzhiyun 
637*4882a593Smuzhiyun 	/*
638*4882a593Smuzhiyun 	 * Mapping the requested stage onto what we support is surprisingly
639*4882a593Smuzhiyun 	 * complicated, mainly because the spec allows S1+S2 SMMUs without
640*4882a593Smuzhiyun 	 * support for nested translation. That means we end up with the
641*4882a593Smuzhiyun 	 * following table:
642*4882a593Smuzhiyun 	 *
643*4882a593Smuzhiyun 	 * Requested        Supported        Actual
644*4882a593Smuzhiyun 	 *     S1               N              S1
645*4882a593Smuzhiyun 	 *     S1             S1+S2            S1
646*4882a593Smuzhiyun 	 *     S1               S2             S2
647*4882a593Smuzhiyun 	 *     S1               S1             S1
648*4882a593Smuzhiyun 	 *     N                N              N
649*4882a593Smuzhiyun 	 *     N              S1+S2            S2
650*4882a593Smuzhiyun 	 *     N                S2             S2
651*4882a593Smuzhiyun 	 *     N                S1             S1
652*4882a593Smuzhiyun 	 *
653*4882a593Smuzhiyun 	 * Note that you can't actually request stage-2 mappings.
654*4882a593Smuzhiyun 	 */
655*4882a593Smuzhiyun 	if (!(smmu->features & ARM_SMMU_FEAT_TRANS_S1))
656*4882a593Smuzhiyun 		smmu_domain->stage = ARM_SMMU_DOMAIN_S2;
657*4882a593Smuzhiyun 	if (!(smmu->features & ARM_SMMU_FEAT_TRANS_S2))
658*4882a593Smuzhiyun 		smmu_domain->stage = ARM_SMMU_DOMAIN_S1;
659*4882a593Smuzhiyun 
660*4882a593Smuzhiyun 	/*
661*4882a593Smuzhiyun 	 * Choosing a suitable context format is even more fiddly. Until we
662*4882a593Smuzhiyun 	 * grow some way for the caller to express a preference, and/or move
663*4882a593Smuzhiyun 	 * the decision into the io-pgtable code where it arguably belongs,
664*4882a593Smuzhiyun 	 * just aim for the closest thing to the rest of the system, and hope
665*4882a593Smuzhiyun 	 * that the hardware isn't esoteric enough that we can't assume AArch64
666*4882a593Smuzhiyun 	 * support to be a superset of AArch32 support...
667*4882a593Smuzhiyun 	 */
668*4882a593Smuzhiyun 	if (smmu->features & ARM_SMMU_FEAT_FMT_AARCH32_L)
669*4882a593Smuzhiyun 		cfg->fmt = ARM_SMMU_CTX_FMT_AARCH32_L;
670*4882a593Smuzhiyun 	if (IS_ENABLED(CONFIG_IOMMU_IO_PGTABLE_ARMV7S) &&
671*4882a593Smuzhiyun 	    !IS_ENABLED(CONFIG_64BIT) && !IS_ENABLED(CONFIG_ARM_LPAE) &&
672*4882a593Smuzhiyun 	    (smmu->features & ARM_SMMU_FEAT_FMT_AARCH32_S) &&
673*4882a593Smuzhiyun 	    (smmu_domain->stage == ARM_SMMU_DOMAIN_S1))
674*4882a593Smuzhiyun 		cfg->fmt = ARM_SMMU_CTX_FMT_AARCH32_S;
675*4882a593Smuzhiyun 	if ((IS_ENABLED(CONFIG_64BIT) || cfg->fmt == ARM_SMMU_CTX_FMT_NONE) &&
676*4882a593Smuzhiyun 	    (smmu->features & (ARM_SMMU_FEAT_FMT_AARCH64_64K |
677*4882a593Smuzhiyun 			       ARM_SMMU_FEAT_FMT_AARCH64_16K |
678*4882a593Smuzhiyun 			       ARM_SMMU_FEAT_FMT_AARCH64_4K)))
679*4882a593Smuzhiyun 		cfg->fmt = ARM_SMMU_CTX_FMT_AARCH64;
680*4882a593Smuzhiyun 
681*4882a593Smuzhiyun 	if (cfg->fmt == ARM_SMMU_CTX_FMT_NONE) {
682*4882a593Smuzhiyun 		ret = -EINVAL;
683*4882a593Smuzhiyun 		goto out_unlock;
684*4882a593Smuzhiyun 	}
685*4882a593Smuzhiyun 
686*4882a593Smuzhiyun 	switch (smmu_domain->stage) {
687*4882a593Smuzhiyun 	case ARM_SMMU_DOMAIN_S1:
688*4882a593Smuzhiyun 		cfg->cbar = CBAR_TYPE_S1_TRANS_S2_BYPASS;
689*4882a593Smuzhiyun 		start = smmu->num_s2_context_banks;
690*4882a593Smuzhiyun 		ias = smmu->va_size;
691*4882a593Smuzhiyun 		oas = smmu->ipa_size;
692*4882a593Smuzhiyun 		if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH64) {
693*4882a593Smuzhiyun 			fmt = ARM_64_LPAE_S1;
694*4882a593Smuzhiyun 		} else if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH32_L) {
695*4882a593Smuzhiyun 			fmt = ARM_32_LPAE_S1;
696*4882a593Smuzhiyun 			ias = min(ias, 32UL);
697*4882a593Smuzhiyun 			oas = min(oas, 40UL);
698*4882a593Smuzhiyun 		} else {
699*4882a593Smuzhiyun 			fmt = ARM_V7S;
700*4882a593Smuzhiyun 			ias = min(ias, 32UL);
701*4882a593Smuzhiyun 			oas = min(oas, 32UL);
702*4882a593Smuzhiyun 		}
703*4882a593Smuzhiyun 		smmu_domain->flush_ops = &arm_smmu_s1_tlb_ops;
704*4882a593Smuzhiyun 		break;
705*4882a593Smuzhiyun 	case ARM_SMMU_DOMAIN_NESTED:
706*4882a593Smuzhiyun 		/*
707*4882a593Smuzhiyun 		 * We will likely want to change this if/when KVM gets
708*4882a593Smuzhiyun 		 * involved.
709*4882a593Smuzhiyun 		 */
710*4882a593Smuzhiyun 	case ARM_SMMU_DOMAIN_S2:
711*4882a593Smuzhiyun 		cfg->cbar = CBAR_TYPE_S2_TRANS;
712*4882a593Smuzhiyun 		start = 0;
713*4882a593Smuzhiyun 		ias = smmu->ipa_size;
714*4882a593Smuzhiyun 		oas = smmu->pa_size;
715*4882a593Smuzhiyun 		if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH64) {
716*4882a593Smuzhiyun 			fmt = ARM_64_LPAE_S2;
717*4882a593Smuzhiyun 		} else {
718*4882a593Smuzhiyun 			fmt = ARM_32_LPAE_S2;
719*4882a593Smuzhiyun 			ias = min(ias, 40UL);
720*4882a593Smuzhiyun 			oas = min(oas, 40UL);
721*4882a593Smuzhiyun 		}
722*4882a593Smuzhiyun 		if (smmu->version == ARM_SMMU_V2)
723*4882a593Smuzhiyun 			smmu_domain->flush_ops = &arm_smmu_s2_tlb_ops_v2;
724*4882a593Smuzhiyun 		else
725*4882a593Smuzhiyun 			smmu_domain->flush_ops = &arm_smmu_s2_tlb_ops_v1;
726*4882a593Smuzhiyun 		break;
727*4882a593Smuzhiyun 	default:
728*4882a593Smuzhiyun 		ret = -EINVAL;
729*4882a593Smuzhiyun 		goto out_unlock;
730*4882a593Smuzhiyun 	}
731*4882a593Smuzhiyun 
732*4882a593Smuzhiyun 	ret = arm_smmu_alloc_context_bank(smmu_domain, smmu, dev, start);
733*4882a593Smuzhiyun 	if (ret < 0) {
734*4882a593Smuzhiyun 		goto out_unlock;
735*4882a593Smuzhiyun 	}
736*4882a593Smuzhiyun 
737*4882a593Smuzhiyun 	smmu_domain->smmu = smmu;
738*4882a593Smuzhiyun 
739*4882a593Smuzhiyun 	cfg->cbndx = ret;
740*4882a593Smuzhiyun 	if (smmu->version < ARM_SMMU_V2) {
741*4882a593Smuzhiyun 		cfg->irptndx = atomic_inc_return(&smmu->irptndx);
742*4882a593Smuzhiyun 		cfg->irptndx %= smmu->num_context_irqs;
743*4882a593Smuzhiyun 	} else {
744*4882a593Smuzhiyun 		cfg->irptndx = cfg->cbndx;
745*4882a593Smuzhiyun 	}
746*4882a593Smuzhiyun 
747*4882a593Smuzhiyun 	if (smmu_domain->stage == ARM_SMMU_DOMAIN_S2)
748*4882a593Smuzhiyun 		cfg->vmid = cfg->cbndx + 1;
749*4882a593Smuzhiyun 	else
750*4882a593Smuzhiyun 		cfg->asid = cfg->cbndx;
751*4882a593Smuzhiyun 
752*4882a593Smuzhiyun 	pgtbl_cfg = (struct io_pgtable_cfg) {
753*4882a593Smuzhiyun 		.pgsize_bitmap	= smmu->pgsize_bitmap,
754*4882a593Smuzhiyun 		.ias		= ias,
755*4882a593Smuzhiyun 		.oas		= oas,
756*4882a593Smuzhiyun 		.coherent_walk	= smmu->features & ARM_SMMU_FEAT_COHERENT_WALK,
757*4882a593Smuzhiyun 		.tlb		= smmu_domain->flush_ops,
758*4882a593Smuzhiyun 		.iommu_dev	= smmu->dev,
759*4882a593Smuzhiyun 	};
760*4882a593Smuzhiyun 
761*4882a593Smuzhiyun 	if (smmu->impl && smmu->impl->init_context) {
762*4882a593Smuzhiyun 		ret = smmu->impl->init_context(smmu_domain, &pgtbl_cfg, dev);
763*4882a593Smuzhiyun 		if (ret)
764*4882a593Smuzhiyun 			goto out_clear_smmu;
765*4882a593Smuzhiyun 	}
766*4882a593Smuzhiyun 
767*4882a593Smuzhiyun 	if (smmu_domain->non_strict)
768*4882a593Smuzhiyun 		pgtbl_cfg.quirks |= IO_PGTABLE_QUIRK_NON_STRICT;
769*4882a593Smuzhiyun 
770*4882a593Smuzhiyun 	pgtbl_ops = alloc_io_pgtable_ops(fmt, &pgtbl_cfg, smmu_domain);
771*4882a593Smuzhiyun 	if (!pgtbl_ops) {
772*4882a593Smuzhiyun 		ret = -ENOMEM;
773*4882a593Smuzhiyun 		goto out_clear_smmu;
774*4882a593Smuzhiyun 	}
775*4882a593Smuzhiyun 
776*4882a593Smuzhiyun 	/* Update the domain's page sizes to reflect the page table format */
777*4882a593Smuzhiyun 	domain->pgsize_bitmap = pgtbl_cfg.pgsize_bitmap;
778*4882a593Smuzhiyun 
779*4882a593Smuzhiyun 	if (pgtbl_cfg.quirks & IO_PGTABLE_QUIRK_ARM_TTBR1) {
780*4882a593Smuzhiyun 		domain->geometry.aperture_start = ~0UL << ias;
781*4882a593Smuzhiyun 		domain->geometry.aperture_end = ~0UL;
782*4882a593Smuzhiyun 	} else {
783*4882a593Smuzhiyun 		domain->geometry.aperture_end = (1UL << ias) - 1;
784*4882a593Smuzhiyun 	}
785*4882a593Smuzhiyun 
786*4882a593Smuzhiyun 	domain->geometry.force_aperture = true;
787*4882a593Smuzhiyun 
788*4882a593Smuzhiyun 	/* Initialise the context bank with our page table cfg */
789*4882a593Smuzhiyun 	arm_smmu_init_context_bank(smmu_domain, &pgtbl_cfg);
790*4882a593Smuzhiyun 	arm_smmu_write_context_bank(smmu, cfg->cbndx);
791*4882a593Smuzhiyun 
792*4882a593Smuzhiyun 	/*
793*4882a593Smuzhiyun 	 * Request context fault interrupt. Do this last to avoid the
794*4882a593Smuzhiyun 	 * handler seeing a half-initialised domain state.
795*4882a593Smuzhiyun 	 */
796*4882a593Smuzhiyun 	irq = smmu->irqs[smmu->num_global_irqs + cfg->irptndx];
797*4882a593Smuzhiyun 
798*4882a593Smuzhiyun 	if (smmu->impl && smmu->impl->context_fault)
799*4882a593Smuzhiyun 		context_fault = smmu->impl->context_fault;
800*4882a593Smuzhiyun 	else
801*4882a593Smuzhiyun 		context_fault = arm_smmu_context_fault;
802*4882a593Smuzhiyun 
803*4882a593Smuzhiyun 	ret = devm_request_irq(smmu->dev, irq, context_fault,
804*4882a593Smuzhiyun 			       IRQF_SHARED, "arm-smmu-context-fault", domain);
805*4882a593Smuzhiyun 	if (ret < 0) {
806*4882a593Smuzhiyun 		dev_err(smmu->dev, "failed to request context IRQ %d (%u)\n",
807*4882a593Smuzhiyun 			cfg->irptndx, irq);
808*4882a593Smuzhiyun 		cfg->irptndx = ARM_SMMU_INVALID_IRPTNDX;
809*4882a593Smuzhiyun 	}
810*4882a593Smuzhiyun 
811*4882a593Smuzhiyun 	mutex_unlock(&smmu_domain->init_mutex);
812*4882a593Smuzhiyun 
813*4882a593Smuzhiyun 	/* Publish page table ops for map/unmap */
814*4882a593Smuzhiyun 	smmu_domain->pgtbl_ops = pgtbl_ops;
815*4882a593Smuzhiyun 	return 0;
816*4882a593Smuzhiyun 
817*4882a593Smuzhiyun out_clear_smmu:
818*4882a593Smuzhiyun 	__arm_smmu_free_bitmap(smmu->context_map, cfg->cbndx);
819*4882a593Smuzhiyun 	smmu_domain->smmu = NULL;
820*4882a593Smuzhiyun out_unlock:
821*4882a593Smuzhiyun 	mutex_unlock(&smmu_domain->init_mutex);
822*4882a593Smuzhiyun 	return ret;
823*4882a593Smuzhiyun }
824*4882a593Smuzhiyun 
arm_smmu_destroy_domain_context(struct iommu_domain * domain)825*4882a593Smuzhiyun static void arm_smmu_destroy_domain_context(struct iommu_domain *domain)
826*4882a593Smuzhiyun {
827*4882a593Smuzhiyun 	struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
828*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = smmu_domain->smmu;
829*4882a593Smuzhiyun 	struct arm_smmu_cfg *cfg = &smmu_domain->cfg;
830*4882a593Smuzhiyun 	int ret, irq;
831*4882a593Smuzhiyun 
832*4882a593Smuzhiyun 	if (!smmu || domain->type == IOMMU_DOMAIN_IDENTITY)
833*4882a593Smuzhiyun 		return;
834*4882a593Smuzhiyun 
835*4882a593Smuzhiyun 	ret = arm_smmu_rpm_get(smmu);
836*4882a593Smuzhiyun 	if (ret < 0)
837*4882a593Smuzhiyun 		return;
838*4882a593Smuzhiyun 
839*4882a593Smuzhiyun 	/*
840*4882a593Smuzhiyun 	 * Disable the context bank and free the page tables before freeing
841*4882a593Smuzhiyun 	 * it.
842*4882a593Smuzhiyun 	 */
843*4882a593Smuzhiyun 	smmu->cbs[cfg->cbndx].cfg = NULL;
844*4882a593Smuzhiyun 	arm_smmu_write_context_bank(smmu, cfg->cbndx);
845*4882a593Smuzhiyun 
846*4882a593Smuzhiyun 	if (cfg->irptndx != ARM_SMMU_INVALID_IRPTNDX) {
847*4882a593Smuzhiyun 		irq = smmu->irqs[smmu->num_global_irqs + cfg->irptndx];
848*4882a593Smuzhiyun 		devm_free_irq(smmu->dev, irq, domain);
849*4882a593Smuzhiyun 	}
850*4882a593Smuzhiyun 
851*4882a593Smuzhiyun 	free_io_pgtable_ops(smmu_domain->pgtbl_ops);
852*4882a593Smuzhiyun 	__arm_smmu_free_bitmap(smmu->context_map, cfg->cbndx);
853*4882a593Smuzhiyun 
854*4882a593Smuzhiyun 	arm_smmu_rpm_put(smmu);
855*4882a593Smuzhiyun }
856*4882a593Smuzhiyun 
arm_smmu_domain_alloc(unsigned type)857*4882a593Smuzhiyun static struct iommu_domain *arm_smmu_domain_alloc(unsigned type)
858*4882a593Smuzhiyun {
859*4882a593Smuzhiyun 	struct arm_smmu_domain *smmu_domain;
860*4882a593Smuzhiyun 
861*4882a593Smuzhiyun 	if (type != IOMMU_DOMAIN_UNMANAGED &&
862*4882a593Smuzhiyun 	    type != IOMMU_DOMAIN_DMA &&
863*4882a593Smuzhiyun 	    type != IOMMU_DOMAIN_IDENTITY)
864*4882a593Smuzhiyun 		return NULL;
865*4882a593Smuzhiyun 	/*
866*4882a593Smuzhiyun 	 * Allocate the domain and initialise some of its data structures.
867*4882a593Smuzhiyun 	 * We can't really do anything meaningful until we've added a
868*4882a593Smuzhiyun 	 * master.
869*4882a593Smuzhiyun 	 */
870*4882a593Smuzhiyun 	smmu_domain = kzalloc(sizeof(*smmu_domain), GFP_KERNEL);
871*4882a593Smuzhiyun 	if (!smmu_domain)
872*4882a593Smuzhiyun 		return NULL;
873*4882a593Smuzhiyun 
874*4882a593Smuzhiyun 	if (type == IOMMU_DOMAIN_DMA && (using_legacy_binding ||
875*4882a593Smuzhiyun 	    iommu_get_dma_cookie(&smmu_domain->domain))) {
876*4882a593Smuzhiyun 		kfree(smmu_domain);
877*4882a593Smuzhiyun 		return NULL;
878*4882a593Smuzhiyun 	}
879*4882a593Smuzhiyun 
880*4882a593Smuzhiyun 	mutex_init(&smmu_domain->init_mutex);
881*4882a593Smuzhiyun 	spin_lock_init(&smmu_domain->cb_lock);
882*4882a593Smuzhiyun 
883*4882a593Smuzhiyun 	return &smmu_domain->domain;
884*4882a593Smuzhiyun }
885*4882a593Smuzhiyun 
arm_smmu_domain_free(struct iommu_domain * domain)886*4882a593Smuzhiyun static void arm_smmu_domain_free(struct iommu_domain *domain)
887*4882a593Smuzhiyun {
888*4882a593Smuzhiyun 	struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
889*4882a593Smuzhiyun 
890*4882a593Smuzhiyun 	/*
891*4882a593Smuzhiyun 	 * Free the domain resources. We assume that all devices have
892*4882a593Smuzhiyun 	 * already been detached.
893*4882a593Smuzhiyun 	 */
894*4882a593Smuzhiyun 	iommu_put_dma_cookie(domain);
895*4882a593Smuzhiyun 	arm_smmu_destroy_domain_context(domain);
896*4882a593Smuzhiyun 	kfree(smmu_domain);
897*4882a593Smuzhiyun }
898*4882a593Smuzhiyun 
arm_smmu_write_smr(struct arm_smmu_device * smmu,int idx)899*4882a593Smuzhiyun static void arm_smmu_write_smr(struct arm_smmu_device *smmu, int idx)
900*4882a593Smuzhiyun {
901*4882a593Smuzhiyun 	struct arm_smmu_smr *smr = smmu->smrs + idx;
902*4882a593Smuzhiyun 	u32 reg = FIELD_PREP(ARM_SMMU_SMR_ID, smr->id) |
903*4882a593Smuzhiyun 		  FIELD_PREP(ARM_SMMU_SMR_MASK, smr->mask);
904*4882a593Smuzhiyun 
905*4882a593Smuzhiyun 	if (!(smmu->features & ARM_SMMU_FEAT_EXIDS) && smr->valid)
906*4882a593Smuzhiyun 		reg |= ARM_SMMU_SMR_VALID;
907*4882a593Smuzhiyun 	arm_smmu_gr0_write(smmu, ARM_SMMU_GR0_SMR(idx), reg);
908*4882a593Smuzhiyun }
909*4882a593Smuzhiyun 
arm_smmu_write_s2cr(struct arm_smmu_device * smmu,int idx)910*4882a593Smuzhiyun static void arm_smmu_write_s2cr(struct arm_smmu_device *smmu, int idx)
911*4882a593Smuzhiyun {
912*4882a593Smuzhiyun 	struct arm_smmu_s2cr *s2cr = smmu->s2crs + idx;
913*4882a593Smuzhiyun 	u32 reg;
914*4882a593Smuzhiyun 
915*4882a593Smuzhiyun 	if (smmu->impl && smmu->impl->write_s2cr) {
916*4882a593Smuzhiyun 		smmu->impl->write_s2cr(smmu, idx);
917*4882a593Smuzhiyun 		return;
918*4882a593Smuzhiyun 	}
919*4882a593Smuzhiyun 
920*4882a593Smuzhiyun 	reg = FIELD_PREP(ARM_SMMU_S2CR_TYPE, s2cr->type) |
921*4882a593Smuzhiyun 	      FIELD_PREP(ARM_SMMU_S2CR_CBNDX, s2cr->cbndx) |
922*4882a593Smuzhiyun 	      FIELD_PREP(ARM_SMMU_S2CR_PRIVCFG, s2cr->privcfg);
923*4882a593Smuzhiyun 
924*4882a593Smuzhiyun 	if (smmu->features & ARM_SMMU_FEAT_EXIDS && smmu->smrs &&
925*4882a593Smuzhiyun 	    smmu->smrs[idx].valid)
926*4882a593Smuzhiyun 		reg |= ARM_SMMU_S2CR_EXIDVALID;
927*4882a593Smuzhiyun 	arm_smmu_gr0_write(smmu, ARM_SMMU_GR0_S2CR(idx), reg);
928*4882a593Smuzhiyun }
929*4882a593Smuzhiyun 
arm_smmu_write_sme(struct arm_smmu_device * smmu,int idx)930*4882a593Smuzhiyun static void arm_smmu_write_sme(struct arm_smmu_device *smmu, int idx)
931*4882a593Smuzhiyun {
932*4882a593Smuzhiyun 	arm_smmu_write_s2cr(smmu, idx);
933*4882a593Smuzhiyun 	if (smmu->smrs)
934*4882a593Smuzhiyun 		arm_smmu_write_smr(smmu, idx);
935*4882a593Smuzhiyun }
936*4882a593Smuzhiyun 
937*4882a593Smuzhiyun /*
938*4882a593Smuzhiyun  * The width of SMR's mask field depends on sCR0_EXIDENABLE, so this function
939*4882a593Smuzhiyun  * should be called after sCR0 is written.
940*4882a593Smuzhiyun  */
arm_smmu_test_smr_masks(struct arm_smmu_device * smmu)941*4882a593Smuzhiyun static void arm_smmu_test_smr_masks(struct arm_smmu_device *smmu)
942*4882a593Smuzhiyun {
943*4882a593Smuzhiyun 	u32 smr;
944*4882a593Smuzhiyun 	int i;
945*4882a593Smuzhiyun 
946*4882a593Smuzhiyun 	if (!smmu->smrs)
947*4882a593Smuzhiyun 		return;
948*4882a593Smuzhiyun 	/*
949*4882a593Smuzhiyun 	 * If we've had to accommodate firmware memory regions, we may
950*4882a593Smuzhiyun 	 * have live SMRs by now; tread carefully...
951*4882a593Smuzhiyun 	 *
952*4882a593Smuzhiyun 	 * Somewhat perversely, not having a free SMR for this test implies we
953*4882a593Smuzhiyun 	 * can get away without it anyway, as we'll only be able to 'allocate'
954*4882a593Smuzhiyun 	 * these SMRs for the ID/mask values we're already trusting to be OK.
955*4882a593Smuzhiyun 	 */
956*4882a593Smuzhiyun 	for (i = 0; i < smmu->num_mapping_groups; i++)
957*4882a593Smuzhiyun 		if (!smmu->smrs[i].valid)
958*4882a593Smuzhiyun 			goto smr_ok;
959*4882a593Smuzhiyun 	return;
960*4882a593Smuzhiyun smr_ok:
961*4882a593Smuzhiyun 	/*
962*4882a593Smuzhiyun 	 * SMR.ID bits may not be preserved if the corresponding MASK
963*4882a593Smuzhiyun 	 * bits are set, so check each one separately. We can reject
964*4882a593Smuzhiyun 	 * masters later if they try to claim IDs outside these masks.
965*4882a593Smuzhiyun 	 */
966*4882a593Smuzhiyun 	smr = FIELD_PREP(ARM_SMMU_SMR_ID, smmu->streamid_mask);
967*4882a593Smuzhiyun 	arm_smmu_gr0_write(smmu, ARM_SMMU_GR0_SMR(i), smr);
968*4882a593Smuzhiyun 	smr = arm_smmu_gr0_read(smmu, ARM_SMMU_GR0_SMR(i));
969*4882a593Smuzhiyun 	smmu->streamid_mask = FIELD_GET(ARM_SMMU_SMR_ID, smr);
970*4882a593Smuzhiyun 
971*4882a593Smuzhiyun 	smr = FIELD_PREP(ARM_SMMU_SMR_MASK, smmu->streamid_mask);
972*4882a593Smuzhiyun 	arm_smmu_gr0_write(smmu, ARM_SMMU_GR0_SMR(i), smr);
973*4882a593Smuzhiyun 	smr = arm_smmu_gr0_read(smmu, ARM_SMMU_GR0_SMR(i));
974*4882a593Smuzhiyun 	smmu->smr_mask_mask = FIELD_GET(ARM_SMMU_SMR_MASK, smr);
975*4882a593Smuzhiyun }
976*4882a593Smuzhiyun 
arm_smmu_find_sme(struct arm_smmu_device * smmu,u16 id,u16 mask)977*4882a593Smuzhiyun static int arm_smmu_find_sme(struct arm_smmu_device *smmu, u16 id, u16 mask)
978*4882a593Smuzhiyun {
979*4882a593Smuzhiyun 	struct arm_smmu_smr *smrs = smmu->smrs;
980*4882a593Smuzhiyun 	int i, free_idx = -ENOSPC;
981*4882a593Smuzhiyun 
982*4882a593Smuzhiyun 	/* Stream indexing is blissfully easy */
983*4882a593Smuzhiyun 	if (!smrs)
984*4882a593Smuzhiyun 		return id;
985*4882a593Smuzhiyun 
986*4882a593Smuzhiyun 	/* Validating SMRs is... less so */
987*4882a593Smuzhiyun 	for (i = 0; i < smmu->num_mapping_groups; ++i) {
988*4882a593Smuzhiyun 		if (!smrs[i].valid) {
989*4882a593Smuzhiyun 			/*
990*4882a593Smuzhiyun 			 * Note the first free entry we come across, which
991*4882a593Smuzhiyun 			 * we'll claim in the end if nothing else matches.
992*4882a593Smuzhiyun 			 */
993*4882a593Smuzhiyun 			if (free_idx < 0)
994*4882a593Smuzhiyun 				free_idx = i;
995*4882a593Smuzhiyun 			continue;
996*4882a593Smuzhiyun 		}
997*4882a593Smuzhiyun 		/*
998*4882a593Smuzhiyun 		 * If the new entry is _entirely_ matched by an existing entry,
999*4882a593Smuzhiyun 		 * then reuse that, with the guarantee that there also cannot
1000*4882a593Smuzhiyun 		 * be any subsequent conflicting entries. In normal use we'd
1001*4882a593Smuzhiyun 		 * expect simply identical entries for this case, but there's
1002*4882a593Smuzhiyun 		 * no harm in accommodating the generalisation.
1003*4882a593Smuzhiyun 		 */
1004*4882a593Smuzhiyun 		if ((mask & smrs[i].mask) == mask &&
1005*4882a593Smuzhiyun 		    !((id ^ smrs[i].id) & ~smrs[i].mask))
1006*4882a593Smuzhiyun 			return i;
1007*4882a593Smuzhiyun 		/*
1008*4882a593Smuzhiyun 		 * If the new entry has any other overlap with an existing one,
1009*4882a593Smuzhiyun 		 * though, then there always exists at least one stream ID
1010*4882a593Smuzhiyun 		 * which would cause a conflict, and we can't allow that risk.
1011*4882a593Smuzhiyun 		 */
1012*4882a593Smuzhiyun 		if (!((id ^ smrs[i].id) & ~(smrs[i].mask | mask)))
1013*4882a593Smuzhiyun 			return -EINVAL;
1014*4882a593Smuzhiyun 	}
1015*4882a593Smuzhiyun 
1016*4882a593Smuzhiyun 	return free_idx;
1017*4882a593Smuzhiyun }
1018*4882a593Smuzhiyun 
arm_smmu_free_sme(struct arm_smmu_device * smmu,int idx)1019*4882a593Smuzhiyun static bool arm_smmu_free_sme(struct arm_smmu_device *smmu, int idx)
1020*4882a593Smuzhiyun {
1021*4882a593Smuzhiyun 	bool pinned = smmu->s2crs[idx].pinned;
1022*4882a593Smuzhiyun 	u8 cbndx = smmu->s2crs[idx].cbndx;
1023*4882a593Smuzhiyun 
1024*4882a593Smuzhiyun 	if (--smmu->s2crs[idx].count)
1025*4882a593Smuzhiyun 		return false;
1026*4882a593Smuzhiyun 
1027*4882a593Smuzhiyun 	smmu->s2crs[idx] = s2cr_init_val;
1028*4882a593Smuzhiyun 	if (pinned) {
1029*4882a593Smuzhiyun 		smmu->s2crs[idx].pinned = true;
1030*4882a593Smuzhiyun 		smmu->s2crs[idx].cbndx = cbndx;
1031*4882a593Smuzhiyun 	} else if (smmu->smrs) {
1032*4882a593Smuzhiyun 		smmu->smrs[idx].valid = false;
1033*4882a593Smuzhiyun 	}
1034*4882a593Smuzhiyun 
1035*4882a593Smuzhiyun 	return true;
1036*4882a593Smuzhiyun }
1037*4882a593Smuzhiyun 
arm_smmu_master_alloc_smes(struct device * dev)1038*4882a593Smuzhiyun static int arm_smmu_master_alloc_smes(struct device *dev)
1039*4882a593Smuzhiyun {
1040*4882a593Smuzhiyun 	struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
1041*4882a593Smuzhiyun 	struct arm_smmu_master_cfg *cfg = dev_iommu_priv_get(dev);
1042*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = cfg->smmu;
1043*4882a593Smuzhiyun 	struct arm_smmu_smr *smrs = smmu->smrs;
1044*4882a593Smuzhiyun 	int i, idx, ret;
1045*4882a593Smuzhiyun 
1046*4882a593Smuzhiyun 	mutex_lock(&smmu->stream_map_mutex);
1047*4882a593Smuzhiyun 	/* Figure out a viable stream map entry allocation */
1048*4882a593Smuzhiyun 	for_each_cfg_sme(cfg, fwspec, i, idx) {
1049*4882a593Smuzhiyun 		u16 sid = FIELD_GET(ARM_SMMU_SMR_ID, fwspec->ids[i]);
1050*4882a593Smuzhiyun 		u16 mask = FIELD_GET(ARM_SMMU_SMR_MASK, fwspec->ids[i]);
1051*4882a593Smuzhiyun 
1052*4882a593Smuzhiyun 		if (idx != INVALID_SMENDX) {
1053*4882a593Smuzhiyun 			ret = -EEXIST;
1054*4882a593Smuzhiyun 			goto out_err;
1055*4882a593Smuzhiyun 		}
1056*4882a593Smuzhiyun 
1057*4882a593Smuzhiyun 		ret = arm_smmu_find_sme(smmu, sid, mask);
1058*4882a593Smuzhiyun 		if (ret < 0)
1059*4882a593Smuzhiyun 			goto out_err;
1060*4882a593Smuzhiyun 
1061*4882a593Smuzhiyun 		idx = ret;
1062*4882a593Smuzhiyun 		if (smrs && smmu->s2crs[idx].count == 0) {
1063*4882a593Smuzhiyun 			smrs[idx].id = sid;
1064*4882a593Smuzhiyun 			smrs[idx].mask = mask;
1065*4882a593Smuzhiyun 			smrs[idx].valid = true;
1066*4882a593Smuzhiyun 		}
1067*4882a593Smuzhiyun 		smmu->s2crs[idx].count++;
1068*4882a593Smuzhiyun 		cfg->smendx[i] = (s16)idx;
1069*4882a593Smuzhiyun 	}
1070*4882a593Smuzhiyun 
1071*4882a593Smuzhiyun 	/* It worked! Now, poke the actual hardware */
1072*4882a593Smuzhiyun 	for_each_cfg_sme(cfg, fwspec, i, idx)
1073*4882a593Smuzhiyun 		arm_smmu_write_sme(smmu, idx);
1074*4882a593Smuzhiyun 
1075*4882a593Smuzhiyun 	mutex_unlock(&smmu->stream_map_mutex);
1076*4882a593Smuzhiyun 	return 0;
1077*4882a593Smuzhiyun 
1078*4882a593Smuzhiyun out_err:
1079*4882a593Smuzhiyun 	while (i--) {
1080*4882a593Smuzhiyun 		arm_smmu_free_sme(smmu, cfg->smendx[i]);
1081*4882a593Smuzhiyun 		cfg->smendx[i] = INVALID_SMENDX;
1082*4882a593Smuzhiyun 	}
1083*4882a593Smuzhiyun 	mutex_unlock(&smmu->stream_map_mutex);
1084*4882a593Smuzhiyun 	return ret;
1085*4882a593Smuzhiyun }
1086*4882a593Smuzhiyun 
arm_smmu_master_free_smes(struct arm_smmu_master_cfg * cfg,struct iommu_fwspec * fwspec)1087*4882a593Smuzhiyun static void arm_smmu_master_free_smes(struct arm_smmu_master_cfg *cfg,
1088*4882a593Smuzhiyun 				      struct iommu_fwspec *fwspec)
1089*4882a593Smuzhiyun {
1090*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = cfg->smmu;
1091*4882a593Smuzhiyun 	int i, idx;
1092*4882a593Smuzhiyun 
1093*4882a593Smuzhiyun 	mutex_lock(&smmu->stream_map_mutex);
1094*4882a593Smuzhiyun 	for_each_cfg_sme(cfg, fwspec, i, idx) {
1095*4882a593Smuzhiyun 		if (arm_smmu_free_sme(smmu, idx))
1096*4882a593Smuzhiyun 			arm_smmu_write_sme(smmu, idx);
1097*4882a593Smuzhiyun 		cfg->smendx[i] = INVALID_SMENDX;
1098*4882a593Smuzhiyun 	}
1099*4882a593Smuzhiyun 	mutex_unlock(&smmu->stream_map_mutex);
1100*4882a593Smuzhiyun }
1101*4882a593Smuzhiyun 
arm_smmu_domain_add_master(struct arm_smmu_domain * smmu_domain,struct arm_smmu_master_cfg * cfg,struct iommu_fwspec * fwspec)1102*4882a593Smuzhiyun static int arm_smmu_domain_add_master(struct arm_smmu_domain *smmu_domain,
1103*4882a593Smuzhiyun 				      struct arm_smmu_master_cfg *cfg,
1104*4882a593Smuzhiyun 				      struct iommu_fwspec *fwspec)
1105*4882a593Smuzhiyun {
1106*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = smmu_domain->smmu;
1107*4882a593Smuzhiyun 	struct arm_smmu_s2cr *s2cr = smmu->s2crs;
1108*4882a593Smuzhiyun 	u8 cbndx = smmu_domain->cfg.cbndx;
1109*4882a593Smuzhiyun 	enum arm_smmu_s2cr_type type;
1110*4882a593Smuzhiyun 	int i, idx;
1111*4882a593Smuzhiyun 
1112*4882a593Smuzhiyun 	if (smmu_domain->stage == ARM_SMMU_DOMAIN_BYPASS)
1113*4882a593Smuzhiyun 		type = S2CR_TYPE_BYPASS;
1114*4882a593Smuzhiyun 	else
1115*4882a593Smuzhiyun 		type = S2CR_TYPE_TRANS;
1116*4882a593Smuzhiyun 
1117*4882a593Smuzhiyun 	for_each_cfg_sme(cfg, fwspec, i, idx) {
1118*4882a593Smuzhiyun 		if (type == s2cr[idx].type && cbndx == s2cr[idx].cbndx)
1119*4882a593Smuzhiyun 			continue;
1120*4882a593Smuzhiyun 
1121*4882a593Smuzhiyun 		/* Don't bypasss pinned streams; leave them as they are */
1122*4882a593Smuzhiyun 		if (type == S2CR_TYPE_BYPASS && s2cr[idx].pinned)
1123*4882a593Smuzhiyun 			continue;
1124*4882a593Smuzhiyun 
1125*4882a593Smuzhiyun 		s2cr[idx].type = type;
1126*4882a593Smuzhiyun 		s2cr[idx].privcfg = S2CR_PRIVCFG_DEFAULT;
1127*4882a593Smuzhiyun 		s2cr[idx].cbndx = cbndx;
1128*4882a593Smuzhiyun 		arm_smmu_write_s2cr(smmu, idx);
1129*4882a593Smuzhiyun 	}
1130*4882a593Smuzhiyun 	return 0;
1131*4882a593Smuzhiyun }
1132*4882a593Smuzhiyun 
arm_smmu_attach_dev(struct iommu_domain * domain,struct device * dev)1133*4882a593Smuzhiyun static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)
1134*4882a593Smuzhiyun {
1135*4882a593Smuzhiyun 	struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
1136*4882a593Smuzhiyun 	struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
1137*4882a593Smuzhiyun 	struct arm_smmu_master_cfg *cfg;
1138*4882a593Smuzhiyun 	struct arm_smmu_device *smmu;
1139*4882a593Smuzhiyun 	int ret;
1140*4882a593Smuzhiyun 
1141*4882a593Smuzhiyun 	if (!fwspec || fwspec->ops != &arm_smmu_ops) {
1142*4882a593Smuzhiyun 		dev_err(dev, "cannot attach to SMMU, is it on the same bus?\n");
1143*4882a593Smuzhiyun 		return -ENXIO;
1144*4882a593Smuzhiyun 	}
1145*4882a593Smuzhiyun 
1146*4882a593Smuzhiyun 	/*
1147*4882a593Smuzhiyun 	 * FIXME: The arch/arm DMA API code tries to attach devices to its own
1148*4882a593Smuzhiyun 	 * domains between of_xlate() and probe_device() - we have no way to cope
1149*4882a593Smuzhiyun 	 * with that, so until ARM gets converted to rely on groups and default
1150*4882a593Smuzhiyun 	 * domains, just say no (but more politely than by dereferencing NULL).
1151*4882a593Smuzhiyun 	 * This should be at least a WARN_ON once that's sorted.
1152*4882a593Smuzhiyun 	 */
1153*4882a593Smuzhiyun 	cfg = dev_iommu_priv_get(dev);
1154*4882a593Smuzhiyun 	if (!cfg)
1155*4882a593Smuzhiyun 		return -ENODEV;
1156*4882a593Smuzhiyun 
1157*4882a593Smuzhiyun 	smmu = cfg->smmu;
1158*4882a593Smuzhiyun 
1159*4882a593Smuzhiyun 	ret = arm_smmu_rpm_get(smmu);
1160*4882a593Smuzhiyun 	if (ret < 0)
1161*4882a593Smuzhiyun 		return ret;
1162*4882a593Smuzhiyun 
1163*4882a593Smuzhiyun 	/* Ensure that the domain is finalised */
1164*4882a593Smuzhiyun 	ret = arm_smmu_init_domain_context(domain, smmu, dev);
1165*4882a593Smuzhiyun 	if (ret < 0)
1166*4882a593Smuzhiyun 		goto rpm_put;
1167*4882a593Smuzhiyun 
1168*4882a593Smuzhiyun 	/*
1169*4882a593Smuzhiyun 	 * Sanity check the domain. We don't support domains across
1170*4882a593Smuzhiyun 	 * different SMMUs.
1171*4882a593Smuzhiyun 	 */
1172*4882a593Smuzhiyun 	if (smmu_domain->smmu != smmu) {
1173*4882a593Smuzhiyun 		dev_err(dev,
1174*4882a593Smuzhiyun 			"cannot attach to SMMU %s whilst already attached to domain on SMMU %s\n",
1175*4882a593Smuzhiyun 			dev_name(smmu_domain->smmu->dev), dev_name(smmu->dev));
1176*4882a593Smuzhiyun 		ret = -EINVAL;
1177*4882a593Smuzhiyun 		goto rpm_put;
1178*4882a593Smuzhiyun 	}
1179*4882a593Smuzhiyun 
1180*4882a593Smuzhiyun 	/* Looks ok, so add the device to the domain */
1181*4882a593Smuzhiyun 	ret = arm_smmu_domain_add_master(smmu_domain, cfg, fwspec);
1182*4882a593Smuzhiyun 
1183*4882a593Smuzhiyun 	/*
1184*4882a593Smuzhiyun 	 * Setup an autosuspend delay to avoid bouncing runpm state.
1185*4882a593Smuzhiyun 	 * Otherwise, if a driver for a suspended consumer device
1186*4882a593Smuzhiyun 	 * unmaps buffers, it will runpm resume/suspend for each one.
1187*4882a593Smuzhiyun 	 *
1188*4882a593Smuzhiyun 	 * For example, when used by a GPU device, when an application
1189*4882a593Smuzhiyun 	 * or game exits, it can trigger unmapping 100s or 1000s of
1190*4882a593Smuzhiyun 	 * buffers.  With a runpm cycle for each buffer, that adds up
1191*4882a593Smuzhiyun 	 * to 5-10sec worth of reprogramming the context bank, while
1192*4882a593Smuzhiyun 	 * the system appears to be locked up to the user.
1193*4882a593Smuzhiyun 	 */
1194*4882a593Smuzhiyun 	pm_runtime_set_autosuspend_delay(smmu->dev, 20);
1195*4882a593Smuzhiyun 	pm_runtime_use_autosuspend(smmu->dev);
1196*4882a593Smuzhiyun 
1197*4882a593Smuzhiyun rpm_put:
1198*4882a593Smuzhiyun 	arm_smmu_rpm_put(smmu);
1199*4882a593Smuzhiyun 	return ret;
1200*4882a593Smuzhiyun }
1201*4882a593Smuzhiyun 
arm_smmu_map_pages(struct iommu_domain * domain,unsigned long iova,phys_addr_t paddr,size_t pgsize,size_t pgcount,int prot,gfp_t gfp,size_t * mapped)1202*4882a593Smuzhiyun static int arm_smmu_map_pages(struct iommu_domain *domain, unsigned long iova,
1203*4882a593Smuzhiyun 			      phys_addr_t paddr, size_t pgsize, size_t pgcount,
1204*4882a593Smuzhiyun 			      int prot, gfp_t gfp, size_t *mapped)
1205*4882a593Smuzhiyun {
1206*4882a593Smuzhiyun 	struct io_pgtable_ops *ops = to_smmu_domain(domain)->pgtbl_ops;
1207*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = to_smmu_domain(domain)->smmu;
1208*4882a593Smuzhiyun 	int ret;
1209*4882a593Smuzhiyun 
1210*4882a593Smuzhiyun 	if (!ops)
1211*4882a593Smuzhiyun 		return -ENODEV;
1212*4882a593Smuzhiyun 
1213*4882a593Smuzhiyun 	arm_smmu_rpm_get(smmu);
1214*4882a593Smuzhiyun 	ret = ops->map_pages(ops, iova, paddr, pgsize, pgcount, prot, gfp, mapped);
1215*4882a593Smuzhiyun 	arm_smmu_rpm_put(smmu);
1216*4882a593Smuzhiyun 
1217*4882a593Smuzhiyun 	return ret;
1218*4882a593Smuzhiyun }
1219*4882a593Smuzhiyun 
arm_smmu_unmap_pages(struct iommu_domain * domain,unsigned long iova,size_t pgsize,size_t pgcount,struct iommu_iotlb_gather * iotlb_gather)1220*4882a593Smuzhiyun static size_t arm_smmu_unmap_pages(struct iommu_domain *domain, unsigned long iova,
1221*4882a593Smuzhiyun 				   size_t pgsize, size_t pgcount,
1222*4882a593Smuzhiyun 				   struct iommu_iotlb_gather *iotlb_gather)
1223*4882a593Smuzhiyun {
1224*4882a593Smuzhiyun 	struct io_pgtable_ops *ops = to_smmu_domain(domain)->pgtbl_ops;
1225*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = to_smmu_domain(domain)->smmu;
1226*4882a593Smuzhiyun 	size_t ret;
1227*4882a593Smuzhiyun 
1228*4882a593Smuzhiyun 	if (!ops)
1229*4882a593Smuzhiyun 		return 0;
1230*4882a593Smuzhiyun 
1231*4882a593Smuzhiyun 	arm_smmu_rpm_get(smmu);
1232*4882a593Smuzhiyun 	ret = ops->unmap_pages(ops, iova, pgsize, pgcount, iotlb_gather);
1233*4882a593Smuzhiyun 	arm_smmu_rpm_put(smmu);
1234*4882a593Smuzhiyun 
1235*4882a593Smuzhiyun 	return ret;
1236*4882a593Smuzhiyun }
1237*4882a593Smuzhiyun 
arm_smmu_flush_iotlb_all(struct iommu_domain * domain)1238*4882a593Smuzhiyun static void arm_smmu_flush_iotlb_all(struct iommu_domain *domain)
1239*4882a593Smuzhiyun {
1240*4882a593Smuzhiyun 	struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
1241*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = smmu_domain->smmu;
1242*4882a593Smuzhiyun 
1243*4882a593Smuzhiyun 	if (smmu_domain->flush_ops) {
1244*4882a593Smuzhiyun 		arm_smmu_rpm_get(smmu);
1245*4882a593Smuzhiyun 		smmu_domain->flush_ops->tlb_flush_all(smmu_domain);
1246*4882a593Smuzhiyun 		arm_smmu_rpm_put(smmu);
1247*4882a593Smuzhiyun 	}
1248*4882a593Smuzhiyun }
1249*4882a593Smuzhiyun 
arm_smmu_iotlb_sync(struct iommu_domain * domain,struct iommu_iotlb_gather * gather)1250*4882a593Smuzhiyun static void arm_smmu_iotlb_sync(struct iommu_domain *domain,
1251*4882a593Smuzhiyun 				struct iommu_iotlb_gather *gather)
1252*4882a593Smuzhiyun {
1253*4882a593Smuzhiyun 	struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
1254*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = smmu_domain->smmu;
1255*4882a593Smuzhiyun 
1256*4882a593Smuzhiyun 	if (!smmu)
1257*4882a593Smuzhiyun 		return;
1258*4882a593Smuzhiyun 
1259*4882a593Smuzhiyun 	arm_smmu_rpm_get(smmu);
1260*4882a593Smuzhiyun 	if (smmu->version == ARM_SMMU_V2 ||
1261*4882a593Smuzhiyun 	    smmu_domain->stage == ARM_SMMU_DOMAIN_S1)
1262*4882a593Smuzhiyun 		arm_smmu_tlb_sync_context(smmu_domain);
1263*4882a593Smuzhiyun 	else
1264*4882a593Smuzhiyun 		arm_smmu_tlb_sync_global(smmu);
1265*4882a593Smuzhiyun 	arm_smmu_rpm_put(smmu);
1266*4882a593Smuzhiyun }
1267*4882a593Smuzhiyun 
arm_smmu_iova_to_phys_hard(struct iommu_domain * domain,dma_addr_t iova)1268*4882a593Smuzhiyun static phys_addr_t arm_smmu_iova_to_phys_hard(struct iommu_domain *domain,
1269*4882a593Smuzhiyun 					      dma_addr_t iova)
1270*4882a593Smuzhiyun {
1271*4882a593Smuzhiyun 	struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
1272*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = smmu_domain->smmu;
1273*4882a593Smuzhiyun 	struct arm_smmu_cfg *cfg = &smmu_domain->cfg;
1274*4882a593Smuzhiyun 	struct io_pgtable_ops *ops= smmu_domain->pgtbl_ops;
1275*4882a593Smuzhiyun 	struct device *dev = smmu->dev;
1276*4882a593Smuzhiyun 	void __iomem *reg;
1277*4882a593Smuzhiyun 	u32 tmp;
1278*4882a593Smuzhiyun 	u64 phys;
1279*4882a593Smuzhiyun 	unsigned long va, flags;
1280*4882a593Smuzhiyun 	int ret, idx = cfg->cbndx;
1281*4882a593Smuzhiyun 	phys_addr_t addr = 0;
1282*4882a593Smuzhiyun 
1283*4882a593Smuzhiyun 	ret = arm_smmu_rpm_get(smmu);
1284*4882a593Smuzhiyun 	if (ret < 0)
1285*4882a593Smuzhiyun 		return 0;
1286*4882a593Smuzhiyun 
1287*4882a593Smuzhiyun 	spin_lock_irqsave(&smmu_domain->cb_lock, flags);
1288*4882a593Smuzhiyun 	va = iova & ~0xfffUL;
1289*4882a593Smuzhiyun 	if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH64)
1290*4882a593Smuzhiyun 		arm_smmu_cb_writeq(smmu, idx, ARM_SMMU_CB_ATS1PR, va);
1291*4882a593Smuzhiyun 	else
1292*4882a593Smuzhiyun 		arm_smmu_cb_write(smmu, idx, ARM_SMMU_CB_ATS1PR, va);
1293*4882a593Smuzhiyun 
1294*4882a593Smuzhiyun 	reg = arm_smmu_page(smmu, ARM_SMMU_CB(smmu, idx)) + ARM_SMMU_CB_ATSR;
1295*4882a593Smuzhiyun 	if (readl_poll_timeout_atomic(reg, tmp, !(tmp & ARM_SMMU_ATSR_ACTIVE),
1296*4882a593Smuzhiyun 				      5, 50)) {
1297*4882a593Smuzhiyun 		spin_unlock_irqrestore(&smmu_domain->cb_lock, flags);
1298*4882a593Smuzhiyun 		dev_err(dev,
1299*4882a593Smuzhiyun 			"iova to phys timed out on %pad. Falling back to software table walk.\n",
1300*4882a593Smuzhiyun 			&iova);
1301*4882a593Smuzhiyun 		arm_smmu_rpm_put(smmu);
1302*4882a593Smuzhiyun 		return ops->iova_to_phys(ops, iova);
1303*4882a593Smuzhiyun 	}
1304*4882a593Smuzhiyun 
1305*4882a593Smuzhiyun 	phys = arm_smmu_cb_readq(smmu, idx, ARM_SMMU_CB_PAR);
1306*4882a593Smuzhiyun 	spin_unlock_irqrestore(&smmu_domain->cb_lock, flags);
1307*4882a593Smuzhiyun 	if (phys & ARM_SMMU_CB_PAR_F) {
1308*4882a593Smuzhiyun 		dev_err(dev, "translation fault!\n");
1309*4882a593Smuzhiyun 		dev_err(dev, "PAR = 0x%llx\n", phys);
1310*4882a593Smuzhiyun 		goto out;
1311*4882a593Smuzhiyun 	}
1312*4882a593Smuzhiyun 
1313*4882a593Smuzhiyun 	addr = (phys & GENMASK_ULL(39, 12)) | (iova & 0xfff);
1314*4882a593Smuzhiyun out:
1315*4882a593Smuzhiyun 	arm_smmu_rpm_put(smmu);
1316*4882a593Smuzhiyun 
1317*4882a593Smuzhiyun 	return addr;
1318*4882a593Smuzhiyun }
1319*4882a593Smuzhiyun 
arm_smmu_iova_to_phys(struct iommu_domain * domain,dma_addr_t iova)1320*4882a593Smuzhiyun static phys_addr_t arm_smmu_iova_to_phys(struct iommu_domain *domain,
1321*4882a593Smuzhiyun 					dma_addr_t iova)
1322*4882a593Smuzhiyun {
1323*4882a593Smuzhiyun 	struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
1324*4882a593Smuzhiyun 	struct io_pgtable_ops *ops = smmu_domain->pgtbl_ops;
1325*4882a593Smuzhiyun 
1326*4882a593Smuzhiyun 	if (domain->type == IOMMU_DOMAIN_IDENTITY)
1327*4882a593Smuzhiyun 		return iova;
1328*4882a593Smuzhiyun 
1329*4882a593Smuzhiyun 	if (!ops)
1330*4882a593Smuzhiyun 		return 0;
1331*4882a593Smuzhiyun 
1332*4882a593Smuzhiyun 	if (smmu_domain->smmu->features & ARM_SMMU_FEAT_TRANS_OPS &&
1333*4882a593Smuzhiyun 			smmu_domain->stage == ARM_SMMU_DOMAIN_S1)
1334*4882a593Smuzhiyun 		return arm_smmu_iova_to_phys_hard(domain, iova);
1335*4882a593Smuzhiyun 
1336*4882a593Smuzhiyun 	return ops->iova_to_phys(ops, iova);
1337*4882a593Smuzhiyun }
1338*4882a593Smuzhiyun 
arm_smmu_capable(enum iommu_cap cap)1339*4882a593Smuzhiyun static bool arm_smmu_capable(enum iommu_cap cap)
1340*4882a593Smuzhiyun {
1341*4882a593Smuzhiyun 	switch (cap) {
1342*4882a593Smuzhiyun 	case IOMMU_CAP_CACHE_COHERENCY:
1343*4882a593Smuzhiyun 		/*
1344*4882a593Smuzhiyun 		 * Return true here as the SMMU can always send out coherent
1345*4882a593Smuzhiyun 		 * requests.
1346*4882a593Smuzhiyun 		 */
1347*4882a593Smuzhiyun 		return true;
1348*4882a593Smuzhiyun 	case IOMMU_CAP_NOEXEC:
1349*4882a593Smuzhiyun 		return true;
1350*4882a593Smuzhiyun 	default:
1351*4882a593Smuzhiyun 		return false;
1352*4882a593Smuzhiyun 	}
1353*4882a593Smuzhiyun }
1354*4882a593Smuzhiyun 
1355*4882a593Smuzhiyun static
arm_smmu_get_by_fwnode(struct fwnode_handle * fwnode)1356*4882a593Smuzhiyun struct arm_smmu_device *arm_smmu_get_by_fwnode(struct fwnode_handle *fwnode)
1357*4882a593Smuzhiyun {
1358*4882a593Smuzhiyun 	struct device *dev = driver_find_device_by_fwnode(&arm_smmu_driver.driver,
1359*4882a593Smuzhiyun 							  fwnode);
1360*4882a593Smuzhiyun 	put_device(dev);
1361*4882a593Smuzhiyun 	return dev ? dev_get_drvdata(dev) : NULL;
1362*4882a593Smuzhiyun }
1363*4882a593Smuzhiyun 
arm_smmu_probe_device(struct device * dev)1364*4882a593Smuzhiyun static struct iommu_device *arm_smmu_probe_device(struct device *dev)
1365*4882a593Smuzhiyun {
1366*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = NULL;
1367*4882a593Smuzhiyun 	struct arm_smmu_master_cfg *cfg;
1368*4882a593Smuzhiyun 	struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
1369*4882a593Smuzhiyun 	int i, ret;
1370*4882a593Smuzhiyun 
1371*4882a593Smuzhiyun 	if (using_legacy_binding) {
1372*4882a593Smuzhiyun 		ret = arm_smmu_register_legacy_master(dev, &smmu);
1373*4882a593Smuzhiyun 
1374*4882a593Smuzhiyun 		/*
1375*4882a593Smuzhiyun 		 * If dev->iommu_fwspec is initally NULL, arm_smmu_register_legacy_master()
1376*4882a593Smuzhiyun 		 * will allocate/initialise a new one. Thus we need to update fwspec for
1377*4882a593Smuzhiyun 		 * later use.
1378*4882a593Smuzhiyun 		 */
1379*4882a593Smuzhiyun 		fwspec = dev_iommu_fwspec_get(dev);
1380*4882a593Smuzhiyun 		if (ret)
1381*4882a593Smuzhiyun 			goto out_free;
1382*4882a593Smuzhiyun 	} else if (fwspec && fwspec->ops == &arm_smmu_ops) {
1383*4882a593Smuzhiyun 		smmu = arm_smmu_get_by_fwnode(fwspec->iommu_fwnode);
1384*4882a593Smuzhiyun 	} else {
1385*4882a593Smuzhiyun 		return ERR_PTR(-ENODEV);
1386*4882a593Smuzhiyun 	}
1387*4882a593Smuzhiyun 
1388*4882a593Smuzhiyun 	ret = -EINVAL;
1389*4882a593Smuzhiyun 	for (i = 0; i < fwspec->num_ids; i++) {
1390*4882a593Smuzhiyun 		u16 sid = FIELD_GET(ARM_SMMU_SMR_ID, fwspec->ids[i]);
1391*4882a593Smuzhiyun 		u16 mask = FIELD_GET(ARM_SMMU_SMR_MASK, fwspec->ids[i]);
1392*4882a593Smuzhiyun 
1393*4882a593Smuzhiyun 		if (sid & ~smmu->streamid_mask) {
1394*4882a593Smuzhiyun 			dev_err(dev, "stream ID 0x%x out of range for SMMU (0x%x)\n",
1395*4882a593Smuzhiyun 				sid, smmu->streamid_mask);
1396*4882a593Smuzhiyun 			goto out_free;
1397*4882a593Smuzhiyun 		}
1398*4882a593Smuzhiyun 		if (mask & ~smmu->smr_mask_mask) {
1399*4882a593Smuzhiyun 			dev_err(dev, "SMR mask 0x%x out of range for SMMU (0x%x)\n",
1400*4882a593Smuzhiyun 				mask, smmu->smr_mask_mask);
1401*4882a593Smuzhiyun 			goto out_free;
1402*4882a593Smuzhiyun 		}
1403*4882a593Smuzhiyun 	}
1404*4882a593Smuzhiyun 
1405*4882a593Smuzhiyun 	ret = -ENOMEM;
1406*4882a593Smuzhiyun 	cfg = kzalloc(offsetof(struct arm_smmu_master_cfg, smendx[i]),
1407*4882a593Smuzhiyun 		      GFP_KERNEL);
1408*4882a593Smuzhiyun 	if (!cfg)
1409*4882a593Smuzhiyun 		goto out_free;
1410*4882a593Smuzhiyun 
1411*4882a593Smuzhiyun 	cfg->smmu = smmu;
1412*4882a593Smuzhiyun 	dev_iommu_priv_set(dev, cfg);
1413*4882a593Smuzhiyun 	while (i--)
1414*4882a593Smuzhiyun 		cfg->smendx[i] = INVALID_SMENDX;
1415*4882a593Smuzhiyun 
1416*4882a593Smuzhiyun 	ret = arm_smmu_rpm_get(smmu);
1417*4882a593Smuzhiyun 	if (ret < 0)
1418*4882a593Smuzhiyun 		goto out_cfg_free;
1419*4882a593Smuzhiyun 
1420*4882a593Smuzhiyun 	ret = arm_smmu_master_alloc_smes(dev);
1421*4882a593Smuzhiyun 	arm_smmu_rpm_put(smmu);
1422*4882a593Smuzhiyun 
1423*4882a593Smuzhiyun 	if (ret)
1424*4882a593Smuzhiyun 		goto out_cfg_free;
1425*4882a593Smuzhiyun 
1426*4882a593Smuzhiyun 	device_link_add(dev, smmu->dev,
1427*4882a593Smuzhiyun 			DL_FLAG_PM_RUNTIME | DL_FLAG_AUTOREMOVE_SUPPLIER);
1428*4882a593Smuzhiyun 
1429*4882a593Smuzhiyun 	return &smmu->iommu;
1430*4882a593Smuzhiyun 
1431*4882a593Smuzhiyun out_cfg_free:
1432*4882a593Smuzhiyun 	kfree(cfg);
1433*4882a593Smuzhiyun out_free:
1434*4882a593Smuzhiyun 	iommu_fwspec_free(dev);
1435*4882a593Smuzhiyun 	return ERR_PTR(ret);
1436*4882a593Smuzhiyun }
1437*4882a593Smuzhiyun 
arm_smmu_release_device(struct device * dev)1438*4882a593Smuzhiyun static void arm_smmu_release_device(struct device *dev)
1439*4882a593Smuzhiyun {
1440*4882a593Smuzhiyun 	struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
1441*4882a593Smuzhiyun 	struct arm_smmu_master_cfg *cfg;
1442*4882a593Smuzhiyun 	struct arm_smmu_device *smmu;
1443*4882a593Smuzhiyun 	int ret;
1444*4882a593Smuzhiyun 
1445*4882a593Smuzhiyun 	if (!fwspec || fwspec->ops != &arm_smmu_ops)
1446*4882a593Smuzhiyun 		return;
1447*4882a593Smuzhiyun 
1448*4882a593Smuzhiyun 	cfg  = dev_iommu_priv_get(dev);
1449*4882a593Smuzhiyun 	smmu = cfg->smmu;
1450*4882a593Smuzhiyun 
1451*4882a593Smuzhiyun 	ret = arm_smmu_rpm_get(smmu);
1452*4882a593Smuzhiyun 	if (ret < 0)
1453*4882a593Smuzhiyun 		return;
1454*4882a593Smuzhiyun 
1455*4882a593Smuzhiyun 	arm_smmu_master_free_smes(cfg, fwspec);
1456*4882a593Smuzhiyun 
1457*4882a593Smuzhiyun 	arm_smmu_rpm_put(smmu);
1458*4882a593Smuzhiyun 
1459*4882a593Smuzhiyun 	dev_iommu_priv_set(dev, NULL);
1460*4882a593Smuzhiyun 	kfree(cfg);
1461*4882a593Smuzhiyun 	iommu_fwspec_free(dev);
1462*4882a593Smuzhiyun }
1463*4882a593Smuzhiyun 
arm_smmu_device_group(struct device * dev)1464*4882a593Smuzhiyun static struct iommu_group *arm_smmu_device_group(struct device *dev)
1465*4882a593Smuzhiyun {
1466*4882a593Smuzhiyun 	struct arm_smmu_master_cfg *cfg = dev_iommu_priv_get(dev);
1467*4882a593Smuzhiyun 	struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
1468*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = cfg->smmu;
1469*4882a593Smuzhiyun 	struct iommu_group *group = NULL;
1470*4882a593Smuzhiyun 	int i, idx;
1471*4882a593Smuzhiyun 
1472*4882a593Smuzhiyun 	for_each_cfg_sme(cfg, fwspec, i, idx) {
1473*4882a593Smuzhiyun 		if (group && smmu->s2crs[idx].group &&
1474*4882a593Smuzhiyun 		    group != smmu->s2crs[idx].group)
1475*4882a593Smuzhiyun 			return ERR_PTR(-EINVAL);
1476*4882a593Smuzhiyun 
1477*4882a593Smuzhiyun 		group = smmu->s2crs[idx].group;
1478*4882a593Smuzhiyun 	}
1479*4882a593Smuzhiyun 
1480*4882a593Smuzhiyun 	if (group)
1481*4882a593Smuzhiyun 		return iommu_group_ref_get(group);
1482*4882a593Smuzhiyun 
1483*4882a593Smuzhiyun 	if (dev_is_pci(dev))
1484*4882a593Smuzhiyun 		group = pci_device_group(dev);
1485*4882a593Smuzhiyun 	else if (dev_is_fsl_mc(dev))
1486*4882a593Smuzhiyun 		group = fsl_mc_device_group(dev);
1487*4882a593Smuzhiyun 	else
1488*4882a593Smuzhiyun 		group = generic_device_group(dev);
1489*4882a593Smuzhiyun 
1490*4882a593Smuzhiyun 	/* Remember group for faster lookups */
1491*4882a593Smuzhiyun 	if (!IS_ERR(group))
1492*4882a593Smuzhiyun 		for_each_cfg_sme(cfg, fwspec, i, idx)
1493*4882a593Smuzhiyun 			smmu->s2crs[idx].group = group;
1494*4882a593Smuzhiyun 
1495*4882a593Smuzhiyun 	return group;
1496*4882a593Smuzhiyun }
1497*4882a593Smuzhiyun 
arm_smmu_domain_get_attr(struct iommu_domain * domain,enum iommu_attr attr,void * data)1498*4882a593Smuzhiyun static int arm_smmu_domain_get_attr(struct iommu_domain *domain,
1499*4882a593Smuzhiyun 				    enum iommu_attr attr, void *data)
1500*4882a593Smuzhiyun {
1501*4882a593Smuzhiyun 	struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
1502*4882a593Smuzhiyun 
1503*4882a593Smuzhiyun 	switch(domain->type) {
1504*4882a593Smuzhiyun 	case IOMMU_DOMAIN_UNMANAGED:
1505*4882a593Smuzhiyun 		switch (attr) {
1506*4882a593Smuzhiyun 		case DOMAIN_ATTR_NESTING:
1507*4882a593Smuzhiyun 			*(int *)data = (smmu_domain->stage == ARM_SMMU_DOMAIN_NESTED);
1508*4882a593Smuzhiyun 			return 0;
1509*4882a593Smuzhiyun 		default:
1510*4882a593Smuzhiyun 			return -ENODEV;
1511*4882a593Smuzhiyun 		}
1512*4882a593Smuzhiyun 		break;
1513*4882a593Smuzhiyun 	case IOMMU_DOMAIN_DMA:
1514*4882a593Smuzhiyun 		switch (attr) {
1515*4882a593Smuzhiyun 		case DOMAIN_ATTR_DMA_USE_FLUSH_QUEUE:
1516*4882a593Smuzhiyun 			*(int *)data = smmu_domain->non_strict;
1517*4882a593Smuzhiyun 			return 0;
1518*4882a593Smuzhiyun 		default:
1519*4882a593Smuzhiyun 			return -ENODEV;
1520*4882a593Smuzhiyun 		}
1521*4882a593Smuzhiyun 		break;
1522*4882a593Smuzhiyun 	default:
1523*4882a593Smuzhiyun 		return -EINVAL;
1524*4882a593Smuzhiyun 	}
1525*4882a593Smuzhiyun }
1526*4882a593Smuzhiyun 
arm_smmu_domain_set_attr(struct iommu_domain * domain,enum iommu_attr attr,void * data)1527*4882a593Smuzhiyun static int arm_smmu_domain_set_attr(struct iommu_domain *domain,
1528*4882a593Smuzhiyun 				    enum iommu_attr attr, void *data)
1529*4882a593Smuzhiyun {
1530*4882a593Smuzhiyun 	int ret = 0;
1531*4882a593Smuzhiyun 	struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
1532*4882a593Smuzhiyun 
1533*4882a593Smuzhiyun 	mutex_lock(&smmu_domain->init_mutex);
1534*4882a593Smuzhiyun 
1535*4882a593Smuzhiyun 	switch(domain->type) {
1536*4882a593Smuzhiyun 	case IOMMU_DOMAIN_UNMANAGED:
1537*4882a593Smuzhiyun 		switch (attr) {
1538*4882a593Smuzhiyun 		case DOMAIN_ATTR_NESTING:
1539*4882a593Smuzhiyun 			if (smmu_domain->smmu) {
1540*4882a593Smuzhiyun 				ret = -EPERM;
1541*4882a593Smuzhiyun 				goto out_unlock;
1542*4882a593Smuzhiyun 			}
1543*4882a593Smuzhiyun 
1544*4882a593Smuzhiyun 			if (*(int *)data)
1545*4882a593Smuzhiyun 				smmu_domain->stage = ARM_SMMU_DOMAIN_NESTED;
1546*4882a593Smuzhiyun 			else
1547*4882a593Smuzhiyun 				smmu_domain->stage = ARM_SMMU_DOMAIN_S1;
1548*4882a593Smuzhiyun 			break;
1549*4882a593Smuzhiyun 		default:
1550*4882a593Smuzhiyun 			ret = -ENODEV;
1551*4882a593Smuzhiyun 		}
1552*4882a593Smuzhiyun 		break;
1553*4882a593Smuzhiyun 	case IOMMU_DOMAIN_DMA:
1554*4882a593Smuzhiyun 		switch (attr) {
1555*4882a593Smuzhiyun 		case DOMAIN_ATTR_DMA_USE_FLUSH_QUEUE:
1556*4882a593Smuzhiyun 			smmu_domain->non_strict = *(int *)data;
1557*4882a593Smuzhiyun 			break;
1558*4882a593Smuzhiyun 		default:
1559*4882a593Smuzhiyun 			ret = -ENODEV;
1560*4882a593Smuzhiyun 		}
1561*4882a593Smuzhiyun 		break;
1562*4882a593Smuzhiyun 	default:
1563*4882a593Smuzhiyun 		ret = -EINVAL;
1564*4882a593Smuzhiyun 	}
1565*4882a593Smuzhiyun out_unlock:
1566*4882a593Smuzhiyun 	mutex_unlock(&smmu_domain->init_mutex);
1567*4882a593Smuzhiyun 	return ret;
1568*4882a593Smuzhiyun }
1569*4882a593Smuzhiyun 
arm_smmu_of_xlate(struct device * dev,struct of_phandle_args * args)1570*4882a593Smuzhiyun static int arm_smmu_of_xlate(struct device *dev, struct of_phandle_args *args)
1571*4882a593Smuzhiyun {
1572*4882a593Smuzhiyun 	u32 mask, fwid = 0;
1573*4882a593Smuzhiyun 
1574*4882a593Smuzhiyun 	if (args->args_count > 0)
1575*4882a593Smuzhiyun 		fwid |= FIELD_PREP(ARM_SMMU_SMR_ID, args->args[0]);
1576*4882a593Smuzhiyun 
1577*4882a593Smuzhiyun 	if (args->args_count > 1)
1578*4882a593Smuzhiyun 		fwid |= FIELD_PREP(ARM_SMMU_SMR_MASK, args->args[1]);
1579*4882a593Smuzhiyun 	else if (!of_property_read_u32(args->np, "stream-match-mask", &mask))
1580*4882a593Smuzhiyun 		fwid |= FIELD_PREP(ARM_SMMU_SMR_MASK, mask);
1581*4882a593Smuzhiyun 
1582*4882a593Smuzhiyun 	return iommu_fwspec_add_ids(dev, &fwid, 1);
1583*4882a593Smuzhiyun }
1584*4882a593Smuzhiyun 
arm_smmu_get_resv_regions(struct device * dev,struct list_head * head)1585*4882a593Smuzhiyun static void arm_smmu_get_resv_regions(struct device *dev,
1586*4882a593Smuzhiyun 				      struct list_head *head)
1587*4882a593Smuzhiyun {
1588*4882a593Smuzhiyun 	struct iommu_resv_region *region;
1589*4882a593Smuzhiyun 	int prot = IOMMU_WRITE | IOMMU_NOEXEC | IOMMU_MMIO;
1590*4882a593Smuzhiyun 
1591*4882a593Smuzhiyun 	region = iommu_alloc_resv_region(MSI_IOVA_BASE, MSI_IOVA_LENGTH,
1592*4882a593Smuzhiyun 					 prot, IOMMU_RESV_SW_MSI);
1593*4882a593Smuzhiyun 	if (!region)
1594*4882a593Smuzhiyun 		return;
1595*4882a593Smuzhiyun 
1596*4882a593Smuzhiyun 	list_add_tail(&region->list, head);
1597*4882a593Smuzhiyun 
1598*4882a593Smuzhiyun 	iommu_dma_get_resv_regions(dev, head);
1599*4882a593Smuzhiyun }
1600*4882a593Smuzhiyun 
arm_smmu_def_domain_type(struct device * dev)1601*4882a593Smuzhiyun static int arm_smmu_def_domain_type(struct device *dev)
1602*4882a593Smuzhiyun {
1603*4882a593Smuzhiyun 	struct arm_smmu_master_cfg *cfg = dev_iommu_priv_get(dev);
1604*4882a593Smuzhiyun 	const struct arm_smmu_impl *impl = cfg->smmu->impl;
1605*4882a593Smuzhiyun 
1606*4882a593Smuzhiyun 	if (impl && impl->def_domain_type)
1607*4882a593Smuzhiyun 		return impl->def_domain_type(dev);
1608*4882a593Smuzhiyun 
1609*4882a593Smuzhiyun 	return 0;
1610*4882a593Smuzhiyun }
1611*4882a593Smuzhiyun 
1612*4882a593Smuzhiyun static struct iommu_ops arm_smmu_ops = {
1613*4882a593Smuzhiyun 	.capable		= arm_smmu_capable,
1614*4882a593Smuzhiyun 	.domain_alloc		= arm_smmu_domain_alloc,
1615*4882a593Smuzhiyun 	.domain_free		= arm_smmu_domain_free,
1616*4882a593Smuzhiyun 	.attach_dev		= arm_smmu_attach_dev,
1617*4882a593Smuzhiyun 	.map_pages		= arm_smmu_map_pages,
1618*4882a593Smuzhiyun 	.unmap_pages		= arm_smmu_unmap_pages,
1619*4882a593Smuzhiyun 	.flush_iotlb_all	= arm_smmu_flush_iotlb_all,
1620*4882a593Smuzhiyun 	.iotlb_sync		= arm_smmu_iotlb_sync,
1621*4882a593Smuzhiyun 	.iova_to_phys		= arm_smmu_iova_to_phys,
1622*4882a593Smuzhiyun 	.probe_device		= arm_smmu_probe_device,
1623*4882a593Smuzhiyun 	.release_device		= arm_smmu_release_device,
1624*4882a593Smuzhiyun 	.device_group		= arm_smmu_device_group,
1625*4882a593Smuzhiyun 	.domain_get_attr	= arm_smmu_domain_get_attr,
1626*4882a593Smuzhiyun 	.domain_set_attr	= arm_smmu_domain_set_attr,
1627*4882a593Smuzhiyun 	.of_xlate		= arm_smmu_of_xlate,
1628*4882a593Smuzhiyun 	.get_resv_regions	= arm_smmu_get_resv_regions,
1629*4882a593Smuzhiyun 	.put_resv_regions	= generic_iommu_put_resv_regions,
1630*4882a593Smuzhiyun 	.def_domain_type	= arm_smmu_def_domain_type,
1631*4882a593Smuzhiyun 	.pgsize_bitmap		= -1UL, /* Restricted during device attach */
1632*4882a593Smuzhiyun };
1633*4882a593Smuzhiyun 
arm_smmu_device_reset(struct arm_smmu_device * smmu)1634*4882a593Smuzhiyun static void arm_smmu_device_reset(struct arm_smmu_device *smmu)
1635*4882a593Smuzhiyun {
1636*4882a593Smuzhiyun 	int i;
1637*4882a593Smuzhiyun 	u32 reg;
1638*4882a593Smuzhiyun 
1639*4882a593Smuzhiyun 	/* clear global FSR */
1640*4882a593Smuzhiyun 	reg = arm_smmu_gr0_read(smmu, ARM_SMMU_GR0_sGFSR);
1641*4882a593Smuzhiyun 	arm_smmu_gr0_write(smmu, ARM_SMMU_GR0_sGFSR, reg);
1642*4882a593Smuzhiyun 
1643*4882a593Smuzhiyun 	/*
1644*4882a593Smuzhiyun 	 * Reset stream mapping groups: Initial values mark all SMRn as
1645*4882a593Smuzhiyun 	 * invalid and all S2CRn as bypass unless overridden.
1646*4882a593Smuzhiyun 	 */
1647*4882a593Smuzhiyun 	for (i = 0; i < smmu->num_mapping_groups; ++i)
1648*4882a593Smuzhiyun 		arm_smmu_write_sme(smmu, i);
1649*4882a593Smuzhiyun 
1650*4882a593Smuzhiyun 	/* Make sure all context banks are disabled and clear CB_FSR  */
1651*4882a593Smuzhiyun 	for (i = 0; i < smmu->num_context_banks; ++i) {
1652*4882a593Smuzhiyun 		arm_smmu_write_context_bank(smmu, i);
1653*4882a593Smuzhiyun 		arm_smmu_cb_write(smmu, i, ARM_SMMU_CB_FSR, ARM_SMMU_FSR_FAULT);
1654*4882a593Smuzhiyun 	}
1655*4882a593Smuzhiyun 
1656*4882a593Smuzhiyun 	/* Invalidate the TLB, just in case */
1657*4882a593Smuzhiyun 	arm_smmu_gr0_write(smmu, ARM_SMMU_GR0_TLBIALLH, QCOM_DUMMY_VAL);
1658*4882a593Smuzhiyun 	arm_smmu_gr0_write(smmu, ARM_SMMU_GR0_TLBIALLNSNH, QCOM_DUMMY_VAL);
1659*4882a593Smuzhiyun 
1660*4882a593Smuzhiyun 	reg = arm_smmu_gr0_read(smmu, ARM_SMMU_GR0_sCR0);
1661*4882a593Smuzhiyun 
1662*4882a593Smuzhiyun 	/* Enable fault reporting */
1663*4882a593Smuzhiyun 	reg |= (ARM_SMMU_sCR0_GFRE | ARM_SMMU_sCR0_GFIE |
1664*4882a593Smuzhiyun 		ARM_SMMU_sCR0_GCFGFRE | ARM_SMMU_sCR0_GCFGFIE);
1665*4882a593Smuzhiyun 
1666*4882a593Smuzhiyun 	/* Disable TLB broadcasting. */
1667*4882a593Smuzhiyun 	reg |= (ARM_SMMU_sCR0_VMIDPNE | ARM_SMMU_sCR0_PTM);
1668*4882a593Smuzhiyun 
1669*4882a593Smuzhiyun 	/* Enable client access, handling unmatched streams as appropriate */
1670*4882a593Smuzhiyun 	reg &= ~ARM_SMMU_sCR0_CLIENTPD;
1671*4882a593Smuzhiyun 	if (disable_bypass)
1672*4882a593Smuzhiyun 		reg |= ARM_SMMU_sCR0_USFCFG;
1673*4882a593Smuzhiyun 	else
1674*4882a593Smuzhiyun 		reg &= ~ARM_SMMU_sCR0_USFCFG;
1675*4882a593Smuzhiyun 
1676*4882a593Smuzhiyun 	/* Disable forced broadcasting */
1677*4882a593Smuzhiyun 	reg &= ~ARM_SMMU_sCR0_FB;
1678*4882a593Smuzhiyun 
1679*4882a593Smuzhiyun 	/* Don't upgrade barriers */
1680*4882a593Smuzhiyun 	reg &= ~(ARM_SMMU_sCR0_BSU);
1681*4882a593Smuzhiyun 
1682*4882a593Smuzhiyun 	if (smmu->features & ARM_SMMU_FEAT_VMID16)
1683*4882a593Smuzhiyun 		reg |= ARM_SMMU_sCR0_VMID16EN;
1684*4882a593Smuzhiyun 
1685*4882a593Smuzhiyun 	if (smmu->features & ARM_SMMU_FEAT_EXIDS)
1686*4882a593Smuzhiyun 		reg |= ARM_SMMU_sCR0_EXIDENABLE;
1687*4882a593Smuzhiyun 
1688*4882a593Smuzhiyun 	if (smmu->impl && smmu->impl->reset)
1689*4882a593Smuzhiyun 		smmu->impl->reset(smmu);
1690*4882a593Smuzhiyun 
1691*4882a593Smuzhiyun 	/* Push the button */
1692*4882a593Smuzhiyun 	arm_smmu_tlb_sync_global(smmu);
1693*4882a593Smuzhiyun 	arm_smmu_gr0_write(smmu, ARM_SMMU_GR0_sCR0, reg);
1694*4882a593Smuzhiyun }
1695*4882a593Smuzhiyun 
arm_smmu_id_size_to_bits(int size)1696*4882a593Smuzhiyun static int arm_smmu_id_size_to_bits(int size)
1697*4882a593Smuzhiyun {
1698*4882a593Smuzhiyun 	switch (size) {
1699*4882a593Smuzhiyun 	case 0:
1700*4882a593Smuzhiyun 		return 32;
1701*4882a593Smuzhiyun 	case 1:
1702*4882a593Smuzhiyun 		return 36;
1703*4882a593Smuzhiyun 	case 2:
1704*4882a593Smuzhiyun 		return 40;
1705*4882a593Smuzhiyun 	case 3:
1706*4882a593Smuzhiyun 		return 42;
1707*4882a593Smuzhiyun 	case 4:
1708*4882a593Smuzhiyun 		return 44;
1709*4882a593Smuzhiyun 	case 5:
1710*4882a593Smuzhiyun 	default:
1711*4882a593Smuzhiyun 		return 48;
1712*4882a593Smuzhiyun 	}
1713*4882a593Smuzhiyun }
1714*4882a593Smuzhiyun 
arm_smmu_device_cfg_probe(struct arm_smmu_device * smmu)1715*4882a593Smuzhiyun static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)
1716*4882a593Smuzhiyun {
1717*4882a593Smuzhiyun 	unsigned int size;
1718*4882a593Smuzhiyun 	u32 id;
1719*4882a593Smuzhiyun 	bool cttw_reg, cttw_fw = smmu->features & ARM_SMMU_FEAT_COHERENT_WALK;
1720*4882a593Smuzhiyun 	int i, ret;
1721*4882a593Smuzhiyun 
1722*4882a593Smuzhiyun 	dev_notice(smmu->dev, "probing hardware configuration...\n");
1723*4882a593Smuzhiyun 	dev_notice(smmu->dev, "SMMUv%d with:\n",
1724*4882a593Smuzhiyun 			smmu->version == ARM_SMMU_V2 ? 2 : 1);
1725*4882a593Smuzhiyun 
1726*4882a593Smuzhiyun 	/* ID0 */
1727*4882a593Smuzhiyun 	id = arm_smmu_gr0_read(smmu, ARM_SMMU_GR0_ID0);
1728*4882a593Smuzhiyun 
1729*4882a593Smuzhiyun 	/* Restrict available stages based on module parameter */
1730*4882a593Smuzhiyun 	if (force_stage == 1)
1731*4882a593Smuzhiyun 		id &= ~(ARM_SMMU_ID0_S2TS | ARM_SMMU_ID0_NTS);
1732*4882a593Smuzhiyun 	else if (force_stage == 2)
1733*4882a593Smuzhiyun 		id &= ~(ARM_SMMU_ID0_S1TS | ARM_SMMU_ID0_NTS);
1734*4882a593Smuzhiyun 
1735*4882a593Smuzhiyun 	if (id & ARM_SMMU_ID0_S1TS) {
1736*4882a593Smuzhiyun 		smmu->features |= ARM_SMMU_FEAT_TRANS_S1;
1737*4882a593Smuzhiyun 		dev_notice(smmu->dev, "\tstage 1 translation\n");
1738*4882a593Smuzhiyun 	}
1739*4882a593Smuzhiyun 
1740*4882a593Smuzhiyun 	if (id & ARM_SMMU_ID0_S2TS) {
1741*4882a593Smuzhiyun 		smmu->features |= ARM_SMMU_FEAT_TRANS_S2;
1742*4882a593Smuzhiyun 		dev_notice(smmu->dev, "\tstage 2 translation\n");
1743*4882a593Smuzhiyun 	}
1744*4882a593Smuzhiyun 
1745*4882a593Smuzhiyun 	if (id & ARM_SMMU_ID0_NTS) {
1746*4882a593Smuzhiyun 		smmu->features |= ARM_SMMU_FEAT_TRANS_NESTED;
1747*4882a593Smuzhiyun 		dev_notice(smmu->dev, "\tnested translation\n");
1748*4882a593Smuzhiyun 	}
1749*4882a593Smuzhiyun 
1750*4882a593Smuzhiyun 	if (!(smmu->features &
1751*4882a593Smuzhiyun 		(ARM_SMMU_FEAT_TRANS_S1 | ARM_SMMU_FEAT_TRANS_S2))) {
1752*4882a593Smuzhiyun 		dev_err(smmu->dev, "\tno translation support!\n");
1753*4882a593Smuzhiyun 		return -ENODEV;
1754*4882a593Smuzhiyun 	}
1755*4882a593Smuzhiyun 
1756*4882a593Smuzhiyun 	if ((id & ARM_SMMU_ID0_S1TS) &&
1757*4882a593Smuzhiyun 	    ((smmu->version < ARM_SMMU_V2) || !(id & ARM_SMMU_ID0_ATOSNS))) {
1758*4882a593Smuzhiyun 		smmu->features |= ARM_SMMU_FEAT_TRANS_OPS;
1759*4882a593Smuzhiyun 		dev_notice(smmu->dev, "\taddress translation ops\n");
1760*4882a593Smuzhiyun 	}
1761*4882a593Smuzhiyun 
1762*4882a593Smuzhiyun 	/*
1763*4882a593Smuzhiyun 	 * In order for DMA API calls to work properly, we must defer to what
1764*4882a593Smuzhiyun 	 * the FW says about coherency, regardless of what the hardware claims.
1765*4882a593Smuzhiyun 	 * Fortunately, this also opens up a workaround for systems where the
1766*4882a593Smuzhiyun 	 * ID register value has ended up configured incorrectly.
1767*4882a593Smuzhiyun 	 */
1768*4882a593Smuzhiyun 	cttw_reg = !!(id & ARM_SMMU_ID0_CTTW);
1769*4882a593Smuzhiyun 	if (cttw_fw || cttw_reg)
1770*4882a593Smuzhiyun 		dev_notice(smmu->dev, "\t%scoherent table walk\n",
1771*4882a593Smuzhiyun 			   cttw_fw ? "" : "non-");
1772*4882a593Smuzhiyun 	if (cttw_fw != cttw_reg)
1773*4882a593Smuzhiyun 		dev_notice(smmu->dev,
1774*4882a593Smuzhiyun 			   "\t(IDR0.CTTW overridden by FW configuration)\n");
1775*4882a593Smuzhiyun 
1776*4882a593Smuzhiyun 	/* Max. number of entries we have for stream matching/indexing */
1777*4882a593Smuzhiyun 	if (smmu->version == ARM_SMMU_V2 && id & ARM_SMMU_ID0_EXIDS) {
1778*4882a593Smuzhiyun 		smmu->features |= ARM_SMMU_FEAT_EXIDS;
1779*4882a593Smuzhiyun 		size = 1 << 16;
1780*4882a593Smuzhiyun 	} else {
1781*4882a593Smuzhiyun 		size = 1 << FIELD_GET(ARM_SMMU_ID0_NUMSIDB, id);
1782*4882a593Smuzhiyun 	}
1783*4882a593Smuzhiyun 	smmu->streamid_mask = size - 1;
1784*4882a593Smuzhiyun 	if (id & ARM_SMMU_ID0_SMS) {
1785*4882a593Smuzhiyun 		smmu->features |= ARM_SMMU_FEAT_STREAM_MATCH;
1786*4882a593Smuzhiyun 		size = FIELD_GET(ARM_SMMU_ID0_NUMSMRG, id);
1787*4882a593Smuzhiyun 		if (size == 0) {
1788*4882a593Smuzhiyun 			dev_err(smmu->dev,
1789*4882a593Smuzhiyun 				"stream-matching supported, but no SMRs present!\n");
1790*4882a593Smuzhiyun 			return -ENODEV;
1791*4882a593Smuzhiyun 		}
1792*4882a593Smuzhiyun 
1793*4882a593Smuzhiyun 		/* Zero-initialised to mark as invalid */
1794*4882a593Smuzhiyun 		smmu->smrs = devm_kcalloc(smmu->dev, size, sizeof(*smmu->smrs),
1795*4882a593Smuzhiyun 					  GFP_KERNEL);
1796*4882a593Smuzhiyun 		if (!smmu->smrs)
1797*4882a593Smuzhiyun 			return -ENOMEM;
1798*4882a593Smuzhiyun 
1799*4882a593Smuzhiyun 		dev_notice(smmu->dev,
1800*4882a593Smuzhiyun 			   "\tstream matching with %u register groups", size);
1801*4882a593Smuzhiyun 	}
1802*4882a593Smuzhiyun 	/* s2cr->type == 0 means translation, so initialise explicitly */
1803*4882a593Smuzhiyun 	smmu->s2crs = devm_kmalloc_array(smmu->dev, size, sizeof(*smmu->s2crs),
1804*4882a593Smuzhiyun 					 GFP_KERNEL);
1805*4882a593Smuzhiyun 	if (!smmu->s2crs)
1806*4882a593Smuzhiyun 		return -ENOMEM;
1807*4882a593Smuzhiyun 	for (i = 0; i < size; i++)
1808*4882a593Smuzhiyun 		smmu->s2crs[i] = s2cr_init_val;
1809*4882a593Smuzhiyun 
1810*4882a593Smuzhiyun 	smmu->num_mapping_groups = size;
1811*4882a593Smuzhiyun 	mutex_init(&smmu->stream_map_mutex);
1812*4882a593Smuzhiyun 	spin_lock_init(&smmu->global_sync_lock);
1813*4882a593Smuzhiyun 
1814*4882a593Smuzhiyun 	if (smmu->version < ARM_SMMU_V2 ||
1815*4882a593Smuzhiyun 	    !(id & ARM_SMMU_ID0_PTFS_NO_AARCH32)) {
1816*4882a593Smuzhiyun 		smmu->features |= ARM_SMMU_FEAT_FMT_AARCH32_L;
1817*4882a593Smuzhiyun 		if (!(id & ARM_SMMU_ID0_PTFS_NO_AARCH32S))
1818*4882a593Smuzhiyun 			smmu->features |= ARM_SMMU_FEAT_FMT_AARCH32_S;
1819*4882a593Smuzhiyun 	}
1820*4882a593Smuzhiyun 
1821*4882a593Smuzhiyun 	/* ID1 */
1822*4882a593Smuzhiyun 	id = arm_smmu_gr0_read(smmu, ARM_SMMU_GR0_ID1);
1823*4882a593Smuzhiyun 	smmu->pgshift = (id & ARM_SMMU_ID1_PAGESIZE) ? 16 : 12;
1824*4882a593Smuzhiyun 
1825*4882a593Smuzhiyun 	/* Check for size mismatch of SMMU address space from mapped region */
1826*4882a593Smuzhiyun 	size = 1 << (FIELD_GET(ARM_SMMU_ID1_NUMPAGENDXB, id) + 1);
1827*4882a593Smuzhiyun 	if (smmu->numpage != 2 * size << smmu->pgshift)
1828*4882a593Smuzhiyun 		dev_warn(smmu->dev,
1829*4882a593Smuzhiyun 			"SMMU address space size (0x%x) differs from mapped region size (0x%x)!\n",
1830*4882a593Smuzhiyun 			2 * size << smmu->pgshift, smmu->numpage);
1831*4882a593Smuzhiyun 	/* Now properly encode NUMPAGE to subsequently derive SMMU_CB_BASE */
1832*4882a593Smuzhiyun 	smmu->numpage = size;
1833*4882a593Smuzhiyun 
1834*4882a593Smuzhiyun 	smmu->num_s2_context_banks = FIELD_GET(ARM_SMMU_ID1_NUMS2CB, id);
1835*4882a593Smuzhiyun 	smmu->num_context_banks = FIELD_GET(ARM_SMMU_ID1_NUMCB, id);
1836*4882a593Smuzhiyun 	if (smmu->num_s2_context_banks > smmu->num_context_banks) {
1837*4882a593Smuzhiyun 		dev_err(smmu->dev, "impossible number of S2 context banks!\n");
1838*4882a593Smuzhiyun 		return -ENODEV;
1839*4882a593Smuzhiyun 	}
1840*4882a593Smuzhiyun 	dev_notice(smmu->dev, "\t%u context banks (%u stage-2 only)\n",
1841*4882a593Smuzhiyun 		   smmu->num_context_banks, smmu->num_s2_context_banks);
1842*4882a593Smuzhiyun 	smmu->cbs = devm_kcalloc(smmu->dev, smmu->num_context_banks,
1843*4882a593Smuzhiyun 				 sizeof(*smmu->cbs), GFP_KERNEL);
1844*4882a593Smuzhiyun 	if (!smmu->cbs)
1845*4882a593Smuzhiyun 		return -ENOMEM;
1846*4882a593Smuzhiyun 
1847*4882a593Smuzhiyun 	/* ID2 */
1848*4882a593Smuzhiyun 	id = arm_smmu_gr0_read(smmu, ARM_SMMU_GR0_ID2);
1849*4882a593Smuzhiyun 	size = arm_smmu_id_size_to_bits(FIELD_GET(ARM_SMMU_ID2_IAS, id));
1850*4882a593Smuzhiyun 	smmu->ipa_size = size;
1851*4882a593Smuzhiyun 
1852*4882a593Smuzhiyun 	/* The output mask is also applied for bypass */
1853*4882a593Smuzhiyun 	size = arm_smmu_id_size_to_bits(FIELD_GET(ARM_SMMU_ID2_OAS, id));
1854*4882a593Smuzhiyun 	smmu->pa_size = size;
1855*4882a593Smuzhiyun 
1856*4882a593Smuzhiyun 	if (id & ARM_SMMU_ID2_VMID16)
1857*4882a593Smuzhiyun 		smmu->features |= ARM_SMMU_FEAT_VMID16;
1858*4882a593Smuzhiyun 
1859*4882a593Smuzhiyun 	/*
1860*4882a593Smuzhiyun 	 * What the page table walker can address actually depends on which
1861*4882a593Smuzhiyun 	 * descriptor format is in use, but since a) we don't know that yet,
1862*4882a593Smuzhiyun 	 * and b) it can vary per context bank, this will have to do...
1863*4882a593Smuzhiyun 	 */
1864*4882a593Smuzhiyun 	if (dma_set_mask_and_coherent(smmu->dev, DMA_BIT_MASK(size)))
1865*4882a593Smuzhiyun 		dev_warn(smmu->dev,
1866*4882a593Smuzhiyun 			 "failed to set DMA mask for table walker\n");
1867*4882a593Smuzhiyun 
1868*4882a593Smuzhiyun 	if (smmu->version < ARM_SMMU_V2) {
1869*4882a593Smuzhiyun 		smmu->va_size = smmu->ipa_size;
1870*4882a593Smuzhiyun 		if (smmu->version == ARM_SMMU_V1_64K)
1871*4882a593Smuzhiyun 			smmu->features |= ARM_SMMU_FEAT_FMT_AARCH64_64K;
1872*4882a593Smuzhiyun 	} else {
1873*4882a593Smuzhiyun 		size = FIELD_GET(ARM_SMMU_ID2_UBS, id);
1874*4882a593Smuzhiyun 		smmu->va_size = arm_smmu_id_size_to_bits(size);
1875*4882a593Smuzhiyun 		if (id & ARM_SMMU_ID2_PTFS_4K)
1876*4882a593Smuzhiyun 			smmu->features |= ARM_SMMU_FEAT_FMT_AARCH64_4K;
1877*4882a593Smuzhiyun 		if (id & ARM_SMMU_ID2_PTFS_16K)
1878*4882a593Smuzhiyun 			smmu->features |= ARM_SMMU_FEAT_FMT_AARCH64_16K;
1879*4882a593Smuzhiyun 		if (id & ARM_SMMU_ID2_PTFS_64K)
1880*4882a593Smuzhiyun 			smmu->features |= ARM_SMMU_FEAT_FMT_AARCH64_64K;
1881*4882a593Smuzhiyun 	}
1882*4882a593Smuzhiyun 
1883*4882a593Smuzhiyun 	if (smmu->impl && smmu->impl->cfg_probe) {
1884*4882a593Smuzhiyun 		ret = smmu->impl->cfg_probe(smmu);
1885*4882a593Smuzhiyun 		if (ret)
1886*4882a593Smuzhiyun 			return ret;
1887*4882a593Smuzhiyun 	}
1888*4882a593Smuzhiyun 
1889*4882a593Smuzhiyun 	/* Now we've corralled the various formats, what'll it do? */
1890*4882a593Smuzhiyun 	if (smmu->features & ARM_SMMU_FEAT_FMT_AARCH32_S)
1891*4882a593Smuzhiyun 		smmu->pgsize_bitmap |= SZ_4K | SZ_64K | SZ_1M | SZ_16M;
1892*4882a593Smuzhiyun 	if (smmu->features &
1893*4882a593Smuzhiyun 	    (ARM_SMMU_FEAT_FMT_AARCH32_L | ARM_SMMU_FEAT_FMT_AARCH64_4K))
1894*4882a593Smuzhiyun 		smmu->pgsize_bitmap |= SZ_4K | SZ_2M | SZ_1G;
1895*4882a593Smuzhiyun 	if (smmu->features & ARM_SMMU_FEAT_FMT_AARCH64_16K)
1896*4882a593Smuzhiyun 		smmu->pgsize_bitmap |= SZ_16K | SZ_32M;
1897*4882a593Smuzhiyun 	if (smmu->features & ARM_SMMU_FEAT_FMT_AARCH64_64K)
1898*4882a593Smuzhiyun 		smmu->pgsize_bitmap |= SZ_64K | SZ_512M;
1899*4882a593Smuzhiyun 
1900*4882a593Smuzhiyun 	if (arm_smmu_ops.pgsize_bitmap == -1UL)
1901*4882a593Smuzhiyun 		arm_smmu_ops.pgsize_bitmap = smmu->pgsize_bitmap;
1902*4882a593Smuzhiyun 	else
1903*4882a593Smuzhiyun 		arm_smmu_ops.pgsize_bitmap |= smmu->pgsize_bitmap;
1904*4882a593Smuzhiyun 	dev_notice(smmu->dev, "\tSupported page sizes: 0x%08lx\n",
1905*4882a593Smuzhiyun 		   smmu->pgsize_bitmap);
1906*4882a593Smuzhiyun 
1907*4882a593Smuzhiyun 
1908*4882a593Smuzhiyun 	if (smmu->features & ARM_SMMU_FEAT_TRANS_S1)
1909*4882a593Smuzhiyun 		dev_notice(smmu->dev, "\tStage-1: %lu-bit VA -> %lu-bit IPA\n",
1910*4882a593Smuzhiyun 			   smmu->va_size, smmu->ipa_size);
1911*4882a593Smuzhiyun 
1912*4882a593Smuzhiyun 	if (smmu->features & ARM_SMMU_FEAT_TRANS_S2)
1913*4882a593Smuzhiyun 		dev_notice(smmu->dev, "\tStage-2: %lu-bit IPA -> %lu-bit PA\n",
1914*4882a593Smuzhiyun 			   smmu->ipa_size, smmu->pa_size);
1915*4882a593Smuzhiyun 
1916*4882a593Smuzhiyun 	return 0;
1917*4882a593Smuzhiyun }
1918*4882a593Smuzhiyun 
1919*4882a593Smuzhiyun struct arm_smmu_match_data {
1920*4882a593Smuzhiyun 	enum arm_smmu_arch_version version;
1921*4882a593Smuzhiyun 	enum arm_smmu_implementation model;
1922*4882a593Smuzhiyun };
1923*4882a593Smuzhiyun 
1924*4882a593Smuzhiyun #define ARM_SMMU_MATCH_DATA(name, ver, imp)	\
1925*4882a593Smuzhiyun static const struct arm_smmu_match_data name = { .version = ver, .model = imp }
1926*4882a593Smuzhiyun 
1927*4882a593Smuzhiyun ARM_SMMU_MATCH_DATA(smmu_generic_v1, ARM_SMMU_V1, GENERIC_SMMU);
1928*4882a593Smuzhiyun ARM_SMMU_MATCH_DATA(smmu_generic_v2, ARM_SMMU_V2, GENERIC_SMMU);
1929*4882a593Smuzhiyun ARM_SMMU_MATCH_DATA(arm_mmu401, ARM_SMMU_V1_64K, GENERIC_SMMU);
1930*4882a593Smuzhiyun ARM_SMMU_MATCH_DATA(arm_mmu500, ARM_SMMU_V2, ARM_MMU500);
1931*4882a593Smuzhiyun ARM_SMMU_MATCH_DATA(cavium_smmuv2, ARM_SMMU_V2, CAVIUM_SMMUV2);
1932*4882a593Smuzhiyun ARM_SMMU_MATCH_DATA(qcom_smmuv2, ARM_SMMU_V2, QCOM_SMMUV2);
1933*4882a593Smuzhiyun 
1934*4882a593Smuzhiyun static const struct of_device_id arm_smmu_of_match[] = {
1935*4882a593Smuzhiyun 	{ .compatible = "arm,smmu-v1", .data = &smmu_generic_v1 },
1936*4882a593Smuzhiyun 	{ .compatible = "arm,smmu-v2", .data = &smmu_generic_v2 },
1937*4882a593Smuzhiyun 	{ .compatible = "arm,mmu-400", .data = &smmu_generic_v1 },
1938*4882a593Smuzhiyun 	{ .compatible = "arm,mmu-401", .data = &arm_mmu401 },
1939*4882a593Smuzhiyun 	{ .compatible = "arm,mmu-500", .data = &arm_mmu500 },
1940*4882a593Smuzhiyun 	{ .compatible = "cavium,smmu-v2", .data = &cavium_smmuv2 },
1941*4882a593Smuzhiyun 	{ .compatible = "nvidia,smmu-500", .data = &arm_mmu500 },
1942*4882a593Smuzhiyun 	{ .compatible = "qcom,smmu-v2", .data = &qcom_smmuv2 },
1943*4882a593Smuzhiyun 	{ },
1944*4882a593Smuzhiyun };
1945*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, arm_smmu_of_match);
1946*4882a593Smuzhiyun 
1947*4882a593Smuzhiyun #ifdef CONFIG_ACPI
acpi_smmu_get_data(u32 model,struct arm_smmu_device * smmu)1948*4882a593Smuzhiyun static int acpi_smmu_get_data(u32 model, struct arm_smmu_device *smmu)
1949*4882a593Smuzhiyun {
1950*4882a593Smuzhiyun 	int ret = 0;
1951*4882a593Smuzhiyun 
1952*4882a593Smuzhiyun 	switch (model) {
1953*4882a593Smuzhiyun 	case ACPI_IORT_SMMU_V1:
1954*4882a593Smuzhiyun 	case ACPI_IORT_SMMU_CORELINK_MMU400:
1955*4882a593Smuzhiyun 		smmu->version = ARM_SMMU_V1;
1956*4882a593Smuzhiyun 		smmu->model = GENERIC_SMMU;
1957*4882a593Smuzhiyun 		break;
1958*4882a593Smuzhiyun 	case ACPI_IORT_SMMU_CORELINK_MMU401:
1959*4882a593Smuzhiyun 		smmu->version = ARM_SMMU_V1_64K;
1960*4882a593Smuzhiyun 		smmu->model = GENERIC_SMMU;
1961*4882a593Smuzhiyun 		break;
1962*4882a593Smuzhiyun 	case ACPI_IORT_SMMU_V2:
1963*4882a593Smuzhiyun 		smmu->version = ARM_SMMU_V2;
1964*4882a593Smuzhiyun 		smmu->model = GENERIC_SMMU;
1965*4882a593Smuzhiyun 		break;
1966*4882a593Smuzhiyun 	case ACPI_IORT_SMMU_CORELINK_MMU500:
1967*4882a593Smuzhiyun 		smmu->version = ARM_SMMU_V2;
1968*4882a593Smuzhiyun 		smmu->model = ARM_MMU500;
1969*4882a593Smuzhiyun 		break;
1970*4882a593Smuzhiyun 	case ACPI_IORT_SMMU_CAVIUM_THUNDERX:
1971*4882a593Smuzhiyun 		smmu->version = ARM_SMMU_V2;
1972*4882a593Smuzhiyun 		smmu->model = CAVIUM_SMMUV2;
1973*4882a593Smuzhiyun 		break;
1974*4882a593Smuzhiyun 	default:
1975*4882a593Smuzhiyun 		ret = -ENODEV;
1976*4882a593Smuzhiyun 	}
1977*4882a593Smuzhiyun 
1978*4882a593Smuzhiyun 	return ret;
1979*4882a593Smuzhiyun }
1980*4882a593Smuzhiyun 
arm_smmu_device_acpi_probe(struct platform_device * pdev,struct arm_smmu_device * smmu)1981*4882a593Smuzhiyun static int arm_smmu_device_acpi_probe(struct platform_device *pdev,
1982*4882a593Smuzhiyun 				      struct arm_smmu_device *smmu)
1983*4882a593Smuzhiyun {
1984*4882a593Smuzhiyun 	struct device *dev = smmu->dev;
1985*4882a593Smuzhiyun 	struct acpi_iort_node *node =
1986*4882a593Smuzhiyun 		*(struct acpi_iort_node **)dev_get_platdata(dev);
1987*4882a593Smuzhiyun 	struct acpi_iort_smmu *iort_smmu;
1988*4882a593Smuzhiyun 	int ret;
1989*4882a593Smuzhiyun 
1990*4882a593Smuzhiyun 	/* Retrieve SMMU1/2 specific data */
1991*4882a593Smuzhiyun 	iort_smmu = (struct acpi_iort_smmu *)node->node_data;
1992*4882a593Smuzhiyun 
1993*4882a593Smuzhiyun 	ret = acpi_smmu_get_data(iort_smmu->model, smmu);
1994*4882a593Smuzhiyun 	if (ret < 0)
1995*4882a593Smuzhiyun 		return ret;
1996*4882a593Smuzhiyun 
1997*4882a593Smuzhiyun 	/* Ignore the configuration access interrupt */
1998*4882a593Smuzhiyun 	smmu->num_global_irqs = 1;
1999*4882a593Smuzhiyun 
2000*4882a593Smuzhiyun 	if (iort_smmu->flags & ACPI_IORT_SMMU_COHERENT_WALK)
2001*4882a593Smuzhiyun 		smmu->features |= ARM_SMMU_FEAT_COHERENT_WALK;
2002*4882a593Smuzhiyun 
2003*4882a593Smuzhiyun 	return 0;
2004*4882a593Smuzhiyun }
2005*4882a593Smuzhiyun #else
arm_smmu_device_acpi_probe(struct platform_device * pdev,struct arm_smmu_device * smmu)2006*4882a593Smuzhiyun static inline int arm_smmu_device_acpi_probe(struct platform_device *pdev,
2007*4882a593Smuzhiyun 					     struct arm_smmu_device *smmu)
2008*4882a593Smuzhiyun {
2009*4882a593Smuzhiyun 	return -ENODEV;
2010*4882a593Smuzhiyun }
2011*4882a593Smuzhiyun #endif
2012*4882a593Smuzhiyun 
arm_smmu_device_dt_probe(struct platform_device * pdev,struct arm_smmu_device * smmu)2013*4882a593Smuzhiyun static int arm_smmu_device_dt_probe(struct platform_device *pdev,
2014*4882a593Smuzhiyun 				    struct arm_smmu_device *smmu)
2015*4882a593Smuzhiyun {
2016*4882a593Smuzhiyun 	const struct arm_smmu_match_data *data;
2017*4882a593Smuzhiyun 	struct device *dev = &pdev->dev;
2018*4882a593Smuzhiyun 	bool legacy_binding;
2019*4882a593Smuzhiyun 
2020*4882a593Smuzhiyun 	if (of_property_read_u32(dev->of_node, "#global-interrupts",
2021*4882a593Smuzhiyun 				 &smmu->num_global_irqs)) {
2022*4882a593Smuzhiyun 		dev_err(dev, "missing #global-interrupts property\n");
2023*4882a593Smuzhiyun 		return -ENODEV;
2024*4882a593Smuzhiyun 	}
2025*4882a593Smuzhiyun 
2026*4882a593Smuzhiyun 	data = of_device_get_match_data(dev);
2027*4882a593Smuzhiyun 	smmu->version = data->version;
2028*4882a593Smuzhiyun 	smmu->model = data->model;
2029*4882a593Smuzhiyun 
2030*4882a593Smuzhiyun 	legacy_binding = of_find_property(dev->of_node, "mmu-masters", NULL);
2031*4882a593Smuzhiyun 	if (legacy_binding && !using_generic_binding) {
2032*4882a593Smuzhiyun 		if (!using_legacy_binding) {
2033*4882a593Smuzhiyun 			pr_notice("deprecated \"mmu-masters\" DT property in use; %s support unavailable\n",
2034*4882a593Smuzhiyun 				  IS_ENABLED(CONFIG_ARM_SMMU_LEGACY_DT_BINDINGS) ? "DMA API" : "SMMU");
2035*4882a593Smuzhiyun 		}
2036*4882a593Smuzhiyun 		using_legacy_binding = true;
2037*4882a593Smuzhiyun 	} else if (!legacy_binding && !using_legacy_binding) {
2038*4882a593Smuzhiyun 		using_generic_binding = true;
2039*4882a593Smuzhiyun 	} else {
2040*4882a593Smuzhiyun 		dev_err(dev, "not probing due to mismatched DT properties\n");
2041*4882a593Smuzhiyun 		return -ENODEV;
2042*4882a593Smuzhiyun 	}
2043*4882a593Smuzhiyun 
2044*4882a593Smuzhiyun 	if (of_dma_is_coherent(dev->of_node))
2045*4882a593Smuzhiyun 		smmu->features |= ARM_SMMU_FEAT_COHERENT_WALK;
2046*4882a593Smuzhiyun 
2047*4882a593Smuzhiyun 	return 0;
2048*4882a593Smuzhiyun }
2049*4882a593Smuzhiyun 
arm_smmu_bus_init(struct iommu_ops * ops)2050*4882a593Smuzhiyun static int arm_smmu_bus_init(struct iommu_ops *ops)
2051*4882a593Smuzhiyun {
2052*4882a593Smuzhiyun 	int err;
2053*4882a593Smuzhiyun 
2054*4882a593Smuzhiyun 	/* Oh, for a proper bus abstraction */
2055*4882a593Smuzhiyun 	if (!iommu_present(&platform_bus_type)) {
2056*4882a593Smuzhiyun 		err = bus_set_iommu(&platform_bus_type, ops);
2057*4882a593Smuzhiyun 		if (err)
2058*4882a593Smuzhiyun 			return err;
2059*4882a593Smuzhiyun 	}
2060*4882a593Smuzhiyun #ifdef CONFIG_ARM_AMBA
2061*4882a593Smuzhiyun 	if (!iommu_present(&amba_bustype)) {
2062*4882a593Smuzhiyun 		err = bus_set_iommu(&amba_bustype, ops);
2063*4882a593Smuzhiyun 		if (err)
2064*4882a593Smuzhiyun 			goto err_reset_platform_ops;
2065*4882a593Smuzhiyun 	}
2066*4882a593Smuzhiyun #endif
2067*4882a593Smuzhiyun #ifdef CONFIG_PCI
2068*4882a593Smuzhiyun 	if (!iommu_present(&pci_bus_type)) {
2069*4882a593Smuzhiyun 		err = bus_set_iommu(&pci_bus_type, ops);
2070*4882a593Smuzhiyun 		if (err)
2071*4882a593Smuzhiyun 			goto err_reset_amba_ops;
2072*4882a593Smuzhiyun 	}
2073*4882a593Smuzhiyun #endif
2074*4882a593Smuzhiyun #ifdef CONFIG_FSL_MC_BUS
2075*4882a593Smuzhiyun 	if (!iommu_present(&fsl_mc_bus_type)) {
2076*4882a593Smuzhiyun 		err = bus_set_iommu(&fsl_mc_bus_type, ops);
2077*4882a593Smuzhiyun 		if (err)
2078*4882a593Smuzhiyun 			goto err_reset_pci_ops;
2079*4882a593Smuzhiyun 	}
2080*4882a593Smuzhiyun #endif
2081*4882a593Smuzhiyun 	return 0;
2082*4882a593Smuzhiyun 
2083*4882a593Smuzhiyun err_reset_pci_ops: __maybe_unused;
2084*4882a593Smuzhiyun #ifdef CONFIG_PCI
2085*4882a593Smuzhiyun 	bus_set_iommu(&pci_bus_type, NULL);
2086*4882a593Smuzhiyun #endif
2087*4882a593Smuzhiyun err_reset_amba_ops: __maybe_unused;
2088*4882a593Smuzhiyun #ifdef CONFIG_ARM_AMBA
2089*4882a593Smuzhiyun 	bus_set_iommu(&amba_bustype, NULL);
2090*4882a593Smuzhiyun #endif
2091*4882a593Smuzhiyun err_reset_platform_ops: __maybe_unused;
2092*4882a593Smuzhiyun 	bus_set_iommu(&platform_bus_type, NULL);
2093*4882a593Smuzhiyun 	return err;
2094*4882a593Smuzhiyun }
2095*4882a593Smuzhiyun 
arm_smmu_device_probe(struct platform_device * pdev)2096*4882a593Smuzhiyun static int arm_smmu_device_probe(struct platform_device *pdev)
2097*4882a593Smuzhiyun {
2098*4882a593Smuzhiyun 	struct resource *res;
2099*4882a593Smuzhiyun 	resource_size_t ioaddr;
2100*4882a593Smuzhiyun 	struct arm_smmu_device *smmu;
2101*4882a593Smuzhiyun 	struct device *dev = &pdev->dev;
2102*4882a593Smuzhiyun 	int num_irqs, i, err;
2103*4882a593Smuzhiyun 	irqreturn_t (*global_fault)(int irq, void *dev);
2104*4882a593Smuzhiyun 
2105*4882a593Smuzhiyun 	smmu = devm_kzalloc(dev, sizeof(*smmu), GFP_KERNEL);
2106*4882a593Smuzhiyun 	if (!smmu) {
2107*4882a593Smuzhiyun 		dev_err(dev, "failed to allocate arm_smmu_device\n");
2108*4882a593Smuzhiyun 		return -ENOMEM;
2109*4882a593Smuzhiyun 	}
2110*4882a593Smuzhiyun 	smmu->dev = dev;
2111*4882a593Smuzhiyun 
2112*4882a593Smuzhiyun 	if (dev->of_node)
2113*4882a593Smuzhiyun 		err = arm_smmu_device_dt_probe(pdev, smmu);
2114*4882a593Smuzhiyun 	else
2115*4882a593Smuzhiyun 		err = arm_smmu_device_acpi_probe(pdev, smmu);
2116*4882a593Smuzhiyun 
2117*4882a593Smuzhiyun 	if (err)
2118*4882a593Smuzhiyun 		return err;
2119*4882a593Smuzhiyun 
2120*4882a593Smuzhiyun 	smmu->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
2121*4882a593Smuzhiyun 	if (IS_ERR(smmu->base))
2122*4882a593Smuzhiyun 		return PTR_ERR(smmu->base);
2123*4882a593Smuzhiyun 	ioaddr = res->start;
2124*4882a593Smuzhiyun 	/*
2125*4882a593Smuzhiyun 	 * The resource size should effectively match the value of SMMU_TOP;
2126*4882a593Smuzhiyun 	 * stash that temporarily until we know PAGESIZE to validate it with.
2127*4882a593Smuzhiyun 	 */
2128*4882a593Smuzhiyun 	smmu->numpage = resource_size(res);
2129*4882a593Smuzhiyun 
2130*4882a593Smuzhiyun 	smmu = arm_smmu_impl_init(smmu);
2131*4882a593Smuzhiyun 	if (IS_ERR(smmu))
2132*4882a593Smuzhiyun 		return PTR_ERR(smmu);
2133*4882a593Smuzhiyun 
2134*4882a593Smuzhiyun 	num_irqs = 0;
2135*4882a593Smuzhiyun 	while ((res = platform_get_resource(pdev, IORESOURCE_IRQ, num_irqs))) {
2136*4882a593Smuzhiyun 		num_irqs++;
2137*4882a593Smuzhiyun 		if (num_irqs > smmu->num_global_irqs)
2138*4882a593Smuzhiyun 			smmu->num_context_irqs++;
2139*4882a593Smuzhiyun 	}
2140*4882a593Smuzhiyun 
2141*4882a593Smuzhiyun 	if (!smmu->num_context_irqs) {
2142*4882a593Smuzhiyun 		dev_err(dev, "found %d interrupts but expected at least %d\n",
2143*4882a593Smuzhiyun 			num_irqs, smmu->num_global_irqs + 1);
2144*4882a593Smuzhiyun 		return -ENODEV;
2145*4882a593Smuzhiyun 	}
2146*4882a593Smuzhiyun 
2147*4882a593Smuzhiyun 	smmu->irqs = devm_kcalloc(dev, num_irqs, sizeof(*smmu->irqs),
2148*4882a593Smuzhiyun 				  GFP_KERNEL);
2149*4882a593Smuzhiyun 	if (!smmu->irqs) {
2150*4882a593Smuzhiyun 		dev_err(dev, "failed to allocate %d irqs\n", num_irqs);
2151*4882a593Smuzhiyun 		return -ENOMEM;
2152*4882a593Smuzhiyun 	}
2153*4882a593Smuzhiyun 
2154*4882a593Smuzhiyun 	for (i = 0; i < num_irqs; ++i) {
2155*4882a593Smuzhiyun 		int irq = platform_get_irq(pdev, i);
2156*4882a593Smuzhiyun 
2157*4882a593Smuzhiyun 		if (irq < 0)
2158*4882a593Smuzhiyun 			return -ENODEV;
2159*4882a593Smuzhiyun 		smmu->irqs[i] = irq;
2160*4882a593Smuzhiyun 	}
2161*4882a593Smuzhiyun 
2162*4882a593Smuzhiyun 	err = devm_clk_bulk_get_all(dev, &smmu->clks);
2163*4882a593Smuzhiyun 	if (err < 0) {
2164*4882a593Smuzhiyun 		dev_err(dev, "failed to get clocks %d\n", err);
2165*4882a593Smuzhiyun 		return err;
2166*4882a593Smuzhiyun 	}
2167*4882a593Smuzhiyun 	smmu->num_clks = err;
2168*4882a593Smuzhiyun 
2169*4882a593Smuzhiyun 	err = clk_bulk_prepare_enable(smmu->num_clks, smmu->clks);
2170*4882a593Smuzhiyun 	if (err)
2171*4882a593Smuzhiyun 		return err;
2172*4882a593Smuzhiyun 
2173*4882a593Smuzhiyun 	err = arm_smmu_device_cfg_probe(smmu);
2174*4882a593Smuzhiyun 	if (err)
2175*4882a593Smuzhiyun 		return err;
2176*4882a593Smuzhiyun 
2177*4882a593Smuzhiyun 	if (smmu->version == ARM_SMMU_V2) {
2178*4882a593Smuzhiyun 		if (smmu->num_context_banks > smmu->num_context_irqs) {
2179*4882a593Smuzhiyun 			dev_err(dev,
2180*4882a593Smuzhiyun 			      "found only %d context irq(s) but %d required\n",
2181*4882a593Smuzhiyun 			      smmu->num_context_irqs, smmu->num_context_banks);
2182*4882a593Smuzhiyun 			return -ENODEV;
2183*4882a593Smuzhiyun 		}
2184*4882a593Smuzhiyun 
2185*4882a593Smuzhiyun 		/* Ignore superfluous interrupts */
2186*4882a593Smuzhiyun 		smmu->num_context_irqs = smmu->num_context_banks;
2187*4882a593Smuzhiyun 	}
2188*4882a593Smuzhiyun 
2189*4882a593Smuzhiyun 	if (smmu->impl && smmu->impl->global_fault)
2190*4882a593Smuzhiyun 		global_fault = smmu->impl->global_fault;
2191*4882a593Smuzhiyun 	else
2192*4882a593Smuzhiyun 		global_fault = arm_smmu_global_fault;
2193*4882a593Smuzhiyun 
2194*4882a593Smuzhiyun 	for (i = 0; i < smmu->num_global_irqs; ++i) {
2195*4882a593Smuzhiyun 		err = devm_request_irq(smmu->dev, smmu->irqs[i],
2196*4882a593Smuzhiyun 				       global_fault,
2197*4882a593Smuzhiyun 				       IRQF_SHARED,
2198*4882a593Smuzhiyun 				       "arm-smmu global fault",
2199*4882a593Smuzhiyun 				       smmu);
2200*4882a593Smuzhiyun 		if (err) {
2201*4882a593Smuzhiyun 			dev_err(dev, "failed to request global IRQ %d (%u)\n",
2202*4882a593Smuzhiyun 				i, smmu->irqs[i]);
2203*4882a593Smuzhiyun 			return err;
2204*4882a593Smuzhiyun 		}
2205*4882a593Smuzhiyun 	}
2206*4882a593Smuzhiyun 
2207*4882a593Smuzhiyun 	err = iommu_device_sysfs_add(&smmu->iommu, smmu->dev, NULL,
2208*4882a593Smuzhiyun 				     "smmu.%pa", &ioaddr);
2209*4882a593Smuzhiyun 	if (err) {
2210*4882a593Smuzhiyun 		dev_err(dev, "Failed to register iommu in sysfs\n");
2211*4882a593Smuzhiyun 		return err;
2212*4882a593Smuzhiyun 	}
2213*4882a593Smuzhiyun 
2214*4882a593Smuzhiyun 	iommu_device_set_ops(&smmu->iommu, &arm_smmu_ops);
2215*4882a593Smuzhiyun 	iommu_device_set_fwnode(&smmu->iommu, dev->fwnode);
2216*4882a593Smuzhiyun 
2217*4882a593Smuzhiyun 	err = iommu_device_register(&smmu->iommu);
2218*4882a593Smuzhiyun 	if (err) {
2219*4882a593Smuzhiyun 		dev_err(dev, "Failed to register iommu\n");
2220*4882a593Smuzhiyun 		return err;
2221*4882a593Smuzhiyun 	}
2222*4882a593Smuzhiyun 
2223*4882a593Smuzhiyun 	platform_set_drvdata(pdev, smmu);
2224*4882a593Smuzhiyun 	arm_smmu_device_reset(smmu);
2225*4882a593Smuzhiyun 	arm_smmu_test_smr_masks(smmu);
2226*4882a593Smuzhiyun 
2227*4882a593Smuzhiyun 	/*
2228*4882a593Smuzhiyun 	 * We want to avoid touching dev->power.lock in fastpaths unless
2229*4882a593Smuzhiyun 	 * it's really going to do something useful - pm_runtime_enabled()
2230*4882a593Smuzhiyun 	 * can serve as an ideal proxy for that decision. So, conditionally
2231*4882a593Smuzhiyun 	 * enable pm_runtime.
2232*4882a593Smuzhiyun 	 */
2233*4882a593Smuzhiyun 	if (dev->pm_domain) {
2234*4882a593Smuzhiyun 		pm_runtime_set_active(dev);
2235*4882a593Smuzhiyun 		pm_runtime_enable(dev);
2236*4882a593Smuzhiyun 	}
2237*4882a593Smuzhiyun 
2238*4882a593Smuzhiyun 	/*
2239*4882a593Smuzhiyun 	 * For ACPI and generic DT bindings, an SMMU will be probed before
2240*4882a593Smuzhiyun 	 * any device which might need it, so we want the bus ops in place
2241*4882a593Smuzhiyun 	 * ready to handle default domain setup as soon as any SMMU exists.
2242*4882a593Smuzhiyun 	 */
2243*4882a593Smuzhiyun 	if (!using_legacy_binding)
2244*4882a593Smuzhiyun 		return arm_smmu_bus_init(&arm_smmu_ops);
2245*4882a593Smuzhiyun 
2246*4882a593Smuzhiyun 	return 0;
2247*4882a593Smuzhiyun }
2248*4882a593Smuzhiyun 
arm_smmu_device_remove(struct platform_device * pdev)2249*4882a593Smuzhiyun static int arm_smmu_device_remove(struct platform_device *pdev)
2250*4882a593Smuzhiyun {
2251*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = platform_get_drvdata(pdev);
2252*4882a593Smuzhiyun 
2253*4882a593Smuzhiyun 	if (!smmu)
2254*4882a593Smuzhiyun 		return -ENODEV;
2255*4882a593Smuzhiyun 
2256*4882a593Smuzhiyun 	if (!bitmap_empty(smmu->context_map, ARM_SMMU_MAX_CBS))
2257*4882a593Smuzhiyun 		dev_notice(&pdev->dev, "disabling translation\n");
2258*4882a593Smuzhiyun 
2259*4882a593Smuzhiyun 	arm_smmu_bus_init(NULL);
2260*4882a593Smuzhiyun 	iommu_device_unregister(&smmu->iommu);
2261*4882a593Smuzhiyun 	iommu_device_sysfs_remove(&smmu->iommu);
2262*4882a593Smuzhiyun 
2263*4882a593Smuzhiyun 	arm_smmu_rpm_get(smmu);
2264*4882a593Smuzhiyun 	/* Turn the thing off */
2265*4882a593Smuzhiyun 	arm_smmu_gr0_write(smmu, ARM_SMMU_GR0_sCR0, ARM_SMMU_sCR0_CLIENTPD);
2266*4882a593Smuzhiyun 	arm_smmu_rpm_put(smmu);
2267*4882a593Smuzhiyun 
2268*4882a593Smuzhiyun 	if (pm_runtime_enabled(smmu->dev))
2269*4882a593Smuzhiyun 		pm_runtime_force_suspend(smmu->dev);
2270*4882a593Smuzhiyun 	else
2271*4882a593Smuzhiyun 		clk_bulk_disable(smmu->num_clks, smmu->clks);
2272*4882a593Smuzhiyun 
2273*4882a593Smuzhiyun 	clk_bulk_unprepare(smmu->num_clks, smmu->clks);
2274*4882a593Smuzhiyun 	return 0;
2275*4882a593Smuzhiyun }
2276*4882a593Smuzhiyun 
arm_smmu_device_shutdown(struct platform_device * pdev)2277*4882a593Smuzhiyun static void arm_smmu_device_shutdown(struct platform_device *pdev)
2278*4882a593Smuzhiyun {
2279*4882a593Smuzhiyun 	arm_smmu_device_remove(pdev);
2280*4882a593Smuzhiyun }
2281*4882a593Smuzhiyun 
arm_smmu_runtime_resume(struct device * dev)2282*4882a593Smuzhiyun static int __maybe_unused arm_smmu_runtime_resume(struct device *dev)
2283*4882a593Smuzhiyun {
2284*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = dev_get_drvdata(dev);
2285*4882a593Smuzhiyun 	int ret;
2286*4882a593Smuzhiyun 
2287*4882a593Smuzhiyun 	ret = clk_bulk_enable(smmu->num_clks, smmu->clks);
2288*4882a593Smuzhiyun 	if (ret)
2289*4882a593Smuzhiyun 		return ret;
2290*4882a593Smuzhiyun 
2291*4882a593Smuzhiyun 	arm_smmu_device_reset(smmu);
2292*4882a593Smuzhiyun 
2293*4882a593Smuzhiyun 	return 0;
2294*4882a593Smuzhiyun }
2295*4882a593Smuzhiyun 
arm_smmu_runtime_suspend(struct device * dev)2296*4882a593Smuzhiyun static int __maybe_unused arm_smmu_runtime_suspend(struct device *dev)
2297*4882a593Smuzhiyun {
2298*4882a593Smuzhiyun 	struct arm_smmu_device *smmu = dev_get_drvdata(dev);
2299*4882a593Smuzhiyun 
2300*4882a593Smuzhiyun 	clk_bulk_disable(smmu->num_clks, smmu->clks);
2301*4882a593Smuzhiyun 
2302*4882a593Smuzhiyun 	return 0;
2303*4882a593Smuzhiyun }
2304*4882a593Smuzhiyun 
arm_smmu_pm_resume(struct device * dev)2305*4882a593Smuzhiyun static int __maybe_unused arm_smmu_pm_resume(struct device *dev)
2306*4882a593Smuzhiyun {
2307*4882a593Smuzhiyun 	if (pm_runtime_suspended(dev))
2308*4882a593Smuzhiyun 		return 0;
2309*4882a593Smuzhiyun 
2310*4882a593Smuzhiyun 	return arm_smmu_runtime_resume(dev);
2311*4882a593Smuzhiyun }
2312*4882a593Smuzhiyun 
arm_smmu_pm_suspend(struct device * dev)2313*4882a593Smuzhiyun static int __maybe_unused arm_smmu_pm_suspend(struct device *dev)
2314*4882a593Smuzhiyun {
2315*4882a593Smuzhiyun 	if (pm_runtime_suspended(dev))
2316*4882a593Smuzhiyun 		return 0;
2317*4882a593Smuzhiyun 
2318*4882a593Smuzhiyun 	return arm_smmu_runtime_suspend(dev);
2319*4882a593Smuzhiyun }
2320*4882a593Smuzhiyun 
2321*4882a593Smuzhiyun static const struct dev_pm_ops arm_smmu_pm_ops = {
2322*4882a593Smuzhiyun 	SET_SYSTEM_SLEEP_PM_OPS(arm_smmu_pm_suspend, arm_smmu_pm_resume)
2323*4882a593Smuzhiyun 	SET_RUNTIME_PM_OPS(arm_smmu_runtime_suspend,
2324*4882a593Smuzhiyun 			   arm_smmu_runtime_resume, NULL)
2325*4882a593Smuzhiyun };
2326*4882a593Smuzhiyun 
2327*4882a593Smuzhiyun static struct platform_driver arm_smmu_driver = {
2328*4882a593Smuzhiyun 	.driver	= {
2329*4882a593Smuzhiyun 		.name			= "arm-smmu",
2330*4882a593Smuzhiyun 		.of_match_table		= arm_smmu_of_match,
2331*4882a593Smuzhiyun 		.pm			= &arm_smmu_pm_ops,
2332*4882a593Smuzhiyun 		.suppress_bind_attrs    = true,
2333*4882a593Smuzhiyun 	},
2334*4882a593Smuzhiyun 	.probe	= arm_smmu_device_probe,
2335*4882a593Smuzhiyun 	.remove	= arm_smmu_device_remove,
2336*4882a593Smuzhiyun 	.shutdown = arm_smmu_device_shutdown,
2337*4882a593Smuzhiyun };
2338*4882a593Smuzhiyun module_platform_driver(arm_smmu_driver);
2339*4882a593Smuzhiyun 
2340*4882a593Smuzhiyun MODULE_DESCRIPTION("IOMMU API for ARM architected SMMU implementations");
2341*4882a593Smuzhiyun MODULE_AUTHOR("Will Deacon <will@kernel.org>");
2342*4882a593Smuzhiyun MODULE_ALIAS("platform:arm-smmu");
2343*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
2344