1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * Copyright (c) 2020, NVIDIA Corporation. All rights reserved. 4*91f16700Schasinglulu * 5*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 6*91f16700Schasinglulu */ 7*91f16700Schasinglulu 8*91f16700Schasinglulu #include <assert.h> 9*91f16700Schasinglulu #include <common/bl_common.h> 10*91f16700Schasinglulu 11*91f16700Schasinglulu #include <mce.h> 12*91f16700Schasinglulu #include <memctrl_v2.h> 13*91f16700Schasinglulu #include <tegra186_private.h> 14*91f16700Schasinglulu #include <tegra_mc_def.h> 15*91f16700Schasinglulu #include <tegra_platform.h> 16*91f16700Schasinglulu #include <tegra_private.h> 17*91f16700Schasinglulu 18*91f16700Schasinglulu extern uint64_t tegra_bl31_phys_base; 19*91f16700Schasinglulu 20*91f16700Schasinglulu /******************************************************************************* 21*91f16700Schasinglulu * Array to hold stream_id override config register offsets 22*91f16700Schasinglulu ******************************************************************************/ 23*91f16700Schasinglulu static const uint32_t tegra186_streamid_override_regs[] = { 24*91f16700Schasinglulu MC_STREAMID_OVERRIDE_CFG_SDMMCRA, 25*91f16700Schasinglulu MC_STREAMID_OVERRIDE_CFG_SDMMCRAA, 26*91f16700Schasinglulu MC_STREAMID_OVERRIDE_CFG_SDMMCR, 27*91f16700Schasinglulu MC_STREAMID_OVERRIDE_CFG_SDMMCRAB, 28*91f16700Schasinglulu MC_STREAMID_OVERRIDE_CFG_SDMMCWA, 29*91f16700Schasinglulu MC_STREAMID_OVERRIDE_CFG_SDMMCWAA, 30*91f16700Schasinglulu MC_STREAMID_OVERRIDE_CFG_SDMMCW, 31*91f16700Schasinglulu MC_STREAMID_OVERRIDE_CFG_SDMMCWAB, 32*91f16700Schasinglulu }; 33*91f16700Schasinglulu 34*91f16700Schasinglulu /******************************************************************************* 35*91f16700Schasinglulu * Array to hold the security configs for stream IDs 36*91f16700Schasinglulu ******************************************************************************/ 37*91f16700Schasinglulu static const mc_streamid_security_cfg_t tegra186_streamid_sec_cfgs[] = { 38*91f16700Schasinglulu mc_make_sec_cfg(SCEW, NON_SECURE, NO_OVERRIDE, DISABLE), 39*91f16700Schasinglulu mc_make_sec_cfg(AFIR, NON_SECURE, OVERRIDE, DISABLE), 40*91f16700Schasinglulu mc_make_sec_cfg(AFIW, NON_SECURE, OVERRIDE, DISABLE), 41*91f16700Schasinglulu mc_make_sec_cfg(NVDISPLAYR1, NON_SECURE, OVERRIDE, DISABLE), 42*91f16700Schasinglulu mc_make_sec_cfg(XUSB_DEVR, NON_SECURE, OVERRIDE, ENABLE), 43*91f16700Schasinglulu mc_make_sec_cfg(VICSRD1, NON_SECURE, NO_OVERRIDE, DISABLE), 44*91f16700Schasinglulu mc_make_sec_cfg(NVENCSWR, NON_SECURE, NO_OVERRIDE, DISABLE), 45*91f16700Schasinglulu mc_make_sec_cfg(TSECSRDB, NON_SECURE, NO_OVERRIDE, DISABLE), 46*91f16700Schasinglulu mc_make_sec_cfg(AXISW, SECURE, NO_OVERRIDE, DISABLE), 47*91f16700Schasinglulu mc_make_sec_cfg(SDMMCWAB, NON_SECURE, OVERRIDE, DISABLE), 48*91f16700Schasinglulu mc_make_sec_cfg(AONDMAW, NON_SECURE, NO_OVERRIDE, DISABLE), 49*91f16700Schasinglulu mc_make_sec_cfg(GPUSWR2, SECURE, NO_OVERRIDE, DISABLE), 50*91f16700Schasinglulu mc_make_sec_cfg(SATAW, NON_SECURE, OVERRIDE, DISABLE), 51*91f16700Schasinglulu mc_make_sec_cfg(UFSHCW, NON_SECURE, OVERRIDE, DISABLE), 52*91f16700Schasinglulu mc_make_sec_cfg(SDMMCR, NON_SECURE, OVERRIDE, DISABLE), 53*91f16700Schasinglulu mc_make_sec_cfg(SCEDMAW, NON_SECURE, NO_OVERRIDE, DISABLE), 54*91f16700Schasinglulu mc_make_sec_cfg(UFSHCR, NON_SECURE, OVERRIDE, DISABLE), 55*91f16700Schasinglulu mc_make_sec_cfg(SDMMCWAA, NON_SECURE, OVERRIDE, DISABLE), 56*91f16700Schasinglulu mc_make_sec_cfg(SESWR, NON_SECURE, NO_OVERRIDE, DISABLE), 57*91f16700Schasinglulu mc_make_sec_cfg(MPCORER, NON_SECURE, OVERRIDE, DISABLE), 58*91f16700Schasinglulu mc_make_sec_cfg(PTCR, NON_SECURE, OVERRIDE, DISABLE), 59*91f16700Schasinglulu mc_make_sec_cfg(BPMPW, NON_SECURE, NO_OVERRIDE, DISABLE), 60*91f16700Schasinglulu mc_make_sec_cfg(ETRW, NON_SECURE, OVERRIDE, DISABLE), 61*91f16700Schasinglulu mc_make_sec_cfg(GPUSRD, SECURE, NO_OVERRIDE, DISABLE), 62*91f16700Schasinglulu mc_make_sec_cfg(VICSWR, NON_SECURE, NO_OVERRIDE, DISABLE), 63*91f16700Schasinglulu mc_make_sec_cfg(SCEDMAR, NON_SECURE, NO_OVERRIDE, DISABLE), 64*91f16700Schasinglulu mc_make_sec_cfg(HDAW, NON_SECURE, OVERRIDE, DISABLE), 65*91f16700Schasinglulu mc_make_sec_cfg(ISPWA, NON_SECURE, OVERRIDE, ENABLE), 66*91f16700Schasinglulu mc_make_sec_cfg(EQOSW, NON_SECURE, OVERRIDE, DISABLE), 67*91f16700Schasinglulu mc_make_sec_cfg(XUSB_HOSTW, NON_SECURE, OVERRIDE, ENABLE), 68*91f16700Schasinglulu mc_make_sec_cfg(TSECSWR, NON_SECURE, NO_OVERRIDE, DISABLE), 69*91f16700Schasinglulu mc_make_sec_cfg(SDMMCRAA, NON_SECURE, OVERRIDE, DISABLE), 70*91f16700Schasinglulu mc_make_sec_cfg(VIW, NON_SECURE, OVERRIDE, ENABLE), 71*91f16700Schasinglulu mc_make_sec_cfg(AXISR, SECURE, NO_OVERRIDE, DISABLE), 72*91f16700Schasinglulu mc_make_sec_cfg(SDMMCW, NON_SECURE, OVERRIDE, DISABLE), 73*91f16700Schasinglulu mc_make_sec_cfg(BPMPDMAW, NON_SECURE, NO_OVERRIDE, DISABLE), 74*91f16700Schasinglulu mc_make_sec_cfg(ISPRA, NON_SECURE, OVERRIDE, ENABLE), 75*91f16700Schasinglulu mc_make_sec_cfg(NVDECSWR, NON_SECURE, NO_OVERRIDE, DISABLE), 76*91f16700Schasinglulu mc_make_sec_cfg(XUSB_DEVW, NON_SECURE, OVERRIDE, ENABLE), 77*91f16700Schasinglulu mc_make_sec_cfg(NVDECSRD, NON_SECURE, NO_OVERRIDE, DISABLE), 78*91f16700Schasinglulu mc_make_sec_cfg(MPCOREW, NON_SECURE, OVERRIDE, DISABLE), 79*91f16700Schasinglulu mc_make_sec_cfg(NVDISPLAYR, NON_SECURE, OVERRIDE, DISABLE), 80*91f16700Schasinglulu mc_make_sec_cfg(BPMPDMAR, NON_SECURE, NO_OVERRIDE, DISABLE), 81*91f16700Schasinglulu mc_make_sec_cfg(NVJPGSWR, NON_SECURE, NO_OVERRIDE, DISABLE), 82*91f16700Schasinglulu mc_make_sec_cfg(NVDECSRD1, NON_SECURE, NO_OVERRIDE, DISABLE), 83*91f16700Schasinglulu mc_make_sec_cfg(TSECSRD, NON_SECURE, NO_OVERRIDE, DISABLE), 84*91f16700Schasinglulu mc_make_sec_cfg(NVJPGSRD, NON_SECURE, NO_OVERRIDE, DISABLE), 85*91f16700Schasinglulu mc_make_sec_cfg(SDMMCWA, NON_SECURE, OVERRIDE, DISABLE), 86*91f16700Schasinglulu mc_make_sec_cfg(SCER, NON_SECURE, NO_OVERRIDE, DISABLE), 87*91f16700Schasinglulu mc_make_sec_cfg(XUSB_HOSTR, NON_SECURE, OVERRIDE, ENABLE), 88*91f16700Schasinglulu mc_make_sec_cfg(VICSRD, NON_SECURE, NO_OVERRIDE, DISABLE), 89*91f16700Schasinglulu mc_make_sec_cfg(AONDMAR, NON_SECURE, NO_OVERRIDE, DISABLE), 90*91f16700Schasinglulu mc_make_sec_cfg(AONW, NON_SECURE, NO_OVERRIDE, DISABLE), 91*91f16700Schasinglulu mc_make_sec_cfg(SDMMCRA, NON_SECURE, OVERRIDE, DISABLE), 92*91f16700Schasinglulu mc_make_sec_cfg(HOST1XDMAR, NON_SECURE, NO_OVERRIDE, DISABLE), 93*91f16700Schasinglulu mc_make_sec_cfg(EQOSR, NON_SECURE, OVERRIDE, DISABLE), 94*91f16700Schasinglulu mc_make_sec_cfg(SATAR, NON_SECURE, OVERRIDE, DISABLE), 95*91f16700Schasinglulu mc_make_sec_cfg(BPMPR, NON_SECURE, NO_OVERRIDE, DISABLE), 96*91f16700Schasinglulu mc_make_sec_cfg(HDAR, NON_SECURE, OVERRIDE, DISABLE), 97*91f16700Schasinglulu mc_make_sec_cfg(SDMMCRAB, NON_SECURE, OVERRIDE, DISABLE), 98*91f16700Schasinglulu mc_make_sec_cfg(ETRR, NON_SECURE, OVERRIDE, DISABLE), 99*91f16700Schasinglulu mc_make_sec_cfg(AONR, NON_SECURE, NO_OVERRIDE, DISABLE), 100*91f16700Schasinglulu mc_make_sec_cfg(SESRD, NON_SECURE, NO_OVERRIDE, DISABLE), 101*91f16700Schasinglulu mc_make_sec_cfg(NVENCSRD, NON_SECURE, NO_OVERRIDE, DISABLE), 102*91f16700Schasinglulu mc_make_sec_cfg(GPUSWR, SECURE, NO_OVERRIDE, DISABLE), 103*91f16700Schasinglulu mc_make_sec_cfg(TSECSWRB, NON_SECURE, NO_OVERRIDE, DISABLE), 104*91f16700Schasinglulu mc_make_sec_cfg(ISPWB, NON_SECURE, OVERRIDE, ENABLE), 105*91f16700Schasinglulu mc_make_sec_cfg(GPUSRD2, SECURE, NO_OVERRIDE, DISABLE), 106*91f16700Schasinglulu mc_make_sec_cfg(APEDMAW, NON_SECURE, NO_OVERRIDE, DISABLE), 107*91f16700Schasinglulu mc_make_sec_cfg(APER, NON_SECURE, NO_OVERRIDE, DISABLE), 108*91f16700Schasinglulu mc_make_sec_cfg(APEW, NON_SECURE, NO_OVERRIDE, DISABLE), 109*91f16700Schasinglulu mc_make_sec_cfg(APEDMAR, NON_SECURE, NO_OVERRIDE, DISABLE), 110*91f16700Schasinglulu }; 111*91f16700Schasinglulu 112*91f16700Schasinglulu /******************************************************************************* 113*91f16700Schasinglulu * Array to hold the transaction override configs 114*91f16700Schasinglulu ******************************************************************************/ 115*91f16700Schasinglulu static const mc_txn_override_cfg_t tegra186_txn_override_cfgs[] = { 116*91f16700Schasinglulu mc_make_txn_override_cfg(BPMPW, CGID_TAG_ADR), 117*91f16700Schasinglulu mc_make_txn_override_cfg(EQOSW, CGID_TAG_ADR), 118*91f16700Schasinglulu mc_make_txn_override_cfg(NVJPGSWR, CGID_TAG_ADR), 119*91f16700Schasinglulu mc_make_txn_override_cfg(SDMMCWAA, CGID_TAG_ADR), 120*91f16700Schasinglulu mc_make_txn_override_cfg(MPCOREW, CGID_TAG_ADR), 121*91f16700Schasinglulu mc_make_txn_override_cfg(SCEDMAW, CGID_TAG_ADR), 122*91f16700Schasinglulu mc_make_txn_override_cfg(SDMMCW, CGID_TAG_ADR), 123*91f16700Schasinglulu mc_make_txn_override_cfg(AXISW, CGID_TAG_ADR), 124*91f16700Schasinglulu mc_make_txn_override_cfg(TSECSWR, CGID_TAG_ADR), 125*91f16700Schasinglulu mc_make_txn_override_cfg(GPUSWR, CGID_TAG_ADR), 126*91f16700Schasinglulu mc_make_txn_override_cfg(XUSB_HOSTW, CGID_TAG_ADR), 127*91f16700Schasinglulu mc_make_txn_override_cfg(TSECSWRB, CGID_TAG_ADR), 128*91f16700Schasinglulu mc_make_txn_override_cfg(GPUSWR2, CGID_TAG_ADR), 129*91f16700Schasinglulu mc_make_txn_override_cfg(AONDMAW, CGID_TAG_ADR), 130*91f16700Schasinglulu mc_make_txn_override_cfg(AONW, CGID_TAG_ADR), 131*91f16700Schasinglulu mc_make_txn_override_cfg(SESWR, CGID_TAG_ADR), 132*91f16700Schasinglulu mc_make_txn_override_cfg(BPMPDMAW, CGID_TAG_ADR), 133*91f16700Schasinglulu mc_make_txn_override_cfg(SDMMCWA, CGID_TAG_ADR), 134*91f16700Schasinglulu mc_make_txn_override_cfg(HDAW, CGID_TAG_ADR), 135*91f16700Schasinglulu mc_make_txn_override_cfg(NVDECSWR, CGID_TAG_ADR), 136*91f16700Schasinglulu mc_make_txn_override_cfg(UFSHCW, CGID_TAG_ADR), 137*91f16700Schasinglulu mc_make_txn_override_cfg(SATAW, CGID_TAG_ADR), 138*91f16700Schasinglulu mc_make_txn_override_cfg(ETRW, CGID_TAG_ADR), 139*91f16700Schasinglulu mc_make_txn_override_cfg(VICSWR, CGID_TAG_ADR), 140*91f16700Schasinglulu mc_make_txn_override_cfg(NVENCSWR, CGID_TAG_ADR), 141*91f16700Schasinglulu mc_make_txn_override_cfg(SDMMCWAB, CGID_TAG_ADR), 142*91f16700Schasinglulu mc_make_txn_override_cfg(ISPWB, CGID_TAG_ADR), 143*91f16700Schasinglulu mc_make_txn_override_cfg(APEW, CGID_TAG_ADR), 144*91f16700Schasinglulu mc_make_txn_override_cfg(XUSB_DEVW, CGID_TAG_ADR), 145*91f16700Schasinglulu mc_make_txn_override_cfg(AFIW, CGID_TAG_ADR), 146*91f16700Schasinglulu mc_make_txn_override_cfg(SCEW, CGID_TAG_ADR), 147*91f16700Schasinglulu }; 148*91f16700Schasinglulu 149*91f16700Schasinglulu static void tegra186_memctrl_reconfig_mss_clients(void) 150*91f16700Schasinglulu { 151*91f16700Schasinglulu #if ENABLE_ROC_FOR_ORDERING_CLIENT_REQUESTS 152*91f16700Schasinglulu uint32_t val, wdata_0, wdata_1; 153*91f16700Schasinglulu 154*91f16700Schasinglulu /* 155*91f16700Schasinglulu * Assert Memory Controller's HOTRESET_FLUSH_ENABLE signal for 156*91f16700Schasinglulu * boot and strongly ordered MSS clients to flush existing memory 157*91f16700Schasinglulu * traffic and stall future requests. 158*91f16700Schasinglulu */ 159*91f16700Schasinglulu val = tegra_mc_read_32(MC_CLIENT_HOTRESET_CTRL0); 160*91f16700Schasinglulu assert(val == MC_CLIENT_HOTRESET_CTRL0_RESET_VAL); 161*91f16700Schasinglulu 162*91f16700Schasinglulu wdata_0 = MC_CLIENT_HOTRESET_CTRL0_HDA_FLUSH_ENB | 163*91f16700Schasinglulu MC_CLIENT_HOTRESET_CTRL0_AFI_FLUSH_ENB | 164*91f16700Schasinglulu MC_CLIENT_HOTRESET_CTRL0_SATA_FLUSH_ENB | 165*91f16700Schasinglulu MC_CLIENT_HOTRESET_CTRL0_XUSB_HOST_FLUSH_ENB | 166*91f16700Schasinglulu MC_CLIENT_HOTRESET_CTRL0_XUSB_DEV_FLUSH_ENB; 167*91f16700Schasinglulu tegra_mc_write_32(MC_CLIENT_HOTRESET_CTRL0, wdata_0); 168*91f16700Schasinglulu 169*91f16700Schasinglulu /* Wait for HOTRESET STATUS to indicate FLUSH_DONE */ 170*91f16700Schasinglulu do { 171*91f16700Schasinglulu val = tegra_mc_read_32(MC_CLIENT_HOTRESET_STATUS0); 172*91f16700Schasinglulu } while ((val & wdata_0) != wdata_0); 173*91f16700Schasinglulu 174*91f16700Schasinglulu /* Wait one more time due to SW WAR for known legacy issue */ 175*91f16700Schasinglulu do { 176*91f16700Schasinglulu val = tegra_mc_read_32(MC_CLIENT_HOTRESET_STATUS0); 177*91f16700Schasinglulu } while ((val & wdata_0) != wdata_0); 178*91f16700Schasinglulu 179*91f16700Schasinglulu val = tegra_mc_read_32(MC_CLIENT_HOTRESET_CTRL1); 180*91f16700Schasinglulu assert(val == MC_CLIENT_HOTRESET_CTRL1_RESET_VAL); 181*91f16700Schasinglulu 182*91f16700Schasinglulu wdata_1 = MC_CLIENT_HOTRESET_CTRL1_SDMMC4A_FLUSH_ENB | 183*91f16700Schasinglulu MC_CLIENT_HOTRESET_CTRL1_APE_FLUSH_ENB | 184*91f16700Schasinglulu MC_CLIENT_HOTRESET_CTRL1_SE_FLUSH_ENB | 185*91f16700Schasinglulu MC_CLIENT_HOTRESET_CTRL1_ETR_FLUSH_ENB | 186*91f16700Schasinglulu MC_CLIENT_HOTRESET_CTRL1_AXIS_FLUSH_ENB | 187*91f16700Schasinglulu MC_CLIENT_HOTRESET_CTRL1_EQOS_FLUSH_ENB | 188*91f16700Schasinglulu MC_CLIENT_HOTRESET_CTRL1_UFSHC_FLUSH_ENB | 189*91f16700Schasinglulu MC_CLIENT_HOTRESET_CTRL1_BPMP_FLUSH_ENB | 190*91f16700Schasinglulu MC_CLIENT_HOTRESET_CTRL1_AON_FLUSH_ENB | 191*91f16700Schasinglulu MC_CLIENT_HOTRESET_CTRL1_SCE_FLUSH_ENB; 192*91f16700Schasinglulu tegra_mc_write_32(MC_CLIENT_HOTRESET_CTRL1, wdata_1); 193*91f16700Schasinglulu 194*91f16700Schasinglulu /* Wait for HOTRESET STATUS to indicate FLUSH_DONE */ 195*91f16700Schasinglulu do { 196*91f16700Schasinglulu val = tegra_mc_read_32(MC_CLIENT_HOTRESET_STATUS1); 197*91f16700Schasinglulu } while ((val & wdata_1) != wdata_1); 198*91f16700Schasinglulu 199*91f16700Schasinglulu /* Wait one more time due to SW WAR for known legacy issue */ 200*91f16700Schasinglulu do { 201*91f16700Schasinglulu val = tegra_mc_read_32(MC_CLIENT_HOTRESET_STATUS1); 202*91f16700Schasinglulu } while ((val & wdata_1) != wdata_1); 203*91f16700Schasinglulu 204*91f16700Schasinglulu /* 205*91f16700Schasinglulu * Change MEMTYPE_OVERRIDE from SO_DEV -> PASSTHRU for boot and 206*91f16700Schasinglulu * strongly ordered MSS clients. ROC needs to be single point 207*91f16700Schasinglulu * of control on overriding the memory type. So, remove TSA's 208*91f16700Schasinglulu * memtype override. 209*91f16700Schasinglulu * 210*91f16700Schasinglulu * MC clients with default SO_DEV override still enabled at TSA: 211*91f16700Schasinglulu * AONW, BPMPW, SCEW, APEW 212*91f16700Schasinglulu */ 213*91f16700Schasinglulu mc_set_tsa_passthrough(AFIW); 214*91f16700Schasinglulu mc_set_tsa_passthrough(HDAW); 215*91f16700Schasinglulu mc_set_tsa_passthrough(SATAW); 216*91f16700Schasinglulu mc_set_tsa_passthrough(XUSB_HOSTW); 217*91f16700Schasinglulu mc_set_tsa_passthrough(XUSB_DEVW); 218*91f16700Schasinglulu mc_set_tsa_passthrough(SDMMCWAB); 219*91f16700Schasinglulu mc_set_tsa_passthrough(APEDMAW); 220*91f16700Schasinglulu mc_set_tsa_passthrough(SESWR); 221*91f16700Schasinglulu mc_set_tsa_passthrough(ETRW); 222*91f16700Schasinglulu mc_set_tsa_passthrough(AXISW); 223*91f16700Schasinglulu mc_set_tsa_passthrough(EQOSW); 224*91f16700Schasinglulu mc_set_tsa_passthrough(UFSHCW); 225*91f16700Schasinglulu mc_set_tsa_passthrough(BPMPDMAW); 226*91f16700Schasinglulu mc_set_tsa_passthrough(AONDMAW); 227*91f16700Schasinglulu mc_set_tsa_passthrough(SCEDMAW); 228*91f16700Schasinglulu 229*91f16700Schasinglulu /* Parker has no IO Coherency support and need the following: 230*91f16700Schasinglulu * Ordered MC Clients on Parker are AFI, EQOS, SATA, XUSB. 231*91f16700Schasinglulu * ISO clients(DISP, VI, EQOS) should never snoop caches and 232*91f16700Schasinglulu * don't need ROC/PCFIFO ordering. 233*91f16700Schasinglulu * ISO clients(EQOS) that need ordering should use PCFIFO ordering 234*91f16700Schasinglulu * and bypass ROC ordering by using FORCE_NON_COHERENT path. 235*91f16700Schasinglulu * FORCE_NON_COHERENT/FORCE_COHERENT config take precedence 236*91f16700Schasinglulu * over SMMU attributes. 237*91f16700Schasinglulu * Force all Normal memory transactions from ISO and non-ISO to be 238*91f16700Schasinglulu * non-coherent(bypass ROC, avoid cache snoop to avoid perf hit). 239*91f16700Schasinglulu * Force the SO_DEV transactions from ordered ISO clients(EQOS) to 240*91f16700Schasinglulu * non-coherent path and enable MC PCFIFO interlock for ordering. 241*91f16700Schasinglulu * Force the SO_DEV transactions from ordered non-ISO clients (PCIe, 242*91f16700Schasinglulu * XUSB, SATA) to coherent so that the transactions are 243*91f16700Schasinglulu * ordered by ROC. 244*91f16700Schasinglulu * PCFIFO ensure write ordering. 245*91f16700Schasinglulu * Read after Write ordering is maintained/enforced by MC clients. 246*91f16700Schasinglulu * Clients that need PCIe type write ordering must 247*91f16700Schasinglulu * go through ROC ordering. 248*91f16700Schasinglulu * Ordering enable for Read clients is not necessary. 249*91f16700Schasinglulu * R5's and A9 would get necessary ordering from AXI and 250*91f16700Schasinglulu * don't need ROC ordering enable: 251*91f16700Schasinglulu * - MMIO ordering is through dev mapping and MMIO 252*91f16700Schasinglulu * accesses bypass SMMU. 253*91f16700Schasinglulu * - Normal memory is accessed through SMMU and ordering is 254*91f16700Schasinglulu * ensured by client and AXI. 255*91f16700Schasinglulu * - Ack point for Normal memory is WCAM in MC. 256*91f16700Schasinglulu * - MMIO's can be early acked and AXI ensures dev memory ordering, 257*91f16700Schasinglulu * Client ensures read/write direction change ordering. 258*91f16700Schasinglulu * - See Bug 200312466 for more details. 259*91f16700Schasinglulu * 260*91f16700Schasinglulu * CGID_TAG_ADR is only present from T186 A02. As this code is common 261*91f16700Schasinglulu * between A01 and A02, tegra_memctrl_set_overrides() programs 262*91f16700Schasinglulu * CGID_TAG_ADR for the necessary clients on A02. 263*91f16700Schasinglulu */ 264*91f16700Schasinglulu mc_set_txn_override(HDAR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 265*91f16700Schasinglulu mc_set_txn_override(BPMPW, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 266*91f16700Schasinglulu mc_set_txn_override(PTCR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 267*91f16700Schasinglulu mc_set_txn_override(NVDISPLAYR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 268*91f16700Schasinglulu mc_set_txn_override(EQOSW, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 269*91f16700Schasinglulu mc_set_txn_override(NVJPGSWR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 270*91f16700Schasinglulu mc_set_txn_override(ISPRA, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 271*91f16700Schasinglulu mc_set_txn_override(SDMMCWAA, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 272*91f16700Schasinglulu mc_set_txn_override(VICSRD, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 273*91f16700Schasinglulu mc_set_txn_override(MPCOREW, CGID_TAG_DEFAULT, SO_DEV_ZERO, NO_OVERRIDE, NO_OVERRIDE); 274*91f16700Schasinglulu mc_set_txn_override(GPUSRD, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 275*91f16700Schasinglulu mc_set_txn_override(AXISR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 276*91f16700Schasinglulu mc_set_txn_override(SCEDMAW, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 277*91f16700Schasinglulu mc_set_txn_override(SDMMCW, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 278*91f16700Schasinglulu mc_set_txn_override(EQOSR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 279*91f16700Schasinglulu /* See bug 200131110 comment #35*/ 280*91f16700Schasinglulu mc_set_txn_override(APEDMAR, CGID_TAG_CLIENT_AXI_ID, SO_DEV_CLIENT_AXI_ID, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 281*91f16700Schasinglulu mc_set_txn_override(NVENCSRD, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 282*91f16700Schasinglulu mc_set_txn_override(SDMMCRAB, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 283*91f16700Schasinglulu mc_set_txn_override(VICSRD1, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 284*91f16700Schasinglulu mc_set_txn_override(BPMPDMAR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 285*91f16700Schasinglulu mc_set_txn_override(VIW, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 286*91f16700Schasinglulu mc_set_txn_override(SDMMCRAA, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 287*91f16700Schasinglulu mc_set_txn_override(AXISW, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 288*91f16700Schasinglulu mc_set_txn_override(XUSB_DEVR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 289*91f16700Schasinglulu mc_set_txn_override(UFSHCR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 290*91f16700Schasinglulu mc_set_txn_override(TSECSWR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 291*91f16700Schasinglulu mc_set_txn_override(GPUSWR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 292*91f16700Schasinglulu mc_set_txn_override(SATAR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 293*91f16700Schasinglulu mc_set_txn_override(XUSB_HOSTW, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_COHERENT); 294*91f16700Schasinglulu mc_set_txn_override(TSECSWRB, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 295*91f16700Schasinglulu mc_set_txn_override(GPUSRD2, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 296*91f16700Schasinglulu mc_set_txn_override(SCEDMAR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 297*91f16700Schasinglulu mc_set_txn_override(GPUSWR2, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 298*91f16700Schasinglulu mc_set_txn_override(AONDMAW, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 299*91f16700Schasinglulu /* See bug 200131110 comment #35*/ 300*91f16700Schasinglulu mc_set_txn_override(APEDMAW, CGID_TAG_CLIENT_AXI_ID, SO_DEV_CLIENT_AXI_ID, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 301*91f16700Schasinglulu mc_set_txn_override(AONW, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 302*91f16700Schasinglulu mc_set_txn_override(HOST1XDMAR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 303*91f16700Schasinglulu mc_set_txn_override(ETRR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 304*91f16700Schasinglulu mc_set_txn_override(SESWR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 305*91f16700Schasinglulu mc_set_txn_override(NVJPGSRD, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 306*91f16700Schasinglulu mc_set_txn_override(NVDECSRD, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 307*91f16700Schasinglulu mc_set_txn_override(TSECSRDB, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 308*91f16700Schasinglulu mc_set_txn_override(BPMPDMAW, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 309*91f16700Schasinglulu mc_set_txn_override(APER, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 310*91f16700Schasinglulu mc_set_txn_override(NVDECSRD1, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 311*91f16700Schasinglulu mc_set_txn_override(XUSB_HOSTR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 312*91f16700Schasinglulu mc_set_txn_override(ISPWA, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 313*91f16700Schasinglulu mc_set_txn_override(SESRD, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 314*91f16700Schasinglulu mc_set_txn_override(SCER, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 315*91f16700Schasinglulu mc_set_txn_override(AONR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 316*91f16700Schasinglulu mc_set_txn_override(MPCORER, CGID_TAG_DEFAULT, SO_DEV_ZERO, NO_OVERRIDE, NO_OVERRIDE); 317*91f16700Schasinglulu mc_set_txn_override(SDMMCWA, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 318*91f16700Schasinglulu mc_set_txn_override(HDAW, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 319*91f16700Schasinglulu mc_set_txn_override(NVDECSWR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 320*91f16700Schasinglulu mc_set_txn_override(UFSHCW, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 321*91f16700Schasinglulu mc_set_txn_override(AONDMAR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 322*91f16700Schasinglulu mc_set_txn_override(SATAW, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_COHERENT); 323*91f16700Schasinglulu mc_set_txn_override(ETRW, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 324*91f16700Schasinglulu mc_set_txn_override(VICSWR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 325*91f16700Schasinglulu mc_set_txn_override(NVENCSWR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 326*91f16700Schasinglulu /* See bug 200131110 comment #35 */ 327*91f16700Schasinglulu mc_set_txn_override(AFIR, CGID_TAG_DEFAULT, SO_DEV_CLIENT_AXI_ID, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 328*91f16700Schasinglulu mc_set_txn_override(SDMMCWAB, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 329*91f16700Schasinglulu mc_set_txn_override(SDMMCRA, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 330*91f16700Schasinglulu mc_set_txn_override(NVDISPLAYR1, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 331*91f16700Schasinglulu mc_set_txn_override(ISPWB, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 332*91f16700Schasinglulu mc_set_txn_override(BPMPR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 333*91f16700Schasinglulu mc_set_txn_override(APEW, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 334*91f16700Schasinglulu mc_set_txn_override(SDMMCR, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 335*91f16700Schasinglulu mc_set_txn_override(XUSB_DEVW, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_COHERENT); 336*91f16700Schasinglulu mc_set_txn_override(TSECSRD, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 337*91f16700Schasinglulu /* 338*91f16700Schasinglulu * See bug 200131110 comment #35 - there are no normal requests 339*91f16700Schasinglulu * and AWID for SO/DEV requests is hardcoded in RTL for a 340*91f16700Schasinglulu * particular PCIE controller 341*91f16700Schasinglulu */ 342*91f16700Schasinglulu mc_set_txn_override(AFIW, CGID_TAG_DEFAULT, SO_DEV_CLIENT_AXI_ID, FORCE_NON_COHERENT, FORCE_COHERENT); 343*91f16700Schasinglulu mc_set_txn_override(SCEW, CGID_TAG_DEFAULT, SO_DEV_ZERO, FORCE_NON_COHERENT, FORCE_NON_COHERENT); 344*91f16700Schasinglulu 345*91f16700Schasinglulu /* 346*91f16700Schasinglulu * At this point, ordering can occur at ROC. So, remove PCFIFO's 347*91f16700Schasinglulu * control over ordering requests. 348*91f16700Schasinglulu * 349*91f16700Schasinglulu * Change PCFIFO_*_ORDERED_CLIENT from ORDERED -> UNORDERED for 350*91f16700Schasinglulu * boot and strongly ordered MSS clients 351*91f16700Schasinglulu */ 352*91f16700Schasinglulu val = MC_PCFIFO_CLIENT_CONFIG1_RESET_VAL & 353*91f16700Schasinglulu mc_set_pcfifo_unordered_boot_so_mss(1, AFIW) & 354*91f16700Schasinglulu mc_set_pcfifo_unordered_boot_so_mss(1, HDAW) & 355*91f16700Schasinglulu mc_set_pcfifo_unordered_boot_so_mss(1, SATAW); 356*91f16700Schasinglulu tegra_mc_write_32(MC_PCFIFO_CLIENT_CONFIG1, val); 357*91f16700Schasinglulu 358*91f16700Schasinglulu val = MC_PCFIFO_CLIENT_CONFIG2_RESET_VAL & 359*91f16700Schasinglulu mc_set_pcfifo_unordered_boot_so_mss(2, XUSB_HOSTW) & 360*91f16700Schasinglulu mc_set_pcfifo_unordered_boot_so_mss(2, XUSB_DEVW); 361*91f16700Schasinglulu tegra_mc_write_32(MC_PCFIFO_CLIENT_CONFIG2, val); 362*91f16700Schasinglulu 363*91f16700Schasinglulu val = MC_PCFIFO_CLIENT_CONFIG3_RESET_VAL & 364*91f16700Schasinglulu mc_set_pcfifo_unordered_boot_so_mss(3, SDMMCWAB); 365*91f16700Schasinglulu tegra_mc_write_32(MC_PCFIFO_CLIENT_CONFIG3, val); 366*91f16700Schasinglulu 367*91f16700Schasinglulu val = MC_PCFIFO_CLIENT_CONFIG4_RESET_VAL & 368*91f16700Schasinglulu mc_set_pcfifo_unordered_boot_so_mss(4, SESWR) & 369*91f16700Schasinglulu mc_set_pcfifo_unordered_boot_so_mss(4, ETRW) & 370*91f16700Schasinglulu mc_set_pcfifo_unordered_boot_so_mss(4, AXISW) & 371*91f16700Schasinglulu mc_set_pcfifo_unordered_boot_so_mss(4, UFSHCW) & 372*91f16700Schasinglulu mc_set_pcfifo_unordered_boot_so_mss(4, BPMPDMAW) & 373*91f16700Schasinglulu mc_set_pcfifo_unordered_boot_so_mss(4, AONDMAW) & 374*91f16700Schasinglulu mc_set_pcfifo_unordered_boot_so_mss(4, SCEDMAW); 375*91f16700Schasinglulu /* EQOSW is the only client that has PCFIFO order enabled. */ 376*91f16700Schasinglulu val |= mc_set_pcfifo_ordered_boot_so_mss(4, EQOSW); 377*91f16700Schasinglulu tegra_mc_write_32(MC_PCFIFO_CLIENT_CONFIG4, val); 378*91f16700Schasinglulu 379*91f16700Schasinglulu val = MC_PCFIFO_CLIENT_CONFIG5_RESET_VAL & 380*91f16700Schasinglulu mc_set_pcfifo_unordered_boot_so_mss(5, APEDMAW); 381*91f16700Schasinglulu tegra_mc_write_32(MC_PCFIFO_CLIENT_CONFIG5, val); 382*91f16700Schasinglulu 383*91f16700Schasinglulu /* 384*91f16700Schasinglulu * Deassert HOTRESET FLUSH_ENABLE for boot and strongly ordered MSS 385*91f16700Schasinglulu * clients to allow memory traffic from all clients to start passing 386*91f16700Schasinglulu * through ROC 387*91f16700Schasinglulu */ 388*91f16700Schasinglulu val = tegra_mc_read_32(MC_CLIENT_HOTRESET_CTRL0); 389*91f16700Schasinglulu assert(val == wdata_0); 390*91f16700Schasinglulu 391*91f16700Schasinglulu wdata_0 = MC_CLIENT_HOTRESET_CTRL0_RESET_VAL; 392*91f16700Schasinglulu tegra_mc_write_32(MC_CLIENT_HOTRESET_CTRL0, wdata_0); 393*91f16700Schasinglulu 394*91f16700Schasinglulu val = tegra_mc_read_32(MC_CLIENT_HOTRESET_CTRL1); 395*91f16700Schasinglulu assert(val == wdata_1); 396*91f16700Schasinglulu 397*91f16700Schasinglulu wdata_1 = MC_CLIENT_HOTRESET_CTRL1_RESET_VAL; 398*91f16700Schasinglulu tegra_mc_write_32(MC_CLIENT_HOTRESET_CTRL1, wdata_1); 399*91f16700Schasinglulu 400*91f16700Schasinglulu #endif 401*91f16700Schasinglulu } 402*91f16700Schasinglulu 403*91f16700Schasinglulu static void tegra186_memctrl_set_overrides(void) 404*91f16700Schasinglulu { 405*91f16700Schasinglulu uint32_t i, val; 406*91f16700Schasinglulu 407*91f16700Schasinglulu /* 408*91f16700Schasinglulu * Set the MC_TXN_OVERRIDE registers for write clients. 409*91f16700Schasinglulu */ 410*91f16700Schasinglulu if ((tegra_chipid_is_t186()) && 411*91f16700Schasinglulu (!tegra_platform_is_silicon() || 412*91f16700Schasinglulu (tegra_platform_is_silicon() && (tegra_get_chipid_minor() == 1U)))) { 413*91f16700Schasinglulu 414*91f16700Schasinglulu /* 415*91f16700Schasinglulu * GPU and NVENC settings for Tegra186 simulation and 416*91f16700Schasinglulu * Silicon rev. A01 417*91f16700Schasinglulu */ 418*91f16700Schasinglulu val = tegra_mc_read_32(MC_TXN_OVERRIDE_CONFIG_GPUSWR); 419*91f16700Schasinglulu val &= (uint32_t)~MC_TXN_OVERRIDE_CGID_TAG_MASK; 420*91f16700Schasinglulu tegra_mc_write_32(MC_TXN_OVERRIDE_CONFIG_GPUSWR, 421*91f16700Schasinglulu val | MC_TXN_OVERRIDE_CGID_TAG_ZERO); 422*91f16700Schasinglulu 423*91f16700Schasinglulu val = tegra_mc_read_32(MC_TXN_OVERRIDE_CONFIG_GPUSWR2); 424*91f16700Schasinglulu val &= (uint32_t)~MC_TXN_OVERRIDE_CGID_TAG_MASK; 425*91f16700Schasinglulu tegra_mc_write_32(MC_TXN_OVERRIDE_CONFIG_GPUSWR2, 426*91f16700Schasinglulu val | MC_TXN_OVERRIDE_CGID_TAG_ZERO); 427*91f16700Schasinglulu 428*91f16700Schasinglulu val = tegra_mc_read_32(MC_TXN_OVERRIDE_CONFIG_NVENCSWR); 429*91f16700Schasinglulu val &= (uint32_t)~MC_TXN_OVERRIDE_CGID_TAG_MASK; 430*91f16700Schasinglulu tegra_mc_write_32(MC_TXN_OVERRIDE_CONFIG_NVENCSWR, 431*91f16700Schasinglulu val | MC_TXN_OVERRIDE_CGID_TAG_CLIENT_AXI_ID); 432*91f16700Schasinglulu 433*91f16700Schasinglulu } else { 434*91f16700Schasinglulu 435*91f16700Schasinglulu /* 436*91f16700Schasinglulu * Settings for Tegra186 silicon rev. A02 and onwards. 437*91f16700Schasinglulu */ 438*91f16700Schasinglulu for (i = 0; i < ARRAY_SIZE(tegra186_txn_override_cfgs); i++) { 439*91f16700Schasinglulu val = tegra_mc_read_32(tegra186_txn_override_cfgs[i].offset); 440*91f16700Schasinglulu val &= (uint32_t)~MC_TXN_OVERRIDE_CGID_TAG_MASK; 441*91f16700Schasinglulu tegra_mc_write_32(tegra186_txn_override_cfgs[i].offset, 442*91f16700Schasinglulu val | tegra186_txn_override_cfgs[i].cgid_tag); 443*91f16700Schasinglulu } 444*91f16700Schasinglulu } 445*91f16700Schasinglulu } 446*91f16700Schasinglulu 447*91f16700Schasinglulu 448*91f16700Schasinglulu /******************************************************************************* 449*91f16700Schasinglulu * Array to hold MC context for Tegra186 450*91f16700Schasinglulu ******************************************************************************/ 451*91f16700Schasinglulu static __attribute__((aligned(16))) mc_regs_t tegra186_mc_context[] = { 452*91f16700Schasinglulu _START_OF_TABLE_, 453*91f16700Schasinglulu mc_make_sid_security_cfg(SCEW), 454*91f16700Schasinglulu mc_make_sid_security_cfg(AFIR), 455*91f16700Schasinglulu mc_make_sid_security_cfg(NVDISPLAYR1), 456*91f16700Schasinglulu mc_make_sid_security_cfg(XUSB_DEVR), 457*91f16700Schasinglulu mc_make_sid_security_cfg(VICSRD1), 458*91f16700Schasinglulu mc_make_sid_security_cfg(NVENCSWR), 459*91f16700Schasinglulu mc_make_sid_security_cfg(TSECSRDB), 460*91f16700Schasinglulu mc_make_sid_security_cfg(AXISW), 461*91f16700Schasinglulu mc_make_sid_security_cfg(SDMMCWAB), 462*91f16700Schasinglulu mc_make_sid_security_cfg(AONDMAW), 463*91f16700Schasinglulu mc_make_sid_security_cfg(GPUSWR2), 464*91f16700Schasinglulu mc_make_sid_security_cfg(SATAW), 465*91f16700Schasinglulu mc_make_sid_security_cfg(UFSHCW), 466*91f16700Schasinglulu mc_make_sid_security_cfg(AFIW), 467*91f16700Schasinglulu mc_make_sid_security_cfg(SDMMCR), 468*91f16700Schasinglulu mc_make_sid_security_cfg(SCEDMAW), 469*91f16700Schasinglulu mc_make_sid_security_cfg(UFSHCR), 470*91f16700Schasinglulu mc_make_sid_security_cfg(SDMMCWAA), 471*91f16700Schasinglulu mc_make_sid_security_cfg(APEDMAW), 472*91f16700Schasinglulu mc_make_sid_security_cfg(SESWR), 473*91f16700Schasinglulu mc_make_sid_security_cfg(MPCORER), 474*91f16700Schasinglulu mc_make_sid_security_cfg(PTCR), 475*91f16700Schasinglulu mc_make_sid_security_cfg(BPMPW), 476*91f16700Schasinglulu mc_make_sid_security_cfg(ETRW), 477*91f16700Schasinglulu mc_make_sid_security_cfg(GPUSRD), 478*91f16700Schasinglulu mc_make_sid_security_cfg(VICSWR), 479*91f16700Schasinglulu mc_make_sid_security_cfg(SCEDMAR), 480*91f16700Schasinglulu mc_make_sid_security_cfg(HDAW), 481*91f16700Schasinglulu mc_make_sid_security_cfg(ISPWA), 482*91f16700Schasinglulu mc_make_sid_security_cfg(EQOSW), 483*91f16700Schasinglulu mc_make_sid_security_cfg(XUSB_HOSTW), 484*91f16700Schasinglulu mc_make_sid_security_cfg(TSECSWR), 485*91f16700Schasinglulu mc_make_sid_security_cfg(SDMMCRAA), 486*91f16700Schasinglulu mc_make_sid_security_cfg(APER), 487*91f16700Schasinglulu mc_make_sid_security_cfg(VIW), 488*91f16700Schasinglulu mc_make_sid_security_cfg(APEW), 489*91f16700Schasinglulu mc_make_sid_security_cfg(AXISR), 490*91f16700Schasinglulu mc_make_sid_security_cfg(SDMMCW), 491*91f16700Schasinglulu mc_make_sid_security_cfg(BPMPDMAW), 492*91f16700Schasinglulu mc_make_sid_security_cfg(ISPRA), 493*91f16700Schasinglulu mc_make_sid_security_cfg(NVDECSWR), 494*91f16700Schasinglulu mc_make_sid_security_cfg(XUSB_DEVW), 495*91f16700Schasinglulu mc_make_sid_security_cfg(NVDECSRD), 496*91f16700Schasinglulu mc_make_sid_security_cfg(MPCOREW), 497*91f16700Schasinglulu mc_make_sid_security_cfg(NVDISPLAYR), 498*91f16700Schasinglulu mc_make_sid_security_cfg(BPMPDMAR), 499*91f16700Schasinglulu mc_make_sid_security_cfg(NVJPGSWR), 500*91f16700Schasinglulu mc_make_sid_security_cfg(NVDECSRD1), 501*91f16700Schasinglulu mc_make_sid_security_cfg(TSECSRD), 502*91f16700Schasinglulu mc_make_sid_security_cfg(NVJPGSRD), 503*91f16700Schasinglulu mc_make_sid_security_cfg(SDMMCWA), 504*91f16700Schasinglulu mc_make_sid_security_cfg(SCER), 505*91f16700Schasinglulu mc_make_sid_security_cfg(XUSB_HOSTR), 506*91f16700Schasinglulu mc_make_sid_security_cfg(VICSRD), 507*91f16700Schasinglulu mc_make_sid_security_cfg(AONDMAR), 508*91f16700Schasinglulu mc_make_sid_security_cfg(AONW), 509*91f16700Schasinglulu mc_make_sid_security_cfg(SDMMCRA), 510*91f16700Schasinglulu mc_make_sid_security_cfg(HOST1XDMAR), 511*91f16700Schasinglulu mc_make_sid_security_cfg(EQOSR), 512*91f16700Schasinglulu mc_make_sid_security_cfg(SATAR), 513*91f16700Schasinglulu mc_make_sid_security_cfg(BPMPR), 514*91f16700Schasinglulu mc_make_sid_security_cfg(HDAR), 515*91f16700Schasinglulu mc_make_sid_security_cfg(SDMMCRAB), 516*91f16700Schasinglulu mc_make_sid_security_cfg(ETRR), 517*91f16700Schasinglulu mc_make_sid_security_cfg(AONR), 518*91f16700Schasinglulu mc_make_sid_security_cfg(APEDMAR), 519*91f16700Schasinglulu mc_make_sid_security_cfg(SESRD), 520*91f16700Schasinglulu mc_make_sid_security_cfg(NVENCSRD), 521*91f16700Schasinglulu mc_make_sid_security_cfg(GPUSWR), 522*91f16700Schasinglulu mc_make_sid_security_cfg(TSECSWRB), 523*91f16700Schasinglulu mc_make_sid_security_cfg(ISPWB), 524*91f16700Schasinglulu mc_make_sid_security_cfg(GPUSRD2), 525*91f16700Schasinglulu mc_make_sid_override_cfg(APER), 526*91f16700Schasinglulu mc_make_sid_override_cfg(VICSRD), 527*91f16700Schasinglulu mc_make_sid_override_cfg(NVENCSRD), 528*91f16700Schasinglulu mc_make_sid_override_cfg(NVJPGSWR), 529*91f16700Schasinglulu mc_make_sid_override_cfg(AONW), 530*91f16700Schasinglulu mc_make_sid_override_cfg(BPMPR), 531*91f16700Schasinglulu mc_make_sid_override_cfg(BPMPW), 532*91f16700Schasinglulu mc_make_sid_override_cfg(HDAW), 533*91f16700Schasinglulu mc_make_sid_override_cfg(NVDISPLAYR1), 534*91f16700Schasinglulu mc_make_sid_override_cfg(APEDMAR), 535*91f16700Schasinglulu mc_make_sid_override_cfg(AFIR), 536*91f16700Schasinglulu mc_make_sid_override_cfg(AXISR), 537*91f16700Schasinglulu mc_make_sid_override_cfg(VICSRD1), 538*91f16700Schasinglulu mc_make_sid_override_cfg(TSECSRD), 539*91f16700Schasinglulu mc_make_sid_override_cfg(BPMPDMAW), 540*91f16700Schasinglulu mc_make_sid_override_cfg(MPCOREW), 541*91f16700Schasinglulu mc_make_sid_override_cfg(XUSB_HOSTR), 542*91f16700Schasinglulu mc_make_sid_override_cfg(GPUSWR), 543*91f16700Schasinglulu mc_make_sid_override_cfg(XUSB_DEVR), 544*91f16700Schasinglulu mc_make_sid_override_cfg(UFSHCW), 545*91f16700Schasinglulu mc_make_sid_override_cfg(XUSB_HOSTW), 546*91f16700Schasinglulu mc_make_sid_override_cfg(SDMMCWAB), 547*91f16700Schasinglulu mc_make_sid_override_cfg(SATAW), 548*91f16700Schasinglulu mc_make_sid_override_cfg(SCEDMAR), 549*91f16700Schasinglulu mc_make_sid_override_cfg(HOST1XDMAR), 550*91f16700Schasinglulu mc_make_sid_override_cfg(SDMMCWA), 551*91f16700Schasinglulu mc_make_sid_override_cfg(APEDMAW), 552*91f16700Schasinglulu mc_make_sid_override_cfg(SESWR), 553*91f16700Schasinglulu mc_make_sid_override_cfg(AXISW), 554*91f16700Schasinglulu mc_make_sid_override_cfg(AONDMAW), 555*91f16700Schasinglulu mc_make_sid_override_cfg(TSECSWRB), 556*91f16700Schasinglulu mc_make_sid_override_cfg(MPCORER), 557*91f16700Schasinglulu mc_make_sid_override_cfg(ISPWB), 558*91f16700Schasinglulu mc_make_sid_override_cfg(AONR), 559*91f16700Schasinglulu mc_make_sid_override_cfg(BPMPDMAR), 560*91f16700Schasinglulu mc_make_sid_override_cfg(HDAR), 561*91f16700Schasinglulu mc_make_sid_override_cfg(SDMMCRA), 562*91f16700Schasinglulu mc_make_sid_override_cfg(ETRW), 563*91f16700Schasinglulu mc_make_sid_override_cfg(GPUSWR2), 564*91f16700Schasinglulu mc_make_sid_override_cfg(EQOSR), 565*91f16700Schasinglulu mc_make_sid_override_cfg(TSECSWR), 566*91f16700Schasinglulu mc_make_sid_override_cfg(ETRR), 567*91f16700Schasinglulu mc_make_sid_override_cfg(NVDECSRD), 568*91f16700Schasinglulu mc_make_sid_override_cfg(TSECSRDB), 569*91f16700Schasinglulu mc_make_sid_override_cfg(SDMMCRAA), 570*91f16700Schasinglulu mc_make_sid_override_cfg(NVDECSRD1), 571*91f16700Schasinglulu mc_make_sid_override_cfg(SDMMCR), 572*91f16700Schasinglulu mc_make_sid_override_cfg(NVJPGSRD), 573*91f16700Schasinglulu mc_make_sid_override_cfg(SCEDMAW), 574*91f16700Schasinglulu mc_make_sid_override_cfg(SDMMCWAA), 575*91f16700Schasinglulu mc_make_sid_override_cfg(APEW), 576*91f16700Schasinglulu mc_make_sid_override_cfg(AONDMAR), 577*91f16700Schasinglulu mc_make_sid_override_cfg(PTCR), 578*91f16700Schasinglulu mc_make_sid_override_cfg(SCER), 579*91f16700Schasinglulu mc_make_sid_override_cfg(ISPRA), 580*91f16700Schasinglulu mc_make_sid_override_cfg(ISPWA), 581*91f16700Schasinglulu mc_make_sid_override_cfg(VICSWR), 582*91f16700Schasinglulu mc_make_sid_override_cfg(SESRD), 583*91f16700Schasinglulu mc_make_sid_override_cfg(SDMMCW), 584*91f16700Schasinglulu mc_make_sid_override_cfg(SDMMCRAB), 585*91f16700Schasinglulu mc_make_sid_override_cfg(EQOSW), 586*91f16700Schasinglulu mc_make_sid_override_cfg(GPUSRD2), 587*91f16700Schasinglulu mc_make_sid_override_cfg(SCEW), 588*91f16700Schasinglulu mc_make_sid_override_cfg(GPUSRD), 589*91f16700Schasinglulu mc_make_sid_override_cfg(NVDECSWR), 590*91f16700Schasinglulu mc_make_sid_override_cfg(XUSB_DEVW), 591*91f16700Schasinglulu mc_make_sid_override_cfg(SATAR), 592*91f16700Schasinglulu mc_make_sid_override_cfg(NVDISPLAYR), 593*91f16700Schasinglulu mc_make_sid_override_cfg(VIW), 594*91f16700Schasinglulu mc_make_sid_override_cfg(UFSHCR), 595*91f16700Schasinglulu mc_make_sid_override_cfg(NVENCSWR), 596*91f16700Schasinglulu mc_make_sid_override_cfg(AFIW), 597*91f16700Schasinglulu mc_smmu_bypass_cfg, /* TBU settings */ 598*91f16700Schasinglulu _END_OF_TABLE_, 599*91f16700Schasinglulu }; 600*91f16700Schasinglulu 601*91f16700Schasinglulu /******************************************************************************* 602*91f16700Schasinglulu * Handler to return the pointer to the MC's context struct 603*91f16700Schasinglulu ******************************************************************************/ 604*91f16700Schasinglulu mc_regs_t *plat_memctrl_get_sys_suspend_ctx(void) 605*91f16700Schasinglulu { 606*91f16700Schasinglulu /* index of _END_OF_TABLE_ */ 607*91f16700Schasinglulu tegra186_mc_context[0].val = (uint32_t)(ARRAY_SIZE(tegra186_mc_context)) - 1U; 608*91f16700Schasinglulu 609*91f16700Schasinglulu return tegra186_mc_context; 610*91f16700Schasinglulu } 611*91f16700Schasinglulu 612*91f16700Schasinglulu void plat_memctrl_setup(void) 613*91f16700Schasinglulu { 614*91f16700Schasinglulu uint32_t val; 615*91f16700Schasinglulu unsigned int i; 616*91f16700Schasinglulu 617*91f16700Schasinglulu /* Program all the Stream ID overrides */ 618*91f16700Schasinglulu for (i = 0U; i < ARRAY_SIZE(tegra186_streamid_override_regs); i++) { 619*91f16700Schasinglulu tegra_mc_streamid_write_32(tegra186_streamid_override_regs[i], 620*91f16700Schasinglulu MC_STREAM_ID_MAX); 621*91f16700Schasinglulu } 622*91f16700Schasinglulu 623*91f16700Schasinglulu /* Program the security config settings for all Stream IDs */ 624*91f16700Schasinglulu for (i = 0U; i < ARRAY_SIZE(tegra186_streamid_sec_cfgs); i++) { 625*91f16700Schasinglulu val = (tegra186_streamid_sec_cfgs[i].override_enable << 16) | 626*91f16700Schasinglulu (tegra186_streamid_sec_cfgs[i].override_client_inputs << 8) | 627*91f16700Schasinglulu (tegra186_streamid_sec_cfgs[i].override_client_ns_flag << 0); 628*91f16700Schasinglulu tegra_mc_streamid_write_32(tegra186_streamid_sec_cfgs[i].offset, val); 629*91f16700Schasinglulu } 630*91f16700Schasinglulu 631*91f16700Schasinglulu /* 632*91f16700Schasinglulu * Re-configure MSS to allow ROC to deal with ordering of the 633*91f16700Schasinglulu * Memory Controller traffic. This is needed as the Memory Controller 634*91f16700Schasinglulu * boots with MSS having all control, but ROC provides a performance 635*91f16700Schasinglulu * boost as compared to MSS. 636*91f16700Schasinglulu */ 637*91f16700Schasinglulu tegra186_memctrl_reconfig_mss_clients(); 638*91f16700Schasinglulu 639*91f16700Schasinglulu /* Program overrides for MC transactions */ 640*91f16700Schasinglulu tegra186_memctrl_set_overrides(); 641*91f16700Schasinglulu } 642*91f16700Schasinglulu 643*91f16700Schasinglulu /******************************************************************************* 644*91f16700Schasinglulu * Handler to restore platform specific settings to the memory controller 645*91f16700Schasinglulu ******************************************************************************/ 646*91f16700Schasinglulu void plat_memctrl_restore(void) 647*91f16700Schasinglulu { 648*91f16700Schasinglulu /* 649*91f16700Schasinglulu * Re-configure MSS to allow ROC to deal with ordering of the 650*91f16700Schasinglulu * Memory Controller traffic. This is needed as the Memory Controller 651*91f16700Schasinglulu * boots with MSS having all control, but ROC provides a performance 652*91f16700Schasinglulu * boost as compared to MSS. 653*91f16700Schasinglulu */ 654*91f16700Schasinglulu tegra186_memctrl_reconfig_mss_clients(); 655*91f16700Schasinglulu 656*91f16700Schasinglulu /* Program overrides for MC transactions */ 657*91f16700Schasinglulu tegra186_memctrl_set_overrides(); 658*91f16700Schasinglulu } 659*91f16700Schasinglulu 660*91f16700Schasinglulu /******************************************************************************* 661*91f16700Schasinglulu * Handler to program the scratch registers with TZDRAM settings for the 662*91f16700Schasinglulu * resume firmware 663*91f16700Schasinglulu ******************************************************************************/ 664*91f16700Schasinglulu void plat_memctrl_tzdram_setup(uint64_t phys_base, uint64_t size_in_bytes) 665*91f16700Schasinglulu { 666*91f16700Schasinglulu uint32_t val; 667*91f16700Schasinglulu 668*91f16700Schasinglulu /* 669*91f16700Schasinglulu * Setup the Memory controller to allow only secure accesses to 670*91f16700Schasinglulu * the TZDRAM carveout 671*91f16700Schasinglulu */ 672*91f16700Schasinglulu INFO("Configuring TrustZone DRAM Memory Carveout\n"); 673*91f16700Schasinglulu 674*91f16700Schasinglulu tegra_mc_write_32(MC_SECURITY_CFG0_0, (uint32_t)phys_base); 675*91f16700Schasinglulu tegra_mc_write_32(MC_SECURITY_CFG3_0, (uint32_t)(phys_base >> 32)); 676*91f16700Schasinglulu tegra_mc_write_32(MC_SECURITY_CFG1_0, size_in_bytes >> 20); 677*91f16700Schasinglulu 678*91f16700Schasinglulu /* 679*91f16700Schasinglulu * When TZ encryption is enabled, we need to setup TZDRAM 680*91f16700Schasinglulu * before CPU accesses TZ Carveout, else CPU will fetch 681*91f16700Schasinglulu * non-decrypted data. So save TZDRAM setting for SC7 resume 682*91f16700Schasinglulu * FW to restore. 683*91f16700Schasinglulu * 684*91f16700Schasinglulu * Scratch registers map: 685*91f16700Schasinglulu * RSV55_0 = CFG1[12:0] | CFG0[31:20] 686*91f16700Schasinglulu * RSV55_1 = CFG3[1:0] 687*91f16700Schasinglulu */ 688*91f16700Schasinglulu val = tegra_mc_read_32(MC_SECURITY_CFG1_0) & MC_SECURITY_SIZE_MB_MASK; 689*91f16700Schasinglulu val |= tegra_mc_read_32(MC_SECURITY_CFG0_0) & MC_SECURITY_BOM_MASK; 690*91f16700Schasinglulu mmio_write_32(TEGRA_SCRATCH_BASE + SCRATCH_TZDRAM_ADDR_LO, val); 691*91f16700Schasinglulu 692*91f16700Schasinglulu val = tegra_mc_read_32(MC_SECURITY_CFG3_0) & MC_SECURITY_BOM_HI_MASK; 693*91f16700Schasinglulu mmio_write_32(TEGRA_SCRATCH_BASE + SCRATCH_TZDRAM_ADDR_HI, val); 694*91f16700Schasinglulu 695*91f16700Schasinglulu /* 696*91f16700Schasinglulu * MCE propagates the security configuration values across the 697*91f16700Schasinglulu * CCPLEX. 698*91f16700Schasinglulu */ 699*91f16700Schasinglulu (void)mce_update_gsc_tzdram(); 700*91f16700Schasinglulu } 701