blob: 82508730feb7a188a3be3e10ae00a4119a9677ab [file] [log] [blame]
Andrew Murray2d7ca2c2018-10-10 11:29:26 +01001// SPDX-License-Identifier: GPL-2.0
Will Deacon48ec83b2015-05-27 17:25:59 +01002/*
3 * IOMMU API for ARM architected SMMUv3 implementations.
4 *
Will Deacon48ec83b2015-05-27 17:25:59 +01005 * Copyright (C) 2015 ARM Limited
6 *
7 * Author: Will Deacon <will.deacon@arm.com>
8 *
9 * This driver is powered by bad coffee and bombay mix.
10 */
11
Lorenzo Pieralisie4dadfa2016-11-21 10:01:43 +000012#include <linux/acpi.h>
13#include <linux/acpi_iort.h>
Robin Murphycbcee192018-03-26 13:35:10 +010014#include <linux/bitfield.h>
Robin Murphy1cf9e542018-03-26 13:35:09 +010015#include <linux/bitops.h>
Will Deaconb63b3432018-07-25 15:58:43 +010016#include <linux/crash_dump.h>
Will Deacon48ec83b2015-05-27 17:25:59 +010017#include <linux/delay.h>
Robin Murphy9adb9592016-01-26 18:06:36 +000018#include <linux/dma-iommu.h>
Will Deacon48ec83b2015-05-27 17:25:59 +010019#include <linux/err.h>
20#include <linux/interrupt.h>
Rob Herringb77cf112019-02-05 10:37:31 -060021#include <linux/io-pgtable.h>
Will Deacon48ec83b2015-05-27 17:25:59 +010022#include <linux/iommu.h>
23#include <linux/iopoll.h>
Will Deacon6e8fa742019-12-19 12:03:44 +000024#include <linux/module.h>
Marc Zyngier166bdbd2015-10-13 18:32:30 +010025#include <linux/msi.h>
Will Deacon48ec83b2015-05-27 17:25:59 +010026#include <linux/of.h>
27#include <linux/of_address.h>
Robin Murphy8f785152016-09-12 17:13:45 +010028#include <linux/of_iommu.h>
Will Deacon941a8022015-08-11 16:25:10 +010029#include <linux/of_platform.h>
Will Deacon48ec83b2015-05-27 17:25:59 +010030#include <linux/pci.h>
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +010031#include <linux/pci-ats.h>
Will Deacon48ec83b2015-05-27 17:25:59 +010032#include <linux/platform_device.h>
33
Robin Murphy08d4ca22016-09-12 17:13:46 +010034#include <linux/amba/bus.h>
35
Will Deacon48ec83b2015-05-27 17:25:59 +010036/* MMIO registers */
37#define ARM_SMMU_IDR0 0x0
Robin Murphycbcee192018-03-26 13:35:10 +010038#define IDR0_ST_LVL GENMASK(28, 27)
39#define IDR0_ST_LVL_2LVL 1
40#define IDR0_STALL_MODEL GENMASK(25, 24)
41#define IDR0_STALL_MODEL_STALL 0
42#define IDR0_STALL_MODEL_FORCE 2
43#define IDR0_TTENDIAN GENMASK(22, 21)
44#define IDR0_TTENDIAN_MIXED 0
45#define IDR0_TTENDIAN_LE 2
46#define IDR0_TTENDIAN_BE 3
Will Deacon48ec83b2015-05-27 17:25:59 +010047#define IDR0_CD2L (1 << 19)
48#define IDR0_VMID16 (1 << 18)
49#define IDR0_PRI (1 << 16)
50#define IDR0_SEV (1 << 14)
51#define IDR0_MSI (1 << 13)
52#define IDR0_ASID16 (1 << 12)
53#define IDR0_ATS (1 << 10)
54#define IDR0_HYP (1 << 9)
55#define IDR0_COHACC (1 << 4)
Robin Murphycbcee192018-03-26 13:35:10 +010056#define IDR0_TTF GENMASK(3, 2)
57#define IDR0_TTF_AARCH64 2
58#define IDR0_TTF_AARCH32_64 3
Will Deacon48ec83b2015-05-27 17:25:59 +010059#define IDR0_S1P (1 << 1)
60#define IDR0_S2P (1 << 0)
61
62#define ARM_SMMU_IDR1 0x4
63#define IDR1_TABLES_PRESET (1 << 30)
64#define IDR1_QUEUES_PRESET (1 << 29)
65#define IDR1_REL (1 << 28)
Robin Murphycbcee192018-03-26 13:35:10 +010066#define IDR1_CMDQS GENMASK(25, 21)
67#define IDR1_EVTQS GENMASK(20, 16)
68#define IDR1_PRIQS GENMASK(15, 11)
69#define IDR1_SSIDSIZE GENMASK(10, 6)
70#define IDR1_SIDSIZE GENMASK(5, 0)
Will Deacon48ec83b2015-05-27 17:25:59 +010071
Rob Herring6a481a92020-02-24 16:31:29 -060072#define ARM_SMMU_IDR3 0xc
73#define IDR3_RIL (1 << 10)
74
Will Deacon48ec83b2015-05-27 17:25:59 +010075#define ARM_SMMU_IDR5 0x14
Robin Murphycbcee192018-03-26 13:35:10 +010076#define IDR5_STALL_MAX GENMASK(31, 16)
Will Deacon48ec83b2015-05-27 17:25:59 +010077#define IDR5_GRAN64K (1 << 6)
78#define IDR5_GRAN16K (1 << 5)
79#define IDR5_GRAN4K (1 << 4)
Robin Murphycbcee192018-03-26 13:35:10 +010080#define IDR5_OAS GENMASK(2, 0)
81#define IDR5_OAS_32_BIT 0
82#define IDR5_OAS_36_BIT 1
83#define IDR5_OAS_40_BIT 2
84#define IDR5_OAS_42_BIT 3
85#define IDR5_OAS_44_BIT 4
86#define IDR5_OAS_48_BIT 5
Robin Murphy6619c912018-03-26 13:35:14 +010087#define IDR5_OAS_52_BIT 6
Robin Murphydcd189e2018-03-26 13:35:15 +010088#define IDR5_VAX GENMASK(11, 10)
89#define IDR5_VAX_52_BIT 1
Will Deacon48ec83b2015-05-27 17:25:59 +010090
91#define ARM_SMMU_CR0 0x20
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +010092#define CR0_ATSCHK (1 << 4)
Will Deacon48ec83b2015-05-27 17:25:59 +010093#define CR0_CMDQEN (1 << 3)
94#define CR0_EVTQEN (1 << 2)
95#define CR0_PRIQEN (1 << 1)
96#define CR0_SMMUEN (1 << 0)
97
98#define ARM_SMMU_CR0ACK 0x24
99
100#define ARM_SMMU_CR1 0x28
Robin Murphycbcee192018-03-26 13:35:10 +0100101#define CR1_TABLE_SH GENMASK(11, 10)
102#define CR1_TABLE_OC GENMASK(9, 8)
103#define CR1_TABLE_IC GENMASK(7, 6)
104#define CR1_QUEUE_SH GENMASK(5, 4)
105#define CR1_QUEUE_OC GENMASK(3, 2)
106#define CR1_QUEUE_IC GENMASK(1, 0)
107/* CR1 cacheability fields don't quite follow the usual TCR-style encoding */
Will Deacon48ec83b2015-05-27 17:25:59 +0100108#define CR1_CACHE_NC 0
109#define CR1_CACHE_WB 1
110#define CR1_CACHE_WT 2
Will Deacon48ec83b2015-05-27 17:25:59 +0100111
112#define ARM_SMMU_CR2 0x2c
113#define CR2_PTM (1 << 2)
114#define CR2_RECINVSID (1 << 1)
115#define CR2_E2H (1 << 0)
116
Robin Murphydc87a982016-09-12 17:13:44 +0100117#define ARM_SMMU_GBPA 0x44
Robin Murphydc87a982016-09-12 17:13:44 +0100118#define GBPA_UPDATE (1 << 31)
Robin Murphycbcee192018-03-26 13:35:10 +0100119#define GBPA_ABORT (1 << 20)
Robin Murphydc87a982016-09-12 17:13:44 +0100120
Will Deacon48ec83b2015-05-27 17:25:59 +0100121#define ARM_SMMU_IRQ_CTRL 0x50
122#define IRQ_CTRL_EVTQ_IRQEN (1 << 2)
Marc Zyngierccd63852015-07-15 11:55:18 +0100123#define IRQ_CTRL_PRIQ_IRQEN (1 << 1)
Will Deacon48ec83b2015-05-27 17:25:59 +0100124#define IRQ_CTRL_GERROR_IRQEN (1 << 0)
125
126#define ARM_SMMU_IRQ_CTRLACK 0x54
127
128#define ARM_SMMU_GERROR 0x60
129#define GERROR_SFM_ERR (1 << 8)
130#define GERROR_MSI_GERROR_ABT_ERR (1 << 7)
131#define GERROR_MSI_PRIQ_ABT_ERR (1 << 6)
132#define GERROR_MSI_EVTQ_ABT_ERR (1 << 5)
133#define GERROR_MSI_CMDQ_ABT_ERR (1 << 4)
134#define GERROR_PRIQ_ABT_ERR (1 << 3)
135#define GERROR_EVTQ_ABT_ERR (1 << 2)
136#define GERROR_CMDQ_ERR (1 << 0)
137#define GERROR_ERR_MASK 0xfd
138
139#define ARM_SMMU_GERRORN 0x64
140
141#define ARM_SMMU_GERROR_IRQ_CFG0 0x68
142#define ARM_SMMU_GERROR_IRQ_CFG1 0x70
143#define ARM_SMMU_GERROR_IRQ_CFG2 0x74
144
145#define ARM_SMMU_STRTAB_BASE 0x80
146#define STRTAB_BASE_RA (1UL << 62)
Robin Murphy6619c912018-03-26 13:35:14 +0100147#define STRTAB_BASE_ADDR_MASK GENMASK_ULL(51, 6)
Will Deacon48ec83b2015-05-27 17:25:59 +0100148
149#define ARM_SMMU_STRTAB_BASE_CFG 0x88
Robin Murphycbcee192018-03-26 13:35:10 +0100150#define STRTAB_BASE_CFG_FMT GENMASK(17, 16)
151#define STRTAB_BASE_CFG_FMT_LINEAR 0
152#define STRTAB_BASE_CFG_FMT_2LVL 1
153#define STRTAB_BASE_CFG_SPLIT GENMASK(10, 6)
154#define STRTAB_BASE_CFG_LOG2SIZE GENMASK(5, 0)
Will Deacon48ec83b2015-05-27 17:25:59 +0100155
156#define ARM_SMMU_CMDQ_BASE 0x90
157#define ARM_SMMU_CMDQ_PROD 0x98
158#define ARM_SMMU_CMDQ_CONS 0x9c
159
160#define ARM_SMMU_EVTQ_BASE 0xa0
161#define ARM_SMMU_EVTQ_PROD 0x100a8
162#define ARM_SMMU_EVTQ_CONS 0x100ac
163#define ARM_SMMU_EVTQ_IRQ_CFG0 0xb0
164#define ARM_SMMU_EVTQ_IRQ_CFG1 0xb8
165#define ARM_SMMU_EVTQ_IRQ_CFG2 0xbc
166
167#define ARM_SMMU_PRIQ_BASE 0xc0
168#define ARM_SMMU_PRIQ_PROD 0x100c8
169#define ARM_SMMU_PRIQ_CONS 0x100cc
170#define ARM_SMMU_PRIQ_IRQ_CFG0 0xd0
171#define ARM_SMMU_PRIQ_IRQ_CFG1 0xd8
172#define ARM_SMMU_PRIQ_IRQ_CFG2 0xdc
173
174/* Common MSI config fields */
Robin Murphy6619c912018-03-26 13:35:14 +0100175#define MSI_CFG0_ADDR_MASK GENMASK_ULL(51, 2)
Robin Murphycbcee192018-03-26 13:35:10 +0100176#define MSI_CFG2_SH GENMASK(5, 4)
177#define MSI_CFG2_MEMATTR GENMASK(3, 0)
178
179/* Common memory attribute values */
180#define ARM_SMMU_SH_NSH 0
181#define ARM_SMMU_SH_OSH 2
182#define ARM_SMMU_SH_ISH 3
183#define ARM_SMMU_MEMATTR_DEVICE_nGnRE 0x1
Robin Murphy7417b992018-03-26 13:35:12 +0100184#define ARM_SMMU_MEMATTR_OIWB 0xf
Will Deacon48ec83b2015-05-27 17:25:59 +0100185
Will Deacon7c288a52019-07-02 17:16:16 +0100186#define Q_IDX(llq, p) ((p) & ((1 << (llq)->max_n_shift) - 1))
187#define Q_WRP(llq, p) ((p) & (1 << (llq)->max_n_shift))
Will Deacon587e6c12019-07-02 17:16:25 +0100188#define Q_OVERFLOW_FLAG (1U << 31)
Will Deacon8a073da2019-07-02 17:15:50 +0100189#define Q_OVF(p) ((p) & Q_OVERFLOW_FLAG)
Will Deacon48ec83b2015-05-27 17:25:59 +0100190#define Q_ENT(q, p) ((q)->base + \
Will Deacon7c288a52019-07-02 17:16:16 +0100191 Q_IDX(&((q)->llq), p) * \
192 (q)->ent_dwords)
Will Deacon48ec83b2015-05-27 17:25:59 +0100193
194#define Q_BASE_RWA (1UL << 62)
Robin Murphy6619c912018-03-26 13:35:14 +0100195#define Q_BASE_ADDR_MASK GENMASK_ULL(51, 5)
Robin Murphycbcee192018-03-26 13:35:10 +0100196#define Q_BASE_LOG2SIZE GENMASK(4, 0)
Will Deacon900a85c2019-07-02 12:53:18 +0100197
198/* Ensure DMA allocations are naturally aligned */
199#ifdef CONFIG_CMA_ALIGNMENT
Will Deacond25f6ea2019-05-16 16:08:47 +0100200#define Q_MAX_SZ_SHIFT (PAGE_SHIFT + CONFIG_CMA_ALIGNMENT)
Will Deacon900a85c2019-07-02 12:53:18 +0100201#else
202#define Q_MAX_SZ_SHIFT (PAGE_SHIFT + MAX_ORDER - 1)
203#endif
Will Deacon48ec83b2015-05-27 17:25:59 +0100204
205/*
206 * Stream table.
207 *
208 * Linear: Enough to cover 1 << IDR1.SIDSIZE entries
Zhen Leie2f4c232015-07-07 04:30:17 +0100209 * 2lvl: 128k L1 entries,
210 * 256 lazy entries per table (each table covers a PCI bus)
Will Deacon48ec83b2015-05-27 17:25:59 +0100211 */
Zhen Leie2f4c232015-07-07 04:30:17 +0100212#define STRTAB_L1_SZ_SHIFT 20
Will Deacon48ec83b2015-05-27 17:25:59 +0100213#define STRTAB_SPLIT 8
214
215#define STRTAB_L1_DESC_DWORDS 1
Robin Murphyba08bdc2018-03-26 13:35:11 +0100216#define STRTAB_L1_DESC_SPAN GENMASK_ULL(4, 0)
Robin Murphy6619c912018-03-26 13:35:14 +0100217#define STRTAB_L1_DESC_L2PTR_MASK GENMASK_ULL(51, 6)
Will Deacon48ec83b2015-05-27 17:25:59 +0100218
219#define STRTAB_STE_DWORDS 8
220#define STRTAB_STE_0_V (1UL << 0)
Robin Murphyba08bdc2018-03-26 13:35:11 +0100221#define STRTAB_STE_0_CFG GENMASK_ULL(3, 1)
222#define STRTAB_STE_0_CFG_ABORT 0
223#define STRTAB_STE_0_CFG_BYPASS 4
224#define STRTAB_STE_0_CFG_S1_TRANS 5
225#define STRTAB_STE_0_CFG_S2_TRANS 6
Will Deacon48ec83b2015-05-27 17:25:59 +0100226
Robin Murphyba08bdc2018-03-26 13:35:11 +0100227#define STRTAB_STE_0_S1FMT GENMASK_ULL(5, 4)
228#define STRTAB_STE_0_S1FMT_LINEAR 0
Jean-Philippe Brucker73af06f2020-01-15 13:52:36 +0100229#define STRTAB_STE_0_S1FMT_64K_L2 2
Robin Murphy6619c912018-03-26 13:35:14 +0100230#define STRTAB_STE_0_S1CTXPTR_MASK GENMASK_ULL(51, 6)
Robin Murphyba08bdc2018-03-26 13:35:11 +0100231#define STRTAB_STE_0_S1CDMAX GENMASK_ULL(63, 59)
Will Deacon48ec83b2015-05-27 17:25:59 +0100232
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +0100233#define STRTAB_STE_1_S1DSS GENMASK_ULL(1, 0)
234#define STRTAB_STE_1_S1DSS_TERMINATE 0x0
235#define STRTAB_STE_1_S1DSS_BYPASS 0x1
236#define STRTAB_STE_1_S1DSS_SSID0 0x2
237
Will Deacon48ec83b2015-05-27 17:25:59 +0100238#define STRTAB_STE_1_S1C_CACHE_NC 0UL
239#define STRTAB_STE_1_S1C_CACHE_WBRA 1UL
240#define STRTAB_STE_1_S1C_CACHE_WT 2UL
241#define STRTAB_STE_1_S1C_CACHE_WB 3UL
Robin Murphyba08bdc2018-03-26 13:35:11 +0100242#define STRTAB_STE_1_S1CIR GENMASK_ULL(3, 2)
243#define STRTAB_STE_1_S1COR GENMASK_ULL(5, 4)
244#define STRTAB_STE_1_S1CSH GENMASK_ULL(7, 6)
Will Deacon48ec83b2015-05-27 17:25:59 +0100245
246#define STRTAB_STE_1_S1STALLD (1UL << 27)
247
Robin Murphyba08bdc2018-03-26 13:35:11 +0100248#define STRTAB_STE_1_EATS GENMASK_ULL(29, 28)
Will Deacon48ec83b2015-05-27 17:25:59 +0100249#define STRTAB_STE_1_EATS_ABT 0UL
250#define STRTAB_STE_1_EATS_TRANS 1UL
251#define STRTAB_STE_1_EATS_S1CHK 2UL
Will Deacon48ec83b2015-05-27 17:25:59 +0100252
Robin Murphyba08bdc2018-03-26 13:35:11 +0100253#define STRTAB_STE_1_STRW GENMASK_ULL(31, 30)
Will Deacon48ec83b2015-05-27 17:25:59 +0100254#define STRTAB_STE_1_STRW_NSEL1 0UL
255#define STRTAB_STE_1_STRW_EL2 2UL
Will Deacon48ec83b2015-05-27 17:25:59 +0100256
Robin Murphyba08bdc2018-03-26 13:35:11 +0100257#define STRTAB_STE_1_SHCFG GENMASK_ULL(45, 44)
Will Deacona0eacd82015-11-18 18:15:51 +0000258#define STRTAB_STE_1_SHCFG_INCOMING 1UL
Will Deacona0eacd82015-11-18 18:15:51 +0000259
Robin Murphyba08bdc2018-03-26 13:35:11 +0100260#define STRTAB_STE_2_S2VMID GENMASK_ULL(15, 0)
261#define STRTAB_STE_2_VTCR GENMASK_ULL(50, 32)
Will Deaconac4b80e2020-01-10 14:51:59 +0000262#define STRTAB_STE_2_VTCR_S2T0SZ GENMASK_ULL(5, 0)
263#define STRTAB_STE_2_VTCR_S2SL0 GENMASK_ULL(7, 6)
264#define STRTAB_STE_2_VTCR_S2IR0 GENMASK_ULL(9, 8)
265#define STRTAB_STE_2_VTCR_S2OR0 GENMASK_ULL(11, 10)
266#define STRTAB_STE_2_VTCR_S2SH0 GENMASK_ULL(13, 12)
267#define STRTAB_STE_2_VTCR_S2TG GENMASK_ULL(15, 14)
268#define STRTAB_STE_2_VTCR_S2PS GENMASK_ULL(18, 16)
Will Deacon48ec83b2015-05-27 17:25:59 +0100269#define STRTAB_STE_2_S2AA64 (1UL << 51)
270#define STRTAB_STE_2_S2ENDI (1UL << 52)
271#define STRTAB_STE_2_S2PTW (1UL << 54)
272#define STRTAB_STE_2_S2R (1UL << 58)
273
Robin Murphy6619c912018-03-26 13:35:14 +0100274#define STRTAB_STE_3_S2TTB_MASK GENMASK_ULL(51, 4)
Will Deacon48ec83b2015-05-27 17:25:59 +0100275
Jean-Philippe Brucker73af06f2020-01-15 13:52:36 +0100276/*
277 * Context descriptors.
278 *
279 * Linear: when less than 1024 SSIDs are supported
280 * 2lvl: at most 1024 L1 entries,
281 * 1024 lazy entries per table.
282 */
283#define CTXDESC_SPLIT 10
284#define CTXDESC_L2_ENTRIES (1 << CTXDESC_SPLIT)
285
286#define CTXDESC_L1_DESC_DWORDS 1
287#define CTXDESC_L1_DESC_V (1UL << 0)
288#define CTXDESC_L1_DESC_L2PTR_MASK GENMASK_ULL(51, 12)
289
Will Deacon48ec83b2015-05-27 17:25:59 +0100290#define CTXDESC_CD_DWORDS 8
Robin Murphyba08bdc2018-03-26 13:35:11 +0100291#define CTXDESC_CD_0_TCR_T0SZ GENMASK_ULL(5, 0)
Robin Murphyba08bdc2018-03-26 13:35:11 +0100292#define CTXDESC_CD_0_TCR_TG0 GENMASK_ULL(7, 6)
Robin Murphyba08bdc2018-03-26 13:35:11 +0100293#define CTXDESC_CD_0_TCR_IRGN0 GENMASK_ULL(9, 8)
Robin Murphyba08bdc2018-03-26 13:35:11 +0100294#define CTXDESC_CD_0_TCR_ORGN0 GENMASK_ULL(11, 10)
Robin Murphyba08bdc2018-03-26 13:35:11 +0100295#define CTXDESC_CD_0_TCR_SH0 GENMASK_ULL(13, 12)
Robin Murphyba08bdc2018-03-26 13:35:11 +0100296#define CTXDESC_CD_0_TCR_EPD0 (1ULL << 14)
Robin Murphyba08bdc2018-03-26 13:35:11 +0100297#define CTXDESC_CD_0_TCR_EPD1 (1ULL << 30)
Will Deacon48ec83b2015-05-27 17:25:59 +0100298
299#define CTXDESC_CD_0_ENDI (1UL << 15)
300#define CTXDESC_CD_0_V (1UL << 31)
301
Robin Murphyba08bdc2018-03-26 13:35:11 +0100302#define CTXDESC_CD_0_TCR_IPS GENMASK_ULL(34, 32)
Robin Murphyba08bdc2018-03-26 13:35:11 +0100303#define CTXDESC_CD_0_TCR_TBI0 (1ULL << 38)
Will Deacon48ec83b2015-05-27 17:25:59 +0100304
305#define CTXDESC_CD_0_AA64 (1UL << 41)
Yisheng Xie9cff86fd22017-09-21 20:36:07 +0800306#define CTXDESC_CD_0_S (1UL << 44)
Will Deacon48ec83b2015-05-27 17:25:59 +0100307#define CTXDESC_CD_0_R (1UL << 45)
308#define CTXDESC_CD_0_A (1UL << 46)
Robin Murphyba08bdc2018-03-26 13:35:11 +0100309#define CTXDESC_CD_0_ASET (1UL << 47)
310#define CTXDESC_CD_0_ASID GENMASK_ULL(63, 48)
Will Deacon48ec83b2015-05-27 17:25:59 +0100311
Robin Murphy6619c912018-03-26 13:35:14 +0100312#define CTXDESC_CD_1_TTB0_MASK GENMASK_ULL(51, 4)
Will Deacon48ec83b2015-05-27 17:25:59 +0100313
Jean-Philippe Brucker89535822020-01-15 13:52:29 +0100314/*
315 * When the SMMU only supports linear context descriptor tables, pick a
316 * reasonable size limit (64kB).
317 */
318#define CTXDESC_LINEAR_CDMAX ilog2(SZ_64K / (CTXDESC_CD_DWORDS << 3))
Will Deacon48ec83b2015-05-27 17:25:59 +0100319
320/* Command queue */
Will Deacond25f6ea2019-05-16 16:08:47 +0100321#define CMDQ_ENT_SZ_SHIFT 4
322#define CMDQ_ENT_DWORDS ((1 << CMDQ_ENT_SZ_SHIFT) >> 3)
323#define CMDQ_MAX_SZ_SHIFT (Q_MAX_SZ_SHIFT - CMDQ_ENT_SZ_SHIFT)
Will Deacon48ec83b2015-05-27 17:25:59 +0100324
Robin Murphycbcee192018-03-26 13:35:10 +0100325#define CMDQ_CONS_ERR GENMASK(30, 24)
Will Deacon48ec83b2015-05-27 17:25:59 +0100326#define CMDQ_ERR_CERROR_NONE_IDX 0
327#define CMDQ_ERR_CERROR_ILL_IDX 1
328#define CMDQ_ERR_CERROR_ABT_IDX 2
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +0100329#define CMDQ_ERR_CERROR_ATC_INV_IDX 3
Will Deacon48ec83b2015-05-27 17:25:59 +0100330
Will Deacon587e6c12019-07-02 17:16:25 +0100331#define CMDQ_PROD_OWNED_FLAG Q_OVERFLOW_FLAG
332
Will Deacon2af2e722019-07-02 17:16:33 +0100333/*
334 * This is used to size the command queue and therefore must be at least
335 * BITS_PER_LONG so that the valid_map works correctly (it relies on the
336 * total number of queue entries being a multiple of BITS_PER_LONG).
337 */
338#define CMDQ_BATCH_ENTRIES BITS_PER_LONG
339
Robin Murphy7417b992018-03-26 13:35:12 +0100340#define CMDQ_0_OP GENMASK_ULL(7, 0)
Will Deacon48ec83b2015-05-27 17:25:59 +0100341#define CMDQ_0_SSV (1UL << 11)
342
Robin Murphy7417b992018-03-26 13:35:12 +0100343#define CMDQ_PREFETCH_0_SID GENMASK_ULL(63, 32)
344#define CMDQ_PREFETCH_1_SIZE GENMASK_ULL(4, 0)
Robin Murphy1cf9e542018-03-26 13:35:09 +0100345#define CMDQ_PREFETCH_1_ADDR_MASK GENMASK_ULL(63, 12)
Will Deacon48ec83b2015-05-27 17:25:59 +0100346
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +0100347#define CMDQ_CFGI_0_SSID GENMASK_ULL(31, 12)
Robin Murphy7417b992018-03-26 13:35:12 +0100348#define CMDQ_CFGI_0_SID GENMASK_ULL(63, 32)
Will Deacon48ec83b2015-05-27 17:25:59 +0100349#define CMDQ_CFGI_1_LEAF (1UL << 0)
Robin Murphy7417b992018-03-26 13:35:12 +0100350#define CMDQ_CFGI_1_RANGE GENMASK_ULL(4, 0)
Will Deacon48ec83b2015-05-27 17:25:59 +0100351
Rob Herring6a481a92020-02-24 16:31:29 -0600352#define CMDQ_TLBI_0_NUM GENMASK_ULL(16, 12)
353#define CMDQ_TLBI_RANGE_NUM_MAX 31
354#define CMDQ_TLBI_0_SCALE GENMASK_ULL(24, 20)
Robin Murphy7417b992018-03-26 13:35:12 +0100355#define CMDQ_TLBI_0_VMID GENMASK_ULL(47, 32)
356#define CMDQ_TLBI_0_ASID GENMASK_ULL(63, 48)
Will Deacon48ec83b2015-05-27 17:25:59 +0100357#define CMDQ_TLBI_1_LEAF (1UL << 0)
Rob Herring6a481a92020-02-24 16:31:29 -0600358#define CMDQ_TLBI_1_TTL GENMASK_ULL(9, 8)
359#define CMDQ_TLBI_1_TG GENMASK_ULL(11, 10)
Robin Murphy1cf9e542018-03-26 13:35:09 +0100360#define CMDQ_TLBI_1_VA_MASK GENMASK_ULL(63, 12)
Robin Murphy6619c912018-03-26 13:35:14 +0100361#define CMDQ_TLBI_1_IPA_MASK GENMASK_ULL(51, 12)
Will Deacon48ec83b2015-05-27 17:25:59 +0100362
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +0100363#define CMDQ_ATC_0_SSID GENMASK_ULL(31, 12)
364#define CMDQ_ATC_0_SID GENMASK_ULL(63, 32)
365#define CMDQ_ATC_0_GLOBAL (1UL << 9)
366#define CMDQ_ATC_1_SIZE GENMASK_ULL(5, 0)
367#define CMDQ_ATC_1_ADDR_MASK GENMASK_ULL(63, 12)
368
Robin Murphy7417b992018-03-26 13:35:12 +0100369#define CMDQ_PRI_0_SSID GENMASK_ULL(31, 12)
370#define CMDQ_PRI_0_SID GENMASK_ULL(63, 32)
371#define CMDQ_PRI_1_GRPID GENMASK_ULL(8, 0)
372#define CMDQ_PRI_1_RESP GENMASK_ULL(13, 12)
Will Deacon48ec83b2015-05-27 17:25:59 +0100373
Robin Murphy7417b992018-03-26 13:35:12 +0100374#define CMDQ_SYNC_0_CS GENMASK_ULL(13, 12)
375#define CMDQ_SYNC_0_CS_NONE 0
376#define CMDQ_SYNC_0_CS_IRQ 1
377#define CMDQ_SYNC_0_CS_SEV 2
378#define CMDQ_SYNC_0_MSH GENMASK_ULL(23, 22)
379#define CMDQ_SYNC_0_MSIATTR GENMASK_ULL(27, 24)
380#define CMDQ_SYNC_0_MSIDATA GENMASK_ULL(63, 32)
Robin Murphy6619c912018-03-26 13:35:14 +0100381#define CMDQ_SYNC_1_MSIADDR_MASK GENMASK_ULL(51, 2)
Will Deacon48ec83b2015-05-27 17:25:59 +0100382
383/* Event queue */
Will Deacond25f6ea2019-05-16 16:08:47 +0100384#define EVTQ_ENT_SZ_SHIFT 5
385#define EVTQ_ENT_DWORDS ((1 << EVTQ_ENT_SZ_SHIFT) >> 3)
386#define EVTQ_MAX_SZ_SHIFT (Q_MAX_SZ_SHIFT - EVTQ_ENT_SZ_SHIFT)
Will Deacon48ec83b2015-05-27 17:25:59 +0100387
Robin Murphy7417b992018-03-26 13:35:12 +0100388#define EVTQ_0_ID GENMASK_ULL(7, 0)
Will Deacon48ec83b2015-05-27 17:25:59 +0100389
390/* PRI queue */
Will Deacond25f6ea2019-05-16 16:08:47 +0100391#define PRIQ_ENT_SZ_SHIFT 4
392#define PRIQ_ENT_DWORDS ((1 << PRIQ_ENT_SZ_SHIFT) >> 3)
393#define PRIQ_MAX_SZ_SHIFT (Q_MAX_SZ_SHIFT - PRIQ_ENT_SZ_SHIFT)
Will Deacon48ec83b2015-05-27 17:25:59 +0100394
Robin Murphy7417b992018-03-26 13:35:12 +0100395#define PRIQ_0_SID GENMASK_ULL(31, 0)
396#define PRIQ_0_SSID GENMASK_ULL(51, 32)
Will Deacon48ec83b2015-05-27 17:25:59 +0100397#define PRIQ_0_PERM_PRIV (1UL << 58)
398#define PRIQ_0_PERM_EXEC (1UL << 59)
399#define PRIQ_0_PERM_READ (1UL << 60)
400#define PRIQ_0_PERM_WRITE (1UL << 61)
401#define PRIQ_0_PRG_LAST (1UL << 62)
402#define PRIQ_0_SSID_V (1UL << 63)
403
Robin Murphy7417b992018-03-26 13:35:12 +0100404#define PRIQ_1_PRG_IDX GENMASK_ULL(8, 0)
Robin Murphy1cf9e542018-03-26 13:35:09 +0100405#define PRIQ_1_ADDR_MASK GENMASK_ULL(63, 12)
Will Deacon48ec83b2015-05-27 17:25:59 +0100406
407/* High-level queue structures */
Will Deacon587e6c12019-07-02 17:16:25 +0100408#define ARM_SMMU_POLL_TIMEOUT_US 1000000 /* 1s! */
409#define ARM_SMMU_POLL_SPIN_COUNT 10
Will Deacon48ec83b2015-05-27 17:25:59 +0100410
Eric Auger50019f02017-01-19 20:57:56 +0000411#define MSI_IOVA_BASE 0x8000000
412#define MSI_IOVA_LENGTH 0x100000
413
Zhen Leia71792d2018-07-12 17:28:43 +0800414static bool disable_bypass = 1;
Will Deacon48ec83b2015-05-27 17:25:59 +0100415module_param_named(disable_bypass, disable_bypass, bool, S_IRUGO);
416MODULE_PARM_DESC(disable_bypass,
417 "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.");
418
419enum pri_resp {
Robin Murphy7417b992018-03-26 13:35:12 +0100420 PRI_RESP_DENY = 0,
421 PRI_RESP_FAIL = 1,
422 PRI_RESP_SUCC = 2,
Will Deacon48ec83b2015-05-27 17:25:59 +0100423};
424
Marc Zyngier166bdbd2015-10-13 18:32:30 +0100425enum arm_smmu_msi_index {
426 EVTQ_MSI_INDEX,
427 GERROR_MSI_INDEX,
428 PRIQ_MSI_INDEX,
429 ARM_SMMU_MAX_MSIS,
430};
431
432static phys_addr_t arm_smmu_msi_cfg[ARM_SMMU_MAX_MSIS][3] = {
433 [EVTQ_MSI_INDEX] = {
434 ARM_SMMU_EVTQ_IRQ_CFG0,
435 ARM_SMMU_EVTQ_IRQ_CFG1,
436 ARM_SMMU_EVTQ_IRQ_CFG2,
437 },
438 [GERROR_MSI_INDEX] = {
439 ARM_SMMU_GERROR_IRQ_CFG0,
440 ARM_SMMU_GERROR_IRQ_CFG1,
441 ARM_SMMU_GERROR_IRQ_CFG2,
442 },
443 [PRIQ_MSI_INDEX] = {
444 ARM_SMMU_PRIQ_IRQ_CFG0,
445 ARM_SMMU_PRIQ_IRQ_CFG1,
446 ARM_SMMU_PRIQ_IRQ_CFG2,
447 },
448};
449
Will Deacon48ec83b2015-05-27 17:25:59 +0100450struct arm_smmu_cmdq_ent {
451 /* Common fields */
452 u8 opcode;
453 bool substream_valid;
454
455 /* Command-specific fields */
456 union {
457 #define CMDQ_OP_PREFETCH_CFG 0x1
458 struct {
459 u32 sid;
460 u8 size;
461 u64 addr;
462 } prefetch;
463
464 #define CMDQ_OP_CFGI_STE 0x3
465 #define CMDQ_OP_CFGI_ALL 0x4
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +0100466 #define CMDQ_OP_CFGI_CD 0x5
467 #define CMDQ_OP_CFGI_CD_ALL 0x6
Will Deacon48ec83b2015-05-27 17:25:59 +0100468 struct {
469 u32 sid;
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +0100470 u32 ssid;
Will Deacon48ec83b2015-05-27 17:25:59 +0100471 union {
472 bool leaf;
473 u8 span;
474 };
475 } cfgi;
476
477 #define CMDQ_OP_TLBI_NH_ASID 0x11
478 #define CMDQ_OP_TLBI_NH_VA 0x12
479 #define CMDQ_OP_TLBI_EL2_ALL 0x20
480 #define CMDQ_OP_TLBI_S12_VMALL 0x28
481 #define CMDQ_OP_TLBI_S2_IPA 0x2a
482 #define CMDQ_OP_TLBI_NSNH_ALL 0x30
483 struct {
Rob Herring6a481a92020-02-24 16:31:29 -0600484 u8 num;
485 u8 scale;
Will Deacon48ec83b2015-05-27 17:25:59 +0100486 u16 asid;
487 u16 vmid;
488 bool leaf;
Rob Herring6a481a92020-02-24 16:31:29 -0600489 u8 ttl;
490 u8 tg;
Will Deacon48ec83b2015-05-27 17:25:59 +0100491 u64 addr;
492 } tlbi;
493
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +0100494 #define CMDQ_OP_ATC_INV 0x40
495 #define ATC_INV_SIZE_ALL 52
496 struct {
497 u32 sid;
498 u32 ssid;
499 u64 addr;
500 u8 size;
501 bool global;
502 } atc;
503
Will Deacon48ec83b2015-05-27 17:25:59 +0100504 #define CMDQ_OP_PRI_RESP 0x41
505 struct {
506 u32 sid;
507 u32 ssid;
508 u16 grpid;
509 enum pri_resp resp;
510 } pri;
511
512 #define CMDQ_OP_CMD_SYNC 0x46
Robin Murphy37de98f2017-10-18 15:04:26 +0100513 struct {
Robin Murphy37de98f2017-10-18 15:04:26 +0100514 u64 msiaddr;
515 } sync;
Will Deacon48ec83b2015-05-27 17:25:59 +0100516 };
517};
518
Will Deacon52be8632019-07-02 17:16:08 +0100519struct arm_smmu_ll_queue {
Will Deacon587e6c12019-07-02 17:16:25 +0100520 union {
521 u64 val;
522 struct {
523 u32 prod;
524 u32 cons;
525 };
526 struct {
527 atomic_t prod;
528 atomic_t cons;
529 } atomic;
530 u8 __pad[SMP_CACHE_BYTES];
531 } ____cacheline_aligned_in_smp;
Will Deacon52be8632019-07-02 17:16:08 +0100532 u32 max_n_shift;
533};
534
Will Deacon48ec83b2015-05-27 17:25:59 +0100535struct arm_smmu_queue {
Will Deacon52be8632019-07-02 17:16:08 +0100536 struct arm_smmu_ll_queue llq;
Will Deacon48ec83b2015-05-27 17:25:59 +0100537 int irq; /* Wired interrupt */
538
539 __le64 *base;
540 dma_addr_t base_dma;
541 u64 q_base;
542
543 size_t ent_dwords;
Will Deacon48ec83b2015-05-27 17:25:59 +0100544
545 u32 __iomem *prod_reg;
546 u32 __iomem *cons_reg;
547};
548
Will Deacon587e6c12019-07-02 17:16:25 +0100549struct arm_smmu_queue_poll {
550 ktime_t timeout;
551 unsigned int delay;
552 unsigned int spin_cnt;
553 bool wfe;
554};
555
Will Deacon48ec83b2015-05-27 17:25:59 +0100556struct arm_smmu_cmdq {
557 struct arm_smmu_queue q;
Will Deacon587e6c12019-07-02 17:16:25 +0100558 atomic_long_t *valid_map;
559 atomic_t owner_prod;
560 atomic_t lock;
Will Deacon48ec83b2015-05-27 17:25:59 +0100561};
562
Jean-Philippe Brucker4ce8da42020-02-24 17:58:44 +0100563struct arm_smmu_cmdq_batch {
564 u64 cmds[CMDQ_BATCH_ENTRIES * CMDQ_ENT_DWORDS];
565 int num;
566};
567
Will Deacon48ec83b2015-05-27 17:25:59 +0100568struct arm_smmu_evtq {
569 struct arm_smmu_queue q;
570 u32 max_stalls;
571};
572
573struct arm_smmu_priq {
574 struct arm_smmu_queue q;
575};
576
577/* High-level stream table and context descriptor structures */
578struct arm_smmu_strtab_l1_desc {
579 u8 span;
580
581 __le64 *l2ptr;
582 dma_addr_t l2ptr_dma;
583};
584
Jean-Philippe Brucker7bc4f3f2020-01-15 13:52:31 +0100585struct arm_smmu_ctx_desc {
586 u16 asid;
587 u64 ttbr;
588 u64 tcr;
589 u64 mair;
590};
Will Deacon48ec83b2015-05-27 17:25:59 +0100591
Jean-Philippe Brucker73af06f2020-01-15 13:52:36 +0100592struct arm_smmu_l1_ctx_desc {
593 __le64 *l2ptr;
594 dma_addr_t l2ptr_dma;
595};
596
Jean-Philippe Brucker7bc4f3f2020-01-15 13:52:31 +0100597struct arm_smmu_ctx_desc_cfg {
598 __le64 *cdtab;
599 dma_addr_t cdtab_dma;
Jean-Philippe Brucker73af06f2020-01-15 13:52:36 +0100600 struct arm_smmu_l1_ctx_desc *l1_desc;
Jean-Philippe Bruckera557aff2020-01-15 13:52:32 +0100601 unsigned int num_l1_ents;
Jean-Philippe Brucker7bc4f3f2020-01-15 13:52:31 +0100602};
603
604struct arm_smmu_s1_cfg {
605 struct arm_smmu_ctx_desc_cfg cdcfg;
606 struct arm_smmu_ctx_desc cd;
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +0100607 u8 s1fmt;
Jean-Philippe Bruckera557aff2020-01-15 13:52:32 +0100608 u8 s1cdmax;
Will Deacon48ec83b2015-05-27 17:25:59 +0100609};
610
611struct arm_smmu_s2_cfg {
612 u16 vmid;
613 u64 vttbr;
614 u64 vtcr;
615};
616
Will Deacon48ec83b2015-05-27 17:25:59 +0100617struct arm_smmu_strtab_cfg {
618 __le64 *strtab;
619 dma_addr_t strtab_dma;
620 struct arm_smmu_strtab_l1_desc *l1_desc;
621 unsigned int num_l1_ents;
622
623 u64 strtab_base;
624 u32 strtab_base_cfg;
625};
626
627/* An SMMUv3 instance */
628struct arm_smmu_device {
629 struct device *dev;
630 void __iomem *base;
631
632#define ARM_SMMU_FEAT_2_LVL_STRTAB (1 << 0)
633#define ARM_SMMU_FEAT_2_LVL_CDTAB (1 << 1)
634#define ARM_SMMU_FEAT_TT_LE (1 << 2)
635#define ARM_SMMU_FEAT_TT_BE (1 << 3)
636#define ARM_SMMU_FEAT_PRI (1 << 4)
637#define ARM_SMMU_FEAT_ATS (1 << 5)
638#define ARM_SMMU_FEAT_SEV (1 << 6)
639#define ARM_SMMU_FEAT_MSI (1 << 7)
640#define ARM_SMMU_FEAT_COHERENCY (1 << 8)
641#define ARM_SMMU_FEAT_TRANS_S1 (1 << 9)
642#define ARM_SMMU_FEAT_TRANS_S2 (1 << 10)
643#define ARM_SMMU_FEAT_STALLS (1 << 11)
644#define ARM_SMMU_FEAT_HYP (1 << 12)
Yisheng Xie9cff86fd22017-09-21 20:36:07 +0800645#define ARM_SMMU_FEAT_STALL_FORCE (1 << 13)
Robin Murphydcd189e2018-03-26 13:35:15 +0100646#define ARM_SMMU_FEAT_VAX (1 << 14)
Rob Herring6a481a92020-02-24 16:31:29 -0600647#define ARM_SMMU_FEAT_RANGE_INV (1 << 15)
Will Deacon48ec83b2015-05-27 17:25:59 +0100648 u32 features;
649
Zhen Lei5e929462015-07-07 04:30:18 +0100650#define ARM_SMMU_OPT_SKIP_PREFETCH (1 << 0)
Linu Cheriane5b829d2017-06-22 17:35:37 +0530651#define ARM_SMMU_OPT_PAGE0_REGS_ONLY (1 << 1)
Zhen Lei5e929462015-07-07 04:30:18 +0100652 u32 options;
653
Will Deacon48ec83b2015-05-27 17:25:59 +0100654 struct arm_smmu_cmdq cmdq;
655 struct arm_smmu_evtq evtq;
656 struct arm_smmu_priq priq;
657
658 int gerr_irq;
Geetha Sowjanyaf9354482017-06-23 19:04:36 +0530659 int combined_irq;
Will Deacon48ec83b2015-05-27 17:25:59 +0100660
661 unsigned long ias; /* IPA */
662 unsigned long oas; /* PA */
Robin Murphyd5466352016-05-09 17:20:09 +0100663 unsigned long pgsize_bitmap;
Will Deacon48ec83b2015-05-27 17:25:59 +0100664
665#define ARM_SMMU_MAX_ASIDS (1 << 16)
666 unsigned int asid_bits;
667 DECLARE_BITMAP(asid_map, ARM_SMMU_MAX_ASIDS);
668
669#define ARM_SMMU_MAX_VMIDS (1 << 16)
670 unsigned int vmid_bits;
671 DECLARE_BITMAP(vmid_map, ARM_SMMU_MAX_VMIDS);
672
673 unsigned int ssid_bits;
674 unsigned int sid_bits;
675
676 struct arm_smmu_strtab_cfg strtab_cfg;
Joerg Roedel9648cbc2017-02-01 18:11:36 +0100677
678 /* IOMMU core code handle */
679 struct iommu_device iommu;
Will Deacon48ec83b2015-05-27 17:25:59 +0100680};
681
Robin Murphy8f785152016-09-12 17:13:45 +0100682/* SMMU private data for each master */
Jean-Philippe Bruckerb54f4262019-04-17 19:24:43 +0100683struct arm_smmu_master {
Will Deacon48ec83b2015-05-27 17:25:59 +0100684 struct arm_smmu_device *smmu;
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +0100685 struct device *dev;
Jean-Philippe Brucker8be39a12019-04-17 19:24:45 +0100686 struct arm_smmu_domain *domain;
Jean-Philippe Brucker2a7e62f2019-04-17 19:24:46 +0100687 struct list_head domain_head;
Jean-Philippe Bruckerbcecaee2019-04-17 19:24:44 +0100688 u32 *sids;
689 unsigned int num_sids;
Will Deaconf75d8e32019-08-20 17:32:18 +0100690 bool ats_enabled;
Jean-Philippe Brucker89535822020-01-15 13:52:29 +0100691 unsigned int ssid_bits;
Will Deacon48ec83b2015-05-27 17:25:59 +0100692};
693
694/* SMMU private data for an IOMMU domain */
695enum arm_smmu_domain_stage {
696 ARM_SMMU_DOMAIN_S1 = 0,
697 ARM_SMMU_DOMAIN_S2,
698 ARM_SMMU_DOMAIN_NESTED,
Will Deaconbeb3c6a2017-01-06 16:27:30 +0000699 ARM_SMMU_DOMAIN_BYPASS,
Will Deacon48ec83b2015-05-27 17:25:59 +0100700};
701
702struct arm_smmu_domain {
703 struct arm_smmu_device *smmu;
704 struct mutex init_mutex; /* Protects smmu pointer */
705
706 struct io_pgtable_ops *pgtbl_ops;
Zhen Lei9662b992018-09-20 17:10:25 +0100707 bool non_strict;
Will Deaconcdb8a3c2019-08-20 16:28:54 +0100708 atomic_t nr_ats_masters;
Will Deacon48ec83b2015-05-27 17:25:59 +0100709
710 enum arm_smmu_domain_stage stage;
711 union {
712 struct arm_smmu_s1_cfg s1_cfg;
713 struct arm_smmu_s2_cfg s2_cfg;
714 };
715
716 struct iommu_domain domain;
Jean-Philippe Brucker2a7e62f2019-04-17 19:24:46 +0100717
718 struct list_head devices;
719 spinlock_t devices_lock;
Will Deacon48ec83b2015-05-27 17:25:59 +0100720};
721
Zhen Lei5e929462015-07-07 04:30:18 +0100722struct arm_smmu_option_prop {
723 u32 opt;
724 const char *prop;
725};
726
727static struct arm_smmu_option_prop arm_smmu_options[] = {
728 { ARM_SMMU_OPT_SKIP_PREFETCH, "hisilicon,broken-prefetch-cmd" },
Linu Cheriane5b829d2017-06-22 17:35:37 +0530729 { ARM_SMMU_OPT_PAGE0_REGS_ONLY, "cavium,cn9900-broken-page1-regspace"},
Zhen Lei5e929462015-07-07 04:30:18 +0100730 { 0, NULL},
731};
732
Linu Cheriane5b829d2017-06-22 17:35:37 +0530733static inline void __iomem *arm_smmu_page1_fixup(unsigned long offset,
734 struct arm_smmu_device *smmu)
735{
736 if ((offset > SZ_64K) &&
737 (smmu->options & ARM_SMMU_OPT_PAGE0_REGS_ONLY))
738 offset -= SZ_64K;
739
740 return smmu->base + offset;
741}
742
Will Deacon48ec83b2015-05-27 17:25:59 +0100743static struct arm_smmu_domain *to_smmu_domain(struct iommu_domain *dom)
744{
745 return container_of(dom, struct arm_smmu_domain, domain);
746}
747
Zhen Lei5e929462015-07-07 04:30:18 +0100748static void parse_driver_options(struct arm_smmu_device *smmu)
749{
750 int i = 0;
751
752 do {
753 if (of_property_read_bool(smmu->dev->of_node,
754 arm_smmu_options[i].prop)) {
755 smmu->options |= arm_smmu_options[i].opt;
756 dev_notice(smmu->dev, "option %s\n",
757 arm_smmu_options[i].prop);
758 }
759 } while (arm_smmu_options[++i].opt);
760}
761
Will Deacon48ec83b2015-05-27 17:25:59 +0100762/* Low-level queue manipulation functions */
Will Deacon587e6c12019-07-02 17:16:25 +0100763static bool queue_has_space(struct arm_smmu_ll_queue *q, u32 n)
764{
765 u32 space, prod, cons;
766
767 prod = Q_IDX(q, q->prod);
768 cons = Q_IDX(q, q->cons);
769
770 if (Q_WRP(q, q->prod) == Q_WRP(q, q->cons))
771 space = (1 << q->max_n_shift) - (prod - cons);
772 else
773 space = cons - prod;
774
775 return space >= n;
776}
777
Will Deacon7c288a52019-07-02 17:16:16 +0100778static bool queue_full(struct arm_smmu_ll_queue *q)
Will Deacon48ec83b2015-05-27 17:25:59 +0100779{
780 return Q_IDX(q, q->prod) == Q_IDX(q, q->cons) &&
781 Q_WRP(q, q->prod) != Q_WRP(q, q->cons);
782}
783
Will Deacon7c288a52019-07-02 17:16:16 +0100784static bool queue_empty(struct arm_smmu_ll_queue *q)
Will Deacon48ec83b2015-05-27 17:25:59 +0100785{
786 return Q_IDX(q, q->prod) == Q_IDX(q, q->cons) &&
787 Q_WRP(q, q->prod) == Q_WRP(q, q->cons);
788}
789
Will Deacon587e6c12019-07-02 17:16:25 +0100790static bool queue_consumed(struct arm_smmu_ll_queue *q, u32 prod)
Will Deacon48ec83b2015-05-27 17:25:59 +0100791{
Will Deacon587e6c12019-07-02 17:16:25 +0100792 return ((Q_WRP(q, q->cons) == Q_WRP(q, prod)) &&
793 (Q_IDX(q, q->cons) > Q_IDX(q, prod))) ||
794 ((Q_WRP(q, q->cons) != Q_WRP(q, prod)) &&
795 (Q_IDX(q, q->cons) <= Q_IDX(q, prod)));
Will Deacon48ec83b2015-05-27 17:25:59 +0100796}
797
Will Deacon2a8868f2019-07-02 17:12:24 +0100798static void queue_sync_cons_out(struct arm_smmu_queue *q)
Will Deacon48ec83b2015-05-27 17:25:59 +0100799{
Will Deacona868e852018-11-07 22:58:24 +0000800 /*
801 * Ensure that all CPU accesses (reads and writes) to the queue
802 * are complete before we update the cons pointer.
803 */
804 mb();
Will Deacon52be8632019-07-02 17:16:08 +0100805 writel_relaxed(q->llq.cons, q->cons_reg);
Will Deacon48ec83b2015-05-27 17:25:59 +0100806}
807
Will Deacon7c288a52019-07-02 17:16:16 +0100808static void queue_inc_cons(struct arm_smmu_ll_queue *q)
Will Deacon2a8868f2019-07-02 17:12:24 +0100809{
Will Deacon7c288a52019-07-02 17:16:16 +0100810 u32 cons = (Q_WRP(q, q->cons) | Q_IDX(q, q->cons)) + 1;
811 q->cons = Q_OVF(q->cons) | Q_WRP(q, cons) | Q_IDX(q, cons);
Will Deacon2a8868f2019-07-02 17:12:24 +0100812}
813
814static int queue_sync_prod_in(struct arm_smmu_queue *q)
Will Deacon48ec83b2015-05-27 17:25:59 +0100815{
816 int ret = 0;
817 u32 prod = readl_relaxed(q->prod_reg);
818
Will Deacon52be8632019-07-02 17:16:08 +0100819 if (Q_OVF(prod) != Q_OVF(q->llq.prod))
Will Deacon48ec83b2015-05-27 17:25:59 +0100820 ret = -EOVERFLOW;
821
Will Deacon52be8632019-07-02 17:16:08 +0100822 q->llq.prod = prod;
Will Deacon48ec83b2015-05-27 17:25:59 +0100823 return ret;
824}
825
Will Deacon587e6c12019-07-02 17:16:25 +0100826static u32 queue_inc_prod_n(struct arm_smmu_ll_queue *q, int n)
Will Deacon48ec83b2015-05-27 17:25:59 +0100827{
Will Deacon587e6c12019-07-02 17:16:25 +0100828 u32 prod = (Q_WRP(q, q->prod) | Q_IDX(q, q->prod)) + n;
829 return Q_OVF(q->prod) | Q_WRP(q, prod) | Q_IDX(q, prod);
Will Deacon48ec83b2015-05-27 17:25:59 +0100830}
831
Will Deacon587e6c12019-07-02 17:16:25 +0100832static void queue_poll_init(struct arm_smmu_device *smmu,
833 struct arm_smmu_queue_poll *qp)
Will Deacon48ec83b2015-05-27 17:25:59 +0100834{
Will Deacon587e6c12019-07-02 17:16:25 +0100835 qp->delay = 1;
836 qp->spin_cnt = 0;
837 qp->wfe = !!(smmu->features & ARM_SMMU_FEAT_SEV);
838 qp->timeout = ktime_add_us(ktime_get(), ARM_SMMU_POLL_TIMEOUT_US);
Will Deacon48ec83b2015-05-27 17:25:59 +0100839}
Sunil Gouthamb847de42017-05-05 16:47:46 +0530840
Will Deacon587e6c12019-07-02 17:16:25 +0100841static int queue_poll(struct arm_smmu_queue_poll *qp)
Will Deacon48ec83b2015-05-27 17:25:59 +0100842{
Will Deacon587e6c12019-07-02 17:16:25 +0100843 if (ktime_compare(ktime_get(), qp->timeout) > 0)
844 return -ETIMEDOUT;
Will Deacon48ec83b2015-05-27 17:25:59 +0100845
Will Deacon587e6c12019-07-02 17:16:25 +0100846 if (qp->wfe) {
847 wfe();
848 } else if (++qp->spin_cnt < ARM_SMMU_POLL_SPIN_COUNT) {
849 cpu_relax();
850 } else {
851 udelay(qp->delay);
852 qp->delay *= 2;
853 qp->spin_cnt = 0;
Will Deacon48ec83b2015-05-27 17:25:59 +0100854 }
855
856 return 0;
857}
858
859static void queue_write(__le64 *dst, u64 *src, size_t n_dwords)
860{
861 int i;
862
863 for (i = 0; i < n_dwords; ++i)
864 *dst++ = cpu_to_le64(*src++);
865}
866
Will Deacon48ec83b2015-05-27 17:25:59 +0100867static void queue_read(__le64 *dst, u64 *src, size_t n_dwords)
868{
869 int i;
870
871 for (i = 0; i < n_dwords; ++i)
872 *dst++ = le64_to_cpu(*src++);
873}
874
875static int queue_remove_raw(struct arm_smmu_queue *q, u64 *ent)
876{
Will Deacon7c288a52019-07-02 17:16:16 +0100877 if (queue_empty(&q->llq))
Will Deacon48ec83b2015-05-27 17:25:59 +0100878 return -EAGAIN;
879
Will Deacon52be8632019-07-02 17:16:08 +0100880 queue_read(ent, Q_ENT(q, q->llq.cons), q->ent_dwords);
Will Deacon7c288a52019-07-02 17:16:16 +0100881 queue_inc_cons(&q->llq);
Will Deacon2a8868f2019-07-02 17:12:24 +0100882 queue_sync_cons_out(q);
Will Deacon48ec83b2015-05-27 17:25:59 +0100883 return 0;
884}
885
886/* High-level queue accessors */
887static int arm_smmu_cmdq_build_cmd(u64 *cmd, struct arm_smmu_cmdq_ent *ent)
888{
Will Deacond25f6ea2019-05-16 16:08:47 +0100889 memset(cmd, 0, 1 << CMDQ_ENT_SZ_SHIFT);
Robin Murphy7417b992018-03-26 13:35:12 +0100890 cmd[0] |= FIELD_PREP(CMDQ_0_OP, ent->opcode);
Will Deacon48ec83b2015-05-27 17:25:59 +0100891
892 switch (ent->opcode) {
893 case CMDQ_OP_TLBI_EL2_ALL:
894 case CMDQ_OP_TLBI_NSNH_ALL:
895 break;
896 case CMDQ_OP_PREFETCH_CFG:
Robin Murphy7417b992018-03-26 13:35:12 +0100897 cmd[0] |= FIELD_PREP(CMDQ_PREFETCH_0_SID, ent->prefetch.sid);
898 cmd[1] |= FIELD_PREP(CMDQ_PREFETCH_1_SIZE, ent->prefetch.size);
Will Deacon48ec83b2015-05-27 17:25:59 +0100899 cmd[1] |= ent->prefetch.addr & CMDQ_PREFETCH_1_ADDR_MASK;
900 break;
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +0100901 case CMDQ_OP_CFGI_CD:
902 cmd[0] |= FIELD_PREP(CMDQ_CFGI_0_SSID, ent->cfgi.ssid);
903 /* Fallthrough */
Will Deacon48ec83b2015-05-27 17:25:59 +0100904 case CMDQ_OP_CFGI_STE:
Robin Murphy7417b992018-03-26 13:35:12 +0100905 cmd[0] |= FIELD_PREP(CMDQ_CFGI_0_SID, ent->cfgi.sid);
906 cmd[1] |= FIELD_PREP(CMDQ_CFGI_1_LEAF, ent->cfgi.leaf);
Will Deacon48ec83b2015-05-27 17:25:59 +0100907 break;
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +0100908 case CMDQ_OP_CFGI_CD_ALL:
909 cmd[0] |= FIELD_PREP(CMDQ_CFGI_0_SID, ent->cfgi.sid);
910 break;
Will Deacon48ec83b2015-05-27 17:25:59 +0100911 case CMDQ_OP_CFGI_ALL:
912 /* Cover the entire SID range */
Robin Murphy7417b992018-03-26 13:35:12 +0100913 cmd[1] |= FIELD_PREP(CMDQ_CFGI_1_RANGE, 31);
Will Deacon48ec83b2015-05-27 17:25:59 +0100914 break;
915 case CMDQ_OP_TLBI_NH_VA:
Rob Herring6a481a92020-02-24 16:31:29 -0600916 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_NUM, ent->tlbi.num);
917 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_SCALE, ent->tlbi.scale);
Shameer Kolothum935d43b2019-11-13 16:11:38 +0000918 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_VMID, ent->tlbi.vmid);
Robin Murphy7417b992018-03-26 13:35:12 +0100919 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_ASID, ent->tlbi.asid);
920 cmd[1] |= FIELD_PREP(CMDQ_TLBI_1_LEAF, ent->tlbi.leaf);
Rob Herring6a481a92020-02-24 16:31:29 -0600921 cmd[1] |= FIELD_PREP(CMDQ_TLBI_1_TTL, ent->tlbi.ttl);
922 cmd[1] |= FIELD_PREP(CMDQ_TLBI_1_TG, ent->tlbi.tg);
Will Deacon1c27df12015-09-18 16:12:56 +0100923 cmd[1] |= ent->tlbi.addr & CMDQ_TLBI_1_VA_MASK;
924 break;
Will Deacon48ec83b2015-05-27 17:25:59 +0100925 case CMDQ_OP_TLBI_S2_IPA:
Rob Herring6a481a92020-02-24 16:31:29 -0600926 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_NUM, ent->tlbi.num);
927 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_SCALE, ent->tlbi.scale);
Robin Murphy7417b992018-03-26 13:35:12 +0100928 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_VMID, ent->tlbi.vmid);
929 cmd[1] |= FIELD_PREP(CMDQ_TLBI_1_LEAF, ent->tlbi.leaf);
Rob Herring6a481a92020-02-24 16:31:29 -0600930 cmd[1] |= FIELD_PREP(CMDQ_TLBI_1_TTL, ent->tlbi.ttl);
931 cmd[1] |= FIELD_PREP(CMDQ_TLBI_1_TG, ent->tlbi.tg);
Will Deacon1c27df12015-09-18 16:12:56 +0100932 cmd[1] |= ent->tlbi.addr & CMDQ_TLBI_1_IPA_MASK;
Will Deacon48ec83b2015-05-27 17:25:59 +0100933 break;
934 case CMDQ_OP_TLBI_NH_ASID:
Robin Murphy7417b992018-03-26 13:35:12 +0100935 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_ASID, ent->tlbi.asid);
Will Deacon48ec83b2015-05-27 17:25:59 +0100936 /* Fallthrough */
937 case CMDQ_OP_TLBI_S12_VMALL:
Robin Murphy7417b992018-03-26 13:35:12 +0100938 cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_VMID, ent->tlbi.vmid);
Will Deacon48ec83b2015-05-27 17:25:59 +0100939 break;
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +0100940 case CMDQ_OP_ATC_INV:
941 cmd[0] |= FIELD_PREP(CMDQ_0_SSV, ent->substream_valid);
942 cmd[0] |= FIELD_PREP(CMDQ_ATC_0_GLOBAL, ent->atc.global);
943 cmd[0] |= FIELD_PREP(CMDQ_ATC_0_SSID, ent->atc.ssid);
944 cmd[0] |= FIELD_PREP(CMDQ_ATC_0_SID, ent->atc.sid);
945 cmd[1] |= FIELD_PREP(CMDQ_ATC_1_SIZE, ent->atc.size);
946 cmd[1] |= ent->atc.addr & CMDQ_ATC_1_ADDR_MASK;
947 break;
Will Deacon48ec83b2015-05-27 17:25:59 +0100948 case CMDQ_OP_PRI_RESP:
Robin Murphy7417b992018-03-26 13:35:12 +0100949 cmd[0] |= FIELD_PREP(CMDQ_0_SSV, ent->substream_valid);
950 cmd[0] |= FIELD_PREP(CMDQ_PRI_0_SSID, ent->pri.ssid);
951 cmd[0] |= FIELD_PREP(CMDQ_PRI_0_SID, ent->pri.sid);
952 cmd[1] |= FIELD_PREP(CMDQ_PRI_1_GRPID, ent->pri.grpid);
Will Deacon48ec83b2015-05-27 17:25:59 +0100953 switch (ent->pri.resp) {
954 case PRI_RESP_DENY:
Will Deacon48ec83b2015-05-27 17:25:59 +0100955 case PRI_RESP_FAIL:
Will Deacon48ec83b2015-05-27 17:25:59 +0100956 case PRI_RESP_SUCC:
Will Deacon48ec83b2015-05-27 17:25:59 +0100957 break;
958 default:
959 return -EINVAL;
960 }
Robin Murphy7417b992018-03-26 13:35:12 +0100961 cmd[1] |= FIELD_PREP(CMDQ_PRI_1_RESP, ent->pri.resp);
Will Deacon48ec83b2015-05-27 17:25:59 +0100962 break;
963 case CMDQ_OP_CMD_SYNC:
Will Deacon587e6c12019-07-02 17:16:25 +0100964 if (ent->sync.msiaddr) {
Robin Murphy7417b992018-03-26 13:35:12 +0100965 cmd[0] |= FIELD_PREP(CMDQ_SYNC_0_CS, CMDQ_SYNC_0_CS_IRQ);
Will Deacon587e6c12019-07-02 17:16:25 +0100966 cmd[1] |= ent->sync.msiaddr & CMDQ_SYNC_1_MSIADDR_MASK;
967 } else {
Robin Murphy7417b992018-03-26 13:35:12 +0100968 cmd[0] |= FIELD_PREP(CMDQ_SYNC_0_CS, CMDQ_SYNC_0_CS_SEV);
Will Deacon587e6c12019-07-02 17:16:25 +0100969 }
Robin Murphy7417b992018-03-26 13:35:12 +0100970 cmd[0] |= FIELD_PREP(CMDQ_SYNC_0_MSH, ARM_SMMU_SH_ISH);
971 cmd[0] |= FIELD_PREP(CMDQ_SYNC_0_MSIATTR, ARM_SMMU_MEMATTR_OIWB);
Will Deacon48ec83b2015-05-27 17:25:59 +0100972 break;
973 default:
974 return -ENOENT;
975 }
976
977 return 0;
978}
979
Will Deacon587e6c12019-07-02 17:16:25 +0100980static void arm_smmu_cmdq_build_sync_cmd(u64 *cmd, struct arm_smmu_device *smmu,
981 u32 prod)
982{
983 struct arm_smmu_queue *q = &smmu->cmdq.q;
984 struct arm_smmu_cmdq_ent ent = {
985 .opcode = CMDQ_OP_CMD_SYNC,
986 };
987
988 /*
989 * Beware that Hi16xx adds an extra 32 bits of goodness to its MSI
990 * payload, so the write will zero the entire command on that platform.
991 */
992 if (smmu->features & ARM_SMMU_FEAT_MSI &&
993 smmu->features & ARM_SMMU_FEAT_COHERENCY) {
994 ent.sync.msiaddr = q->base_dma + Q_IDX(&q->llq, prod) *
995 q->ent_dwords * 8;
996 }
997
998 arm_smmu_cmdq_build_cmd(cmd, &ent);
999}
1000
Will Deacon48ec83b2015-05-27 17:25:59 +01001001static void arm_smmu_cmdq_skip_err(struct arm_smmu_device *smmu)
1002{
1003 static const char *cerror_str[] = {
1004 [CMDQ_ERR_CERROR_NONE_IDX] = "No error",
1005 [CMDQ_ERR_CERROR_ILL_IDX] = "Illegal command",
1006 [CMDQ_ERR_CERROR_ABT_IDX] = "Abort on command fetch",
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01001007 [CMDQ_ERR_CERROR_ATC_INV_IDX] = "ATC invalidate timeout",
Will Deacon48ec83b2015-05-27 17:25:59 +01001008 };
1009
1010 int i;
1011 u64 cmd[CMDQ_ENT_DWORDS];
1012 struct arm_smmu_queue *q = &smmu->cmdq.q;
1013 u32 cons = readl_relaxed(q->cons_reg);
Robin Murphycbcee192018-03-26 13:35:10 +01001014 u32 idx = FIELD_GET(CMDQ_CONS_ERR, cons);
Will Deacon48ec83b2015-05-27 17:25:59 +01001015 struct arm_smmu_cmdq_ent cmd_sync = {
1016 .opcode = CMDQ_OP_CMD_SYNC,
1017 };
1018
1019 dev_err(smmu->dev, "CMDQ error (cons 0x%08x): %s\n", cons,
Will Deacona0d5c042015-12-04 12:00:29 +00001020 idx < ARRAY_SIZE(cerror_str) ? cerror_str[idx] : "Unknown");
Will Deacon48ec83b2015-05-27 17:25:59 +01001021
1022 switch (idx) {
Will Deacon48ec83b2015-05-27 17:25:59 +01001023 case CMDQ_ERR_CERROR_ABT_IDX:
1024 dev_err(smmu->dev, "retrying command fetch\n");
1025 case CMDQ_ERR_CERROR_NONE_IDX:
1026 return;
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01001027 case CMDQ_ERR_CERROR_ATC_INV_IDX:
1028 /*
1029 * ATC Invalidation Completion timeout. CONS is still pointing
1030 * at the CMD_SYNC. Attempt to complete other pending commands
1031 * by repeating the CMD_SYNC, though we might well end up back
1032 * here since the ATC invalidation may still be pending.
1033 */
1034 return;
Will Deacona0d5c042015-12-04 12:00:29 +00001035 case CMDQ_ERR_CERROR_ILL_IDX:
1036 /* Fallthrough */
1037 default:
1038 break;
Will Deacon48ec83b2015-05-27 17:25:59 +01001039 }
1040
1041 /*
1042 * We may have concurrent producers, so we need to be careful
1043 * not to touch any of the shadow cmdq state.
1044 */
Will Deaconaea20372016-07-29 11:15:37 +01001045 queue_read(cmd, Q_ENT(q, cons), q->ent_dwords);
Will Deacon48ec83b2015-05-27 17:25:59 +01001046 dev_err(smmu->dev, "skipping command in error state:\n");
1047 for (i = 0; i < ARRAY_SIZE(cmd); ++i)
1048 dev_err(smmu->dev, "\t0x%016llx\n", (unsigned long long)cmd[i]);
1049
1050 /* Convert the erroneous command into a CMD_SYNC */
1051 if (arm_smmu_cmdq_build_cmd(cmd, &cmd_sync)) {
1052 dev_err(smmu->dev, "failed to convert to CMD_SYNC\n");
1053 return;
1054 }
1055
Will Deaconaea20372016-07-29 11:15:37 +01001056 queue_write(Q_ENT(q, cons), cmd, q->ent_dwords);
Will Deacon48ec83b2015-05-27 17:25:59 +01001057}
1058
Will Deacon587e6c12019-07-02 17:16:25 +01001059/*
1060 * Command queue locking.
1061 * This is a form of bastardised rwlock with the following major changes:
1062 *
1063 * - The only LOCK routines are exclusive_trylock() and shared_lock().
1064 * Neither have barrier semantics, and instead provide only a control
1065 * dependency.
1066 *
1067 * - The UNLOCK routines are supplemented with shared_tryunlock(), which
1068 * fails if the caller appears to be the last lock holder (yes, this is
1069 * racy). All successful UNLOCK routines have RELEASE semantics.
1070 */
1071static void arm_smmu_cmdq_shared_lock(struct arm_smmu_cmdq *cmdq)
Robin Murphy2f657ad2017-08-31 14:44:25 +01001072{
Will Deacon587e6c12019-07-02 17:16:25 +01001073 int val;
Robin Murphy2f657ad2017-08-31 14:44:25 +01001074
Will Deacon587e6c12019-07-02 17:16:25 +01001075 /*
1076 * We can try to avoid the cmpxchg() loop by simply incrementing the
1077 * lock counter. When held in exclusive state, the lock counter is set
1078 * to INT_MIN so these increments won't hurt as the value will remain
1079 * negative.
1080 */
1081 if (atomic_fetch_inc_relaxed(&cmdq->lock) >= 0)
1082 return;
Zhen Lei901510e2018-08-19 15:51:11 +08001083
Will Deacon587e6c12019-07-02 17:16:25 +01001084 do {
1085 val = atomic_cond_read_relaxed(&cmdq->lock, VAL >= 0);
1086 } while (atomic_cmpxchg_relaxed(&cmdq->lock, val, val + 1) != val);
1087}
1088
1089static void arm_smmu_cmdq_shared_unlock(struct arm_smmu_cmdq *cmdq)
1090{
1091 (void)atomic_dec_return_release(&cmdq->lock);
1092}
1093
1094static bool arm_smmu_cmdq_shared_tryunlock(struct arm_smmu_cmdq *cmdq)
1095{
1096 if (atomic_read(&cmdq->lock) == 1)
1097 return false;
1098
1099 arm_smmu_cmdq_shared_unlock(cmdq);
1100 return true;
1101}
1102
1103#define arm_smmu_cmdq_exclusive_trylock_irqsave(cmdq, flags) \
1104({ \
1105 bool __ret; \
1106 local_irq_save(flags); \
1107 __ret = !atomic_cmpxchg_relaxed(&cmdq->lock, 0, INT_MIN); \
1108 if (!__ret) \
1109 local_irq_restore(flags); \
1110 __ret; \
1111})
1112
1113#define arm_smmu_cmdq_exclusive_unlock_irqrestore(cmdq, flags) \
1114({ \
1115 atomic_set_release(&cmdq->lock, 0); \
1116 local_irq_restore(flags); \
1117})
1118
1119
1120/*
1121 * Command queue insertion.
1122 * This is made fiddly by our attempts to achieve some sort of scalability
1123 * since there is one queue shared amongst all of the CPUs in the system. If
1124 * you like mixed-size concurrency, dependency ordering and relaxed atomics,
1125 * then you'll *love* this monstrosity.
1126 *
1127 * The basic idea is to split the queue up into ranges of commands that are
1128 * owned by a given CPU; the owner may not have written all of the commands
1129 * itself, but is responsible for advancing the hardware prod pointer when
1130 * the time comes. The algorithm is roughly:
1131 *
1132 * 1. Allocate some space in the queue. At this point we also discover
1133 * whether the head of the queue is currently owned by another CPU,
1134 * or whether we are the owner.
1135 *
1136 * 2. Write our commands into our allocated slots in the queue.
1137 *
1138 * 3. Mark our slots as valid in arm_smmu_cmdq.valid_map.
1139 *
1140 * 4. If we are an owner:
1141 * a. Wait for the previous owner to finish.
1142 * b. Mark the queue head as unowned, which tells us the range
1143 * that we are responsible for publishing.
1144 * c. Wait for all commands in our owned range to become valid.
1145 * d. Advance the hardware prod pointer.
1146 * e. Tell the next owner we've finished.
1147 *
1148 * 5. If we are inserting a CMD_SYNC (we may or may not have been an
1149 * owner), then we need to stick around until it has completed:
1150 * a. If we have MSIs, the SMMU can write back into the CMD_SYNC
1151 * to clear the first 4 bytes.
1152 * b. Otherwise, we spin waiting for the hardware cons pointer to
1153 * advance past our command.
1154 *
1155 * The devil is in the details, particularly the use of locking for handling
1156 * SYNC completion and freeing up space in the queue before we think that it is
1157 * full.
1158 */
1159static void __arm_smmu_cmdq_poll_set_valid_map(struct arm_smmu_cmdq *cmdq,
1160 u32 sprod, u32 eprod, bool set)
1161{
1162 u32 swidx, sbidx, ewidx, ebidx;
1163 struct arm_smmu_ll_queue llq = {
1164 .max_n_shift = cmdq->q.llq.max_n_shift,
1165 .prod = sprod,
1166 };
1167
1168 ewidx = BIT_WORD(Q_IDX(&llq, eprod));
1169 ebidx = Q_IDX(&llq, eprod) % BITS_PER_LONG;
1170
1171 while (llq.prod != eprod) {
1172 unsigned long mask;
1173 atomic_long_t *ptr;
1174 u32 limit = BITS_PER_LONG;
1175
1176 swidx = BIT_WORD(Q_IDX(&llq, llq.prod));
1177 sbidx = Q_IDX(&llq, llq.prod) % BITS_PER_LONG;
1178
1179 ptr = &cmdq->valid_map[swidx];
1180
1181 if ((swidx == ewidx) && (sbidx < ebidx))
1182 limit = ebidx;
1183
1184 mask = GENMASK(limit - 1, sbidx);
1185
1186 /*
1187 * The valid bit is the inverse of the wrap bit. This means
1188 * that a zero-initialised queue is invalid and, after marking
1189 * all entries as valid, they become invalid again when we
1190 * wrap.
1191 */
1192 if (set) {
1193 atomic_long_xor(mask, ptr);
1194 } else { /* Poll */
1195 unsigned long valid;
1196
1197 valid = (ULONG_MAX + !!Q_WRP(&llq, llq.prod)) & mask;
1198 atomic_long_cond_read_relaxed(ptr, (VAL & mask) == valid);
1199 }
1200
1201 llq.prod = queue_inc_prod_n(&llq, limit - sbidx);
Robin Murphy2f657ad2017-08-31 14:44:25 +01001202 }
1203}
1204
Will Deacon587e6c12019-07-02 17:16:25 +01001205/* Mark all entries in the range [sprod, eprod) as valid */
1206static void arm_smmu_cmdq_set_valid_map(struct arm_smmu_cmdq *cmdq,
1207 u32 sprod, u32 eprod)
1208{
1209 __arm_smmu_cmdq_poll_set_valid_map(cmdq, sprod, eprod, true);
1210}
1211
1212/* Wait for all entries in the range [sprod, eprod) to become valid */
1213static void arm_smmu_cmdq_poll_valid_map(struct arm_smmu_cmdq *cmdq,
1214 u32 sprod, u32 eprod)
1215{
1216 __arm_smmu_cmdq_poll_set_valid_map(cmdq, sprod, eprod, false);
1217}
1218
1219/* Wait for the command queue to become non-full */
1220static int arm_smmu_cmdq_poll_until_not_full(struct arm_smmu_device *smmu,
1221 struct arm_smmu_ll_queue *llq)
1222{
1223 unsigned long flags;
1224 struct arm_smmu_queue_poll qp;
1225 struct arm_smmu_cmdq *cmdq = &smmu->cmdq;
1226 int ret = 0;
1227
1228 /*
1229 * Try to update our copy of cons by grabbing exclusive cmdq access. If
1230 * that fails, spin until somebody else updates it for us.
1231 */
1232 if (arm_smmu_cmdq_exclusive_trylock_irqsave(cmdq, flags)) {
1233 WRITE_ONCE(cmdq->q.llq.cons, readl_relaxed(cmdq->q.cons_reg));
1234 arm_smmu_cmdq_exclusive_unlock_irqrestore(cmdq, flags);
1235 llq->val = READ_ONCE(cmdq->q.llq.val);
1236 return 0;
1237 }
1238
1239 queue_poll_init(smmu, &qp);
1240 do {
1241 llq->val = READ_ONCE(smmu->cmdq.q.llq.val);
1242 if (!queue_full(llq))
1243 break;
1244
1245 ret = queue_poll(&qp);
1246 } while (!ret);
1247
1248 return ret;
1249}
1250
1251/*
1252 * Wait until the SMMU signals a CMD_SYNC completion MSI.
1253 * Must be called with the cmdq lock held in some capacity.
1254 */
1255static int __arm_smmu_cmdq_poll_until_msi(struct arm_smmu_device *smmu,
1256 struct arm_smmu_ll_queue *llq)
1257{
1258 int ret = 0;
1259 struct arm_smmu_queue_poll qp;
1260 struct arm_smmu_cmdq *cmdq = &smmu->cmdq;
1261 u32 *cmd = (u32 *)(Q_ENT(&cmdq->q, llq->prod));
1262
1263 queue_poll_init(smmu, &qp);
1264
1265 /*
1266 * The MSI won't generate an event, since it's being written back
1267 * into the command queue.
1268 */
1269 qp.wfe = false;
1270 smp_cond_load_relaxed(cmd, !VAL || (ret = queue_poll(&qp)));
1271 llq->cons = ret ? llq->prod : queue_inc_prod_n(llq, 1);
1272 return ret;
1273}
1274
1275/*
1276 * Wait until the SMMU cons index passes llq->prod.
1277 * Must be called with the cmdq lock held in some capacity.
1278 */
1279static int __arm_smmu_cmdq_poll_until_consumed(struct arm_smmu_device *smmu,
1280 struct arm_smmu_ll_queue *llq)
1281{
1282 struct arm_smmu_queue_poll qp;
1283 struct arm_smmu_cmdq *cmdq = &smmu->cmdq;
1284 u32 prod = llq->prod;
1285 int ret = 0;
1286
1287 queue_poll_init(smmu, &qp);
1288 llq->val = READ_ONCE(smmu->cmdq.q.llq.val);
1289 do {
1290 if (queue_consumed(llq, prod))
1291 break;
1292
1293 ret = queue_poll(&qp);
1294
1295 /*
1296 * This needs to be a readl() so that our subsequent call
1297 * to arm_smmu_cmdq_shared_tryunlock() can fail accurately.
1298 *
1299 * Specifically, we need to ensure that we observe all
1300 * shared_lock()s by other CMD_SYNCs that share our owner,
1301 * so that a failing call to tryunlock() means that we're
1302 * the last one out and therefore we can safely advance
1303 * cmdq->q.llq.cons. Roughly speaking:
1304 *
1305 * CPU 0 CPU1 CPU2 (us)
1306 *
1307 * if (sync)
1308 * shared_lock();
1309 *
1310 * dma_wmb();
1311 * set_valid_map();
1312 *
1313 * if (owner) {
1314 * poll_valid_map();
1315 * <control dependency>
1316 * writel(prod_reg);
1317 *
1318 * readl(cons_reg);
1319 * tryunlock();
1320 *
1321 * Requires us to see CPU 0's shared_lock() acquisition.
1322 */
1323 llq->cons = readl(cmdq->q.cons_reg);
1324 } while (!ret);
1325
1326 return ret;
1327}
1328
1329static int arm_smmu_cmdq_poll_until_sync(struct arm_smmu_device *smmu,
1330 struct arm_smmu_ll_queue *llq)
1331{
1332 if (smmu->features & ARM_SMMU_FEAT_MSI &&
1333 smmu->features & ARM_SMMU_FEAT_COHERENCY)
1334 return __arm_smmu_cmdq_poll_until_msi(smmu, llq);
1335
1336 return __arm_smmu_cmdq_poll_until_consumed(smmu, llq);
1337}
1338
1339static void arm_smmu_cmdq_write_entries(struct arm_smmu_cmdq *cmdq, u64 *cmds,
1340 u32 prod, int n)
1341{
1342 int i;
1343 struct arm_smmu_ll_queue llq = {
1344 .max_n_shift = cmdq->q.llq.max_n_shift,
1345 .prod = prod,
1346 };
1347
1348 for (i = 0; i < n; ++i) {
1349 u64 *cmd = &cmds[i * CMDQ_ENT_DWORDS];
1350
1351 prod = queue_inc_prod_n(&llq, i);
1352 queue_write(Q_ENT(&cmdq->q, prod), cmd, CMDQ_ENT_DWORDS);
1353 }
1354}
1355
Will Deacon05cbaf42019-08-20 13:25:36 +01001356/*
1357 * This is the actual insertion function, and provides the following
1358 * ordering guarantees to callers:
1359 *
1360 * - There is a dma_wmb() before publishing any commands to the queue.
1361 * This can be relied upon to order prior writes to data structures
1362 * in memory (such as a CD or an STE) before the command.
1363 *
1364 * - On completion of a CMD_SYNC, there is a control dependency.
1365 * This can be relied upon to order subsequent writes to memory (e.g.
1366 * freeing an IOVA) after completion of the CMD_SYNC.
1367 *
1368 * - Command insertion is totally ordered, so if two CPUs each race to
1369 * insert their own list of commands then all of the commands from one
1370 * CPU will appear before any of the commands from the other CPU.
1371 */
Will Deacon587e6c12019-07-02 17:16:25 +01001372static int arm_smmu_cmdq_issue_cmdlist(struct arm_smmu_device *smmu,
1373 u64 *cmds, int n, bool sync)
1374{
1375 u64 cmd_sync[CMDQ_ENT_DWORDS];
1376 u32 prod;
1377 unsigned long flags;
1378 bool owner;
1379 struct arm_smmu_cmdq *cmdq = &smmu->cmdq;
1380 struct arm_smmu_ll_queue llq = {
1381 .max_n_shift = cmdq->q.llq.max_n_shift,
1382 }, head = llq;
1383 int ret = 0;
1384
1385 /* 1. Allocate some space in the queue */
1386 local_irq_save(flags);
1387 llq.val = READ_ONCE(cmdq->q.llq.val);
1388 do {
1389 u64 old;
1390
1391 while (!queue_has_space(&llq, n + sync)) {
1392 local_irq_restore(flags);
1393 if (arm_smmu_cmdq_poll_until_not_full(smmu, &llq))
1394 dev_err_ratelimited(smmu->dev, "CMDQ timeout\n");
1395 local_irq_save(flags);
1396 }
1397
1398 head.cons = llq.cons;
1399 head.prod = queue_inc_prod_n(&llq, n + sync) |
1400 CMDQ_PROD_OWNED_FLAG;
1401
1402 old = cmpxchg_relaxed(&cmdq->q.llq.val, llq.val, head.val);
1403 if (old == llq.val)
1404 break;
1405
1406 llq.val = old;
1407 } while (1);
1408 owner = !(llq.prod & CMDQ_PROD_OWNED_FLAG);
1409 head.prod &= ~CMDQ_PROD_OWNED_FLAG;
1410 llq.prod &= ~CMDQ_PROD_OWNED_FLAG;
1411
1412 /*
1413 * 2. Write our commands into the queue
1414 * Dependency ordering from the cmpxchg() loop above.
1415 */
1416 arm_smmu_cmdq_write_entries(cmdq, cmds, llq.prod, n);
1417 if (sync) {
1418 prod = queue_inc_prod_n(&llq, n);
1419 arm_smmu_cmdq_build_sync_cmd(cmd_sync, smmu, prod);
1420 queue_write(Q_ENT(&cmdq->q, prod), cmd_sync, CMDQ_ENT_DWORDS);
1421
1422 /*
1423 * In order to determine completion of our CMD_SYNC, we must
1424 * ensure that the queue can't wrap twice without us noticing.
1425 * We achieve that by taking the cmdq lock as shared before
1426 * marking our slot as valid.
1427 */
1428 arm_smmu_cmdq_shared_lock(cmdq);
1429 }
1430
1431 /* 3. Mark our slots as valid, ensuring commands are visible first */
1432 dma_wmb();
1433 arm_smmu_cmdq_set_valid_map(cmdq, llq.prod, head.prod);
1434
1435 /* 4. If we are the owner, take control of the SMMU hardware */
1436 if (owner) {
1437 /* a. Wait for previous owner to finish */
1438 atomic_cond_read_relaxed(&cmdq->owner_prod, VAL == llq.prod);
1439
1440 /* b. Stop gathering work by clearing the owned flag */
1441 prod = atomic_fetch_andnot_relaxed(CMDQ_PROD_OWNED_FLAG,
1442 &cmdq->q.llq.atomic.prod);
1443 prod &= ~CMDQ_PROD_OWNED_FLAG;
1444
1445 /*
1446 * c. Wait for any gathered work to be written to the queue.
1447 * Note that we read our own entries so that we have the control
1448 * dependency required by (d).
1449 */
1450 arm_smmu_cmdq_poll_valid_map(cmdq, llq.prod, prod);
1451
1452 /*
1453 * d. Advance the hardware prod pointer
1454 * Control dependency ordering from the entries becoming valid.
1455 */
1456 writel_relaxed(prod, cmdq->q.prod_reg);
1457
1458 /*
1459 * e. Tell the next owner we're done
1460 * Make sure we've updated the hardware first, so that we don't
1461 * race to update prod and potentially move it backwards.
1462 */
1463 atomic_set_release(&cmdq->owner_prod, prod);
1464 }
1465
1466 /* 5. If we are inserting a CMD_SYNC, we must wait for it to complete */
1467 if (sync) {
1468 llq.prod = queue_inc_prod_n(&llq, n);
1469 ret = arm_smmu_cmdq_poll_until_sync(smmu, &llq);
1470 if (ret) {
1471 dev_err_ratelimited(smmu->dev,
1472 "CMD_SYNC timeout at 0x%08x [hwprod 0x%08x, hwcons 0x%08x]\n",
1473 llq.prod,
1474 readl_relaxed(cmdq->q.prod_reg),
1475 readl_relaxed(cmdq->q.cons_reg));
1476 }
1477
1478 /*
1479 * Try to unlock the cmq lock. This will fail if we're the last
1480 * reader, in which case we can safely update cmdq->q.llq.cons
1481 */
1482 if (!arm_smmu_cmdq_shared_tryunlock(cmdq)) {
1483 WRITE_ONCE(cmdq->q.llq.cons, llq.cons);
1484 arm_smmu_cmdq_shared_unlock(cmdq);
1485 }
1486 }
1487
1488 local_irq_restore(flags);
1489 return ret;
1490}
1491
1492static int arm_smmu_cmdq_issue_cmd(struct arm_smmu_device *smmu,
1493 struct arm_smmu_cmdq_ent *ent)
Will Deacon48ec83b2015-05-27 17:25:59 +01001494{
Will Deacon48ec83b2015-05-27 17:25:59 +01001495 u64 cmd[CMDQ_ENT_DWORDS];
Will Deacon48ec83b2015-05-27 17:25:59 +01001496
1497 if (arm_smmu_cmdq_build_cmd(cmd, ent)) {
1498 dev_warn(smmu->dev, "ignoring unknown CMDQ opcode 0x%x\n",
1499 ent->opcode);
Will Deacon587e6c12019-07-02 17:16:25 +01001500 return -EINVAL;
Will Deacon48ec83b2015-05-27 17:25:59 +01001501 }
1502
Will Deacon587e6c12019-07-02 17:16:25 +01001503 return arm_smmu_cmdq_issue_cmdlist(smmu, cmd, 1, false);
Will Deacon49806592017-10-19 16:41:53 +01001504}
1505
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01001506static int arm_smmu_cmdq_issue_sync(struct arm_smmu_device *smmu)
Will Deacon49806592017-10-19 16:41:53 +01001507{
Will Deacon587e6c12019-07-02 17:16:25 +01001508 return arm_smmu_cmdq_issue_cmdlist(smmu, NULL, 0, true);
Robin Murphy2f657ad2017-08-31 14:44:25 +01001509}
1510
Jean-Philippe Brucker4ce8da42020-02-24 17:58:44 +01001511static void arm_smmu_cmdq_batch_add(struct arm_smmu_device *smmu,
1512 struct arm_smmu_cmdq_batch *cmds,
1513 struct arm_smmu_cmdq_ent *cmd)
1514{
1515 if (cmds->num == CMDQ_BATCH_ENTRIES) {
1516 arm_smmu_cmdq_issue_cmdlist(smmu, cmds->cmds, cmds->num, false);
1517 cmds->num = 0;
1518 }
1519 arm_smmu_cmdq_build_cmd(&cmds->cmds[cmds->num * CMDQ_ENT_DWORDS], cmd);
1520 cmds->num++;
1521}
1522
1523static int arm_smmu_cmdq_batch_submit(struct arm_smmu_device *smmu,
1524 struct arm_smmu_cmdq_batch *cmds)
1525{
1526 return arm_smmu_cmdq_issue_cmdlist(smmu, cmds->cmds, cmds->num, true);
1527}
1528
Will Deacon48ec83b2015-05-27 17:25:59 +01001529/* Context descriptor manipulation functions */
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +01001530static void arm_smmu_sync_cd(struct arm_smmu_domain *smmu_domain,
1531 int ssid, bool leaf)
Will Deacon48ec83b2015-05-27 17:25:59 +01001532{
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +01001533 size_t i;
1534 unsigned long flags;
1535 struct arm_smmu_master *master;
Jean-Philippe Bruckeredd03512020-02-24 17:58:45 +01001536 struct arm_smmu_cmdq_batch cmds = {};
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +01001537 struct arm_smmu_device *smmu = smmu_domain->smmu;
1538 struct arm_smmu_cmdq_ent cmd = {
1539 .opcode = CMDQ_OP_CFGI_CD,
1540 .cfgi = {
1541 .ssid = ssid,
1542 .leaf = leaf,
1543 },
1544 };
Will Deacon48ec83b2015-05-27 17:25:59 +01001545
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +01001546 spin_lock_irqsave(&smmu_domain->devices_lock, flags);
1547 list_for_each_entry(master, &smmu_domain->devices, domain_head) {
1548 for (i = 0; i < master->num_sids; i++) {
1549 cmd.cfgi.sid = master->sids[i];
Jean-Philippe Bruckeredd03512020-02-24 17:58:45 +01001550 arm_smmu_cmdq_batch_add(smmu, &cmds, &cmd);
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +01001551 }
1552 }
1553 spin_unlock_irqrestore(&smmu_domain->devices_lock, flags);
Will Deacon48ec83b2015-05-27 17:25:59 +01001554
Jean-Philippe Bruckeredd03512020-02-24 17:58:45 +01001555 arm_smmu_cmdq_batch_submit(smmu, &cmds);
Will Deacon48ec83b2015-05-27 17:25:59 +01001556}
1557
Jean-Philippe Brucker73af06f2020-01-15 13:52:36 +01001558static int arm_smmu_alloc_cd_leaf_table(struct arm_smmu_device *smmu,
1559 struct arm_smmu_l1_ctx_desc *l1_desc)
Will Deacon48ec83b2015-05-27 17:25:59 +01001560{
Jean-Philippe Brucker73af06f2020-01-15 13:52:36 +01001561 size_t size = CTXDESC_L2_ENTRIES * (CTXDESC_CD_DWORDS << 3);
1562
1563 l1_desc->l2ptr = dmam_alloc_coherent(smmu->dev, size,
1564 &l1_desc->l2ptr_dma, GFP_KERNEL);
1565 if (!l1_desc->l2ptr) {
1566 dev_warn(smmu->dev,
1567 "failed to allocate context descriptor table\n");
1568 return -ENOMEM;
1569 }
1570 return 0;
1571}
1572
1573static void arm_smmu_write_cd_l1_desc(__le64 *dst,
1574 struct arm_smmu_l1_ctx_desc *l1_desc)
1575{
1576 u64 val = (l1_desc->l2ptr_dma & CTXDESC_L1_DESC_L2PTR_MASK) |
1577 CTXDESC_L1_DESC_V;
1578
Jean-Philippe Brucker87e5fe52020-02-24 17:58:43 +01001579 /* See comment in arm_smmu_write_ctx_desc() */
Jean-Philippe Brucker73af06f2020-01-15 13:52:36 +01001580 WRITE_ONCE(*dst, cpu_to_le64(val));
1581}
1582
1583static __le64 *arm_smmu_get_cd_ptr(struct arm_smmu_domain *smmu_domain,
1584 u32 ssid)
1585{
1586 __le64 *l1ptr;
1587 unsigned int idx;
1588 struct arm_smmu_l1_ctx_desc *l1_desc;
1589 struct arm_smmu_device *smmu = smmu_domain->smmu;
1590 struct arm_smmu_ctx_desc_cfg *cdcfg = &smmu_domain->s1_cfg.cdcfg;
1591
1592 if (smmu_domain->s1_cfg.s1fmt == STRTAB_STE_0_S1FMT_LINEAR)
1593 return cdcfg->cdtab + ssid * CTXDESC_CD_DWORDS;
1594
1595 idx = ssid >> CTXDESC_SPLIT;
1596 l1_desc = &cdcfg->l1_desc[idx];
1597 if (!l1_desc->l2ptr) {
1598 if (arm_smmu_alloc_cd_leaf_table(smmu, l1_desc))
1599 return NULL;
1600
1601 l1ptr = cdcfg->cdtab + idx * CTXDESC_L1_DESC_DWORDS;
1602 arm_smmu_write_cd_l1_desc(l1ptr, l1_desc);
1603 /* An invalid L1CD can be cached */
1604 arm_smmu_sync_cd(smmu_domain, ssid, false);
1605 }
1606 idx = ssid & (CTXDESC_L2_ENTRIES - 1);
1607 return l1_desc->l2ptr + idx * CTXDESC_CD_DWORDS;
1608}
1609
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +01001610static int arm_smmu_write_ctx_desc(struct arm_smmu_domain *smmu_domain,
1611 int ssid, struct arm_smmu_ctx_desc *cd)
1612{
1613 /*
1614 * This function handles the following cases:
1615 *
1616 * (1) Install primary CD, for normal DMA traffic (SSID = 0).
1617 * (2) Install a secondary CD, for SID+SSID traffic.
1618 * (3) Update ASID of a CD. Atomically write the first 64 bits of the
1619 * CD, then invalidate the old entry and mappings.
1620 * (4) Remove a secondary CD.
1621 */
Will Deacon48ec83b2015-05-27 17:25:59 +01001622 u64 val;
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +01001623 bool cd_live;
Jean-Philippe Brucker73af06f2020-01-15 13:52:36 +01001624 __le64 *cdptr;
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +01001625 struct arm_smmu_device *smmu = smmu_domain->smmu;
Jean-Philippe Brucker73af06f2020-01-15 13:52:36 +01001626
1627 if (WARN_ON(ssid >= (1 << smmu_domain->s1_cfg.s1cdmax)))
1628 return -E2BIG;
1629
1630 cdptr = arm_smmu_get_cd_ptr(smmu_domain, ssid);
1631 if (!cdptr)
1632 return -ENOMEM;
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +01001633
1634 val = le64_to_cpu(cdptr[0]);
1635 cd_live = !!(val & CTXDESC_CD_0_V);
1636
1637 if (!cd) { /* (4) */
1638 val = 0;
1639 } else if (cd_live) { /* (3) */
1640 val &= ~CTXDESC_CD_0_ASID;
1641 val |= FIELD_PREP(CTXDESC_CD_0_ASID, cd->asid);
1642 /*
1643 * Until CD+TLB invalidation, both ASIDs may be used for tagging
1644 * this substream's traffic
1645 */
1646 } else { /* (1) and (2) */
1647 cdptr[1] = cpu_to_le64(cd->ttbr & CTXDESC_CD_1_TTB0_MASK);
1648 cdptr[2] = 0;
1649 cdptr[3] = cpu_to_le64(cd->mair);
1650
1651 /*
1652 * STE is live, and the SMMU might read dwords of this CD in any
1653 * order. Ensure that it observes valid values before reading
1654 * V=1.
1655 */
1656 arm_smmu_sync_cd(smmu_domain, ssid, true);
1657
1658 val = cd->tcr |
1659#ifdef __BIG_ENDIAN
1660 CTXDESC_CD_0_ENDI |
1661#endif
1662 CTXDESC_CD_0_R | CTXDESC_CD_0_A | CTXDESC_CD_0_ASET |
1663 CTXDESC_CD_0_AA64 |
1664 FIELD_PREP(CTXDESC_CD_0_ASID, cd->asid) |
1665 CTXDESC_CD_0_V;
1666
1667 /* STALL_MODEL==0b10 && CD.S==0 is ILLEGAL */
1668 if (smmu->features & ARM_SMMU_FEAT_STALL_FORCE)
1669 val |= CTXDESC_CD_0_S;
1670 }
Will Deacon48ec83b2015-05-27 17:25:59 +01001671
1672 /*
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +01001673 * The SMMU accesses 64-bit values atomically. See IHI0070Ca 3.21.3
1674 * "Configuration structures and configuration invalidation completion"
1675 *
1676 * The size of single-copy atomic reads made by the SMMU is
1677 * IMPLEMENTATION DEFINED but must be at least 64 bits. Any single
1678 * field within an aligned 64-bit span of a structure can be altered
1679 * without first making the structure invalid.
Will Deacon48ec83b2015-05-27 17:25:59 +01001680 */
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +01001681 WRITE_ONCE(cdptr[0], cpu_to_le64(val));
1682 arm_smmu_sync_cd(smmu_domain, ssid, true);
1683 return 0;
Will Deacon48ec83b2015-05-27 17:25:59 +01001684}
Will Deacon48ec83b2015-05-27 17:25:59 +01001685
Jean-Philippe Bruckera557aff2020-01-15 13:52:32 +01001686static int arm_smmu_alloc_cd_tables(struct arm_smmu_domain *smmu_domain)
1687{
Jean-Philippe Brucker73af06f2020-01-15 13:52:36 +01001688 int ret;
Jean-Philippe Bruckera557aff2020-01-15 13:52:32 +01001689 size_t l1size;
Jean-Philippe Brucker73af06f2020-01-15 13:52:36 +01001690 size_t max_contexts;
Jean-Philippe Bruckera557aff2020-01-15 13:52:32 +01001691 struct arm_smmu_device *smmu = smmu_domain->smmu;
1692 struct arm_smmu_s1_cfg *cfg = &smmu_domain->s1_cfg;
1693 struct arm_smmu_ctx_desc_cfg *cdcfg = &cfg->cdcfg;
Will Deacon48ec83b2015-05-27 17:25:59 +01001694
Jean-Philippe Brucker73af06f2020-01-15 13:52:36 +01001695 max_contexts = 1 << cfg->s1cdmax;
Will Deacon48ec83b2015-05-27 17:25:59 +01001696
Jean-Philippe Brucker73af06f2020-01-15 13:52:36 +01001697 if (!(smmu->features & ARM_SMMU_FEAT_2_LVL_CDTAB) ||
1698 max_contexts <= CTXDESC_L2_ENTRIES) {
1699 cfg->s1fmt = STRTAB_STE_0_S1FMT_LINEAR;
1700 cdcfg->num_l1_ents = max_contexts;
Will Deacon48ec83b2015-05-27 17:25:59 +01001701
Jean-Philippe Brucker73af06f2020-01-15 13:52:36 +01001702 l1size = max_contexts * (CTXDESC_CD_DWORDS << 3);
1703 } else {
1704 cfg->s1fmt = STRTAB_STE_0_S1FMT_64K_L2;
1705 cdcfg->num_l1_ents = DIV_ROUND_UP(max_contexts,
1706 CTXDESC_L2_ENTRIES);
1707
1708 cdcfg->l1_desc = devm_kcalloc(smmu->dev, cdcfg->num_l1_ents,
1709 sizeof(*cdcfg->l1_desc),
1710 GFP_KERNEL);
1711 if (!cdcfg->l1_desc)
1712 return -ENOMEM;
1713
1714 l1size = cdcfg->num_l1_ents * (CTXDESC_L1_DESC_DWORDS << 3);
1715 }
1716
Jean-Philippe Bruckera557aff2020-01-15 13:52:32 +01001717 cdcfg->cdtab = dmam_alloc_coherent(smmu->dev, l1size, &cdcfg->cdtab_dma,
1718 GFP_KERNEL);
1719 if (!cdcfg->cdtab) {
1720 dev_warn(smmu->dev, "failed to allocate context descriptor\n");
Jean-Philippe Brucker73af06f2020-01-15 13:52:36 +01001721 ret = -ENOMEM;
1722 goto err_free_l1;
Jean-Philippe Bruckera557aff2020-01-15 13:52:32 +01001723 }
Jean-Philippe Brucker73af06f2020-01-15 13:52:36 +01001724
Jean-Philippe Bruckera557aff2020-01-15 13:52:32 +01001725 return 0;
Jean-Philippe Brucker73af06f2020-01-15 13:52:36 +01001726
1727err_free_l1:
1728 if (cdcfg->l1_desc) {
1729 devm_kfree(smmu->dev, cdcfg->l1_desc);
1730 cdcfg->l1_desc = NULL;
1731 }
1732 return ret;
Jean-Philippe Bruckera557aff2020-01-15 13:52:32 +01001733}
1734
1735static void arm_smmu_free_cd_tables(struct arm_smmu_domain *smmu_domain)
1736{
Jean-Philippe Brucker73af06f2020-01-15 13:52:36 +01001737 int i;
1738 size_t size, l1size;
Jean-Philippe Bruckera557aff2020-01-15 13:52:32 +01001739 struct arm_smmu_device *smmu = smmu_domain->smmu;
1740 struct arm_smmu_ctx_desc_cfg *cdcfg = &smmu_domain->s1_cfg.cdcfg;
Jean-Philippe Brucker73af06f2020-01-15 13:52:36 +01001741
1742 if (cdcfg->l1_desc) {
1743 size = CTXDESC_L2_ENTRIES * (CTXDESC_CD_DWORDS << 3);
1744
1745 for (i = 0; i < cdcfg->num_l1_ents; i++) {
1746 if (!cdcfg->l1_desc[i].l2ptr)
1747 continue;
1748
1749 dmam_free_coherent(smmu->dev, size,
1750 cdcfg->l1_desc[i].l2ptr,
1751 cdcfg->l1_desc[i].l2ptr_dma);
1752 }
1753 devm_kfree(smmu->dev, cdcfg->l1_desc);
1754 cdcfg->l1_desc = NULL;
1755
1756 l1size = cdcfg->num_l1_ents * (CTXDESC_L1_DESC_DWORDS << 3);
1757 } else {
1758 l1size = cdcfg->num_l1_ents * (CTXDESC_CD_DWORDS << 3);
1759 }
Jean-Philippe Bruckera557aff2020-01-15 13:52:32 +01001760
1761 dmam_free_coherent(smmu->dev, l1size, cdcfg->cdtab, cdcfg->cdtab_dma);
1762 cdcfg->cdtab_dma = 0;
1763 cdcfg->cdtab = NULL;
Will Deacon48ec83b2015-05-27 17:25:59 +01001764}
1765
1766/* Stream table manipulation functions */
1767static void
1768arm_smmu_write_strtab_l1_desc(__le64 *dst, struct arm_smmu_strtab_l1_desc *desc)
1769{
1770 u64 val = 0;
1771
Robin Murphyba08bdc2018-03-26 13:35:11 +01001772 val |= FIELD_PREP(STRTAB_L1_DESC_SPAN, desc->span);
Robin Murphy1cf9e542018-03-26 13:35:09 +01001773 val |= desc->l2ptr_dma & STRTAB_L1_DESC_L2PTR_MASK;
Will Deacon48ec83b2015-05-27 17:25:59 +01001774
Jean-Philippe Brucker87e5fe52020-02-24 17:58:43 +01001775 /* See comment in arm_smmu_write_ctx_desc() */
1776 WRITE_ONCE(*dst, cpu_to_le64(val));
Will Deacon48ec83b2015-05-27 17:25:59 +01001777}
1778
1779static void arm_smmu_sync_ste_for_sid(struct arm_smmu_device *smmu, u32 sid)
1780{
1781 struct arm_smmu_cmdq_ent cmd = {
1782 .opcode = CMDQ_OP_CFGI_STE,
1783 .cfgi = {
1784 .sid = sid,
1785 .leaf = true,
1786 },
1787 };
1788
1789 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
Robin Murphy2f657ad2017-08-31 14:44:25 +01001790 arm_smmu_cmdq_issue_sync(smmu);
Will Deacon48ec83b2015-05-27 17:25:59 +01001791}
1792
Jean-Philippe Brucker8be39a12019-04-17 19:24:45 +01001793static void arm_smmu_write_strtab_ent(struct arm_smmu_master *master, u32 sid,
1794 __le64 *dst)
Will Deacon48ec83b2015-05-27 17:25:59 +01001795{
1796 /*
1797 * This is hideously complicated, but we only really care about
1798 * three cases at the moment:
1799 *
Will Deaconbeb3c6a2017-01-06 16:27:30 +00001800 * 1. Invalid (all zero) -> bypass/fault (init)
1801 * 2. Bypass/fault -> translation/bypass (attach)
1802 * 3. Translation/bypass -> bypass/fault (detach)
Will Deacon48ec83b2015-05-27 17:25:59 +01001803 *
1804 * Given that we can't update the STE atomically and the SMMU
1805 * doesn't read the thing in a defined order, that leaves us
1806 * with the following maintenance requirements:
1807 *
1808 * 1. Update Config, return (init time STEs aren't live)
1809 * 2. Write everything apart from dword 0, sync, write dword 0, sync
1810 * 3. Update Config, sync
1811 */
1812 u64 val = le64_to_cpu(dst[0]);
1813 bool ste_live = false;
Jean-Philippe Brucker8be39a12019-04-17 19:24:45 +01001814 struct arm_smmu_device *smmu = NULL;
1815 struct arm_smmu_s1_cfg *s1_cfg = NULL;
1816 struct arm_smmu_s2_cfg *s2_cfg = NULL;
1817 struct arm_smmu_domain *smmu_domain = NULL;
Will Deacon48ec83b2015-05-27 17:25:59 +01001818 struct arm_smmu_cmdq_ent prefetch_cmd = {
1819 .opcode = CMDQ_OP_PREFETCH_CFG,
1820 .prefetch = {
1821 .sid = sid,
1822 },
1823 };
1824
Jean-Philippe Brucker8be39a12019-04-17 19:24:45 +01001825 if (master) {
1826 smmu_domain = master->domain;
1827 smmu = master->smmu;
1828 }
1829
1830 if (smmu_domain) {
1831 switch (smmu_domain->stage) {
1832 case ARM_SMMU_DOMAIN_S1:
1833 s1_cfg = &smmu_domain->s1_cfg;
1834 break;
1835 case ARM_SMMU_DOMAIN_S2:
1836 case ARM_SMMU_DOMAIN_NESTED:
1837 s2_cfg = &smmu_domain->s2_cfg;
1838 break;
1839 default:
1840 break;
1841 }
1842 }
1843
Will Deacon48ec83b2015-05-27 17:25:59 +01001844 if (val & STRTAB_STE_0_V) {
Robin Murphyba08bdc2018-03-26 13:35:11 +01001845 switch (FIELD_GET(STRTAB_STE_0_CFG, val)) {
Will Deacon48ec83b2015-05-27 17:25:59 +01001846 case STRTAB_STE_0_CFG_BYPASS:
1847 break;
1848 case STRTAB_STE_0_CFG_S1_TRANS:
1849 case STRTAB_STE_0_CFG_S2_TRANS:
1850 ste_live = true;
1851 break;
Will Deacon5bc0a112016-08-16 14:29:16 +01001852 case STRTAB_STE_0_CFG_ABORT:
Anders Roxell11f4fe92019-07-30 17:20:11 +02001853 BUG_ON(!disable_bypass);
1854 break;
Will Deacon48ec83b2015-05-27 17:25:59 +01001855 default:
1856 BUG(); /* STE corruption */
1857 }
1858 }
1859
Nate Watterson810871c2016-12-20 23:11:48 -05001860 /* Nuke the existing STE_0 value, as we're going to rewrite it */
Will Deaconbeb3c6a2017-01-06 16:27:30 +00001861 val = STRTAB_STE_0_V;
Will Deacon48ec83b2015-05-27 17:25:59 +01001862
Will Deaconbeb3c6a2017-01-06 16:27:30 +00001863 /* Bypass/fault */
Jean-Philippe Brucker8be39a12019-04-17 19:24:45 +01001864 if (!smmu_domain || !(s1_cfg || s2_cfg)) {
1865 if (!smmu_domain && disable_bypass)
Robin Murphyba08bdc2018-03-26 13:35:11 +01001866 val |= FIELD_PREP(STRTAB_STE_0_CFG, STRTAB_STE_0_CFG_ABORT);
Will Deaconbeb3c6a2017-01-06 16:27:30 +00001867 else
Robin Murphyba08bdc2018-03-26 13:35:11 +01001868 val |= FIELD_PREP(STRTAB_STE_0_CFG, STRTAB_STE_0_CFG_BYPASS);
Will Deaconbeb3c6a2017-01-06 16:27:30 +00001869
Will Deacon48ec83b2015-05-27 17:25:59 +01001870 dst[0] = cpu_to_le64(val);
Robin Murphyba08bdc2018-03-26 13:35:11 +01001871 dst[1] = cpu_to_le64(FIELD_PREP(STRTAB_STE_1_SHCFG,
1872 STRTAB_STE_1_SHCFG_INCOMING));
Will Deacon48ec83b2015-05-27 17:25:59 +01001873 dst[2] = 0; /* Nuke the VMID */
Will Deacon704c0382017-10-05 16:49:37 +01001874 /*
1875 * The SMMU can perform negative caching, so we must sync
1876 * the STE regardless of whether the old value was live.
1877 */
1878 if (smmu)
Will Deacon48ec83b2015-05-27 17:25:59 +01001879 arm_smmu_sync_ste_for_sid(smmu, sid);
1880 return;
1881 }
1882
Jean-Philippe Brucker8be39a12019-04-17 19:24:45 +01001883 if (s1_cfg) {
Will Deacon48ec83b2015-05-27 17:25:59 +01001884 BUG_ON(ste_live);
1885 dst[1] = cpu_to_le64(
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +01001886 FIELD_PREP(STRTAB_STE_1_S1DSS, STRTAB_STE_1_S1DSS_SSID0) |
Robin Murphyba08bdc2018-03-26 13:35:11 +01001887 FIELD_PREP(STRTAB_STE_1_S1CIR, STRTAB_STE_1_S1C_CACHE_WBRA) |
1888 FIELD_PREP(STRTAB_STE_1_S1COR, STRTAB_STE_1_S1C_CACHE_WBRA) |
1889 FIELD_PREP(STRTAB_STE_1_S1CSH, ARM_SMMU_SH_ISH) |
Robin Murphyba08bdc2018-03-26 13:35:11 +01001890 FIELD_PREP(STRTAB_STE_1_STRW, STRTAB_STE_1_STRW_NSEL1));
Will Deacon48ec83b2015-05-27 17:25:59 +01001891
Yisheng Xie9cff86fd22017-09-21 20:36:07 +08001892 if (smmu->features & ARM_SMMU_FEAT_STALLS &&
1893 !(smmu->features & ARM_SMMU_FEAT_STALL_FORCE))
Prem Mallappa6380be02015-12-14 22:01:23 +05301894 dst[1] |= cpu_to_le64(STRTAB_STE_1_S1STALLD);
1895
Jean-Philippe Brucker7bc4f3f2020-01-15 13:52:31 +01001896 val |= (s1_cfg->cdcfg.cdtab_dma & STRTAB_STE_0_S1CTXPTR_MASK) |
Jean-Philippe Brucker87f42392020-01-15 13:52:33 +01001897 FIELD_PREP(STRTAB_STE_0_CFG, STRTAB_STE_0_CFG_S1_TRANS) |
1898 FIELD_PREP(STRTAB_STE_0_S1CDMAX, s1_cfg->s1cdmax) |
1899 FIELD_PREP(STRTAB_STE_0_S1FMT, s1_cfg->s1fmt);
Will Deacon48ec83b2015-05-27 17:25:59 +01001900 }
1901
Jean-Philippe Brucker8be39a12019-04-17 19:24:45 +01001902 if (s2_cfg) {
Will Deacon48ec83b2015-05-27 17:25:59 +01001903 BUG_ON(ste_live);
1904 dst[2] = cpu_to_le64(
Jean-Philippe Brucker8be39a12019-04-17 19:24:45 +01001905 FIELD_PREP(STRTAB_STE_2_S2VMID, s2_cfg->vmid) |
1906 FIELD_PREP(STRTAB_STE_2_VTCR, s2_cfg->vtcr) |
Will Deacon48ec83b2015-05-27 17:25:59 +01001907#ifdef __BIG_ENDIAN
1908 STRTAB_STE_2_S2ENDI |
1909#endif
1910 STRTAB_STE_2_S2PTW | STRTAB_STE_2_S2AA64 |
1911 STRTAB_STE_2_S2R);
1912
Jean-Philippe Brucker8be39a12019-04-17 19:24:45 +01001913 dst[3] = cpu_to_le64(s2_cfg->vttbr & STRTAB_STE_3_S2TTB_MASK);
Will Deacon48ec83b2015-05-27 17:25:59 +01001914
Robin Murphyba08bdc2018-03-26 13:35:11 +01001915 val |= FIELD_PREP(STRTAB_STE_0_CFG, STRTAB_STE_0_CFG_S2_TRANS);
Will Deacon48ec83b2015-05-27 17:25:59 +01001916 }
1917
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01001918 if (master->ats_enabled)
1919 dst[1] |= cpu_to_le64(FIELD_PREP(STRTAB_STE_1_EATS,
1920 STRTAB_STE_1_EATS_TRANS));
1921
Will Deacon48ec83b2015-05-27 17:25:59 +01001922 arm_smmu_sync_ste_for_sid(smmu, sid);
Will Deacond71e0172020-01-15 15:21:47 +00001923 /* See comment in arm_smmu_write_ctx_desc() */
1924 WRITE_ONCE(dst[0], cpu_to_le64(val));
Will Deacon48ec83b2015-05-27 17:25:59 +01001925 arm_smmu_sync_ste_for_sid(smmu, sid);
1926
1927 /* It's likely that we'll want to use the new STE soon */
Zhen Lei5e929462015-07-07 04:30:18 +01001928 if (!(smmu->options & ARM_SMMU_OPT_SKIP_PREFETCH))
1929 arm_smmu_cmdq_issue_cmd(smmu, &prefetch_cmd);
Will Deacon48ec83b2015-05-27 17:25:59 +01001930}
1931
1932static void arm_smmu_init_bypass_stes(u64 *strtab, unsigned int nent)
1933{
1934 unsigned int i;
Will Deacon48ec83b2015-05-27 17:25:59 +01001935
1936 for (i = 0; i < nent; ++i) {
Jean-Philippe Brucker8be39a12019-04-17 19:24:45 +01001937 arm_smmu_write_strtab_ent(NULL, -1, strtab);
Will Deacon48ec83b2015-05-27 17:25:59 +01001938 strtab += STRTAB_STE_DWORDS;
1939 }
1940}
1941
1942static int arm_smmu_init_l2_strtab(struct arm_smmu_device *smmu, u32 sid)
1943{
1944 size_t size;
1945 void *strtab;
1946 struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg;
1947 struct arm_smmu_strtab_l1_desc *desc = &cfg->l1_desc[sid >> STRTAB_SPLIT];
1948
1949 if (desc->l2ptr)
1950 return 0;
1951
1952 size = 1 << (STRTAB_SPLIT + ilog2(STRTAB_STE_DWORDS) + 3);
Zhen Lei69146e72015-06-26 09:32:58 +01001953 strtab = &cfg->strtab[(sid >> STRTAB_SPLIT) * STRTAB_L1_DESC_DWORDS];
Will Deacon48ec83b2015-05-27 17:25:59 +01001954
1955 desc->span = STRTAB_SPLIT + 1;
Will Deacon04fa26c2015-10-30 18:12:41 +00001956 desc->l2ptr = dmam_alloc_coherent(smmu->dev, size, &desc->l2ptr_dma,
Jean-Philippe Brucker9bb90692020-01-15 13:52:27 +01001957 GFP_KERNEL);
Will Deacon48ec83b2015-05-27 17:25:59 +01001958 if (!desc->l2ptr) {
1959 dev_err(smmu->dev,
1960 "failed to allocate l2 stream table for SID %u\n",
1961 sid);
1962 return -ENOMEM;
1963 }
1964
1965 arm_smmu_init_bypass_stes(desc->l2ptr, 1 << STRTAB_SPLIT);
1966 arm_smmu_write_strtab_l1_desc(strtab, desc);
1967 return 0;
1968}
1969
1970/* IRQ and event handlers */
1971static irqreturn_t arm_smmu_evtq_thread(int irq, void *dev)
1972{
1973 int i;
1974 struct arm_smmu_device *smmu = dev;
1975 struct arm_smmu_queue *q = &smmu->evtq.q;
Will Deacon7c288a52019-07-02 17:16:16 +01001976 struct arm_smmu_ll_queue *llq = &q->llq;
Will Deacon48ec83b2015-05-27 17:25:59 +01001977 u64 evt[EVTQ_ENT_DWORDS];
1978
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01001979 do {
1980 while (!queue_remove_raw(q, evt)) {
Robin Murphy7417b992018-03-26 13:35:12 +01001981 u8 id = FIELD_GET(EVTQ_0_ID, evt[0]);
Will Deacon48ec83b2015-05-27 17:25:59 +01001982
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01001983 dev_info(smmu->dev, "event 0x%02x received:\n", id);
1984 for (i = 0; i < ARRAY_SIZE(evt); ++i)
1985 dev_info(smmu->dev, "\t0x%016llx\n",
1986 (unsigned long long)evt[i]);
1987
1988 }
1989
1990 /*
1991 * Not much we can do on overflow, so scream and pretend we're
1992 * trying harder.
1993 */
Will Deacon2a8868f2019-07-02 17:12:24 +01001994 if (queue_sync_prod_in(q) == -EOVERFLOW)
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01001995 dev_err(smmu->dev, "EVTQ overflow detected -- events lost\n");
Will Deacon7c288a52019-07-02 17:16:16 +01001996 } while (!queue_empty(llq));
Will Deacon48ec83b2015-05-27 17:25:59 +01001997
1998 /* Sync our overflow flag, as we believe we're up to speed */
Will Deacon7c288a52019-07-02 17:16:16 +01001999 llq->cons = Q_OVF(llq->prod) | Q_WRP(llq, llq->cons) |
2000 Q_IDX(llq, llq->cons);
Will Deacon48ec83b2015-05-27 17:25:59 +01002001 return IRQ_HANDLED;
2002}
2003
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01002004static void arm_smmu_handle_ppr(struct arm_smmu_device *smmu, u64 *evt)
Will Deacon48ec83b2015-05-27 17:25:59 +01002005{
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01002006 u32 sid, ssid;
2007 u16 grpid;
2008 bool ssv, last;
Will Deacon48ec83b2015-05-27 17:25:59 +01002009
Robin Murphy7417b992018-03-26 13:35:12 +01002010 sid = FIELD_GET(PRIQ_0_SID, evt[0]);
2011 ssv = FIELD_GET(PRIQ_0_SSID_V, evt[0]);
2012 ssid = ssv ? FIELD_GET(PRIQ_0_SSID, evt[0]) : 0;
2013 last = FIELD_GET(PRIQ_0_PRG_LAST, evt[0]);
2014 grpid = FIELD_GET(PRIQ_1_PRG_IDX, evt[1]);
Will Deacon48ec83b2015-05-27 17:25:59 +01002015
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01002016 dev_info(smmu->dev, "unexpected PRI request received:\n");
2017 dev_info(smmu->dev,
2018 "\tsid 0x%08x.0x%05x: [%u%s] %sprivileged %s%s%s access at iova 0x%016llx\n",
2019 sid, ssid, grpid, last ? "L" : "",
2020 evt[0] & PRIQ_0_PERM_PRIV ? "" : "un",
2021 evt[0] & PRIQ_0_PERM_READ ? "R" : "",
2022 evt[0] & PRIQ_0_PERM_WRITE ? "W" : "",
2023 evt[0] & PRIQ_0_PERM_EXEC ? "X" : "",
Robin Murphy1cf9e542018-03-26 13:35:09 +01002024 evt[1] & PRIQ_1_ADDR_MASK);
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01002025
2026 if (last) {
2027 struct arm_smmu_cmdq_ent cmd = {
2028 .opcode = CMDQ_OP_PRI_RESP,
2029 .substream_valid = ssv,
2030 .pri = {
2031 .sid = sid,
2032 .ssid = ssid,
2033 .grpid = grpid,
2034 .resp = PRI_RESP_DENY,
2035 },
2036 };
2037
2038 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
2039 }
Will Deacon48ec83b2015-05-27 17:25:59 +01002040}
2041
2042static irqreturn_t arm_smmu_priq_thread(int irq, void *dev)
2043{
2044 struct arm_smmu_device *smmu = dev;
2045 struct arm_smmu_queue *q = &smmu->priq.q;
Will Deacon7c288a52019-07-02 17:16:16 +01002046 struct arm_smmu_ll_queue *llq = &q->llq;
Will Deacon48ec83b2015-05-27 17:25:59 +01002047 u64 evt[PRIQ_ENT_DWORDS];
2048
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01002049 do {
2050 while (!queue_remove_raw(q, evt))
2051 arm_smmu_handle_ppr(smmu, evt);
Will Deacon48ec83b2015-05-27 17:25:59 +01002052
Will Deacon2a8868f2019-07-02 17:12:24 +01002053 if (queue_sync_prod_in(q) == -EOVERFLOW)
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01002054 dev_err(smmu->dev, "PRIQ overflow detected -- requests lost\n");
Will Deacon7c288a52019-07-02 17:16:16 +01002055 } while (!queue_empty(llq));
Will Deacon48ec83b2015-05-27 17:25:59 +01002056
2057 /* Sync our overflow flag, as we believe we're up to speed */
Will Deacon7c288a52019-07-02 17:16:16 +01002058 llq->cons = Q_OVF(llq->prod) | Q_WRP(llq, llq->cons) |
2059 Q_IDX(llq, llq->cons);
2060 queue_sync_cons_out(q);
Will Deacon48ec83b2015-05-27 17:25:59 +01002061 return IRQ_HANDLED;
2062}
2063
Will Deacon48ec83b2015-05-27 17:25:59 +01002064static int arm_smmu_device_disable(struct arm_smmu_device *smmu);
2065
2066static irqreturn_t arm_smmu_gerror_handler(int irq, void *dev)
2067{
Prem Mallappa324ba102015-12-14 22:01:14 +05302068 u32 gerror, gerrorn, active;
Will Deacon48ec83b2015-05-27 17:25:59 +01002069 struct arm_smmu_device *smmu = dev;
2070
2071 gerror = readl_relaxed(smmu->base + ARM_SMMU_GERROR);
2072 gerrorn = readl_relaxed(smmu->base + ARM_SMMU_GERRORN);
2073
Prem Mallappa324ba102015-12-14 22:01:14 +05302074 active = gerror ^ gerrorn;
2075 if (!(active & GERROR_ERR_MASK))
Will Deacon48ec83b2015-05-27 17:25:59 +01002076 return IRQ_NONE; /* No errors pending */
2077
2078 dev_warn(smmu->dev,
2079 "unexpected global error reported (0x%08x), this could be serious\n",
Prem Mallappa324ba102015-12-14 22:01:14 +05302080 active);
Will Deacon48ec83b2015-05-27 17:25:59 +01002081
Prem Mallappa324ba102015-12-14 22:01:14 +05302082 if (active & GERROR_SFM_ERR) {
Will Deacon48ec83b2015-05-27 17:25:59 +01002083 dev_err(smmu->dev, "device has entered Service Failure Mode!\n");
2084 arm_smmu_device_disable(smmu);
2085 }
2086
Prem Mallappa324ba102015-12-14 22:01:14 +05302087 if (active & GERROR_MSI_GERROR_ABT_ERR)
Will Deacon48ec83b2015-05-27 17:25:59 +01002088 dev_warn(smmu->dev, "GERROR MSI write aborted\n");
2089
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01002090 if (active & GERROR_MSI_PRIQ_ABT_ERR)
Will Deacon48ec83b2015-05-27 17:25:59 +01002091 dev_warn(smmu->dev, "PRIQ MSI write aborted\n");
Will Deacon48ec83b2015-05-27 17:25:59 +01002092
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01002093 if (active & GERROR_MSI_EVTQ_ABT_ERR)
Will Deacon48ec83b2015-05-27 17:25:59 +01002094 dev_warn(smmu->dev, "EVTQ MSI write aborted\n");
Will Deacon48ec83b2015-05-27 17:25:59 +01002095
Robin Murphydce032a2017-08-31 14:44:26 +01002096 if (active & GERROR_MSI_CMDQ_ABT_ERR)
Will Deacon48ec83b2015-05-27 17:25:59 +01002097 dev_warn(smmu->dev, "CMDQ MSI write aborted\n");
Will Deacon48ec83b2015-05-27 17:25:59 +01002098
Prem Mallappa324ba102015-12-14 22:01:14 +05302099 if (active & GERROR_PRIQ_ABT_ERR)
Will Deacon48ec83b2015-05-27 17:25:59 +01002100 dev_err(smmu->dev, "PRIQ write aborted -- events may have been lost\n");
2101
Prem Mallappa324ba102015-12-14 22:01:14 +05302102 if (active & GERROR_EVTQ_ABT_ERR)
Will Deacon48ec83b2015-05-27 17:25:59 +01002103 dev_err(smmu->dev, "EVTQ write aborted -- events may have been lost\n");
2104
Prem Mallappa324ba102015-12-14 22:01:14 +05302105 if (active & GERROR_CMDQ_ERR)
Will Deacon48ec83b2015-05-27 17:25:59 +01002106 arm_smmu_cmdq_skip_err(smmu);
2107
2108 writel(gerror, smmu->base + ARM_SMMU_GERRORN);
2109 return IRQ_HANDLED;
2110}
2111
Geetha Sowjanyaf9354482017-06-23 19:04:36 +05302112static irqreturn_t arm_smmu_combined_irq_thread(int irq, void *dev)
2113{
2114 struct arm_smmu_device *smmu = dev;
2115
2116 arm_smmu_evtq_thread(irq, dev);
2117 if (smmu->features & ARM_SMMU_FEAT_PRI)
2118 arm_smmu_priq_thread(irq, dev);
2119
2120 return IRQ_HANDLED;
2121}
2122
2123static irqreturn_t arm_smmu_combined_irq_handler(int irq, void *dev)
2124{
2125 arm_smmu_gerror_handler(irq, dev);
Geetha Sowjanyaf9354482017-06-23 19:04:36 +05302126 return IRQ_WAKE_THREAD;
2127}
2128
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002129static void
2130arm_smmu_atc_inv_to_cmd(int ssid, unsigned long iova, size_t size,
2131 struct arm_smmu_cmdq_ent *cmd)
2132{
2133 size_t log2_span;
2134 size_t span_mask;
2135 /* ATC invalidates are always on 4096-bytes pages */
2136 size_t inval_grain_shift = 12;
2137 unsigned long page_start, page_end;
2138
2139 *cmd = (struct arm_smmu_cmdq_ent) {
2140 .opcode = CMDQ_OP_ATC_INV,
2141 .substream_valid = !!ssid,
2142 .atc.ssid = ssid,
2143 };
2144
2145 if (!size) {
2146 cmd->atc.size = ATC_INV_SIZE_ALL;
2147 return;
2148 }
2149
2150 page_start = iova >> inval_grain_shift;
2151 page_end = (iova + size - 1) >> inval_grain_shift;
2152
2153 /*
2154 * In an ATS Invalidate Request, the address must be aligned on the
2155 * range size, which must be a power of two number of page sizes. We
2156 * thus have to choose between grossly over-invalidating the region, or
2157 * splitting the invalidation into multiple commands. For simplicity
2158 * we'll go with the first solution, but should refine it in the future
2159 * if multiple commands are shown to be more efficient.
2160 *
2161 * Find the smallest power of two that covers the range. The most
2162 * significant differing bit between the start and end addresses,
2163 * fls(start ^ end), indicates the required span. For example:
2164 *
2165 * We want to invalidate pages [8; 11]. This is already the ideal range:
2166 * x = 0b1000 ^ 0b1011 = 0b11
2167 * span = 1 << fls(x) = 4
2168 *
2169 * To invalidate pages [7; 10], we need to invalidate [0; 15]:
2170 * x = 0b0111 ^ 0b1010 = 0b1101
2171 * span = 1 << fls(x) = 16
2172 */
2173 log2_span = fls_long(page_start ^ page_end);
2174 span_mask = (1ULL << log2_span) - 1;
2175
2176 page_start &= ~span_mask;
2177
2178 cmd->atc.addr = page_start << inval_grain_shift;
2179 cmd->atc.size = log2_span;
2180}
2181
Rob Herring9e773ae2020-02-24 17:58:46 +01002182static int arm_smmu_atc_inv_master(struct arm_smmu_master *master)
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002183{
2184 int i;
Rob Herring9e773ae2020-02-24 17:58:46 +01002185 struct arm_smmu_cmdq_ent cmd;
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002186
Rob Herring9e773ae2020-02-24 17:58:46 +01002187 arm_smmu_atc_inv_to_cmd(0, 0, 0, &cmd);
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002188
2189 for (i = 0; i < master->num_sids; i++) {
Rob Herring9e773ae2020-02-24 17:58:46 +01002190 cmd.atc.sid = master->sids[i];
2191 arm_smmu_cmdq_issue_cmd(master->smmu, &cmd);
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002192 }
2193
2194 return arm_smmu_cmdq_issue_sync(master->smmu);
2195}
2196
2197static int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain,
2198 int ssid, unsigned long iova, size_t size)
2199{
Rob Herring9e773ae2020-02-24 17:58:46 +01002200 int i;
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002201 unsigned long flags;
2202 struct arm_smmu_cmdq_ent cmd;
2203 struct arm_smmu_master *master;
Rob Herring9e773ae2020-02-24 17:58:46 +01002204 struct arm_smmu_cmdq_batch cmds = {};
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002205
2206 if (!(smmu_domain->smmu->features & ARM_SMMU_FEAT_ATS))
2207 return 0;
2208
Will Deaconcdb8a3c2019-08-20 16:28:54 +01002209 /*
2210 * Ensure that we've completed prior invalidation of the main TLBs
2211 * before we read 'nr_ats_masters' in case of a concurrent call to
2212 * arm_smmu_enable_ats():
2213 *
2214 * // unmap() // arm_smmu_enable_ats()
2215 * TLBI+SYNC atomic_inc(&nr_ats_masters);
2216 * smp_mb(); [...]
2217 * atomic_read(&nr_ats_masters); pci_enable_ats() // writel()
2218 *
2219 * Ensures that we always see the incremented 'nr_ats_masters' count if
2220 * ATS was enabled at the PCI device before completion of the TLBI.
2221 */
2222 smp_mb();
2223 if (!atomic_read(&smmu_domain->nr_ats_masters))
2224 return 0;
2225
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002226 arm_smmu_atc_inv_to_cmd(ssid, iova, size, &cmd);
2227
2228 spin_lock_irqsave(&smmu_domain->devices_lock, flags);
Rob Herring9e773ae2020-02-24 17:58:46 +01002229 list_for_each_entry(master, &smmu_domain->devices, domain_head) {
2230 if (!master->ats_enabled)
2231 continue;
2232
2233 for (i = 0; i < master->num_sids; i++) {
2234 cmd.atc.sid = master->sids[i];
2235 arm_smmu_cmdq_batch_add(smmu_domain->smmu, &cmds, &cmd);
2236 }
2237 }
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002238 spin_unlock_irqrestore(&smmu_domain->devices_lock, flags);
2239
Rob Herring9e773ae2020-02-24 17:58:46 +01002240 return arm_smmu_cmdq_batch_submit(smmu_domain->smmu, &cmds);
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002241}
2242
Will Deacon48ec83b2015-05-27 17:25:59 +01002243/* IO_PGTABLE API */
Will Deacon48ec83b2015-05-27 17:25:59 +01002244static void arm_smmu_tlb_inv_context(void *cookie)
2245{
2246 struct arm_smmu_domain *smmu_domain = cookie;
2247 struct arm_smmu_device *smmu = smmu_domain->smmu;
2248 struct arm_smmu_cmdq_ent cmd;
2249
2250 if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) {
2251 cmd.opcode = CMDQ_OP_TLBI_NH_ASID;
2252 cmd.tlbi.asid = smmu_domain->s1_cfg.cd.asid;
2253 cmd.tlbi.vmid = 0;
2254 } else {
2255 cmd.opcode = CMDQ_OP_TLBI_S12_VMALL;
2256 cmd.tlbi.vmid = smmu_domain->s2_cfg.vmid;
2257 }
2258
Zhen Lei9662b992018-09-20 17:10:25 +01002259 /*
2260 * NOTE: when io-pgtable is in non-strict mode, we may get here with
2261 * PTEs previously cleared by unmaps on the current CPU not yet visible
Will Deacon587e6c12019-07-02 17:16:25 +01002262 * to the SMMU. We are relying on the dma_wmb() implicit during cmd
2263 * insertion to guarantee those are observed before the TLBI. Do be
2264 * careful, 007.
Zhen Lei9662b992018-09-20 17:10:25 +01002265 */
Will Deacon48ec83b2015-05-27 17:25:59 +01002266 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
Andrew Murray5e731072018-10-10 11:29:27 +01002267 arm_smmu_cmdq_issue_sync(smmu);
Will Deacon353e3cf2019-08-20 15:12:12 +01002268 arm_smmu_atc_inv_domain(smmu_domain, 0, 0, 0);
Will Deacon48ec83b2015-05-27 17:25:59 +01002269}
2270
Will Deacon2af2e722019-07-02 17:16:33 +01002271static void arm_smmu_tlb_inv_range(unsigned long iova, size_t size,
2272 size_t granule, bool leaf,
2273 struct arm_smmu_domain *smmu_domain)
Will Deacon48ec83b2015-05-27 17:25:59 +01002274{
Will Deacon48ec83b2015-05-27 17:25:59 +01002275 struct arm_smmu_device *smmu = smmu_domain->smmu;
Rob Herring6a481a92020-02-24 16:31:29 -06002276 unsigned long start = iova, end = iova + size, num_pages = 0, tg = 0;
2277 size_t inv_range = granule;
Jean-Philippe Brucker4ce8da42020-02-24 17:58:44 +01002278 struct arm_smmu_cmdq_batch cmds = {};
Will Deacon48ec83b2015-05-27 17:25:59 +01002279 struct arm_smmu_cmdq_ent cmd = {
2280 .tlbi = {
2281 .leaf = leaf,
Will Deacon48ec83b2015-05-27 17:25:59 +01002282 },
2283 };
2284
Will Deacon7314ca82019-08-21 12:38:15 +01002285 if (!size)
2286 return;
2287
Will Deacon48ec83b2015-05-27 17:25:59 +01002288 if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) {
2289 cmd.opcode = CMDQ_OP_TLBI_NH_VA;
2290 cmd.tlbi.asid = smmu_domain->s1_cfg.cd.asid;
2291 } else {
2292 cmd.opcode = CMDQ_OP_TLBI_S2_IPA;
2293 cmd.tlbi.vmid = smmu_domain->s2_cfg.vmid;
2294 }
2295
Rob Herring6a481a92020-02-24 16:31:29 -06002296 if (smmu->features & ARM_SMMU_FEAT_RANGE_INV) {
2297 /* Get the leaf page size */
2298 tg = __ffs(smmu_domain->domain.pgsize_bitmap);
2299
2300 /* Convert page size of 12,14,16 (log2) to 1,2,3 */
2301 cmd.tlbi.tg = (tg - 10) / 2;
2302
2303 /* Determine what level the granule is at */
2304 cmd.tlbi.ttl = 4 - ((ilog2(granule) - 3) / (tg - 3));
2305
2306 num_pages = size >> tg;
2307 }
2308
Will Deacon2af2e722019-07-02 17:16:33 +01002309 while (iova < end) {
Rob Herring6a481a92020-02-24 16:31:29 -06002310 if (smmu->features & ARM_SMMU_FEAT_RANGE_INV) {
2311 /*
2312 * On each iteration of the loop, the range is 5 bits
2313 * worth of the aligned size remaining.
2314 * The range in pages is:
2315 *
2316 * range = (num_pages & (0x1f << __ffs(num_pages)))
2317 */
2318 unsigned long scale, num;
2319
2320 /* Determine the power of 2 multiple number of pages */
2321 scale = __ffs(num_pages);
2322 cmd.tlbi.scale = scale;
2323
2324 /* Determine how many chunks of 2^scale size we have */
2325 num = (num_pages >> scale) & CMDQ_TLBI_RANGE_NUM_MAX;
2326 cmd.tlbi.num = num - 1;
2327
2328 /* range is num * 2^scale * pgsize */
2329 inv_range = num << (scale + tg);
2330
2331 /* Clear out the lower order bits for the next iteration */
2332 num_pages -= num << scale;
Will Deacon2af2e722019-07-02 17:16:33 +01002333 }
2334
2335 cmd.tlbi.addr = iova;
Jean-Philippe Brucker4ce8da42020-02-24 17:58:44 +01002336 arm_smmu_cmdq_batch_add(smmu, &cmds, &cmd);
Rob Herring6a481a92020-02-24 16:31:29 -06002337 iova += inv_range;
Will Deacon2af2e722019-07-02 17:16:33 +01002338 }
Jean-Philippe Brucker4ce8da42020-02-24 17:58:44 +01002339 arm_smmu_cmdq_batch_submit(smmu, &cmds);
Will Deacon353e3cf2019-08-20 15:12:12 +01002340
2341 /*
2342 * Unfortunately, this can't be leaf-only since we may have
2343 * zapped an entire table.
2344 */
2345 arm_smmu_atc_inv_domain(smmu_domain, 0, start, size);
Will Deacon48ec83b2015-05-27 17:25:59 +01002346}
2347
Will Deacon3951c412019-07-02 16:45:15 +01002348static void arm_smmu_tlb_inv_page_nosync(struct iommu_iotlb_gather *gather,
2349 unsigned long iova, size_t granule,
Will Deaconabfd6fe2019-07-02 16:44:41 +01002350 void *cookie)
2351{
Will Deacon2af2e722019-07-02 17:16:33 +01002352 struct arm_smmu_domain *smmu_domain = cookie;
2353 struct iommu_domain *domain = &smmu_domain->domain;
2354
2355 iommu_iotlb_gather_add_page(domain, gather, iova, granule);
Will Deaconabfd6fe2019-07-02 16:44:41 +01002356}
2357
Will Deacon05aed942019-07-02 16:44:25 +01002358static void arm_smmu_tlb_inv_walk(unsigned long iova, size_t size,
2359 size_t granule, void *cookie)
2360{
Will Deacon2af2e722019-07-02 17:16:33 +01002361 arm_smmu_tlb_inv_range(iova, size, granule, false, cookie);
Will Deacon05aed942019-07-02 16:44:25 +01002362}
2363
2364static void arm_smmu_tlb_inv_leaf(unsigned long iova, size_t size,
2365 size_t granule, void *cookie)
2366{
Will Deacon2af2e722019-07-02 17:16:33 +01002367 arm_smmu_tlb_inv_range(iova, size, granule, true, cookie);
Will Deacon05aed942019-07-02 16:44:25 +01002368}
2369
Will Deacon298f78892019-07-02 16:43:34 +01002370static const struct iommu_flush_ops arm_smmu_flush_ops = {
Will Deacon48ec83b2015-05-27 17:25:59 +01002371 .tlb_flush_all = arm_smmu_tlb_inv_context,
Will Deacon05aed942019-07-02 16:44:25 +01002372 .tlb_flush_walk = arm_smmu_tlb_inv_walk,
2373 .tlb_flush_leaf = arm_smmu_tlb_inv_leaf,
Will Deaconabfd6fe2019-07-02 16:44:41 +01002374 .tlb_add_page = arm_smmu_tlb_inv_page_nosync,
Will Deacon48ec83b2015-05-27 17:25:59 +01002375};
2376
2377/* IOMMU API */
2378static bool arm_smmu_capable(enum iommu_cap cap)
2379{
2380 switch (cap) {
2381 case IOMMU_CAP_CACHE_COHERENCY:
2382 return true;
Will Deacon48ec83b2015-05-27 17:25:59 +01002383 case IOMMU_CAP_NOEXEC:
2384 return true;
2385 default:
2386 return false;
2387 }
2388}
2389
2390static struct iommu_domain *arm_smmu_domain_alloc(unsigned type)
2391{
2392 struct arm_smmu_domain *smmu_domain;
2393
Will Deaconbeb3c6a2017-01-06 16:27:30 +00002394 if (type != IOMMU_DOMAIN_UNMANAGED &&
2395 type != IOMMU_DOMAIN_DMA &&
2396 type != IOMMU_DOMAIN_IDENTITY)
Will Deacon48ec83b2015-05-27 17:25:59 +01002397 return NULL;
2398
2399 /*
2400 * Allocate the domain and initialise some of its data structures.
2401 * We can't really do anything meaningful until we've added a
2402 * master.
2403 */
2404 smmu_domain = kzalloc(sizeof(*smmu_domain), GFP_KERNEL);
2405 if (!smmu_domain)
2406 return NULL;
2407
Robin Murphy9adb9592016-01-26 18:06:36 +00002408 if (type == IOMMU_DOMAIN_DMA &&
2409 iommu_get_dma_cookie(&smmu_domain->domain)) {
2410 kfree(smmu_domain);
2411 return NULL;
2412 }
2413
Will Deacon48ec83b2015-05-27 17:25:59 +01002414 mutex_init(&smmu_domain->init_mutex);
Jean-Philippe Brucker2a7e62f2019-04-17 19:24:46 +01002415 INIT_LIST_HEAD(&smmu_domain->devices);
2416 spin_lock_init(&smmu_domain->devices_lock);
2417
Will Deacon48ec83b2015-05-27 17:25:59 +01002418 return &smmu_domain->domain;
2419}
2420
2421static int arm_smmu_bitmap_alloc(unsigned long *map, int span)
2422{
2423 int idx, size = 1 << span;
2424
2425 do {
2426 idx = find_first_zero_bit(map, size);
2427 if (idx == size)
2428 return -ENOSPC;
2429 } while (test_and_set_bit(idx, map));
2430
2431 return idx;
2432}
2433
2434static void arm_smmu_bitmap_free(unsigned long *map, int idx)
2435{
2436 clear_bit(idx, map);
2437}
2438
2439static void arm_smmu_domain_free(struct iommu_domain *domain)
2440{
2441 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
2442 struct arm_smmu_device *smmu = smmu_domain->smmu;
2443
Robin Murphy9adb9592016-01-26 18:06:36 +00002444 iommu_put_dma_cookie(domain);
Markus Elfringa6e08fb2015-06-29 17:47:43 +01002445 free_io_pgtable_ops(smmu_domain->pgtbl_ops);
Will Deacon48ec83b2015-05-27 17:25:59 +01002446
2447 /* Free the CD and ASID, if we allocated them */
2448 if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) {
2449 struct arm_smmu_s1_cfg *cfg = &smmu_domain->s1_cfg;
2450
Jean-Philippe Brucker7bc4f3f2020-01-15 13:52:31 +01002451 if (cfg->cdcfg.cdtab) {
Jean-Philippe Bruckera557aff2020-01-15 13:52:32 +01002452 arm_smmu_free_cd_tables(smmu_domain);
Will Deacon48ec83b2015-05-27 17:25:59 +01002453 arm_smmu_bitmap_free(smmu->asid_map, cfg->cd.asid);
2454 }
2455 } else {
2456 struct arm_smmu_s2_cfg *cfg = &smmu_domain->s2_cfg;
2457 if (cfg->vmid)
2458 arm_smmu_bitmap_free(smmu->vmid_map, cfg->vmid);
2459 }
2460
2461 kfree(smmu_domain);
2462}
2463
2464static int arm_smmu_domain_finalise_s1(struct arm_smmu_domain *smmu_domain,
Jean-Philippe Brucker2505ec62020-01-15 13:52:34 +01002465 struct arm_smmu_master *master,
Will Deacon48ec83b2015-05-27 17:25:59 +01002466 struct io_pgtable_cfg *pgtbl_cfg)
2467{
2468 int ret;
Will Deaconc0733a22015-10-13 17:51:14 +01002469 int asid;
Will Deacon48ec83b2015-05-27 17:25:59 +01002470 struct arm_smmu_device *smmu = smmu_domain->smmu;
2471 struct arm_smmu_s1_cfg *cfg = &smmu_domain->s1_cfg;
Robin Murphyfb485eb2019-10-25 19:08:38 +01002472 typeof(&pgtbl_cfg->arm_lpae_s1_cfg.tcr) tcr = &pgtbl_cfg->arm_lpae_s1_cfg.tcr;
Will Deacon48ec83b2015-05-27 17:25:59 +01002473
2474 asid = arm_smmu_bitmap_alloc(smmu->asid_map, smmu->asid_bits);
Arnd Bergmann287980e2016-05-27 23:23:25 +02002475 if (asid < 0)
Will Deacon48ec83b2015-05-27 17:25:59 +01002476 return asid;
2477
Jean-Philippe Brucker2505ec62020-01-15 13:52:34 +01002478 cfg->s1cdmax = master->ssid_bits;
2479
Jean-Philippe Bruckera557aff2020-01-15 13:52:32 +01002480 ret = arm_smmu_alloc_cd_tables(smmu_domain);
2481 if (ret)
Will Deacon48ec83b2015-05-27 17:25:59 +01002482 goto out_free_asid;
Will Deacon48ec83b2015-05-27 17:25:59 +01002483
Will Deaconc0733a22015-10-13 17:51:14 +01002484 cfg->cd.asid = (u16)asid;
Robin Murphyd1e5f262019-10-25 19:08:37 +01002485 cfg->cd.ttbr = pgtbl_cfg->arm_lpae_s1_cfg.ttbr;
Robin Murphyfb485eb2019-10-25 19:08:38 +01002486 cfg->cd.tcr = FIELD_PREP(CTXDESC_CD_0_TCR_T0SZ, tcr->tsz) |
2487 FIELD_PREP(CTXDESC_CD_0_TCR_TG0, tcr->tg) |
2488 FIELD_PREP(CTXDESC_CD_0_TCR_IRGN0, tcr->irgn) |
2489 FIELD_PREP(CTXDESC_CD_0_TCR_ORGN0, tcr->orgn) |
2490 FIELD_PREP(CTXDESC_CD_0_TCR_SH0, tcr->sh) |
2491 FIELD_PREP(CTXDESC_CD_0_TCR_IPS, tcr->ips) |
2492 CTXDESC_CD_0_TCR_EPD1 | CTXDESC_CD_0_AA64;
Robin Murphy205577a2019-10-25 19:08:36 +01002493 cfg->cd.mair = pgtbl_cfg->arm_lpae_s1_cfg.mair;
Jean-Philippe Brucker492ddc72020-01-15 13:52:35 +01002494
2495 /*
2496 * Note that this will end up calling arm_smmu_sync_cd() before
2497 * the master has been added to the devices list for this domain.
2498 * This isn't an issue because the STE hasn't been installed yet.
2499 */
2500 ret = arm_smmu_write_ctx_desc(smmu_domain, 0, &cfg->cd);
2501 if (ret)
2502 goto out_free_cd_tables;
2503
Will Deacon48ec83b2015-05-27 17:25:59 +01002504 return 0;
2505
Jean-Philippe Brucker492ddc72020-01-15 13:52:35 +01002506out_free_cd_tables:
2507 arm_smmu_free_cd_tables(smmu_domain);
Will Deacon48ec83b2015-05-27 17:25:59 +01002508out_free_asid:
2509 arm_smmu_bitmap_free(smmu->asid_map, asid);
2510 return ret;
2511}
2512
2513static int arm_smmu_domain_finalise_s2(struct arm_smmu_domain *smmu_domain,
Jean-Philippe Brucker2505ec62020-01-15 13:52:34 +01002514 struct arm_smmu_master *master,
Will Deacon48ec83b2015-05-27 17:25:59 +01002515 struct io_pgtable_cfg *pgtbl_cfg)
2516{
Will Deaconc0733a22015-10-13 17:51:14 +01002517 int vmid;
Will Deacon48ec83b2015-05-27 17:25:59 +01002518 struct arm_smmu_device *smmu = smmu_domain->smmu;
2519 struct arm_smmu_s2_cfg *cfg = &smmu_domain->s2_cfg;
Will Deaconac4b80e2020-01-10 14:51:59 +00002520 typeof(&pgtbl_cfg->arm_lpae_s2_cfg.vtcr) vtcr;
Will Deacon48ec83b2015-05-27 17:25:59 +01002521
2522 vmid = arm_smmu_bitmap_alloc(smmu->vmid_map, smmu->vmid_bits);
Arnd Bergmann287980e2016-05-27 23:23:25 +02002523 if (vmid < 0)
Will Deacon48ec83b2015-05-27 17:25:59 +01002524 return vmid;
2525
Will Deaconac4b80e2020-01-10 14:51:59 +00002526 vtcr = &pgtbl_cfg->arm_lpae_s2_cfg.vtcr;
Will Deaconc0733a22015-10-13 17:51:14 +01002527 cfg->vmid = (u16)vmid;
Will Deacon48ec83b2015-05-27 17:25:59 +01002528 cfg->vttbr = pgtbl_cfg->arm_lpae_s2_cfg.vttbr;
Will Deaconac4b80e2020-01-10 14:51:59 +00002529 cfg->vtcr = FIELD_PREP(STRTAB_STE_2_VTCR_S2T0SZ, vtcr->tsz) |
2530 FIELD_PREP(STRTAB_STE_2_VTCR_S2SL0, vtcr->sl) |
2531 FIELD_PREP(STRTAB_STE_2_VTCR_S2IR0, vtcr->irgn) |
2532 FIELD_PREP(STRTAB_STE_2_VTCR_S2OR0, vtcr->orgn) |
2533 FIELD_PREP(STRTAB_STE_2_VTCR_S2SH0, vtcr->sh) |
2534 FIELD_PREP(STRTAB_STE_2_VTCR_S2TG, vtcr->tg) |
2535 FIELD_PREP(STRTAB_STE_2_VTCR_S2PS, vtcr->ps);
Will Deacon48ec83b2015-05-27 17:25:59 +01002536 return 0;
2537}
2538
Jean-Philippe Brucker2505ec62020-01-15 13:52:34 +01002539static int arm_smmu_domain_finalise(struct iommu_domain *domain,
2540 struct arm_smmu_master *master)
Will Deacon48ec83b2015-05-27 17:25:59 +01002541{
2542 int ret;
2543 unsigned long ias, oas;
2544 enum io_pgtable_fmt fmt;
2545 struct io_pgtable_cfg pgtbl_cfg;
2546 struct io_pgtable_ops *pgtbl_ops;
2547 int (*finalise_stage_fn)(struct arm_smmu_domain *,
Jean-Philippe Brucker2505ec62020-01-15 13:52:34 +01002548 struct arm_smmu_master *,
Will Deacon48ec83b2015-05-27 17:25:59 +01002549 struct io_pgtable_cfg *);
2550 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
2551 struct arm_smmu_device *smmu = smmu_domain->smmu;
2552
Will Deaconbeb3c6a2017-01-06 16:27:30 +00002553 if (domain->type == IOMMU_DOMAIN_IDENTITY) {
2554 smmu_domain->stage = ARM_SMMU_DOMAIN_BYPASS;
2555 return 0;
2556 }
2557
Will Deacon48ec83b2015-05-27 17:25:59 +01002558 /* Restrict the stage to what we can actually support */
2559 if (!(smmu->features & ARM_SMMU_FEAT_TRANS_S1))
2560 smmu_domain->stage = ARM_SMMU_DOMAIN_S2;
2561 if (!(smmu->features & ARM_SMMU_FEAT_TRANS_S2))
2562 smmu_domain->stage = ARM_SMMU_DOMAIN_S1;
2563
2564 switch (smmu_domain->stage) {
2565 case ARM_SMMU_DOMAIN_S1:
Robin Murphydcd189e2018-03-26 13:35:15 +01002566 ias = (smmu->features & ARM_SMMU_FEAT_VAX) ? 52 : 48;
2567 ias = min_t(unsigned long, ias, VA_BITS);
Will Deacon48ec83b2015-05-27 17:25:59 +01002568 oas = smmu->ias;
2569 fmt = ARM_64_LPAE_S1;
2570 finalise_stage_fn = arm_smmu_domain_finalise_s1;
2571 break;
2572 case ARM_SMMU_DOMAIN_NESTED:
2573 case ARM_SMMU_DOMAIN_S2:
2574 ias = smmu->ias;
2575 oas = smmu->oas;
2576 fmt = ARM_64_LPAE_S2;
2577 finalise_stage_fn = arm_smmu_domain_finalise_s2;
2578 break;
2579 default:
2580 return -EINVAL;
2581 }
2582
2583 pgtbl_cfg = (struct io_pgtable_cfg) {
Robin Murphyd5466352016-05-09 17:20:09 +01002584 .pgsize_bitmap = smmu->pgsize_bitmap,
Will Deacon48ec83b2015-05-27 17:25:59 +01002585 .ias = ias,
2586 .oas = oas,
Will Deacon4f418452019-06-25 12:51:25 +01002587 .coherent_walk = smmu->features & ARM_SMMU_FEAT_COHERENCY,
Will Deacon298f78892019-07-02 16:43:34 +01002588 .tlb = &arm_smmu_flush_ops,
Robin Murphybdc6d972015-07-29 19:46:07 +01002589 .iommu_dev = smmu->dev,
Will Deacon48ec83b2015-05-27 17:25:59 +01002590 };
2591
Zhen Lei9662b992018-09-20 17:10:25 +01002592 if (smmu_domain->non_strict)
2593 pgtbl_cfg.quirks |= IO_PGTABLE_QUIRK_NON_STRICT;
2594
Will Deacon48ec83b2015-05-27 17:25:59 +01002595 pgtbl_ops = alloc_io_pgtable_ops(fmt, &pgtbl_cfg, smmu_domain);
2596 if (!pgtbl_ops)
2597 return -ENOMEM;
2598
Robin Murphyd5466352016-05-09 17:20:09 +01002599 domain->pgsize_bitmap = pgtbl_cfg.pgsize_bitmap;
Robin Murphy6619c912018-03-26 13:35:14 +01002600 domain->geometry.aperture_end = (1UL << pgtbl_cfg.ias) - 1;
Robin Murphy455eb7d2016-09-12 17:13:58 +01002601 domain->geometry.force_aperture = true;
Will Deacon48ec83b2015-05-27 17:25:59 +01002602
Jean-Philippe Brucker2505ec62020-01-15 13:52:34 +01002603 ret = finalise_stage_fn(smmu_domain, master, &pgtbl_cfg);
Jean-Philippe Brucker57d72e12017-12-14 11:03:01 +00002604 if (ret < 0) {
Will Deacon48ec83b2015-05-27 17:25:59 +01002605 free_io_pgtable_ops(pgtbl_ops);
Jean-Philippe Brucker57d72e12017-12-14 11:03:01 +00002606 return ret;
2607 }
Will Deacon48ec83b2015-05-27 17:25:59 +01002608
Jean-Philippe Brucker57d72e12017-12-14 11:03:01 +00002609 smmu_domain->pgtbl_ops = pgtbl_ops;
2610 return 0;
Will Deacon48ec83b2015-05-27 17:25:59 +01002611}
2612
Will Deacon48ec83b2015-05-27 17:25:59 +01002613static __le64 *arm_smmu_get_step_for_sid(struct arm_smmu_device *smmu, u32 sid)
2614{
2615 __le64 *step;
2616 struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg;
2617
2618 if (smmu->features & ARM_SMMU_FEAT_2_LVL_STRTAB) {
2619 struct arm_smmu_strtab_l1_desc *l1_desc;
2620 int idx;
2621
2622 /* Two-level walk */
2623 idx = (sid >> STRTAB_SPLIT) * STRTAB_L1_DESC_DWORDS;
2624 l1_desc = &cfg->l1_desc[idx];
2625 idx = (sid & ((1 << STRTAB_SPLIT) - 1)) * STRTAB_STE_DWORDS;
2626 step = &l1_desc->l2ptr[idx];
2627 } else {
2628 /* Simple linear lookup */
2629 step = &cfg->strtab[sid * STRTAB_STE_DWORDS];
2630 }
2631
2632 return step;
2633}
2634
Jean-Philippe Bruckerbcecaee2019-04-17 19:24:44 +01002635static void arm_smmu_install_ste_for_dev(struct arm_smmu_master *master)
Will Deacon48ec83b2015-05-27 17:25:59 +01002636{
Robin Murphy563b5cb2018-01-02 12:33:14 +00002637 int i, j;
Robin Murphy8f785152016-09-12 17:13:45 +01002638 struct arm_smmu_device *smmu = master->smmu;
Will Deacon48ec83b2015-05-27 17:25:59 +01002639
Jean-Philippe Bruckerbcecaee2019-04-17 19:24:44 +01002640 for (i = 0; i < master->num_sids; ++i) {
2641 u32 sid = master->sids[i];
Will Deacon48ec83b2015-05-27 17:25:59 +01002642 __le64 *step = arm_smmu_get_step_for_sid(smmu, sid);
2643
Robin Murphy563b5cb2018-01-02 12:33:14 +00002644 /* Bridged PCI devices may end up with duplicated IDs */
2645 for (j = 0; j < i; j++)
Jean-Philippe Bruckerbcecaee2019-04-17 19:24:44 +01002646 if (master->sids[j] == sid)
Robin Murphy563b5cb2018-01-02 12:33:14 +00002647 break;
2648 if (j < i)
2649 continue;
2650
Jean-Philippe Brucker8be39a12019-04-17 19:24:45 +01002651 arm_smmu_write_strtab_ent(master, sid, step);
Will Deacon48ec83b2015-05-27 17:25:59 +01002652 }
Will Deacon48ec83b2015-05-27 17:25:59 +01002653}
2654
YueHaibing097a7df2019-09-03 14:50:56 +08002655#ifdef CONFIG_PCI_ATS
Will Deaconbfff88e2019-08-20 14:28:59 +01002656static bool arm_smmu_ats_supported(struct arm_smmu_master *master)
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002657{
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002658 struct pci_dev *pdev;
2659 struct arm_smmu_device *smmu = master->smmu;
2660 struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(master->dev);
2661
2662 if (!(smmu->features & ARM_SMMU_FEAT_ATS) || !dev_is_pci(master->dev) ||
2663 !(fwspec->flags & IOMMU_FWSPEC_PCI_RC_ATS) || pci_ats_disabled())
Will Deaconbfff88e2019-08-20 14:28:59 +01002664 return false;
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002665
2666 pdev = to_pci_dev(master->dev);
Will Deaconbfff88e2019-08-20 14:28:59 +01002667 return !pdev->untrusted && pdev->ats_cap;
2668}
YueHaibing097a7df2019-09-03 14:50:56 +08002669#else
2670static bool arm_smmu_ats_supported(struct arm_smmu_master *master)
2671{
2672 return false;
2673}
2674#endif
Will Deaconbfff88e2019-08-20 14:28:59 +01002675
2676static void arm_smmu_enable_ats(struct arm_smmu_master *master)
2677{
2678 size_t stu;
2679 struct pci_dev *pdev;
2680 struct arm_smmu_device *smmu = master->smmu;
Will Deaconcdb8a3c2019-08-20 16:28:54 +01002681 struct arm_smmu_domain *smmu_domain = master->domain;
Will Deaconbfff88e2019-08-20 14:28:59 +01002682
2683 /* Don't enable ATS at the endpoint if it's not enabled in the STE */
2684 if (!master->ats_enabled)
2685 return;
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002686
2687 /* Smallest Translation Unit: log2 of the smallest supported granule */
2688 stu = __ffs(smmu->pgsize_bitmap);
Will Deaconbfff88e2019-08-20 14:28:59 +01002689 pdev = to_pci_dev(master->dev);
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002690
Will Deaconcdb8a3c2019-08-20 16:28:54 +01002691 atomic_inc(&smmu_domain->nr_ats_masters);
2692 arm_smmu_atc_inv_domain(smmu_domain, 0, 0, 0);
Will Deaconbfff88e2019-08-20 14:28:59 +01002693 if (pci_enable_ats(pdev, stu))
2694 dev_err(master->dev, "Failed to enable ATS (STU %zu)\n", stu);
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002695}
2696
2697static void arm_smmu_disable_ats(struct arm_smmu_master *master)
2698{
Will Deaconcdb8a3c2019-08-20 16:28:54 +01002699 struct arm_smmu_domain *smmu_domain = master->domain;
Jean-Philippe Brucker8dd8f002019-07-03 12:19:20 +01002700
Will Deaconbfff88e2019-08-20 14:28:59 +01002701 if (!master->ats_enabled)
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002702 return;
2703
Will Deaconbfff88e2019-08-20 14:28:59 +01002704 pci_disable_ats(to_pci_dev(master->dev));
2705 /*
2706 * Ensure ATS is disabled at the endpoint before we issue the
2707 * ATC invalidation via the SMMU.
2708 */
2709 wmb();
Rob Herring9e773ae2020-02-24 17:58:46 +01002710 arm_smmu_atc_inv_master(master);
Will Deaconcdb8a3c2019-08-20 16:28:54 +01002711 atomic_dec(&smmu_domain->nr_ats_masters);
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002712}
2713
Jean-Philippe Brucker058c59a2020-02-24 17:58:42 +01002714static int arm_smmu_enable_pasid(struct arm_smmu_master *master)
2715{
2716 int ret;
2717 int features;
2718 int num_pasids;
2719 struct pci_dev *pdev;
2720
2721 if (!dev_is_pci(master->dev))
2722 return -ENODEV;
2723
2724 pdev = to_pci_dev(master->dev);
2725
2726 features = pci_pasid_features(pdev);
2727 if (features < 0)
2728 return features;
2729
2730 num_pasids = pci_max_pasids(pdev);
2731 if (num_pasids <= 0)
2732 return num_pasids;
2733
2734 ret = pci_enable_pasid(pdev, features);
2735 if (ret) {
2736 dev_err(&pdev->dev, "Failed to enable PASID\n");
2737 return ret;
2738 }
2739
2740 master->ssid_bits = min_t(u8, ilog2(num_pasids),
2741 master->smmu->ssid_bits);
2742 return 0;
2743}
2744
2745static void arm_smmu_disable_pasid(struct arm_smmu_master *master)
2746{
2747 struct pci_dev *pdev;
2748
2749 if (!dev_is_pci(master->dev))
2750 return;
2751
2752 pdev = to_pci_dev(master->dev);
2753
2754 if (!pdev->pasid_enabled)
2755 return;
2756
2757 master->ssid_bits = 0;
2758 pci_disable_pasid(pdev);
2759}
2760
Jean-Philippe Bruckerbcecaee2019-04-17 19:24:44 +01002761static void arm_smmu_detach_dev(struct arm_smmu_master *master)
Will Deaconbc7f2ce2016-02-17 17:41:57 +00002762{
Jean-Philippe Brucker2a7e62f2019-04-17 19:24:46 +01002763 unsigned long flags;
2764 struct arm_smmu_domain *smmu_domain = master->domain;
2765
2766 if (!smmu_domain)
Jean-Philippe Brucker8be39a12019-04-17 19:24:45 +01002767 return;
2768
Will Deaconcdb8a3c2019-08-20 16:28:54 +01002769 arm_smmu_disable_ats(master);
2770
Jean-Philippe Brucker2a7e62f2019-04-17 19:24:46 +01002771 spin_lock_irqsave(&smmu_domain->devices_lock, flags);
2772 list_del(&master->domain_head);
2773 spin_unlock_irqrestore(&smmu_domain->devices_lock, flags);
2774
Jean-Philippe Brucker8be39a12019-04-17 19:24:45 +01002775 master->domain = NULL;
Will Deaconbfff88e2019-08-20 14:28:59 +01002776 master->ats_enabled = false;
Jean-Philippe Bruckerbcecaee2019-04-17 19:24:44 +01002777 arm_smmu_install_ste_for_dev(master);
Will Deaconbc7f2ce2016-02-17 17:41:57 +00002778}
2779
Will Deacon48ec83b2015-05-27 17:25:59 +01002780static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)
2781{
2782 int ret = 0;
Jean-Philippe Brucker2a7e62f2019-04-17 19:24:46 +01002783 unsigned long flags;
Joerg Roedel9b468f72018-11-29 14:01:00 +01002784 struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
Will Deacon48ec83b2015-05-27 17:25:59 +01002785 struct arm_smmu_device *smmu;
2786 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
Jean-Philippe Bruckerb54f4262019-04-17 19:24:43 +01002787 struct arm_smmu_master *master;
Will Deacon48ec83b2015-05-27 17:25:59 +01002788
Joerg Roedel9b468f72018-11-29 14:01:00 +01002789 if (!fwspec)
Will Deacon48ec83b2015-05-27 17:25:59 +01002790 return -ENOENT;
2791
Joerg Roedelb7a96622020-03-26 16:08:34 +01002792 master = dev_iommu_priv_get(dev);
Robin Murphy8f785152016-09-12 17:13:45 +01002793 smmu = master->smmu;
Robin Murphy8f785152016-09-12 17:13:45 +01002794
Jean-Philippe Brucker8be39a12019-04-17 19:24:45 +01002795 arm_smmu_detach_dev(master);
Will Deacon48ec83b2015-05-27 17:25:59 +01002796
Will Deacon48ec83b2015-05-27 17:25:59 +01002797 mutex_lock(&smmu_domain->init_mutex);
2798
2799 if (!smmu_domain->smmu) {
2800 smmu_domain->smmu = smmu;
Jean-Philippe Brucker2505ec62020-01-15 13:52:34 +01002801 ret = arm_smmu_domain_finalise(domain, master);
Will Deacon48ec83b2015-05-27 17:25:59 +01002802 if (ret) {
2803 smmu_domain->smmu = NULL;
2804 goto out_unlock;
2805 }
2806 } else if (smmu_domain->smmu != smmu) {
2807 dev_err(dev,
2808 "cannot attach to SMMU %s (upstream of %s)\n",
2809 dev_name(smmu_domain->smmu->dev),
2810 dev_name(smmu->dev));
2811 ret = -ENXIO;
2812 goto out_unlock;
Jean-Philippe Brucker2505ec62020-01-15 13:52:34 +01002813 } else if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1 &&
2814 master->ssid_bits != smmu_domain->s1_cfg.s1cdmax) {
2815 dev_err(dev,
2816 "cannot attach to incompatible domain (%u SSID bits != %u)\n",
2817 smmu_domain->s1_cfg.s1cdmax, master->ssid_bits);
2818 ret = -EINVAL;
2819 goto out_unlock;
Will Deacon48ec83b2015-05-27 17:25:59 +01002820 }
2821
Jean-Philippe Brucker8be39a12019-04-17 19:24:45 +01002822 master->domain = smmu_domain;
Will Deacon48ec83b2015-05-27 17:25:59 +01002823
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002824 if (smmu_domain->stage != ARM_SMMU_DOMAIN_BYPASS)
Will Deaconbfff88e2019-08-20 14:28:59 +01002825 master->ats_enabled = arm_smmu_ats_supported(master);
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002826
Jean-Philippe Bruckerbcecaee2019-04-17 19:24:44 +01002827 arm_smmu_install_ste_for_dev(master);
Will Deaconcdb8a3c2019-08-20 16:28:54 +01002828
2829 spin_lock_irqsave(&smmu_domain->devices_lock, flags);
2830 list_add(&master->domain_head, &smmu_domain->devices);
2831 spin_unlock_irqrestore(&smmu_domain->devices_lock, flags);
2832
Will Deaconbfff88e2019-08-20 14:28:59 +01002833 arm_smmu_enable_ats(master);
Will Deaconcdb8a3c2019-08-20 16:28:54 +01002834
Will Deacon48ec83b2015-05-27 17:25:59 +01002835out_unlock:
2836 mutex_unlock(&smmu_domain->init_mutex);
2837 return ret;
2838}
2839
Will Deacon48ec83b2015-05-27 17:25:59 +01002840static int arm_smmu_map(struct iommu_domain *domain, unsigned long iova,
Tom Murphy781ca2d2019-09-08 09:56:38 -07002841 phys_addr_t paddr, size_t size, int prot, gfp_t gfp)
Will Deacon48ec83b2015-05-27 17:25:59 +01002842{
Robin Murphy58188af2017-06-22 16:53:57 +01002843 struct io_pgtable_ops *ops = to_smmu_domain(domain)->pgtbl_ops;
Will Deacon48ec83b2015-05-27 17:25:59 +01002844
2845 if (!ops)
2846 return -ENODEV;
2847
Robin Murphy58188af2017-06-22 16:53:57 +01002848 return ops->map(ops, iova, paddr, size, prot);
Will Deacon48ec83b2015-05-27 17:25:59 +01002849}
2850
Will Deacon56f8af52019-07-02 16:44:06 +01002851static size_t arm_smmu_unmap(struct iommu_domain *domain, unsigned long iova,
2852 size_t size, struct iommu_iotlb_gather *gather)
Will Deacon48ec83b2015-05-27 17:25:59 +01002853{
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01002854 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
2855 struct io_pgtable_ops *ops = smmu_domain->pgtbl_ops;
Will Deacon48ec83b2015-05-27 17:25:59 +01002856
2857 if (!ops)
2858 return 0;
2859
Will Deacon353e3cf2019-08-20 15:12:12 +01002860 return ops->unmap(ops, iova, size, gather);
Will Deacon48ec83b2015-05-27 17:25:59 +01002861}
2862
Zhen Lei07fdef32018-09-20 17:10:21 +01002863static void arm_smmu_flush_iotlb_all(struct iommu_domain *domain)
2864{
2865 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
2866
2867 if (smmu_domain->smmu)
2868 arm_smmu_tlb_inv_context(smmu_domain);
2869}
2870
Will Deacon56f8af52019-07-02 16:44:06 +01002871static void arm_smmu_iotlb_sync(struct iommu_domain *domain,
2872 struct iommu_iotlb_gather *gather)
Robin Murphy32b12442017-09-28 15:55:01 +01002873{
Will Deacon2af2e722019-07-02 17:16:33 +01002874 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
Robin Murphy32b12442017-09-28 15:55:01 +01002875
Will Deacon2af2e722019-07-02 17:16:33 +01002876 arm_smmu_tlb_inv_range(gather->start, gather->end - gather->start,
2877 gather->pgsize, true, smmu_domain);
Robin Murphy32b12442017-09-28 15:55:01 +01002878}
2879
Will Deacon48ec83b2015-05-27 17:25:59 +01002880static phys_addr_t
2881arm_smmu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova)
2882{
Robin Murphy58188af2017-06-22 16:53:57 +01002883 struct io_pgtable_ops *ops = to_smmu_domain(domain)->pgtbl_ops;
Will Deacon48ec83b2015-05-27 17:25:59 +01002884
Sunil Gouthambdf95922017-04-25 15:27:52 +05302885 if (domain->type == IOMMU_DOMAIN_IDENTITY)
2886 return iova;
2887
Will Deacon48ec83b2015-05-27 17:25:59 +01002888 if (!ops)
2889 return 0;
2890
Robin Murphy58188af2017-06-22 16:53:57 +01002891 return ops->iova_to_phys(ops, iova);
Will Deacon48ec83b2015-05-27 17:25:59 +01002892}
2893
Robin Murphy8f785152016-09-12 17:13:45 +01002894static struct platform_driver arm_smmu_driver;
2895
Lorenzo Pieralisi778de072016-11-21 10:01:38 +00002896static
2897struct arm_smmu_device *arm_smmu_get_by_fwnode(struct fwnode_handle *fwnode)
Will Deacon48ec83b2015-05-27 17:25:59 +01002898{
Suzuki K Poulose67843bb2019-07-23 23:18:34 +01002899 struct device *dev = driver_find_device_by_fwnode(&arm_smmu_driver.driver,
2900 fwnode);
Robin Murphy8f785152016-09-12 17:13:45 +01002901 put_device(dev);
2902 return dev ? dev_get_drvdata(dev) : NULL;
Will Deacon48ec83b2015-05-27 17:25:59 +01002903}
2904
2905static bool arm_smmu_sid_in_range(struct arm_smmu_device *smmu, u32 sid)
2906{
2907 unsigned long limit = smmu->strtab_cfg.num_l1_ents;
2908
2909 if (smmu->features & ARM_SMMU_FEAT_2_LVL_STRTAB)
2910 limit *= 1UL << STRTAB_SPLIT;
2911
2912 return sid < limit;
2913}
2914
Robin Murphy8f785152016-09-12 17:13:45 +01002915static struct iommu_ops arm_smmu_ops;
2916
Will Deacon48ec83b2015-05-27 17:25:59 +01002917static int arm_smmu_add_device(struct device *dev)
2918{
2919 int i, ret;
Will Deacon48ec83b2015-05-27 17:25:59 +01002920 struct arm_smmu_device *smmu;
Jean-Philippe Bruckerb54f4262019-04-17 19:24:43 +01002921 struct arm_smmu_master *master;
Joerg Roedel9b468f72018-11-29 14:01:00 +01002922 struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
Robin Murphy8f785152016-09-12 17:13:45 +01002923 struct iommu_group *group;
Will Deacon48ec83b2015-05-27 17:25:59 +01002924
Robin Murphy8f785152016-09-12 17:13:45 +01002925 if (!fwspec || fwspec->ops != &arm_smmu_ops)
Will Deacon48ec83b2015-05-27 17:25:59 +01002926 return -ENODEV;
Robin Murphy8f785152016-09-12 17:13:45 +01002927
Joerg Roedelb7a96622020-03-26 16:08:34 +01002928 if (WARN_ON_ONCE(dev_iommu_priv_get(dev)))
Will Deacon92c1d362020-01-15 15:35:16 +00002929 return -EBUSY;
2930
2931 smmu = arm_smmu_get_by_fwnode(fwspec->iommu_fwnode);
2932 if (!smmu)
2933 return -ENODEV;
2934
2935 master = kzalloc(sizeof(*master), GFP_KERNEL);
2936 if (!master)
2937 return -ENOMEM;
2938
2939 master->dev = dev;
2940 master->smmu = smmu;
2941 master->sids = fwspec->ids;
2942 master->num_sids = fwspec->num_ids;
Joerg Roedelb7a96622020-03-26 16:08:34 +01002943 dev_iommu_priv_set(dev, master);
Will Deacon48ec83b2015-05-27 17:25:59 +01002944
Robin Murphy8f785152016-09-12 17:13:45 +01002945 /* Check the SIDs are in range of the SMMU and our stream table */
Jean-Philippe Bruckerbcecaee2019-04-17 19:24:44 +01002946 for (i = 0; i < master->num_sids; i++) {
2947 u32 sid = master->sids[i];
Robin Murphy8f785152016-09-12 17:13:45 +01002948
Jean-Philippe Bruckera2be6212020-01-15 13:52:37 +01002949 if (!arm_smmu_sid_in_range(smmu, sid)) {
2950 ret = -ERANGE;
2951 goto err_free_master;
2952 }
Robin Murphy8f785152016-09-12 17:13:45 +01002953
2954 /* Ensure l2 strtab is initialised */
2955 if (smmu->features & ARM_SMMU_FEAT_2_LVL_STRTAB) {
2956 ret = arm_smmu_init_l2_strtab(smmu, sid);
2957 if (ret)
Jean-Philippe Bruckera2be6212020-01-15 13:52:37 +01002958 goto err_free_master;
Robin Murphy8f785152016-09-12 17:13:45 +01002959 }
Will Deacon48ec83b2015-05-27 17:25:59 +01002960 }
2961
Jean-Philippe Brucker89535822020-01-15 13:52:29 +01002962 master->ssid_bits = min(smmu->ssid_bits, fwspec->num_pasid_bits);
2963
Jean-Philippe Brucker058c59a2020-02-24 17:58:42 +01002964 /*
2965 * Note that PASID must be enabled before, and disabled after ATS:
2966 * PCI Express Base 4.0r1.0 - 10.5.1.3 ATS Control Register
2967 *
2968 * Behavior is undefined if this bit is Set and the value of the PASID
2969 * Enable, Execute Requested Enable, or Privileged Mode Requested bits
2970 * are changed.
2971 */
2972 arm_smmu_enable_pasid(master);
2973
Jean-Philippe Brucker89535822020-01-15 13:52:29 +01002974 if (!(smmu->features & ARM_SMMU_FEAT_2_LVL_CDTAB))
2975 master->ssid_bits = min_t(u8, master->ssid_bits,
2976 CTXDESC_LINEAR_CDMAX);
2977
Jean-Philippe Bruckera2be6212020-01-15 13:52:37 +01002978 ret = iommu_device_link(&smmu->iommu, dev);
2979 if (ret)
Jean-Philippe Brucker058c59a2020-02-24 17:58:42 +01002980 goto err_disable_pasid;
Jean-Philippe Bruckera2be6212020-01-15 13:52:37 +01002981
Robin Murphy8f785152016-09-12 17:13:45 +01002982 group = iommu_group_get_for_dev(dev);
Jean-Philippe Bruckera2be6212020-01-15 13:52:37 +01002983 if (IS_ERR(group)) {
2984 ret = PTR_ERR(group);
2985 goto err_unlink;
Joerg Roedel9648cbc2017-02-01 18:11:36 +01002986 }
Will Deacon48ec83b2015-05-27 17:25:59 +01002987
Jean-Philippe Bruckera2be6212020-01-15 13:52:37 +01002988 iommu_group_put(group);
2989 return 0;
2990
2991err_unlink:
2992 iommu_device_unlink(&smmu->iommu, dev);
Jean-Philippe Brucker058c59a2020-02-24 17:58:42 +01002993err_disable_pasid:
2994 arm_smmu_disable_pasid(master);
Jean-Philippe Bruckera2be6212020-01-15 13:52:37 +01002995err_free_master:
2996 kfree(master);
Joerg Roedelb7a96622020-03-26 16:08:34 +01002997 dev_iommu_priv_set(dev, NULL);
Jean-Philippe Bruckera2be6212020-01-15 13:52:37 +01002998 return ret;
Will Deacon48ec83b2015-05-27 17:25:59 +01002999}
3000
3001static void arm_smmu_remove_device(struct device *dev)
3002{
Joerg Roedel9b468f72018-11-29 14:01:00 +01003003 struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
Jean-Philippe Bruckerb54f4262019-04-17 19:24:43 +01003004 struct arm_smmu_master *master;
Joerg Roedel9648cbc2017-02-01 18:11:36 +01003005 struct arm_smmu_device *smmu;
Robin Murphy8f785152016-09-12 17:13:45 +01003006
3007 if (!fwspec || fwspec->ops != &arm_smmu_ops)
3008 return;
3009
Joerg Roedelb7a96622020-03-26 16:08:34 +01003010 master = dev_iommu_priv_get(dev);
Joerg Roedel9648cbc2017-02-01 18:11:36 +01003011 smmu = master->smmu;
Jean-Philippe Brucker8be39a12019-04-17 19:24:45 +01003012 arm_smmu_detach_dev(master);
Will Deacon48ec83b2015-05-27 17:25:59 +01003013 iommu_group_remove_device(dev);
Joerg Roedel9648cbc2017-02-01 18:11:36 +01003014 iommu_device_unlink(&smmu->iommu, dev);
Jean-Philippe Brucker058c59a2020-02-24 17:58:42 +01003015 arm_smmu_disable_pasid(master);
Robin Murphy8f785152016-09-12 17:13:45 +01003016 kfree(master);
3017 iommu_fwspec_free(dev);
Will Deacon48ec83b2015-05-27 17:25:59 +01003018}
3019
Robin Murphy08d4ca22016-09-12 17:13:46 +01003020static struct iommu_group *arm_smmu_device_group(struct device *dev)
3021{
3022 struct iommu_group *group;
3023
3024 /*
3025 * We don't support devices sharing stream IDs other than PCI RID
3026 * aliases, since the necessary ID-to-device lookup becomes rather
3027 * impractical given a potential sparse 32-bit stream ID space.
3028 */
3029 if (dev_is_pci(dev))
3030 group = pci_device_group(dev);
3031 else
3032 group = generic_device_group(dev);
3033
3034 return group;
3035}
3036
Will Deacon48ec83b2015-05-27 17:25:59 +01003037static int arm_smmu_domain_get_attr(struct iommu_domain *domain,
3038 enum iommu_attr attr, void *data)
3039{
3040 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
3041
Zhen Lei9662b992018-09-20 17:10:25 +01003042 switch (domain->type) {
3043 case IOMMU_DOMAIN_UNMANAGED:
3044 switch (attr) {
3045 case DOMAIN_ATTR_NESTING:
3046 *(int *)data = (smmu_domain->stage == ARM_SMMU_DOMAIN_NESTED);
3047 return 0;
3048 default:
3049 return -ENODEV;
3050 }
3051 break;
3052 case IOMMU_DOMAIN_DMA:
3053 switch (attr) {
3054 case DOMAIN_ATTR_DMA_USE_FLUSH_QUEUE:
3055 *(int *)data = smmu_domain->non_strict;
3056 return 0;
3057 default:
3058 return -ENODEV;
3059 }
3060 break;
Will Deacon48ec83b2015-05-27 17:25:59 +01003061 default:
Zhen Lei9662b992018-09-20 17:10:25 +01003062 return -EINVAL;
Will Deacon48ec83b2015-05-27 17:25:59 +01003063 }
3064}
3065
3066static int arm_smmu_domain_set_attr(struct iommu_domain *domain,
3067 enum iommu_attr attr, void *data)
3068{
3069 int ret = 0;
3070 struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
3071
3072 mutex_lock(&smmu_domain->init_mutex);
3073
Zhen Lei9662b992018-09-20 17:10:25 +01003074 switch (domain->type) {
3075 case IOMMU_DOMAIN_UNMANAGED:
3076 switch (attr) {
3077 case DOMAIN_ATTR_NESTING:
3078 if (smmu_domain->smmu) {
3079 ret = -EPERM;
3080 goto out_unlock;
3081 }
3082
3083 if (*(int *)data)
3084 smmu_domain->stage = ARM_SMMU_DOMAIN_NESTED;
3085 else
3086 smmu_domain->stage = ARM_SMMU_DOMAIN_S1;
3087 break;
3088 default:
3089 ret = -ENODEV;
Will Deacon48ec83b2015-05-27 17:25:59 +01003090 }
Zhen Lei9662b992018-09-20 17:10:25 +01003091 break;
3092 case IOMMU_DOMAIN_DMA:
3093 switch(attr) {
3094 case DOMAIN_ATTR_DMA_USE_FLUSH_QUEUE:
3095 smmu_domain->non_strict = *(int *)data;
3096 break;
3097 default:
3098 ret = -ENODEV;
3099 }
Will Deacon48ec83b2015-05-27 17:25:59 +01003100 break;
3101 default:
Zhen Lei9662b992018-09-20 17:10:25 +01003102 ret = -EINVAL;
Will Deacon48ec83b2015-05-27 17:25:59 +01003103 }
3104
3105out_unlock:
3106 mutex_unlock(&smmu_domain->init_mutex);
3107 return ret;
3108}
3109
Robin Murphy8f785152016-09-12 17:13:45 +01003110static int arm_smmu_of_xlate(struct device *dev, struct of_phandle_args *args)
3111{
Robin Murphy8f785152016-09-12 17:13:45 +01003112 return iommu_fwspec_add_ids(dev, args->args, 1);
3113}
3114
Eric Auger50019f02017-01-19 20:57:56 +00003115static void arm_smmu_get_resv_regions(struct device *dev,
3116 struct list_head *head)
3117{
3118 struct iommu_resv_region *region;
3119 int prot = IOMMU_WRITE | IOMMU_NOEXEC | IOMMU_MMIO;
3120
3121 region = iommu_alloc_resv_region(MSI_IOVA_BASE, MSI_IOVA_LENGTH,
Robin Murphy9d3a4de2017-03-16 17:00:16 +00003122 prot, IOMMU_RESV_SW_MSI);
Eric Auger50019f02017-01-19 20:57:56 +00003123 if (!region)
3124 return;
3125
3126 list_add_tail(&region->list, head);
Robin Murphy273df962017-03-16 17:00:19 +00003127
3128 iommu_dma_get_resv_regions(dev, head);
Eric Auger50019f02017-01-19 20:57:56 +00003129}
3130
Will Deacon48ec83b2015-05-27 17:25:59 +01003131static struct iommu_ops arm_smmu_ops = {
3132 .capable = arm_smmu_capable,
3133 .domain_alloc = arm_smmu_domain_alloc,
3134 .domain_free = arm_smmu_domain_free,
3135 .attach_dev = arm_smmu_attach_dev,
Will Deacon48ec83b2015-05-27 17:25:59 +01003136 .map = arm_smmu_map,
3137 .unmap = arm_smmu_unmap,
Zhen Lei07fdef32018-09-20 17:10:21 +01003138 .flush_iotlb_all = arm_smmu_flush_iotlb_all,
Robin Murphy32b12442017-09-28 15:55:01 +01003139 .iotlb_sync = arm_smmu_iotlb_sync,
Will Deacon48ec83b2015-05-27 17:25:59 +01003140 .iova_to_phys = arm_smmu_iova_to_phys,
3141 .add_device = arm_smmu_add_device,
3142 .remove_device = arm_smmu_remove_device,
Robin Murphy08d4ca22016-09-12 17:13:46 +01003143 .device_group = arm_smmu_device_group,
Will Deacon48ec83b2015-05-27 17:25:59 +01003144 .domain_get_attr = arm_smmu_domain_get_attr,
3145 .domain_set_attr = arm_smmu_domain_set_attr,
Robin Murphy8f785152016-09-12 17:13:45 +01003146 .of_xlate = arm_smmu_of_xlate,
Eric Auger50019f02017-01-19 20:57:56 +00003147 .get_resv_regions = arm_smmu_get_resv_regions,
Thierry Redinga66c5dc2019-12-18 14:42:02 +01003148 .put_resv_regions = generic_iommu_put_resv_regions,
Will Deacon48ec83b2015-05-27 17:25:59 +01003149 .pgsize_bitmap = -1UL, /* Restricted during device attach */
3150};
3151
3152/* Probing and initialisation functions */
3153static int arm_smmu_init_one_queue(struct arm_smmu_device *smmu,
3154 struct arm_smmu_queue *q,
3155 unsigned long prod_off,
3156 unsigned long cons_off,
Will Deacond25f6ea2019-05-16 16:08:47 +01003157 size_t dwords, const char *name)
Will Deacon48ec83b2015-05-27 17:25:59 +01003158{
Will Deacond25f6ea2019-05-16 16:08:47 +01003159 size_t qsz;
Will Deacon48ec83b2015-05-27 17:25:59 +01003160
Will Deacond25f6ea2019-05-16 16:08:47 +01003161 do {
Will Deacon52be8632019-07-02 17:16:08 +01003162 qsz = ((1 << q->llq.max_n_shift) * dwords) << 3;
Will Deacond25f6ea2019-05-16 16:08:47 +01003163 q->base = dmam_alloc_coherent(smmu->dev, qsz, &q->base_dma,
3164 GFP_KERNEL);
3165 if (q->base || qsz < PAGE_SIZE)
3166 break;
3167
Will Deacon52be8632019-07-02 17:16:08 +01003168 q->llq.max_n_shift--;
Will Deacond25f6ea2019-05-16 16:08:47 +01003169 } while (1);
3170
Will Deacon48ec83b2015-05-27 17:25:59 +01003171 if (!q->base) {
Will Deacond25f6ea2019-05-16 16:08:47 +01003172 dev_err(smmu->dev,
3173 "failed to allocate queue (0x%zx bytes) for %s\n",
3174 qsz, name);
Will Deacon48ec83b2015-05-27 17:25:59 +01003175 return -ENOMEM;
3176 }
3177
Will Deacond25f6ea2019-05-16 16:08:47 +01003178 if (!WARN_ON(q->base_dma & (qsz - 1))) {
3179 dev_info(smmu->dev, "allocated %u entries for %s\n",
Will Deacon52be8632019-07-02 17:16:08 +01003180 1 << q->llq.max_n_shift, name);
Will Deacond25f6ea2019-05-16 16:08:47 +01003181 }
3182
Linu Cheriane5b829d2017-06-22 17:35:37 +05303183 q->prod_reg = arm_smmu_page1_fixup(prod_off, smmu);
3184 q->cons_reg = arm_smmu_page1_fixup(cons_off, smmu);
Will Deacon48ec83b2015-05-27 17:25:59 +01003185 q->ent_dwords = dwords;
3186
3187 q->q_base = Q_BASE_RWA;
Robin Murphy1cf9e542018-03-26 13:35:09 +01003188 q->q_base |= q->base_dma & Q_BASE_ADDR_MASK;
Will Deacon52be8632019-07-02 17:16:08 +01003189 q->q_base |= FIELD_PREP(Q_BASE_LOG2SIZE, q->llq.max_n_shift);
Will Deacon48ec83b2015-05-27 17:25:59 +01003190
Will Deacon52be8632019-07-02 17:16:08 +01003191 q->llq.prod = q->llq.cons = 0;
Will Deacon48ec83b2015-05-27 17:25:59 +01003192 return 0;
3193}
3194
Will Deacon587e6c12019-07-02 17:16:25 +01003195static void arm_smmu_cmdq_free_bitmap(void *data)
3196{
3197 unsigned long *bitmap = data;
3198 bitmap_free(bitmap);
3199}
3200
3201static int arm_smmu_cmdq_init(struct arm_smmu_device *smmu)
3202{
3203 int ret = 0;
3204 struct arm_smmu_cmdq *cmdq = &smmu->cmdq;
3205 unsigned int nents = 1 << cmdq->q.llq.max_n_shift;
3206 atomic_long_t *bitmap;
3207
3208 atomic_set(&cmdq->owner_prod, 0);
3209 atomic_set(&cmdq->lock, 0);
3210
3211 bitmap = (atomic_long_t *)bitmap_zalloc(nents, GFP_KERNEL);
3212 if (!bitmap) {
3213 dev_err(smmu->dev, "failed to allocate cmdq bitmap\n");
3214 ret = -ENOMEM;
3215 } else {
3216 cmdq->valid_map = bitmap;
3217 devm_add_action(smmu->dev, arm_smmu_cmdq_free_bitmap, bitmap);
3218 }
3219
3220 return ret;
3221}
3222
Will Deacon48ec83b2015-05-27 17:25:59 +01003223static int arm_smmu_init_queues(struct arm_smmu_device *smmu)
3224{
3225 int ret;
3226
3227 /* cmdq */
Will Deacon48ec83b2015-05-27 17:25:59 +01003228 ret = arm_smmu_init_one_queue(smmu, &smmu->cmdq.q, ARM_SMMU_CMDQ_PROD,
Will Deacond25f6ea2019-05-16 16:08:47 +01003229 ARM_SMMU_CMDQ_CONS, CMDQ_ENT_DWORDS,
3230 "cmdq");
Will Deacon48ec83b2015-05-27 17:25:59 +01003231 if (ret)
Will Deacon04fa26c2015-10-30 18:12:41 +00003232 return ret;
Will Deacon48ec83b2015-05-27 17:25:59 +01003233
Will Deacon587e6c12019-07-02 17:16:25 +01003234 ret = arm_smmu_cmdq_init(smmu);
3235 if (ret)
3236 return ret;
3237
Will Deacon48ec83b2015-05-27 17:25:59 +01003238 /* evtq */
3239 ret = arm_smmu_init_one_queue(smmu, &smmu->evtq.q, ARM_SMMU_EVTQ_PROD,
Will Deacond25f6ea2019-05-16 16:08:47 +01003240 ARM_SMMU_EVTQ_CONS, EVTQ_ENT_DWORDS,
3241 "evtq");
Will Deacon48ec83b2015-05-27 17:25:59 +01003242 if (ret)
Will Deacon04fa26c2015-10-30 18:12:41 +00003243 return ret;
Will Deacon48ec83b2015-05-27 17:25:59 +01003244
3245 /* priq */
3246 if (!(smmu->features & ARM_SMMU_FEAT_PRI))
3247 return 0;
3248
Will Deacon04fa26c2015-10-30 18:12:41 +00003249 return arm_smmu_init_one_queue(smmu, &smmu->priq.q, ARM_SMMU_PRIQ_PROD,
Will Deacond25f6ea2019-05-16 16:08:47 +01003250 ARM_SMMU_PRIQ_CONS, PRIQ_ENT_DWORDS,
3251 "priq");
Will Deacon48ec83b2015-05-27 17:25:59 +01003252}
3253
3254static int arm_smmu_init_l1_strtab(struct arm_smmu_device *smmu)
3255{
3256 unsigned int i;
3257 struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg;
3258 size_t size = sizeof(*cfg->l1_desc) * cfg->num_l1_ents;
3259 void *strtab = smmu->strtab_cfg.strtab;
3260
3261 cfg->l1_desc = devm_kzalloc(smmu->dev, size, GFP_KERNEL);
3262 if (!cfg->l1_desc) {
3263 dev_err(smmu->dev, "failed to allocate l1 stream table desc\n");
3264 return -ENOMEM;
3265 }
3266
3267 for (i = 0; i < cfg->num_l1_ents; ++i) {
3268 arm_smmu_write_strtab_l1_desc(strtab, &cfg->l1_desc[i]);
3269 strtab += STRTAB_L1_DESC_DWORDS << 3;
3270 }
3271
3272 return 0;
3273}
3274
3275static int arm_smmu_init_strtab_2lvl(struct arm_smmu_device *smmu)
3276{
3277 void *strtab;
3278 u64 reg;
Will Deacond2e88e72015-06-30 10:02:28 +01003279 u32 size, l1size;
Will Deacon48ec83b2015-05-27 17:25:59 +01003280 struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg;
3281
Nate Watterson692c4e42017-01-10 14:47:13 -05003282 /* Calculate the L1 size, capped to the SIDSIZE. */
3283 size = STRTAB_L1_SZ_SHIFT - (ilog2(STRTAB_L1_DESC_DWORDS) + 3);
3284 size = min(size, smmu->sid_bits - STRTAB_SPLIT);
Will Deacond2e88e72015-06-30 10:02:28 +01003285 cfg->num_l1_ents = 1 << size;
3286
3287 size += STRTAB_SPLIT;
3288 if (size < smmu->sid_bits)
Will Deacon48ec83b2015-05-27 17:25:59 +01003289 dev_warn(smmu->dev,
3290 "2-level strtab only covers %u/%u bits of SID\n",
Will Deacond2e88e72015-06-30 10:02:28 +01003291 size, smmu->sid_bits);
Will Deacon48ec83b2015-05-27 17:25:59 +01003292
Will Deacond2e88e72015-06-30 10:02:28 +01003293 l1size = cfg->num_l1_ents * (STRTAB_L1_DESC_DWORDS << 3);
Will Deacon04fa26c2015-10-30 18:12:41 +00003294 strtab = dmam_alloc_coherent(smmu->dev, l1size, &cfg->strtab_dma,
Jean-Philippe Brucker9bb90692020-01-15 13:52:27 +01003295 GFP_KERNEL);
Will Deacon48ec83b2015-05-27 17:25:59 +01003296 if (!strtab) {
3297 dev_err(smmu->dev,
3298 "failed to allocate l1 stream table (%u bytes)\n",
3299 size);
3300 return -ENOMEM;
3301 }
3302 cfg->strtab = strtab;
3303
3304 /* Configure strtab_base_cfg for 2 levels */
Robin Murphycbcee192018-03-26 13:35:10 +01003305 reg = FIELD_PREP(STRTAB_BASE_CFG_FMT, STRTAB_BASE_CFG_FMT_2LVL);
3306 reg |= FIELD_PREP(STRTAB_BASE_CFG_LOG2SIZE, size);
3307 reg |= FIELD_PREP(STRTAB_BASE_CFG_SPLIT, STRTAB_SPLIT);
Will Deacon48ec83b2015-05-27 17:25:59 +01003308 cfg->strtab_base_cfg = reg;
3309
Will Deacon04fa26c2015-10-30 18:12:41 +00003310 return arm_smmu_init_l1_strtab(smmu);
Will Deacon48ec83b2015-05-27 17:25:59 +01003311}
3312
3313static int arm_smmu_init_strtab_linear(struct arm_smmu_device *smmu)
3314{
3315 void *strtab;
3316 u64 reg;
3317 u32 size;
3318 struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg;
3319
3320 size = (1 << smmu->sid_bits) * (STRTAB_STE_DWORDS << 3);
Will Deacon04fa26c2015-10-30 18:12:41 +00003321 strtab = dmam_alloc_coherent(smmu->dev, size, &cfg->strtab_dma,
Jean-Philippe Brucker9bb90692020-01-15 13:52:27 +01003322 GFP_KERNEL);
Will Deacon48ec83b2015-05-27 17:25:59 +01003323 if (!strtab) {
3324 dev_err(smmu->dev,
3325 "failed to allocate linear stream table (%u bytes)\n",
3326 size);
3327 return -ENOMEM;
3328 }
3329 cfg->strtab = strtab;
3330 cfg->num_l1_ents = 1 << smmu->sid_bits;
3331
3332 /* Configure strtab_base_cfg for a linear table covering all SIDs */
Robin Murphycbcee192018-03-26 13:35:10 +01003333 reg = FIELD_PREP(STRTAB_BASE_CFG_FMT, STRTAB_BASE_CFG_FMT_LINEAR);
3334 reg |= FIELD_PREP(STRTAB_BASE_CFG_LOG2SIZE, smmu->sid_bits);
Will Deacon48ec83b2015-05-27 17:25:59 +01003335 cfg->strtab_base_cfg = reg;
3336
3337 arm_smmu_init_bypass_stes(strtab, cfg->num_l1_ents);
3338 return 0;
3339}
3340
3341static int arm_smmu_init_strtab(struct arm_smmu_device *smmu)
3342{
3343 u64 reg;
3344 int ret;
3345
3346 if (smmu->features & ARM_SMMU_FEAT_2_LVL_STRTAB)
3347 ret = arm_smmu_init_strtab_2lvl(smmu);
3348 else
3349 ret = arm_smmu_init_strtab_linear(smmu);
3350
3351 if (ret)
3352 return ret;
3353
3354 /* Set the strtab base address */
Robin Murphy1cf9e542018-03-26 13:35:09 +01003355 reg = smmu->strtab_cfg.strtab_dma & STRTAB_BASE_ADDR_MASK;
Will Deacon48ec83b2015-05-27 17:25:59 +01003356 reg |= STRTAB_BASE_RA;
3357 smmu->strtab_cfg.strtab_base = reg;
3358
3359 /* Allocate the first VMID for stage-2 bypass STEs */
3360 set_bit(0, smmu->vmid_map);
3361 return 0;
3362}
3363
Will Deacon48ec83b2015-05-27 17:25:59 +01003364static int arm_smmu_init_structures(struct arm_smmu_device *smmu)
3365{
3366 int ret;
3367
3368 ret = arm_smmu_init_queues(smmu);
3369 if (ret)
3370 return ret;
3371
Will Deacon04fa26c2015-10-30 18:12:41 +00003372 return arm_smmu_init_strtab(smmu);
Will Deacon48ec83b2015-05-27 17:25:59 +01003373}
3374
3375static int arm_smmu_write_reg_sync(struct arm_smmu_device *smmu, u32 val,
3376 unsigned int reg_off, unsigned int ack_off)
3377{
3378 u32 reg;
3379
3380 writel_relaxed(val, smmu->base + reg_off);
3381 return readl_relaxed_poll_timeout(smmu->base + ack_off, reg, reg == val,
3382 1, ARM_SMMU_POLL_TIMEOUT_US);
3383}
3384
Robin Murphydc87a982016-09-12 17:13:44 +01003385/* GBPA is "special" */
3386static int arm_smmu_update_gbpa(struct arm_smmu_device *smmu, u32 set, u32 clr)
3387{
3388 int ret;
3389 u32 reg, __iomem *gbpa = smmu->base + ARM_SMMU_GBPA;
3390
3391 ret = readl_relaxed_poll_timeout(gbpa, reg, !(reg & GBPA_UPDATE),
3392 1, ARM_SMMU_POLL_TIMEOUT_US);
3393 if (ret)
3394 return ret;
3395
3396 reg &= ~clr;
3397 reg |= set;
3398 writel_relaxed(reg | GBPA_UPDATE, gbpa);
Will Deaconb63b3432018-07-25 15:58:43 +01003399 ret = readl_relaxed_poll_timeout(gbpa, reg, !(reg & GBPA_UPDATE),
3400 1, ARM_SMMU_POLL_TIMEOUT_US);
3401
3402 if (ret)
3403 dev_err(smmu->dev, "GBPA not responding to update\n");
3404 return ret;
Robin Murphydc87a982016-09-12 17:13:44 +01003405}
3406
Marc Zyngier166bdbd2015-10-13 18:32:30 +01003407static void arm_smmu_free_msis(void *data)
3408{
3409 struct device *dev = data;
3410 platform_msi_domain_free_irqs(dev);
3411}
3412
3413static void arm_smmu_write_msi_msg(struct msi_desc *desc, struct msi_msg *msg)
3414{
3415 phys_addr_t doorbell;
3416 struct device *dev = msi_desc_to_dev(desc);
3417 struct arm_smmu_device *smmu = dev_get_drvdata(dev);
3418 phys_addr_t *cfg = arm_smmu_msi_cfg[desc->platform.msi_index];
3419
3420 doorbell = (((u64)msg->address_hi) << 32) | msg->address_lo;
Robin Murphy1cf9e542018-03-26 13:35:09 +01003421 doorbell &= MSI_CFG0_ADDR_MASK;
Marc Zyngier166bdbd2015-10-13 18:32:30 +01003422
3423 writeq_relaxed(doorbell, smmu->base + cfg[0]);
3424 writel_relaxed(msg->data, smmu->base + cfg[1]);
Robin Murphycbcee192018-03-26 13:35:10 +01003425 writel_relaxed(ARM_SMMU_MEMATTR_DEVICE_nGnRE, smmu->base + cfg[2]);
Marc Zyngier166bdbd2015-10-13 18:32:30 +01003426}
3427
3428static void arm_smmu_setup_msis(struct arm_smmu_device *smmu)
3429{
3430 struct msi_desc *desc;
3431 int ret, nvec = ARM_SMMU_MAX_MSIS;
3432 struct device *dev = smmu->dev;
3433
3434 /* Clear the MSI address regs */
3435 writeq_relaxed(0, smmu->base + ARM_SMMU_GERROR_IRQ_CFG0);
3436 writeq_relaxed(0, smmu->base + ARM_SMMU_EVTQ_IRQ_CFG0);
3437
3438 if (smmu->features & ARM_SMMU_FEAT_PRI)
3439 writeq_relaxed(0, smmu->base + ARM_SMMU_PRIQ_IRQ_CFG0);
3440 else
3441 nvec--;
3442
3443 if (!(smmu->features & ARM_SMMU_FEAT_MSI))
3444 return;
3445
Nate Watterson940ded92018-01-20 13:08:04 -05003446 if (!dev->msi_domain) {
3447 dev_info(smmu->dev, "msi_domain absent - falling back to wired irqs\n");
3448 return;
3449 }
3450
Marc Zyngier166bdbd2015-10-13 18:32:30 +01003451 /* Allocate MSIs for evtq, gerror and priq. Ignore cmdq */
3452 ret = platform_msi_domain_alloc_irqs(dev, nvec, arm_smmu_write_msi_msg);
3453 if (ret) {
Nate Watterson940ded92018-01-20 13:08:04 -05003454 dev_warn(dev, "failed to allocate MSIs - falling back to wired irqs\n");
Marc Zyngier166bdbd2015-10-13 18:32:30 +01003455 return;
3456 }
3457
3458 for_each_msi_entry(desc, dev) {
3459 switch (desc->platform.msi_index) {
3460 case EVTQ_MSI_INDEX:
3461 smmu->evtq.q.irq = desc->irq;
3462 break;
3463 case GERROR_MSI_INDEX:
3464 smmu->gerr_irq = desc->irq;
3465 break;
3466 case PRIQ_MSI_INDEX:
3467 smmu->priq.q.irq = desc->irq;
3468 break;
3469 default: /* Unknown */
3470 continue;
3471 }
3472 }
3473
3474 /* Add callback to free MSIs on teardown */
3475 devm_add_action(dev, arm_smmu_free_msis, dev);
3476}
3477
Geetha Sowjanyaf9354482017-06-23 19:04:36 +05303478static void arm_smmu_setup_unique_irqs(struct arm_smmu_device *smmu)
Will Deacon48ec83b2015-05-27 17:25:59 +01003479{
Geetha Sowjanyaf9354482017-06-23 19:04:36 +05303480 int irq, ret;
Will Deacon48ec83b2015-05-27 17:25:59 +01003481
Marc Zyngier166bdbd2015-10-13 18:32:30 +01003482 arm_smmu_setup_msis(smmu);
Will Deacon48ec83b2015-05-27 17:25:59 +01003483
Marc Zyngier166bdbd2015-10-13 18:32:30 +01003484 /* Request interrupt lines */
Will Deacon48ec83b2015-05-27 17:25:59 +01003485 irq = smmu->evtq.q.irq;
3486 if (irq) {
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01003487 ret = devm_request_threaded_irq(smmu->dev, irq, NULL,
Will Deacon48ec83b2015-05-27 17:25:59 +01003488 arm_smmu_evtq_thread,
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01003489 IRQF_ONESHOT,
3490 "arm-smmu-v3-evtq", smmu);
Arnd Bergmann287980e2016-05-27 23:23:25 +02003491 if (ret < 0)
Will Deacon48ec83b2015-05-27 17:25:59 +01003492 dev_warn(smmu->dev, "failed to enable evtq irq\n");
Robin Murphy4c8996d2017-10-30 12:14:02 +00003493 } else {
3494 dev_warn(smmu->dev, "no evtq irq - events will not be reported!\n");
Will Deacon48ec83b2015-05-27 17:25:59 +01003495 }
3496
Will Deacon48ec83b2015-05-27 17:25:59 +01003497 irq = smmu->gerr_irq;
3498 if (irq) {
3499 ret = devm_request_irq(smmu->dev, irq, arm_smmu_gerror_handler,
3500 0, "arm-smmu-v3-gerror", smmu);
Arnd Bergmann287980e2016-05-27 23:23:25 +02003501 if (ret < 0)
Will Deacon48ec83b2015-05-27 17:25:59 +01003502 dev_warn(smmu->dev, "failed to enable gerror irq\n");
Robin Murphy4c8996d2017-10-30 12:14:02 +00003503 } else {
3504 dev_warn(smmu->dev, "no gerr irq - errors will not be reported!\n");
Will Deacon48ec83b2015-05-27 17:25:59 +01003505 }
3506
3507 if (smmu->features & ARM_SMMU_FEAT_PRI) {
Will Deacon48ec83b2015-05-27 17:25:59 +01003508 irq = smmu->priq.q.irq;
3509 if (irq) {
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01003510 ret = devm_request_threaded_irq(smmu->dev, irq, NULL,
Will Deacon48ec83b2015-05-27 17:25:59 +01003511 arm_smmu_priq_thread,
Jean-Philippe Bruckerb4163fb2016-08-22 14:42:24 +01003512 IRQF_ONESHOT,
3513 "arm-smmu-v3-priq",
Will Deacon48ec83b2015-05-27 17:25:59 +01003514 smmu);
Arnd Bergmann287980e2016-05-27 23:23:25 +02003515 if (ret < 0)
Will Deacon48ec83b2015-05-27 17:25:59 +01003516 dev_warn(smmu->dev,
3517 "failed to enable priq irq\n");
Robin Murphy4c8996d2017-10-30 12:14:02 +00003518 } else {
3519 dev_warn(smmu->dev, "no priq irq - PRI will be broken\n");
Will Deacon48ec83b2015-05-27 17:25:59 +01003520 }
3521 }
Geetha Sowjanyaf9354482017-06-23 19:04:36 +05303522}
3523
3524static int arm_smmu_setup_irqs(struct arm_smmu_device *smmu)
3525{
3526 int ret, irq;
3527 u32 irqen_flags = IRQ_CTRL_EVTQ_IRQEN | IRQ_CTRL_GERROR_IRQEN;
3528
3529 /* Disable IRQs first */
3530 ret = arm_smmu_write_reg_sync(smmu, 0, ARM_SMMU_IRQ_CTRL,
3531 ARM_SMMU_IRQ_CTRLACK);
3532 if (ret) {
3533 dev_err(smmu->dev, "failed to disable irqs\n");
3534 return ret;
3535 }
3536
3537 irq = smmu->combined_irq;
3538 if (irq) {
3539 /*
John Garry657135f2018-08-17 23:42:22 +08003540 * Cavium ThunderX2 implementation doesn't support unique irq
3541 * lines. Use a single irq line for all the SMMUv3 interrupts.
Geetha Sowjanyaf9354482017-06-23 19:04:36 +05303542 */
3543 ret = devm_request_threaded_irq(smmu->dev, irq,
3544 arm_smmu_combined_irq_handler,
3545 arm_smmu_combined_irq_thread,
3546 IRQF_ONESHOT,
3547 "arm-smmu-v3-combined-irq", smmu);
3548 if (ret < 0)
3549 dev_warn(smmu->dev, "failed to enable combined irq\n");
3550 } else
3551 arm_smmu_setup_unique_irqs(smmu);
3552
3553 if (smmu->features & ARM_SMMU_FEAT_PRI)
3554 irqen_flags |= IRQ_CTRL_PRIQ_IRQEN;
Will Deacon48ec83b2015-05-27 17:25:59 +01003555
3556 /* Enable interrupt generation on the SMMU */
Marc Zyngierccd63852015-07-15 11:55:18 +01003557 ret = arm_smmu_write_reg_sync(smmu, irqen_flags,
Will Deacon48ec83b2015-05-27 17:25:59 +01003558 ARM_SMMU_IRQ_CTRL, ARM_SMMU_IRQ_CTRLACK);
3559 if (ret)
3560 dev_warn(smmu->dev, "failed to enable irqs\n");
3561
3562 return 0;
3563}
3564
3565static int arm_smmu_device_disable(struct arm_smmu_device *smmu)
3566{
3567 int ret;
3568
3569 ret = arm_smmu_write_reg_sync(smmu, 0, ARM_SMMU_CR0, ARM_SMMU_CR0ACK);
3570 if (ret)
3571 dev_err(smmu->dev, "failed to clear cr0\n");
3572
3573 return ret;
3574}
3575
Robin Murphydc87a982016-09-12 17:13:44 +01003576static int arm_smmu_device_reset(struct arm_smmu_device *smmu, bool bypass)
Will Deacon48ec83b2015-05-27 17:25:59 +01003577{
3578 int ret;
3579 u32 reg, enables;
3580 struct arm_smmu_cmdq_ent cmd;
3581
3582 /* Clear CR0 and sync (disables SMMU and queue processing) */
3583 reg = readl_relaxed(smmu->base + ARM_SMMU_CR0);
Will Deaconb63b3432018-07-25 15:58:43 +01003584 if (reg & CR0_SMMUEN) {
Will Deacon48ec83b2015-05-27 17:25:59 +01003585 dev_warn(smmu->dev, "SMMU currently enabled! Resetting...\n");
Will Deacon3f54c442019-04-23 11:59:36 +01003586 WARN_ON(is_kdump_kernel() && !disable_bypass);
3587 arm_smmu_update_gbpa(smmu, GBPA_ABORT, 0);
Will Deaconb63b3432018-07-25 15:58:43 +01003588 }
Will Deacon48ec83b2015-05-27 17:25:59 +01003589
3590 ret = arm_smmu_device_disable(smmu);
3591 if (ret)
3592 return ret;
3593
3594 /* CR1 (table and queue memory attributes) */
Robin Murphycbcee192018-03-26 13:35:10 +01003595 reg = FIELD_PREP(CR1_TABLE_SH, ARM_SMMU_SH_ISH) |
3596 FIELD_PREP(CR1_TABLE_OC, CR1_CACHE_WB) |
3597 FIELD_PREP(CR1_TABLE_IC, CR1_CACHE_WB) |
3598 FIELD_PREP(CR1_QUEUE_SH, ARM_SMMU_SH_ISH) |
3599 FIELD_PREP(CR1_QUEUE_OC, CR1_CACHE_WB) |
3600 FIELD_PREP(CR1_QUEUE_IC, CR1_CACHE_WB);
Will Deacon48ec83b2015-05-27 17:25:59 +01003601 writel_relaxed(reg, smmu->base + ARM_SMMU_CR1);
3602
3603 /* CR2 (random crap) */
3604 reg = CR2_PTM | CR2_RECINVSID | CR2_E2H;
3605 writel_relaxed(reg, smmu->base + ARM_SMMU_CR2);
3606
3607 /* Stream table */
3608 writeq_relaxed(smmu->strtab_cfg.strtab_base,
3609 smmu->base + ARM_SMMU_STRTAB_BASE);
3610 writel_relaxed(smmu->strtab_cfg.strtab_base_cfg,
3611 smmu->base + ARM_SMMU_STRTAB_BASE_CFG);
3612
3613 /* Command queue */
3614 writeq_relaxed(smmu->cmdq.q.q_base, smmu->base + ARM_SMMU_CMDQ_BASE);
Will Deacon52be8632019-07-02 17:16:08 +01003615 writel_relaxed(smmu->cmdq.q.llq.prod, smmu->base + ARM_SMMU_CMDQ_PROD);
3616 writel_relaxed(smmu->cmdq.q.llq.cons, smmu->base + ARM_SMMU_CMDQ_CONS);
Will Deacon48ec83b2015-05-27 17:25:59 +01003617
3618 enables = CR0_CMDQEN;
3619 ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
3620 ARM_SMMU_CR0ACK);
3621 if (ret) {
3622 dev_err(smmu->dev, "failed to enable command queue\n");
3623 return ret;
3624 }
3625
3626 /* Invalidate any cached configuration */
3627 cmd.opcode = CMDQ_OP_CFGI_ALL;
3628 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
Robin Murphy2f657ad2017-08-31 14:44:25 +01003629 arm_smmu_cmdq_issue_sync(smmu);
Will Deacon48ec83b2015-05-27 17:25:59 +01003630
3631 /* Invalidate any stale TLB entries */
3632 if (smmu->features & ARM_SMMU_FEAT_HYP) {
3633 cmd.opcode = CMDQ_OP_TLBI_EL2_ALL;
3634 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
3635 }
3636
3637 cmd.opcode = CMDQ_OP_TLBI_NSNH_ALL;
3638 arm_smmu_cmdq_issue_cmd(smmu, &cmd);
Robin Murphy2f657ad2017-08-31 14:44:25 +01003639 arm_smmu_cmdq_issue_sync(smmu);
Will Deacon48ec83b2015-05-27 17:25:59 +01003640
3641 /* Event queue */
3642 writeq_relaxed(smmu->evtq.q.q_base, smmu->base + ARM_SMMU_EVTQ_BASE);
Will Deacon52be8632019-07-02 17:16:08 +01003643 writel_relaxed(smmu->evtq.q.llq.prod,
Linu Cheriane5b829d2017-06-22 17:35:37 +05303644 arm_smmu_page1_fixup(ARM_SMMU_EVTQ_PROD, smmu));
Will Deacon52be8632019-07-02 17:16:08 +01003645 writel_relaxed(smmu->evtq.q.llq.cons,
Linu Cheriane5b829d2017-06-22 17:35:37 +05303646 arm_smmu_page1_fixup(ARM_SMMU_EVTQ_CONS, smmu));
Will Deacon48ec83b2015-05-27 17:25:59 +01003647
3648 enables |= CR0_EVTQEN;
3649 ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
3650 ARM_SMMU_CR0ACK);
3651 if (ret) {
3652 dev_err(smmu->dev, "failed to enable event queue\n");
3653 return ret;
3654 }
3655
3656 /* PRI queue */
3657 if (smmu->features & ARM_SMMU_FEAT_PRI) {
3658 writeq_relaxed(smmu->priq.q.q_base,
3659 smmu->base + ARM_SMMU_PRIQ_BASE);
Will Deacon52be8632019-07-02 17:16:08 +01003660 writel_relaxed(smmu->priq.q.llq.prod,
Linu Cheriane5b829d2017-06-22 17:35:37 +05303661 arm_smmu_page1_fixup(ARM_SMMU_PRIQ_PROD, smmu));
Will Deacon52be8632019-07-02 17:16:08 +01003662 writel_relaxed(smmu->priq.q.llq.cons,
Linu Cheriane5b829d2017-06-22 17:35:37 +05303663 arm_smmu_page1_fixup(ARM_SMMU_PRIQ_CONS, smmu));
Will Deacon48ec83b2015-05-27 17:25:59 +01003664
3665 enables |= CR0_PRIQEN;
3666 ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
3667 ARM_SMMU_CR0ACK);
3668 if (ret) {
3669 dev_err(smmu->dev, "failed to enable PRI queue\n");
3670 return ret;
3671 }
3672 }
3673
Jean-Philippe Brucker9ce27af2019-04-17 19:24:47 +01003674 if (smmu->features & ARM_SMMU_FEAT_ATS) {
3675 enables |= CR0_ATSCHK;
3676 ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
3677 ARM_SMMU_CR0ACK);
3678 if (ret) {
3679 dev_err(smmu->dev, "failed to enable ATS check\n");
3680 return ret;
3681 }
3682 }
3683
Will Deacon48ec83b2015-05-27 17:25:59 +01003684 ret = arm_smmu_setup_irqs(smmu);
3685 if (ret) {
3686 dev_err(smmu->dev, "failed to setup irqs\n");
3687 return ret;
3688 }
3689
Will Deacon3f54c442019-04-23 11:59:36 +01003690 if (is_kdump_kernel())
3691 enables &= ~(CR0_EVTQEN | CR0_PRIQEN);
Robin Murphydc87a982016-09-12 17:13:44 +01003692
3693 /* Enable the SMMU interface, or ensure bypass */
3694 if (!bypass || disable_bypass) {
3695 enables |= CR0_SMMUEN;
3696 } else {
3697 ret = arm_smmu_update_gbpa(smmu, 0, GBPA_ABORT);
Will Deaconb63b3432018-07-25 15:58:43 +01003698 if (ret)
Robin Murphydc87a982016-09-12 17:13:44 +01003699 return ret;
Robin Murphydc87a982016-09-12 17:13:44 +01003700 }
Will Deacon48ec83b2015-05-27 17:25:59 +01003701 ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
3702 ARM_SMMU_CR0ACK);
3703 if (ret) {
3704 dev_err(smmu->dev, "failed to enable SMMU interface\n");
3705 return ret;
3706 }
3707
3708 return 0;
3709}
3710
Lorenzo Pieralisi2985b522016-11-21 10:01:42 +00003711static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
Will Deacon48ec83b2015-05-27 17:25:59 +01003712{
3713 u32 reg;
Lorenzo Pieralisi2985b522016-11-21 10:01:42 +00003714 bool coherent = smmu->features & ARM_SMMU_FEAT_COHERENCY;
Will Deacon48ec83b2015-05-27 17:25:59 +01003715
3716 /* IDR0 */
3717 reg = readl_relaxed(smmu->base + ARM_SMMU_IDR0);
3718
3719 /* 2-level structures */
Robin Murphycbcee192018-03-26 13:35:10 +01003720 if (FIELD_GET(IDR0_ST_LVL, reg) == IDR0_ST_LVL_2LVL)
Will Deacon48ec83b2015-05-27 17:25:59 +01003721 smmu->features |= ARM_SMMU_FEAT_2_LVL_STRTAB;
3722
3723 if (reg & IDR0_CD2L)
3724 smmu->features |= ARM_SMMU_FEAT_2_LVL_CDTAB;
3725
3726 /*
3727 * Translation table endianness.
3728 * We currently require the same endianness as the CPU, but this
3729 * could be changed later by adding a new IO_PGTABLE_QUIRK.
3730 */
Robin Murphycbcee192018-03-26 13:35:10 +01003731 switch (FIELD_GET(IDR0_TTENDIAN, reg)) {
Will Deacon48ec83b2015-05-27 17:25:59 +01003732 case IDR0_TTENDIAN_MIXED:
3733 smmu->features |= ARM_SMMU_FEAT_TT_LE | ARM_SMMU_FEAT_TT_BE;
3734 break;
3735#ifdef __BIG_ENDIAN
3736 case IDR0_TTENDIAN_BE:
3737 smmu->features |= ARM_SMMU_FEAT_TT_BE;
3738 break;
3739#else
3740 case IDR0_TTENDIAN_LE:
3741 smmu->features |= ARM_SMMU_FEAT_TT_LE;
3742 break;
3743#endif
3744 default:
3745 dev_err(smmu->dev, "unknown/unsupported TT endianness!\n");
3746 return -ENXIO;
3747 }
3748
3749 /* Boolean feature flags */
3750 if (IS_ENABLED(CONFIG_PCI_PRI) && reg & IDR0_PRI)
3751 smmu->features |= ARM_SMMU_FEAT_PRI;
3752
3753 if (IS_ENABLED(CONFIG_PCI_ATS) && reg & IDR0_ATS)
3754 smmu->features |= ARM_SMMU_FEAT_ATS;
3755
3756 if (reg & IDR0_SEV)
3757 smmu->features |= ARM_SMMU_FEAT_SEV;
3758
3759 if (reg & IDR0_MSI)
3760 smmu->features |= ARM_SMMU_FEAT_MSI;
3761
3762 if (reg & IDR0_HYP)
3763 smmu->features |= ARM_SMMU_FEAT_HYP;
3764
3765 /*
Lorenzo Pieralisi2985b522016-11-21 10:01:42 +00003766 * The coherency feature as set by FW is used in preference to the ID
Will Deacon48ec83b2015-05-27 17:25:59 +01003767 * register, but warn on mismatch.
3768 */
Will Deacon48ec83b2015-05-27 17:25:59 +01003769 if (!!(reg & IDR0_COHACC) != coherent)
Robin Murphy2a22baa2017-09-25 14:55:40 +01003770 dev_warn(smmu->dev, "IDR0.COHACC overridden by FW configuration (%s)\n",
Will Deacon48ec83b2015-05-27 17:25:59 +01003771 coherent ? "true" : "false");
3772
Robin Murphycbcee192018-03-26 13:35:10 +01003773 switch (FIELD_GET(IDR0_STALL_MODEL, reg)) {
Prem Mallappa6380be02015-12-14 22:01:23 +05303774 case IDR0_STALL_MODEL_FORCE:
Yisheng Xie9cff86fd22017-09-21 20:36:07 +08003775 smmu->features |= ARM_SMMU_FEAT_STALL_FORCE;
3776 /* Fallthrough */
3777 case IDR0_STALL_MODEL_STALL:
Will Deacon48ec83b2015-05-27 17:25:59 +01003778 smmu->features |= ARM_SMMU_FEAT_STALLS;
Prem Mallappa6380be02015-12-14 22:01:23 +05303779 }
Will Deacon48ec83b2015-05-27 17:25:59 +01003780
3781 if (reg & IDR0_S1P)
3782 smmu->features |= ARM_SMMU_FEAT_TRANS_S1;
3783
3784 if (reg & IDR0_S2P)
3785 smmu->features |= ARM_SMMU_FEAT_TRANS_S2;
3786
3787 if (!(reg & (IDR0_S1P | IDR0_S2P))) {
3788 dev_err(smmu->dev, "no translation support!\n");
3789 return -ENXIO;
3790 }
3791
3792 /* We only support the AArch64 table format at present */
Robin Murphycbcee192018-03-26 13:35:10 +01003793 switch (FIELD_GET(IDR0_TTF, reg)) {
Will Deaconf0c453d2015-08-20 12:12:32 +01003794 case IDR0_TTF_AARCH32_64:
3795 smmu->ias = 40;
3796 /* Fallthrough */
3797 case IDR0_TTF_AARCH64:
3798 break;
3799 default:
Will Deacon48ec83b2015-05-27 17:25:59 +01003800 dev_err(smmu->dev, "AArch64 table format not supported!\n");
3801 return -ENXIO;
3802 }
3803
3804 /* ASID/VMID sizes */
3805 smmu->asid_bits = reg & IDR0_ASID16 ? 16 : 8;
3806 smmu->vmid_bits = reg & IDR0_VMID16 ? 16 : 8;
3807
3808 /* IDR1 */
3809 reg = readl_relaxed(smmu->base + ARM_SMMU_IDR1);
3810 if (reg & (IDR1_TABLES_PRESET | IDR1_QUEUES_PRESET | IDR1_REL)) {
3811 dev_err(smmu->dev, "embedded implementation not supported\n");
3812 return -ENXIO;
3813 }
3814
Will Deacond25f6ea2019-05-16 16:08:47 +01003815 /* Queue sizes, capped to ensure natural alignment */
Will Deacon52be8632019-07-02 17:16:08 +01003816 smmu->cmdq.q.llq.max_n_shift = min_t(u32, CMDQ_MAX_SZ_SHIFT,
3817 FIELD_GET(IDR1_CMDQS, reg));
Will Deacon2af2e722019-07-02 17:16:33 +01003818 if (smmu->cmdq.q.llq.max_n_shift <= ilog2(CMDQ_BATCH_ENTRIES)) {
Will Deacon587e6c12019-07-02 17:16:25 +01003819 /*
Will Deacon2af2e722019-07-02 17:16:33 +01003820 * We don't support splitting up batches, so one batch of
3821 * commands plus an extra sync needs to fit inside the command
3822 * queue. There's also no way we can handle the weird alignment
3823 * restrictions on the base pointer for a unit-length queue.
Will Deacon587e6c12019-07-02 17:16:25 +01003824 */
Will Deacon2af2e722019-07-02 17:16:33 +01003825 dev_err(smmu->dev, "command queue size <= %d entries not supported\n",
3826 CMDQ_BATCH_ENTRIES);
Will Deacon48ec83b2015-05-27 17:25:59 +01003827 return -ENXIO;
3828 }
3829
Will Deacon52be8632019-07-02 17:16:08 +01003830 smmu->evtq.q.llq.max_n_shift = min_t(u32, EVTQ_MAX_SZ_SHIFT,
3831 FIELD_GET(IDR1_EVTQS, reg));
3832 smmu->priq.q.llq.max_n_shift = min_t(u32, PRIQ_MAX_SZ_SHIFT,
3833 FIELD_GET(IDR1_PRIQS, reg));
Will Deacon48ec83b2015-05-27 17:25:59 +01003834
3835 /* SID/SSID sizes */
Robin Murphycbcee192018-03-26 13:35:10 +01003836 smmu->ssid_bits = FIELD_GET(IDR1_SSIDSIZE, reg);
3837 smmu->sid_bits = FIELD_GET(IDR1_SIDSIZE, reg);
Will Deacon48ec83b2015-05-27 17:25:59 +01003838
Nate Watterson692c4e42017-01-10 14:47:13 -05003839 /*
3840 * If the SMMU supports fewer bits than would fill a single L2 stream
3841 * table, use a linear table instead.
3842 */
3843 if (smmu->sid_bits <= STRTAB_SPLIT)
3844 smmu->features &= ~ARM_SMMU_FEAT_2_LVL_STRTAB;
3845
Rob Herring6a481a92020-02-24 16:31:29 -06003846 /* IDR3 */
3847 reg = readl_relaxed(smmu->base + ARM_SMMU_IDR3);
3848 if (FIELD_GET(IDR3_RIL, reg))
3849 smmu->features |= ARM_SMMU_FEAT_RANGE_INV;
3850
Will Deacon48ec83b2015-05-27 17:25:59 +01003851 /* IDR5 */
3852 reg = readl_relaxed(smmu->base + ARM_SMMU_IDR5);
3853
3854 /* Maximum number of outstanding stalls */
Robin Murphycbcee192018-03-26 13:35:10 +01003855 smmu->evtq.max_stalls = FIELD_GET(IDR5_STALL_MAX, reg);
Will Deacon48ec83b2015-05-27 17:25:59 +01003856
3857 /* Page sizes */
3858 if (reg & IDR5_GRAN64K)
Robin Murphyd5466352016-05-09 17:20:09 +01003859 smmu->pgsize_bitmap |= SZ_64K | SZ_512M;
Will Deacon48ec83b2015-05-27 17:25:59 +01003860 if (reg & IDR5_GRAN16K)
Robin Murphyd5466352016-05-09 17:20:09 +01003861 smmu->pgsize_bitmap |= SZ_16K | SZ_32M;
Will Deacon48ec83b2015-05-27 17:25:59 +01003862 if (reg & IDR5_GRAN4K)
Robin Murphyd5466352016-05-09 17:20:09 +01003863 smmu->pgsize_bitmap |= SZ_4K | SZ_2M | SZ_1G;
Will Deacon48ec83b2015-05-27 17:25:59 +01003864
Robin Murphydcd189e2018-03-26 13:35:15 +01003865 /* Input address size */
3866 if (FIELD_GET(IDR5_VAX, reg) == IDR5_VAX_52_BIT)
3867 smmu->features |= ARM_SMMU_FEAT_VAX;
3868
Will Deacon48ec83b2015-05-27 17:25:59 +01003869 /* Output address size */
Robin Murphycbcee192018-03-26 13:35:10 +01003870 switch (FIELD_GET(IDR5_OAS, reg)) {
Will Deacon48ec83b2015-05-27 17:25:59 +01003871 case IDR5_OAS_32_BIT:
3872 smmu->oas = 32;
3873 break;
3874 case IDR5_OAS_36_BIT:
3875 smmu->oas = 36;
3876 break;
3877 case IDR5_OAS_40_BIT:
3878 smmu->oas = 40;
3879 break;
3880 case IDR5_OAS_42_BIT:
3881 smmu->oas = 42;
3882 break;
3883 case IDR5_OAS_44_BIT:
3884 smmu->oas = 44;
3885 break;
Robin Murphy6619c912018-03-26 13:35:14 +01003886 case IDR5_OAS_52_BIT:
3887 smmu->oas = 52;
3888 smmu->pgsize_bitmap |= 1ULL << 42; /* 4TB */
3889 break;
Will Deacon85430962015-08-03 10:35:40 +01003890 default:
3891 dev_info(smmu->dev,
3892 "unknown output address size. Truncating to 48-bit\n");
3893 /* Fallthrough */
Will Deacon48ec83b2015-05-27 17:25:59 +01003894 case IDR5_OAS_48_BIT:
3895 smmu->oas = 48;
Will Deacon48ec83b2015-05-27 17:25:59 +01003896 }
3897
Robin Murphy6619c912018-03-26 13:35:14 +01003898 if (arm_smmu_ops.pgsize_bitmap == -1UL)
3899 arm_smmu_ops.pgsize_bitmap = smmu->pgsize_bitmap;
3900 else
3901 arm_smmu_ops.pgsize_bitmap |= smmu->pgsize_bitmap;
3902
Will Deacon48ec83b2015-05-27 17:25:59 +01003903 /* Set the DMA mask for our table walker */
3904 if (dma_set_mask_and_coherent(smmu->dev, DMA_BIT_MASK(smmu->oas)))
3905 dev_warn(smmu->dev,
3906 "failed to set DMA mask for table walker\n");
3907
Will Deaconf0c453d2015-08-20 12:12:32 +01003908 smmu->ias = max(smmu->ias, smmu->oas);
Will Deacon48ec83b2015-05-27 17:25:59 +01003909
3910 dev_info(smmu->dev, "ias %lu-bit, oas %lu-bit (features 0x%08x)\n",
3911 smmu->ias, smmu->oas, smmu->features);
3912 return 0;
3913}
3914
Lorenzo Pieralisie4dadfa2016-11-21 10:01:43 +00003915#ifdef CONFIG_ACPI
Linu Cheriane5b829d2017-06-22 17:35:37 +05303916static void acpi_smmu_get_options(u32 model, struct arm_smmu_device *smmu)
3917{
shameer99caf172017-05-17 10:12:05 +01003918 switch (model) {
3919 case ACPI_IORT_SMMU_V3_CAVIUM_CN99XX:
Linu Cheriane5b829d2017-06-22 17:35:37 +05303920 smmu->options |= ARM_SMMU_OPT_PAGE0_REGS_ONLY;
shameer99caf172017-05-17 10:12:05 +01003921 break;
Robin Murphy6948d4a2017-09-22 15:04:00 +01003922 case ACPI_IORT_SMMU_V3_HISILICON_HI161X:
shameer99caf172017-05-17 10:12:05 +01003923 smmu->options |= ARM_SMMU_OPT_SKIP_PREFETCH;
3924 break;
3925 }
Linu Cheriane5b829d2017-06-22 17:35:37 +05303926
3927 dev_notice(smmu->dev, "option mask 0x%x\n", smmu->options);
3928}
3929
Lorenzo Pieralisie4dadfa2016-11-21 10:01:43 +00003930static int arm_smmu_device_acpi_probe(struct platform_device *pdev,
3931 struct arm_smmu_device *smmu)
3932{
3933 struct acpi_iort_smmu_v3 *iort_smmu;
3934 struct device *dev = smmu->dev;
3935 struct acpi_iort_node *node;
3936
3937 node = *(struct acpi_iort_node **)dev_get_platdata(dev);
3938
3939 /* Retrieve SMMUv3 specific data */
3940 iort_smmu = (struct acpi_iort_smmu_v3 *)node->node_data;
3941
Linu Cheriane5b829d2017-06-22 17:35:37 +05303942 acpi_smmu_get_options(iort_smmu->model, smmu);
3943
Lorenzo Pieralisie4dadfa2016-11-21 10:01:43 +00003944 if (iort_smmu->flags & ACPI_IORT_SMMU_V3_COHACC_OVERRIDE)
3945 smmu->features |= ARM_SMMU_FEAT_COHERENCY;
3946
3947 return 0;
3948}
3949#else
3950static inline int arm_smmu_device_acpi_probe(struct platform_device *pdev,
3951 struct arm_smmu_device *smmu)
3952{
3953 return -ENODEV;
3954}
3955#endif
3956
Lorenzo Pieralisi2985b522016-11-21 10:01:42 +00003957static int arm_smmu_device_dt_probe(struct platform_device *pdev,
3958 struct arm_smmu_device *smmu)
Will Deacon48ec83b2015-05-27 17:25:59 +01003959{
Will Deacon48ec83b2015-05-27 17:25:59 +01003960 struct device *dev = &pdev->dev;
Robin Murphydc87a982016-09-12 17:13:44 +01003961 u32 cells;
Lorenzo Pieralisi2985b522016-11-21 10:01:42 +00003962 int ret = -EINVAL;
Robin Murphydc87a982016-09-12 17:13:44 +01003963
3964 if (of_property_read_u32(dev->of_node, "#iommu-cells", &cells))
3965 dev_err(dev, "missing #iommu-cells property\n");
3966 else if (cells != 1)
3967 dev_err(dev, "invalid #iommu-cells value (%d)\n", cells);
3968 else
Lorenzo Pieralisi2985b522016-11-21 10:01:42 +00003969 ret = 0;
3970
3971 parse_driver_options(smmu);
3972
3973 if (of_dma_is_coherent(dev->of_node))
3974 smmu->features |= ARM_SMMU_FEAT_COHERENCY;
3975
3976 return ret;
3977}
3978
Linu Cheriane5b829d2017-06-22 17:35:37 +05303979static unsigned long arm_smmu_resource_size(struct arm_smmu_device *smmu)
3980{
3981 if (smmu->options & ARM_SMMU_OPT_PAGE0_REGS_ONLY)
3982 return SZ_64K;
3983 else
3984 return SZ_128K;
3985}
3986
Will Deaconab246772019-12-19 12:03:47 +00003987static int arm_smmu_set_bus_ops(struct iommu_ops *ops)
3988{
3989 int err;
3990
3991#ifdef CONFIG_PCI
3992 if (pci_bus_type.iommu_ops != ops) {
Will Deaconab246772019-12-19 12:03:47 +00003993 err = bus_set_iommu(&pci_bus_type, ops);
3994 if (err)
3995 return err;
3996 }
3997#endif
3998#ifdef CONFIG_ARM_AMBA
3999 if (amba_bustype.iommu_ops != ops) {
4000 err = bus_set_iommu(&amba_bustype, ops);
4001 if (err)
4002 goto err_reset_pci_ops;
4003 }
4004#endif
4005 if (platform_bus_type.iommu_ops != ops) {
4006 err = bus_set_iommu(&platform_bus_type, ops);
4007 if (err)
4008 goto err_reset_amba_ops;
4009 }
4010
4011 return 0;
4012
4013err_reset_amba_ops:
4014#ifdef CONFIG_ARM_AMBA
4015 bus_set_iommu(&amba_bustype, NULL);
4016#endif
4017err_reset_pci_ops: __maybe_unused;
4018#ifdef CONFIG_PCI
4019 bus_set_iommu(&pci_bus_type, NULL);
4020#endif
4021 return err;
4022}
4023
Lorenzo Pieralisi2985b522016-11-21 10:01:42 +00004024static int arm_smmu_device_probe(struct platform_device *pdev)
4025{
4026 int irq, ret;
4027 struct resource *res;
Joerg Roedel9648cbc2017-02-01 18:11:36 +01004028 resource_size_t ioaddr;
Lorenzo Pieralisi2985b522016-11-21 10:01:42 +00004029 struct arm_smmu_device *smmu;
4030 struct device *dev = &pdev->dev;
4031 bool bypass;
Will Deacon48ec83b2015-05-27 17:25:59 +01004032
4033 smmu = devm_kzalloc(dev, sizeof(*smmu), GFP_KERNEL);
4034 if (!smmu) {
4035 dev_err(dev, "failed to allocate arm_smmu_device\n");
4036 return -ENOMEM;
4037 }
4038 smmu->dev = dev;
4039
Linu Cheriane5b829d2017-06-22 17:35:37 +05304040 if (dev->of_node) {
4041 ret = arm_smmu_device_dt_probe(pdev, smmu);
4042 } else {
4043 ret = arm_smmu_device_acpi_probe(pdev, smmu);
4044 if (ret == -ENODEV)
4045 return ret;
4046 }
4047
4048 /* Set bypass mode according to firmware probing result */
4049 bypass = !!ret;
4050
Will Deacon48ec83b2015-05-27 17:25:59 +01004051 /* Base address */
4052 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
Masahiro Yamada322a9bb2019-12-26 18:50:56 +09004053 if (resource_size(res) < arm_smmu_resource_size(smmu)) {
Will Deacon48ec83b2015-05-27 17:25:59 +01004054 dev_err(dev, "MMIO region too small (%pr)\n", res);
4055 return -EINVAL;
4056 }
Joerg Roedel9648cbc2017-02-01 18:11:36 +01004057 ioaddr = res->start;
Will Deacon48ec83b2015-05-27 17:25:59 +01004058
4059 smmu->base = devm_ioremap_resource(dev, res);
4060 if (IS_ERR(smmu->base))
4061 return PTR_ERR(smmu->base);
4062
4063 /* Interrupt lines */
Will Deacon48ec83b2015-05-27 17:25:59 +01004064
Jean-Philippe Bruckerf7aff1a2019-11-11 12:17:20 +01004065 irq = platform_get_irq_byname_optional(pdev, "combined");
Will Deacon48ec83b2015-05-27 17:25:59 +01004066 if (irq > 0)
Geetha Sowjanyaf9354482017-06-23 19:04:36 +05304067 smmu->combined_irq = irq;
4068 else {
Jean-Philippe Bruckerf7aff1a2019-11-11 12:17:20 +01004069 irq = platform_get_irq_byname_optional(pdev, "eventq");
Geetha Sowjanyaf9354482017-06-23 19:04:36 +05304070 if (irq > 0)
4071 smmu->evtq.q.irq = irq;
Will Deacon48ec83b2015-05-27 17:25:59 +01004072
Jean-Philippe Bruckerf7aff1a2019-11-11 12:17:20 +01004073 irq = platform_get_irq_byname_optional(pdev, "priq");
Geetha Sowjanyaf9354482017-06-23 19:04:36 +05304074 if (irq > 0)
4075 smmu->priq.q.irq = irq;
Will Deacon48ec83b2015-05-27 17:25:59 +01004076
Jean-Philippe Bruckerf7aff1a2019-11-11 12:17:20 +01004077 irq = platform_get_irq_byname_optional(pdev, "gerror");
Geetha Sowjanyaf9354482017-06-23 19:04:36 +05304078 if (irq > 0)
4079 smmu->gerr_irq = irq;
4080 }
Will Deacon48ec83b2015-05-27 17:25:59 +01004081 /* Probe the h/w */
Lorenzo Pieralisi2985b522016-11-21 10:01:42 +00004082 ret = arm_smmu_device_hw_probe(smmu);
Will Deacon48ec83b2015-05-27 17:25:59 +01004083 if (ret)
4084 return ret;
4085
4086 /* Initialise in-memory data structures */
4087 ret = arm_smmu_init_structures(smmu);
4088 if (ret)
4089 return ret;
4090
Marc Zyngier166bdbd2015-10-13 18:32:30 +01004091 /* Record our private device structure */
4092 platform_set_drvdata(pdev, smmu);
4093
Will Deacon48ec83b2015-05-27 17:25:59 +01004094 /* Reset the device */
Robin Murphy8f785152016-09-12 17:13:45 +01004095 ret = arm_smmu_device_reset(smmu, bypass);
4096 if (ret)
4097 return ret;
4098
4099 /* And we're up. Go go go! */
Joerg Roedel9648cbc2017-02-01 18:11:36 +01004100 ret = iommu_device_sysfs_add(&smmu->iommu, dev, NULL,
4101 "smmu3.%pa", &ioaddr);
Robin Murphy08d4ca22016-09-12 17:13:46 +01004102 if (ret)
4103 return ret;
Joerg Roedel9648cbc2017-02-01 18:11:36 +01004104
4105 iommu_device_set_ops(&smmu->iommu, &arm_smmu_ops);
4106 iommu_device_set_fwnode(&smmu->iommu, dev->fwnode);
4107
4108 ret = iommu_device_register(&smmu->iommu);
Arvind Yadav5c2d0212017-06-22 12:57:42 +05304109 if (ret) {
4110 dev_err(dev, "Failed to register iommu\n");
4111 return ret;
4112 }
Lorenzo Pieralisi778de072016-11-21 10:01:38 +00004113
Will Deaconab246772019-12-19 12:03:47 +00004114 return arm_smmu_set_bus_ops(&arm_smmu_ops);
Will Deacon48ec83b2015-05-27 17:25:59 +01004115}
4116
Will Deacon6e8fa742019-12-19 12:03:44 +00004117static int arm_smmu_device_remove(struct platform_device *pdev)
Will Deacon48ec83b2015-05-27 17:25:59 +01004118{
Will Deacon941a8022015-08-11 16:25:10 +01004119 struct arm_smmu_device *smmu = platform_get_drvdata(pdev);
Will Deacon48ec83b2015-05-27 17:25:59 +01004120
Will Deaconab246772019-12-19 12:03:47 +00004121 arm_smmu_set_bus_ops(NULL);
4122 iommu_device_unregister(&smmu->iommu);
4123 iommu_device_sysfs_remove(&smmu->iommu);
Will Deacon48ec83b2015-05-27 17:25:59 +01004124 arm_smmu_device_disable(smmu);
Will Deacon6e8fa742019-12-19 12:03:44 +00004125
Will Deacon48ec83b2015-05-27 17:25:59 +01004126 return 0;
4127}
4128
4129static void arm_smmu_device_shutdown(struct platform_device *pdev)
4130{
Will Deacon6e8fa742019-12-19 12:03:44 +00004131 arm_smmu_device_remove(pdev);
Nate Watterson7aa86192017-06-29 18:18:15 -04004132}
4133
Arvind Yadavebdd13c2017-06-22 12:51:00 +05304134static const struct of_device_id arm_smmu_of_match[] = {
Will Deacon48ec83b2015-05-27 17:25:59 +01004135 { .compatible = "arm,smmu-v3", },
4136 { },
4137};
Will Deacon6e8fa742019-12-19 12:03:44 +00004138MODULE_DEVICE_TABLE(of, arm_smmu_of_match);
Will Deacon48ec83b2015-05-27 17:25:59 +01004139
4140static struct platform_driver arm_smmu_driver = {
4141 .driver = {
Will Deacon34debdc2019-12-19 12:03:46 +00004142 .name = "arm-smmu-v3",
Masahiro Yamada8efda062019-12-24 17:14:59 +09004143 .of_match_table = arm_smmu_of_match,
Will Deacon34debdc2019-12-19 12:03:46 +00004144 .suppress_bind_attrs = true,
Will Deacon48ec83b2015-05-27 17:25:59 +01004145 },
Lorenzo Pieralisi2985b522016-11-21 10:01:42 +00004146 .probe = arm_smmu_device_probe,
Will Deacon6e8fa742019-12-19 12:03:44 +00004147 .remove = arm_smmu_device_remove,
Nate Watterson7aa86192017-06-29 18:18:15 -04004148 .shutdown = arm_smmu_device_shutdown,
Will Deacon48ec83b2015-05-27 17:25:59 +01004149};
Will Deacon6e8fa742019-12-19 12:03:44 +00004150module_platform_driver(arm_smmu_driver);
4151
4152MODULE_DESCRIPTION("IOMMU API for ARM architected SMMUv3 implementations");
Will Deacon1ea27ee2019-12-19 12:03:52 +00004153MODULE_AUTHOR("Will Deacon <will@kernel.org>");
Ard Biesheuveld3daf662019-12-19 12:03:48 +00004154MODULE_ALIAS("platform:arm-smmu-v3");
Will Deacon6e8fa742019-12-19 12:03:44 +00004155MODULE_LICENSE("GPL v2");