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 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 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 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 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 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 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