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 = ⁢
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(®ion->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