1*3942d3a8SSheetal Tigadoli /*
2*3942d3a8SSheetal Tigadoli * Copyright (c) 2017 - 2020, Broadcom
3*3942d3a8SSheetal Tigadoli *
4*3942d3a8SSheetal Tigadoli * SPDX-License-Identifier: BSD-3-Clause
5*3942d3a8SSheetal Tigadoli */
6*3942d3a8SSheetal Tigadoli
7*3942d3a8SSheetal Tigadoli #include <arch_helpers.h>
8*3942d3a8SSheetal Tigadoli #include <common/debug.h>
9*3942d3a8SSheetal Tigadoli #include <drivers/delay_timer.h>
10*3942d3a8SSheetal Tigadoli #include <lib/mmio.h>
11*3942d3a8SSheetal Tigadoli
12*3942d3a8SSheetal Tigadoli #include <iommu.h>
13*3942d3a8SSheetal Tigadoli #include <platform_def.h>
14*3942d3a8SSheetal Tigadoli
15*3942d3a8SSheetal Tigadoli #define SMMU_BASE 0x64000000
16*3942d3a8SSheetal Tigadoli #define ARM_SMMU_MAX_NUM_CNTXT_BANK 64
17*3942d3a8SSheetal Tigadoli #define SMMU_CTX_BANK_IDX_SECURE_CRMU 63
18*3942d3a8SSheetal Tigadoli #define ARM_SMMU_NUM_SECURE_MASTER 1
19*3942d3a8SSheetal Tigadoli #define ARM_SMMU_NSNUMCBO (ARM_SMMU_MAX_NUM_CNTXT_BANK - \
20*3942d3a8SSheetal Tigadoli ARM_SMMU_NUM_SECURE_MASTER)
21*3942d3a8SSheetal Tigadoli #define ARM_SMMU_NSNUMSMRGO (ARM_SMMU_MAX_NUM_CNTXT_BANK - \
22*3942d3a8SSheetal Tigadoli ARM_SMMU_NUM_SECURE_MASTER)
23*3942d3a8SSheetal Tigadoli /* Reserved Banks. */
24*3942d3a8SSheetal Tigadoli #define SMMU_CTX_BANK_IDX (SMMU_CTX_BANK_IDX_SECURE_CRMU - \
25*3942d3a8SSheetal Tigadoli ARM_SMMU_NUM_SECURE_MASTER)
26*3942d3a8SSheetal Tigadoli #define NUM_OF_SMRS 1
27*3942d3a8SSheetal Tigadoli
28*3942d3a8SSheetal Tigadoli #define STG1_WITH_STG2_BYPASS 1
29*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PGTBL_PHYS_CRMU 0x880000000
30*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PGTBL_PHYS 0x880200000
31*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PGTBL_PTE_CNT 512
32*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_L1_BLOCK_SIZE 0x40000000
33*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_L1_ADDR_MASK 0x0000FFFFC0000000UL
34*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_TABLE 0x2UL
35*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_VALID 0x1UL
36*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_ATTRINDX 2
37*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_NS 5
38*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_AP 6
39*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_AP_EL1_RW 0x0
40*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_AP_EL0_RW 0x1
41*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_SH 8
42*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_SH_NON 0x0
43*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_SH_OUTER 0x2
44*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_SH_INNER 0x3
45*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_AF 10
46*3942d3a8SSheetal Tigadoli #define ARM_SMMU_RES_SIZE 0x80000
47*3942d3a8SSheetal Tigadoli
48*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_NSTABLE 0x8000000000000000UL
49*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_L1_INDEX_SHIFT 30
50*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_L1_INDEX_MASK 0x1ff
51*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_L0_INDEX_SHIFT 39
52*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_L0_INDEX_MASK 0x1ff
53*3942d3a8SSheetal Tigadoli #define ARM_LPAE_PTE_TABLE_MASK ~(0xfffUL)
54*3942d3a8SSheetal Tigadoli /* Configuration registers */
55*3942d3a8SSheetal Tigadoli #define ARM_SMMU_GR0_sCR0 0x0
56*3942d3a8SSheetal Tigadoli #define sCR0_CLIENTPD (1 << 0)
57*3942d3a8SSheetal Tigadoli #define sCR0_GFRE (1 << 1)
58*3942d3a8SSheetal Tigadoli #define sCR0_GFIE (1 << 2)
59*3942d3a8SSheetal Tigadoli #define sCR0_GCFGFRE (1 << 4)
60*3942d3a8SSheetal Tigadoli #define sCR0_GCFGFIE (1 << 5)
61*3942d3a8SSheetal Tigadoli #define sCR0_USFCFG (1 << 10)
62*3942d3a8SSheetal Tigadoli #define sCR0_VMIDPNE (1 << 11)
63*3942d3a8SSheetal Tigadoli #define sCR0_PTM (1 << 12)
64*3942d3a8SSheetal Tigadoli #define sCR0_FB (1 << 13)
65*3942d3a8SSheetal Tigadoli #define sCR0_VMID16EN (1 << 31)
66*3942d3a8SSheetal Tigadoli #define sCR0_BSU_SHIFT 14
67*3942d3a8SSheetal Tigadoli #define sCR0_BSU_MASK 0x3
68*3942d3a8SSheetal Tigadoli #define ARM_SMMU_SMMU_SCR1 0x4
69*3942d3a8SSheetal Tigadoli #define SCR1_NSNUMCBO_MASK 0xFF
70*3942d3a8SSheetal Tigadoli #define SCR1_NSNUMCBO_SHIFT 0x0
71*3942d3a8SSheetal Tigadoli #define SCR1_NSNUMSMRGO_MASK 0xFF00
72*3942d3a8SSheetal Tigadoli #define SCR1_NSNUMSMRGO_SHIFT 0x8
73*3942d3a8SSheetal Tigadoli
74*3942d3a8SSheetal Tigadoli /* Identification registers */
75*3942d3a8SSheetal Tigadoli #define ARM_SMMU_GR0_ID0 0x20
76*3942d3a8SSheetal Tigadoli #define ARM_SMMU_GR0_ID1 0x24
77*3942d3a8SSheetal Tigadoli #define ARM_SMMU_GR0_ID2 0x28
78*3942d3a8SSheetal Tigadoli #define ARM_SMMU_GR0_ID3 0x2c
79*3942d3a8SSheetal Tigadoli #define ARM_SMMU_GR0_ID4 0x30
80*3942d3a8SSheetal Tigadoli #define ARM_SMMU_GR0_ID5 0x34
81*3942d3a8SSheetal Tigadoli #define ARM_SMMU_GR0_ID6 0x38
82*3942d3a8SSheetal Tigadoli #define ARM_SMMU_GR0_ID7 0x3c
83*3942d3a8SSheetal Tigadoli #define ARM_SMMU_GR0_sGFSR 0x48
84*3942d3a8SSheetal Tigadoli #define ARM_SMMU_GR0_sGFSYNR0 0x50
85*3942d3a8SSheetal Tigadoli #define ARM_SMMU_GR0_sGFSYNR1 0x54
86*3942d3a8SSheetal Tigadoli #define ARM_SMMU_GR0_sGFSYNR2 0x58
87*3942d3a8SSheetal Tigadoli
88*3942d3a8SSheetal Tigadoli #define ID1_PAGESIZE (1U << 31)
89*3942d3a8SSheetal Tigadoli #define ID1_NUMPAGENDXB_SHIFT 28
90*3942d3a8SSheetal Tigadoli #define ID1_NUMPAGENDXB_MASK 7
91*3942d3a8SSheetal Tigadoli #define ID1_NUMS2CB_SHIFT 16
92*3942d3a8SSheetal Tigadoli #define ID1_NUMS2CB_MASK 0xff
93*3942d3a8SSheetal Tigadoli #define ID1_NUMCB_SHIFT 0
94*3942d3a8SSheetal Tigadoli #define ID1_NUMCB_MASK 0xff
95*3942d3a8SSheetal Tigadoli
96*3942d3a8SSheetal Tigadoli /* SMMU global address space */
97*3942d3a8SSheetal Tigadoli #define ARM_SMMU_GR0(smmu) ((smmu)->base)
98*3942d3a8SSheetal Tigadoli #define ARM_SMMU_GR1(smmu) ((smmu)->base + (1 << (smmu)->pgshift))
99*3942d3a8SSheetal Tigadoli
100*3942d3a8SSheetal Tigadoli /* Stream mapping registers */
101*3942d3a8SSheetal Tigadoli #define ARM_SMMU_GR0_SMR(n) (0x800 + (n << 2))
102*3942d3a8SSheetal Tigadoli #define SMR_VALID (1U << 31)
103*3942d3a8SSheetal Tigadoli #define SMR_MASK_SHIFT 16
104*3942d3a8SSheetal Tigadoli #define SMR_ID_SHIFT 0
105*3942d3a8SSheetal Tigadoli
106*3942d3a8SSheetal Tigadoli #define ARM_SMMU_GR0_S2CR(n) (0xc00 + (n << 2))
107*3942d3a8SSheetal Tigadoli #define S2CR_CBNDX_SHIFT 0
108*3942d3a8SSheetal Tigadoli #define S2CR_CBNDX_MASK 0xff
109*3942d3a8SSheetal Tigadoli #define S2CR_TYPE_SHIFT 16
110*3942d3a8SSheetal Tigadoli #define S2CR_TYPE_MASK 0x3
111*3942d3a8SSheetal Tigadoli
112*3942d3a8SSheetal Tigadoli #define ARM_SMMU_GR1_CBA2R(n) (0x800 + (n << 2))
113*3942d3a8SSheetal Tigadoli #define CBA2R_RW64_32BIT (0 << 0)
114*3942d3a8SSheetal Tigadoli #define CBA2R_RW64_64BIT (1 << 0)
115*3942d3a8SSheetal Tigadoli #define CBA2R_VMID_SHIFT 16
116*3942d3a8SSheetal Tigadoli #define CBA2R_VMID_MASK 0xffff
117*3942d3a8SSheetal Tigadoli
118*3942d3a8SSheetal Tigadoli #define ARM_SMMU_GR1_CBAR(n) (0x0 + (n << 2))
119*3942d3a8SSheetal Tigadoli #define CBAR_VMID_SHIFT 0
120*3942d3a8SSheetal Tigadoli #define CBAR_VMID_MASK 0xff
121*3942d3a8SSheetal Tigadoli #define CBAR_S1_BPSHCFG_SHIFT 8
122*3942d3a8SSheetal Tigadoli #define CBAR_S1_BPSHCFG_MASK 3
123*3942d3a8SSheetal Tigadoli #define CBAR_S1_BPSHCFG_NSH 3
124*3942d3a8SSheetal Tigadoli #define CBAR_S1_MEMATTR_SHIFT 12
125*3942d3a8SSheetal Tigadoli #define CBAR_S1_MEMATTR_MASK 0xf
126*3942d3a8SSheetal Tigadoli #define CBAR_S1_MEMATTR_WB 0xf
127*3942d3a8SSheetal Tigadoli #define CBAR_TYPE_SHIFT 16
128*3942d3a8SSheetal Tigadoli #define CBAR_TYPE_MASK 0x3
129*3942d3a8SSheetal Tigadoli #define CBAR_TYPE_S2_TRANS (0 << CBAR_TYPE_SHIFT)
130*3942d3a8SSheetal Tigadoli #define CBAR_TYPE_S1_TRANS_S2_BYPASS (1 << CBAR_TYPE_SHIFT)
131*3942d3a8SSheetal Tigadoli #define CBAR_TYPE_S1_TRANS_S2_FAULT (2 << CBAR_TYPE_SHIFT)
132*3942d3a8SSheetal Tigadoli #define CBAR_TYPE_S1_TRANS_S2_TRANS (3 << CBAR_TYPE_SHIFT)
133*3942d3a8SSheetal Tigadoli #define CBAR_IRPTNDX_SHIFT 24
134*3942d3a8SSheetal Tigadoli #define CBAR_IRPTNDX_MASK 0xff
135*3942d3a8SSheetal Tigadoli
136*3942d3a8SSheetal Tigadoli /* Translation context bank */
137*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_BASE(smmu) ((smmu)->base + ((smmu)->size >> 1))
138*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB(smmu, n) ((n) * (1 << (smmu)->pgshift))
139*3942d3a8SSheetal Tigadoli
140*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_SCTLR 0x0
141*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_ACTLR 0x4
142*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_RESUME 0x8
143*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_TTBCR2 0x10
144*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_TTBR0 0x20
145*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_TTBR1 0x28
146*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_TTBCR 0x30
147*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_CONTEXTIDR 0x34
148*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_S1_MAIR0 0x38
149*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_S1_MAIR1 0x3c
150*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_PAR 0x50
151*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_FSR 0x58
152*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_FAR 0x60
153*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_FSYNR0 0x68
154*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_S1_TLBIVA 0x600
155*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_S1_TLBIASID 0x610
156*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_S1_TLBIVAL 0x620
157*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_S2_TLBIIPAS2 0x630
158*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_S2_TLBIIPAS2L 0x638
159*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_ATS1PR 0x800
160*3942d3a8SSheetal Tigadoli #define ARM_SMMU_CB_ATSR 0x8f0
161*3942d3a8SSheetal Tigadoli
162*3942d3a8SSheetal Tigadoli #define SCTLR_S1_ASIDPNE (1 << 12)
163*3942d3a8SSheetal Tigadoli #define SCTLR_CFCFG (1 << 7)
164*3942d3a8SSheetal Tigadoli #define SCTLR_CFIE (1 << 6)
165*3942d3a8SSheetal Tigadoli #define SCTLR_CFRE (1 << 5)
166*3942d3a8SSheetal Tigadoli #define SCTLR_E (1 << 4)
167*3942d3a8SSheetal Tigadoli #define SCTLR_AFE (1 << 2)
168*3942d3a8SSheetal Tigadoli #define SCTLR_TRE (1 << 1)
169*3942d3a8SSheetal Tigadoli #define SCTLR_M (1 << 0)
170*3942d3a8SSheetal Tigadoli
171*3942d3a8SSheetal Tigadoli /* ARM LPAE configuration. */
172*3942d3a8SSheetal Tigadoli /**************************************************************/
173*3942d3a8SSheetal Tigadoli /* Register bits */
174*3942d3a8SSheetal Tigadoli #define ARM_32_LPAE_TCR_EAE (1 << 31)
175*3942d3a8SSheetal Tigadoli #define ARM_64_LPAE_S2_TCR_RES1 (1 << 31)
176*3942d3a8SSheetal Tigadoli
177*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_EPD1 (1 << 23)
178*3942d3a8SSheetal Tigadoli
179*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_TG0_4K (0 << 14)
180*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_TG0_64K (1 << 14)
181*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_TG0_16K (2 << 14)
182*3942d3a8SSheetal Tigadoli
183*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_SH0_SHIFT 12
184*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_SH0_MASK 0x3
185*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_SH_NS 0
186*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_SH_OS 2
187*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_SH_IS 3
188*3942d3a8SSheetal Tigadoli
189*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_ORGN0_SHIFT 10
190*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_IRGN0_SHIFT 8
191*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_RGN_MASK 0x3
192*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_RGN_NC 0
193*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_RGN_WBWA 1
194*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_RGN_WT 2
195*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_RGN_WB 3
196*3942d3a8SSheetal Tigadoli
197*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_SL0_SHIFT 6
198*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_SL0_MASK 0x3
199*3942d3a8SSheetal Tigadoli
200*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_T0SZ_SHIFT 0
201*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_SZ_MASK 0xf
202*3942d3a8SSheetal Tigadoli
203*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_PS_SHIFT 16
204*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_PS_MASK 0x7
205*3942d3a8SSheetal Tigadoli
206*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_IPS_SHIFT 32
207*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_IPS_MASK 0x7
208*3942d3a8SSheetal Tigadoli
209*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_PS_32_BIT 0x0ULL
210*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_PS_36_BIT 0x1ULL
211*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_PS_40_BIT 0x2ULL
212*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_PS_42_BIT 0x3ULL
213*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_PS_44_BIT 0x4ULL
214*3942d3a8SSheetal Tigadoli #define ARM_LPAE_TCR_PS_48_BIT 0x5ULL
215*3942d3a8SSheetal Tigadoli
216*3942d3a8SSheetal Tigadoli #define ARM_LPAE_MAIR_ATTR_SHIFT(n) ((n) << 3)
217*3942d3a8SSheetal Tigadoli #define ARM_LPAE_MAIR_ATTR_MASK 0xff
218*3942d3a8SSheetal Tigadoli #define ARM_LPAE_MAIR_ATTR_DEVICE 0x04
219*3942d3a8SSheetal Tigadoli #define ARM_LPAE_MAIR_ATTR_NC 0x44
220*3942d3a8SSheetal Tigadoli #define ARM_LPAE_MAIR_ATTR_WBRWA 0xff
221*3942d3a8SSheetal Tigadoli #define ARM_LPAE_MAIR_ATTR_IDX_NC 0
222*3942d3a8SSheetal Tigadoli #define ARM_LPAE_MAIR_ATTR_IDX_CACHE 1
223*3942d3a8SSheetal Tigadoli #define ARM_LPAE_MAIR_ATTR_IDX_DEV 2
224*3942d3a8SSheetal Tigadoli
225*3942d3a8SSheetal Tigadoli #define TTBRn_ASID_SHIFT 48
226*3942d3a8SSheetal Tigadoli #define TTBCR2_SEP_SHIFT 15
227*3942d3a8SSheetal Tigadoli #define TTBCR2_SEP_UPSTREAM (0x7 << TTBCR2_SEP_SHIFT)
228*3942d3a8SSheetal Tigadoli #define TTBCR2_AS (1 << 4)
229*3942d3a8SSheetal Tigadoli #define TTBCR_T0SZ(ia_bits) (64 - (ia_bits))
230*3942d3a8SSheetal Tigadoli
231*3942d3a8SSheetal Tigadoli #define S2CR_PRIVCFG_SHIFT 24
232*3942d3a8SSheetal Tigadoli #define S2CR_PRIVCFG_MASK 0x3
233*3942d3a8SSheetal Tigadoli
234*3942d3a8SSheetal Tigadoli /**************************************************************/
235*3942d3a8SSheetal Tigadoli
236*3942d3a8SSheetal Tigadoli uint16_t paxc_stream_ids[] = { 0x2000 };
237*3942d3a8SSheetal Tigadoli
238*3942d3a8SSheetal Tigadoli uint16_t paxc_stream_ids_mask[] = { 0x1fff };
239*3942d3a8SSheetal Tigadoli uint16_t crmu_stream_ids[] = { CRMU_STREAM_ID };
240*3942d3a8SSheetal Tigadoli uint16_t crmu_stream_ids_mask[] = { 0x0 };
241*3942d3a8SSheetal Tigadoli
242*3942d3a8SSheetal Tigadoli enum arm_smmu_s2cr_type {
243*3942d3a8SSheetal Tigadoli S2CR_TYPE_TRANS,
244*3942d3a8SSheetal Tigadoli S2CR_TYPE_BYPASS,
245*3942d3a8SSheetal Tigadoli S2CR_TYPE_FAULT,
246*3942d3a8SSheetal Tigadoli };
247*3942d3a8SSheetal Tigadoli
248*3942d3a8SSheetal Tigadoli enum arm_smmu_s2cr_privcfg {
249*3942d3a8SSheetal Tigadoli S2CR_PRIVCFG_DEFAULT,
250*3942d3a8SSheetal Tigadoli S2CR_PRIVCFG_DIPAN,
251*3942d3a8SSheetal Tigadoli S2CR_PRIVCFG_UNPRIV,
252*3942d3a8SSheetal Tigadoli S2CR_PRIVCFG_PRIV,
253*3942d3a8SSheetal Tigadoli };
254*3942d3a8SSheetal Tigadoli
255*3942d3a8SSheetal Tigadoli struct arm_smmu_smr {
256*3942d3a8SSheetal Tigadoli uint16_t mask;
257*3942d3a8SSheetal Tigadoli uint16_t id;
258*3942d3a8SSheetal Tigadoli uint32_t valid;
259*3942d3a8SSheetal Tigadoli };
260*3942d3a8SSheetal Tigadoli
261*3942d3a8SSheetal Tigadoli struct arm_smmu_s2cr {
262*3942d3a8SSheetal Tigadoli int count;
263*3942d3a8SSheetal Tigadoli enum arm_smmu_s2cr_type type;
264*3942d3a8SSheetal Tigadoli enum arm_smmu_s2cr_privcfg privcfg;
265*3942d3a8SSheetal Tigadoli uint8_t cbndx;
266*3942d3a8SSheetal Tigadoli };
267*3942d3a8SSheetal Tigadoli
268*3942d3a8SSheetal Tigadoli struct arm_smmu_cfg {
269*3942d3a8SSheetal Tigadoli uint8_t cbndx;
270*3942d3a8SSheetal Tigadoli uint8_t irptndx;
271*3942d3a8SSheetal Tigadoli uint32_t cbar;
272*3942d3a8SSheetal Tigadoli };
273*3942d3a8SSheetal Tigadoli
274*3942d3a8SSheetal Tigadoli struct arm_smmu_device {
275*3942d3a8SSheetal Tigadoli uint8_t *base;
276*3942d3a8SSheetal Tigadoli uint32_t streams;
277*3942d3a8SSheetal Tigadoli unsigned long size;
278*3942d3a8SSheetal Tigadoli unsigned long pgshift;
279*3942d3a8SSheetal Tigadoli unsigned long va_size;
280*3942d3a8SSheetal Tigadoli unsigned long ipa_size;
281*3942d3a8SSheetal Tigadoli unsigned long pa_size;
282*3942d3a8SSheetal Tigadoli struct arm_smmu_smr smr[NUM_OF_SMRS];
283*3942d3a8SSheetal Tigadoli struct arm_smmu_s2cr s2cr[NUM_OF_SMRS];
284*3942d3a8SSheetal Tigadoli struct arm_smmu_cfg cfg[NUM_OF_SMRS];
285*3942d3a8SSheetal Tigadoli uint16_t *stream_ids;
286*3942d3a8SSheetal Tigadoli uint16_t *stream_ids_mask;
287*3942d3a8SSheetal Tigadoli };
288*3942d3a8SSheetal Tigadoli
arm_smmu_enable_secure_client_port(void)289*3942d3a8SSheetal Tigadoli void arm_smmu_enable_secure_client_port(void)
290*3942d3a8SSheetal Tigadoli {
291*3942d3a8SSheetal Tigadoli uintptr_t smmu_base = SMMU_BASE;
292*3942d3a8SSheetal Tigadoli
293*3942d3a8SSheetal Tigadoli mmio_clrbits_32(smmu_base, sCR0_CLIENTPD);
294*3942d3a8SSheetal Tigadoli }
295*3942d3a8SSheetal Tigadoli
arm_smmu_reserve_secure_cntxt(void)296*3942d3a8SSheetal Tigadoli void arm_smmu_reserve_secure_cntxt(void)
297*3942d3a8SSheetal Tigadoli {
298*3942d3a8SSheetal Tigadoli uintptr_t smmu_base = SMMU_BASE;
299*3942d3a8SSheetal Tigadoli
300*3942d3a8SSheetal Tigadoli mmio_clrsetbits_32(smmu_base + ARM_SMMU_SMMU_SCR1,
301*3942d3a8SSheetal Tigadoli (SCR1_NSNUMSMRGO_MASK | SCR1_NSNUMCBO_MASK),
302*3942d3a8SSheetal Tigadoli ((ARM_SMMU_NSNUMCBO << SCR1_NSNUMCBO_SHIFT) |
303*3942d3a8SSheetal Tigadoli (ARM_SMMU_NSNUMSMRGO << SCR1_NSNUMSMRGO_SHIFT)));
304*3942d3a8SSheetal Tigadoli }
305*3942d3a8SSheetal Tigadoli
arm_smmu_smr_cfg(struct arm_smmu_device * smmu,uint32_t index)306*3942d3a8SSheetal Tigadoli static void arm_smmu_smr_cfg(struct arm_smmu_device *smmu, uint32_t index)
307*3942d3a8SSheetal Tigadoli {
308*3942d3a8SSheetal Tigadoli uint32_t idx = smmu->cfg[index].cbndx;
309*3942d3a8SSheetal Tigadoli struct arm_smmu_smr *smr = &smmu->smr[index];
310*3942d3a8SSheetal Tigadoli uint32_t reg = smr->id << SMR_ID_SHIFT | smr->mask << SMR_MASK_SHIFT;
311*3942d3a8SSheetal Tigadoli
312*3942d3a8SSheetal Tigadoli if (smr->valid)
313*3942d3a8SSheetal Tigadoli reg |= SMR_VALID;
314*3942d3a8SSheetal Tigadoli
315*3942d3a8SSheetal Tigadoli mmio_write_32((uintptr_t) (ARM_SMMU_GR0(smmu) +
316*3942d3a8SSheetal Tigadoli ARM_SMMU_GR0_SMR(idx)), reg);
317*3942d3a8SSheetal Tigadoli }
318*3942d3a8SSheetal Tigadoli
arm_smmu_s2cr_cfg(struct arm_smmu_device * smmu,uint32_t index)319*3942d3a8SSheetal Tigadoli static void arm_smmu_s2cr_cfg(struct arm_smmu_device *smmu, uint32_t index)
320*3942d3a8SSheetal Tigadoli {
321*3942d3a8SSheetal Tigadoli uint32_t idx = smmu->cfg[index].cbndx;
322*3942d3a8SSheetal Tigadoli struct arm_smmu_s2cr *s2cr = &smmu->s2cr[index];
323*3942d3a8SSheetal Tigadoli
324*3942d3a8SSheetal Tigadoli uint32_t reg = (s2cr->type & S2CR_TYPE_MASK) << S2CR_TYPE_SHIFT |
325*3942d3a8SSheetal Tigadoli (s2cr->cbndx & S2CR_CBNDX_MASK) << S2CR_CBNDX_SHIFT |
326*3942d3a8SSheetal Tigadoli (s2cr->privcfg & S2CR_PRIVCFG_MASK) << S2CR_PRIVCFG_SHIFT;
327*3942d3a8SSheetal Tigadoli
328*3942d3a8SSheetal Tigadoli mmio_write_32((uintptr_t) (ARM_SMMU_GR0(smmu) +
329*3942d3a8SSheetal Tigadoli ARM_SMMU_GR0_S2CR(idx)), reg);
330*3942d3a8SSheetal Tigadoli }
331*3942d3a8SSheetal Tigadoli
smmu_set_pgtbl(struct arm_smmu_device * smmu,enum iommu_domain dom,uint64_t * pg_table_base)332*3942d3a8SSheetal Tigadoli static void smmu_set_pgtbl(struct arm_smmu_device *smmu,
333*3942d3a8SSheetal Tigadoli enum iommu_domain dom,
334*3942d3a8SSheetal Tigadoli uint64_t *pg_table_base)
335*3942d3a8SSheetal Tigadoli {
336*3942d3a8SSheetal Tigadoli int i, l0_index, l1_index;
337*3942d3a8SSheetal Tigadoli uint64_t addr, *pte, *l0_base, *l1_base;
338*3942d3a8SSheetal Tigadoli uint64_t addr_space_limit;
339*3942d3a8SSheetal Tigadoli
340*3942d3a8SSheetal Tigadoli if (dom == PCIE_PAXC) {
341*3942d3a8SSheetal Tigadoli addr_space_limit = 0xffffffffff;
342*3942d3a8SSheetal Tigadoli } else if (dom == DOMAIN_CRMU) {
343*3942d3a8SSheetal Tigadoli addr_space_limit = 0xffffffff;
344*3942d3a8SSheetal Tigadoli } else {
345*3942d3a8SSheetal Tigadoli ERROR("dom is not supported\n");
346*3942d3a8SSheetal Tigadoli return;
347*3942d3a8SSheetal Tigadoli }
348*3942d3a8SSheetal Tigadoli
349*3942d3a8SSheetal Tigadoli l0_base = pg_table_base;
350*3942d3a8SSheetal Tigadoli /* clear L0 descriptors. */
351*3942d3a8SSheetal Tigadoli for (i = 0; i < ARM_LPAE_PGTBL_PTE_CNT; i++)
352*3942d3a8SSheetal Tigadoli l0_base[i] = 0x0;
353*3942d3a8SSheetal Tigadoli
354*3942d3a8SSheetal Tigadoli addr = 0x0;
355*3942d3a8SSheetal Tigadoli while (addr < addr_space_limit) {
356*3942d3a8SSheetal Tigadoli /* find L0 pte */
357*3942d3a8SSheetal Tigadoli l0_index = ((addr >> ARM_LPAE_PTE_L0_INDEX_SHIFT) &
358*3942d3a8SSheetal Tigadoli ARM_LPAE_PTE_L0_INDEX_MASK);
359*3942d3a8SSheetal Tigadoli l1_base = l0_base + ((l0_index + 1) * ARM_LPAE_PGTBL_PTE_CNT);
360*3942d3a8SSheetal Tigadoli
361*3942d3a8SSheetal Tigadoli /* setup L0 pte if required */
362*3942d3a8SSheetal Tigadoli pte = l0_base + l0_index;
363*3942d3a8SSheetal Tigadoli if (*pte == 0x0) {
364*3942d3a8SSheetal Tigadoli *pte |= ((uint64_t)l1_base & ARM_LPAE_PTE_TABLE_MASK);
365*3942d3a8SSheetal Tigadoli if (dom == PCIE_PAXC)
366*3942d3a8SSheetal Tigadoli *pte |= ARM_LPAE_PTE_NSTABLE;
367*3942d3a8SSheetal Tigadoli *pte |= ARM_LPAE_PTE_TABLE;
368*3942d3a8SSheetal Tigadoli *pte |= ARM_LPAE_PTE_VALID;
369*3942d3a8SSheetal Tigadoli }
370*3942d3a8SSheetal Tigadoli
371*3942d3a8SSheetal Tigadoli /* find L1 pte */
372*3942d3a8SSheetal Tigadoli l1_index = ((addr >> ARM_LPAE_PTE_L1_INDEX_SHIFT) &
373*3942d3a8SSheetal Tigadoli ARM_LPAE_PTE_L1_INDEX_MASK);
374*3942d3a8SSheetal Tigadoli pte = l1_base + l1_index;
375*3942d3a8SSheetal Tigadoli
376*3942d3a8SSheetal Tigadoli /* setup L1 pte */
377*3942d3a8SSheetal Tigadoli *pte = 0x0;
378*3942d3a8SSheetal Tigadoli *pte |= (addr & ARM_LPAE_PTE_L1_ADDR_MASK);
379*3942d3a8SSheetal Tigadoli if (addr < 0x80000000) {
380*3942d3a8SSheetal Tigadoli *pte |= (ARM_LPAE_MAIR_ATTR_IDX_DEV <<
381*3942d3a8SSheetal Tigadoli ARM_LPAE_PTE_ATTRINDX);
382*3942d3a8SSheetal Tigadoli if (dom == PCIE_PAXC)
383*3942d3a8SSheetal Tigadoli *pte |= (1 << ARM_LPAE_PTE_NS);
384*3942d3a8SSheetal Tigadoli } else {
385*3942d3a8SSheetal Tigadoli *pte |= (ARM_LPAE_MAIR_ATTR_IDX_CACHE <<
386*3942d3a8SSheetal Tigadoli ARM_LPAE_PTE_ATTRINDX);
387*3942d3a8SSheetal Tigadoli *pte |= (1 << ARM_LPAE_PTE_NS);
388*3942d3a8SSheetal Tigadoli }
389*3942d3a8SSheetal Tigadoli *pte |= (ARM_LPAE_PTE_AP_EL0_RW << ARM_LPAE_PTE_AP);
390*3942d3a8SSheetal Tigadoli *pte |= (ARM_LPAE_PTE_SH_INNER << ARM_LPAE_PTE_SH);
391*3942d3a8SSheetal Tigadoli *pte |= (1 << ARM_LPAE_PTE_AF);
392*3942d3a8SSheetal Tigadoli *pte |= ARM_LPAE_PTE_VALID;
393*3942d3a8SSheetal Tigadoli
394*3942d3a8SSheetal Tigadoli addr += ARM_LPAE_PTE_L1_BLOCK_SIZE;
395*3942d3a8SSheetal Tigadoli }
396*3942d3a8SSheetal Tigadoli }
397*3942d3a8SSheetal Tigadoli
arm_smmu_create_identity_map(enum iommu_domain dom)398*3942d3a8SSheetal Tigadoli void arm_smmu_create_identity_map(enum iommu_domain dom)
399*3942d3a8SSheetal Tigadoli {
400*3942d3a8SSheetal Tigadoli struct arm_smmu_device iommu;
401*3942d3a8SSheetal Tigadoli struct arm_smmu_device *smmu = &iommu;
402*3942d3a8SSheetal Tigadoli uint32_t reg, reg2;
403*3942d3a8SSheetal Tigadoli unsigned long long reg64;
404*3942d3a8SSheetal Tigadoli uint32_t idx;
405*3942d3a8SSheetal Tigadoli uint16_t asid;
406*3942d3a8SSheetal Tigadoli unsigned int context_bank_index;
407*3942d3a8SSheetal Tigadoli unsigned long long pg_table_base;
408*3942d3a8SSheetal Tigadoli
409*3942d3a8SSheetal Tigadoli smmu->base = (uint8_t *) SMMU_BASE;
410*3942d3a8SSheetal Tigadoli reg = mmio_read_32((uintptr_t) (ARM_SMMU_GR0(smmu) + ARM_SMMU_GR0_ID1));
411*3942d3a8SSheetal Tigadoli smmu->pgshift = (reg & ID1_PAGESIZE) ? 16 : 12;
412*3942d3a8SSheetal Tigadoli smmu->size = ARM_SMMU_RES_SIZE;
413*3942d3a8SSheetal Tigadoli smmu->stream_ids = NULL;
414*3942d3a8SSheetal Tigadoli
415*3942d3a8SSheetal Tigadoli switch (dom) {
416*3942d3a8SSheetal Tigadoli case PCIE_PAXC:
417*3942d3a8SSheetal Tigadoli smmu->stream_ids = &paxc_stream_ids[0];
418*3942d3a8SSheetal Tigadoli smmu->stream_ids_mask = &paxc_stream_ids_mask[0];
419*3942d3a8SSheetal Tigadoli smmu->streams = ARRAY_SIZE(paxc_stream_ids);
420*3942d3a8SSheetal Tigadoli context_bank_index = SMMU_CTX_BANK_IDX;
421*3942d3a8SSheetal Tigadoli pg_table_base = ARM_LPAE_PGTBL_PHYS;
422*3942d3a8SSheetal Tigadoli break;
423*3942d3a8SSheetal Tigadoli case DOMAIN_CRMU:
424*3942d3a8SSheetal Tigadoli smmu->stream_ids = &crmu_stream_ids[0];
425*3942d3a8SSheetal Tigadoli smmu->stream_ids_mask = &crmu_stream_ids_mask[0];
426*3942d3a8SSheetal Tigadoli smmu->streams = ARRAY_SIZE(crmu_stream_ids);
427*3942d3a8SSheetal Tigadoli context_bank_index = SMMU_CTX_BANK_IDX_SECURE_CRMU;
428*3942d3a8SSheetal Tigadoli pg_table_base = ARM_LPAE_PGTBL_PHYS_CRMU;
429*3942d3a8SSheetal Tigadoli break;
430*3942d3a8SSheetal Tigadoli default:
431*3942d3a8SSheetal Tigadoli ERROR("domain not supported\n");
432*3942d3a8SSheetal Tigadoli return;
433*3942d3a8SSheetal Tigadoli }
434*3942d3a8SSheetal Tigadoli
435*3942d3a8SSheetal Tigadoli if (smmu->streams > NUM_OF_SMRS) {
436*3942d3a8SSheetal Tigadoli INFO("can not support more than %d sids\n", NUM_OF_SMRS);
437*3942d3a8SSheetal Tigadoli return;
438*3942d3a8SSheetal Tigadoli }
439*3942d3a8SSheetal Tigadoli
440*3942d3a8SSheetal Tigadoli /* set up iommu dev. */
441*3942d3a8SSheetal Tigadoli for (idx = 0; idx < smmu->streams; idx++) {
442*3942d3a8SSheetal Tigadoli /* S2CR. */
443*3942d3a8SSheetal Tigadoli smmu->s2cr[idx].type = S2CR_TYPE_TRANS;
444*3942d3a8SSheetal Tigadoli smmu->s2cr[idx].privcfg = S2CR_PRIVCFG_DEFAULT;
445*3942d3a8SSheetal Tigadoli smmu->s2cr[idx].cbndx = context_bank_index;
446*3942d3a8SSheetal Tigadoli smmu->cfg[idx].cbndx = context_bank_index;
447*3942d3a8SSheetal Tigadoli smmu->cfg[idx].cbar = STG1_WITH_STG2_BYPASS << CBAR_TYPE_SHIFT;
448*3942d3a8SSheetal Tigadoli arm_smmu_s2cr_cfg(smmu, idx);
449*3942d3a8SSheetal Tigadoli
450*3942d3a8SSheetal Tigadoli /* SMR. */
451*3942d3a8SSheetal Tigadoli smmu->smr[idx].mask = smmu->stream_ids_mask[idx];
452*3942d3a8SSheetal Tigadoli smmu->smr[idx].id = smmu->stream_ids[idx];
453*3942d3a8SSheetal Tigadoli smmu->smr[idx].valid = 1;
454*3942d3a8SSheetal Tigadoli arm_smmu_smr_cfg(smmu, idx);
455*3942d3a8SSheetal Tigadoli
456*3942d3a8SSheetal Tigadoli /* CBA2R. 64-bit Translation */
457*3942d3a8SSheetal Tigadoli mmio_write_32((uintptr_t) (ARM_SMMU_GR1(smmu) +
458*3942d3a8SSheetal Tigadoli ARM_SMMU_GR1_CBA2R(smmu->cfg[idx].cbndx)),
459*3942d3a8SSheetal Tigadoli 0x1);
460*3942d3a8SSheetal Tigadoli /* CBAR.*/
461*3942d3a8SSheetal Tigadoli reg = smmu->cfg[idx].cbar;
462*3942d3a8SSheetal Tigadoli reg |= (CBAR_S1_BPSHCFG_NSH << CBAR_S1_BPSHCFG_SHIFT) |
463*3942d3a8SSheetal Tigadoli (CBAR_S1_MEMATTR_WB << CBAR_S1_MEMATTR_SHIFT);
464*3942d3a8SSheetal Tigadoli
465*3942d3a8SSheetal Tigadoli mmio_write_32((uintptr_t) (ARM_SMMU_GR1(smmu) +
466*3942d3a8SSheetal Tigadoli ARM_SMMU_GR1_CBAR(smmu->cfg[idx].cbndx)),
467*3942d3a8SSheetal Tigadoli reg);
468*3942d3a8SSheetal Tigadoli
469*3942d3a8SSheetal Tigadoli /* TTBCR. */
470*3942d3a8SSheetal Tigadoli reg64 = (ARM_LPAE_TCR_SH_IS << ARM_LPAE_TCR_SH0_SHIFT) |
471*3942d3a8SSheetal Tigadoli (ARM_LPAE_TCR_RGN_WBWA << ARM_LPAE_TCR_IRGN0_SHIFT) |
472*3942d3a8SSheetal Tigadoli (ARM_LPAE_TCR_RGN_WBWA << ARM_LPAE_TCR_ORGN0_SHIFT);
473*3942d3a8SSheetal Tigadoli reg64 |= ARM_LPAE_TCR_TG0_4K;
474*3942d3a8SSheetal Tigadoli reg64 |= (ARM_LPAE_TCR_PS_40_BIT << ARM_LPAE_TCR_IPS_SHIFT);
475*3942d3a8SSheetal Tigadoli /* ias 40 bits.*/
476*3942d3a8SSheetal Tigadoli reg64 |= TTBCR_T0SZ(40) << ARM_LPAE_TCR_T0SZ_SHIFT;
477*3942d3a8SSheetal Tigadoli /* Disable speculative walks through TTBR1 */
478*3942d3a8SSheetal Tigadoli reg64 |= ARM_LPAE_TCR_EPD1;
479*3942d3a8SSheetal Tigadoli reg = (uint32_t) reg64;
480*3942d3a8SSheetal Tigadoli reg2 = (uint32_t) (reg64 >> 32);
481*3942d3a8SSheetal Tigadoli reg2 |= TTBCR2_SEP_UPSTREAM;
482*3942d3a8SSheetal Tigadoli reg2 |= TTBCR2_AS;
483*3942d3a8SSheetal Tigadoli
484*3942d3a8SSheetal Tigadoli mmio_write_32((uintptr_t) (ARM_SMMU_CB_BASE(smmu) +
485*3942d3a8SSheetal Tigadoli ARM_SMMU_CB(smmu, smmu->cfg[idx].cbndx) +
486*3942d3a8SSheetal Tigadoli ARM_SMMU_CB_TTBCR2), reg2);
487*3942d3a8SSheetal Tigadoli
488*3942d3a8SSheetal Tigadoli mmio_write_32((uintptr_t) (ARM_SMMU_CB_BASE(smmu) +
489*3942d3a8SSheetal Tigadoli ARM_SMMU_CB(smmu, smmu->cfg[idx].cbndx) +
490*3942d3a8SSheetal Tigadoli ARM_SMMU_CB_TTBCR), reg);
491*3942d3a8SSheetal Tigadoli
492*3942d3a8SSheetal Tigadoli /* TTBR0. */
493*3942d3a8SSheetal Tigadoli asid = smmu->cfg[idx].cbndx;
494*3942d3a8SSheetal Tigadoli reg64 = pg_table_base;
495*3942d3a8SSheetal Tigadoli reg64 |= (unsigned long long) asid << TTBRn_ASID_SHIFT;
496*3942d3a8SSheetal Tigadoli
497*3942d3a8SSheetal Tigadoli mmio_write_64((uintptr_t) (ARM_SMMU_CB_BASE(smmu) +
498*3942d3a8SSheetal Tigadoli ARM_SMMU_CB(smmu, smmu->cfg[idx].cbndx) +
499*3942d3a8SSheetal Tigadoli ARM_SMMU_CB_TTBR0), reg64);
500*3942d3a8SSheetal Tigadoli /* TTBR1. */
501*3942d3a8SSheetal Tigadoli reg64 = 0;
502*3942d3a8SSheetal Tigadoli reg64 |= (unsigned long long) asid << TTBRn_ASID_SHIFT;
503*3942d3a8SSheetal Tigadoli
504*3942d3a8SSheetal Tigadoli mmio_write_64((uintptr_t) (ARM_SMMU_CB_BASE(smmu) +
505*3942d3a8SSheetal Tigadoli ARM_SMMU_CB(smmu, smmu->cfg[idx].cbndx) +
506*3942d3a8SSheetal Tigadoli ARM_SMMU_CB_TTBR1), reg64);
507*3942d3a8SSheetal Tigadoli /* MAIR. */
508*3942d3a8SSheetal Tigadoli reg = (ARM_LPAE_MAIR_ATTR_NC
509*3942d3a8SSheetal Tigadoli << ARM_LPAE_MAIR_ATTR_SHIFT
510*3942d3a8SSheetal Tigadoli (ARM_LPAE_MAIR_ATTR_IDX_NC)) |
511*3942d3a8SSheetal Tigadoli (ARM_LPAE_MAIR_ATTR_WBRWA <<
512*3942d3a8SSheetal Tigadoli ARM_LPAE_MAIR_ATTR_SHIFT
513*3942d3a8SSheetal Tigadoli (ARM_LPAE_MAIR_ATTR_IDX_CACHE)) |
514*3942d3a8SSheetal Tigadoli (ARM_LPAE_MAIR_ATTR_DEVICE <<
515*3942d3a8SSheetal Tigadoli ARM_LPAE_MAIR_ATTR_SHIFT
516*3942d3a8SSheetal Tigadoli (ARM_LPAE_MAIR_ATTR_IDX_DEV));
517*3942d3a8SSheetal Tigadoli
518*3942d3a8SSheetal Tigadoli mmio_write_32((uintptr_t) (ARM_SMMU_CB_BASE(smmu) +
519*3942d3a8SSheetal Tigadoli ARM_SMMU_CB(smmu, smmu->cfg[idx].cbndx) +
520*3942d3a8SSheetal Tigadoli ARM_SMMU_CB_S1_MAIR0), reg);
521*3942d3a8SSheetal Tigadoli
522*3942d3a8SSheetal Tigadoli /* MAIR1. */
523*3942d3a8SSheetal Tigadoli reg = 0;
524*3942d3a8SSheetal Tigadoli mmio_write_32((uintptr_t) (ARM_SMMU_CB_BASE(smmu) +
525*3942d3a8SSheetal Tigadoli ARM_SMMU_CB(smmu, smmu->cfg[idx].cbndx) +
526*3942d3a8SSheetal Tigadoli ARM_SMMU_CB_S1_MAIR1), reg);
527*3942d3a8SSheetal Tigadoli /* SCTLR. */
528*3942d3a8SSheetal Tigadoli reg = SCTLR_CFIE | SCTLR_CFRE | SCTLR_AFE | SCTLR_TRE | SCTLR_M;
529*3942d3a8SSheetal Tigadoli /* stage 1.*/
530*3942d3a8SSheetal Tigadoli reg |= SCTLR_S1_ASIDPNE;
531*3942d3a8SSheetal Tigadoli mmio_write_32((uintptr_t) (ARM_SMMU_CB_BASE(smmu) +
532*3942d3a8SSheetal Tigadoli ARM_SMMU_CB(smmu, smmu->cfg[idx].cbndx) +
533*3942d3a8SSheetal Tigadoli ARM_SMMU_CB_SCTLR), reg);
534*3942d3a8SSheetal Tigadoli }
535*3942d3a8SSheetal Tigadoli smmu_set_pgtbl(smmu, dom, (uint64_t *)pg_table_base);
536*3942d3a8SSheetal Tigadoli }
537