1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2019-2020, NVIDIA CORPORATION. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <assert.h> 8*91f16700Schasinglulu #include <common/bl_common.h> 9*91f16700Schasinglulu #include <mce.h> 10*91f16700Schasinglulu #include <memctrl_v2.h> 11*91f16700Schasinglulu #include <tegra_platform.h> 12*91f16700Schasinglulu #include <tegra_private.h> 13*91f16700Schasinglulu 14*91f16700Schasinglulu /******************************************************************************* 15*91f16700Schasinglulu * Array to hold MC context for Tegra194 16*91f16700Schasinglulu ******************************************************************************/ 17*91f16700Schasinglulu static __attribute__((aligned(16))) mc_regs_t tegra194_mc_context[] = { 18*91f16700Schasinglulu _START_OF_TABLE_, 19*91f16700Schasinglulu mc_smmu_bypass_cfg, /* TBU settings */ 20*91f16700Schasinglulu _END_OF_TABLE_, 21*91f16700Schasinglulu }; 22*91f16700Schasinglulu 23*91f16700Schasinglulu /******************************************************************************* 24*91f16700Schasinglulu * Handler to return the pointer to the MC's context struct 25*91f16700Schasinglulu ******************************************************************************/ 26*91f16700Schasinglulu mc_regs_t *plat_memctrl_get_sys_suspend_ctx(void) 27*91f16700Schasinglulu { 28*91f16700Schasinglulu /* index of _END_OF_TABLE_ */ 29*91f16700Schasinglulu tegra194_mc_context[0].val = (uint32_t)ARRAY_SIZE(tegra194_mc_context) - 1U; 30*91f16700Schasinglulu 31*91f16700Schasinglulu return tegra194_mc_context; 32*91f16700Schasinglulu } 33*91f16700Schasinglulu 34*91f16700Schasinglulu /******************************************************************************* 35*91f16700Schasinglulu * Handler to restore platform specific settings to the memory controller 36*91f16700Schasinglulu ******************************************************************************/ 37*91f16700Schasinglulu void plat_memctrl_restore(void) 38*91f16700Schasinglulu { 39*91f16700Schasinglulu UNUSED_FUNC_NOP(); /* do nothing */ 40*91f16700Schasinglulu } 41*91f16700Schasinglulu 42*91f16700Schasinglulu /******************************************************************************* 43*91f16700Schasinglulu * Handler to program platform specific settings to the memory controller 44*91f16700Schasinglulu ******************************************************************************/ 45*91f16700Schasinglulu void plat_memctrl_setup(void) 46*91f16700Schasinglulu { 47*91f16700Schasinglulu UNUSED_FUNC_NOP(); /* do nothing */ 48*91f16700Schasinglulu } 49*91f16700Schasinglulu 50*91f16700Schasinglulu /******************************************************************************* 51*91f16700Schasinglulu * Handler to program the scratch registers with TZDRAM settings for the 52*91f16700Schasinglulu * resume firmware 53*91f16700Schasinglulu ******************************************************************************/ 54*91f16700Schasinglulu void plat_memctrl_tzdram_setup(uint64_t phys_base, uint64_t size_in_bytes) 55*91f16700Schasinglulu { 56*91f16700Schasinglulu uint32_t sec_reg_ctrl = tegra_mc_read_32(MC_SECURITY_CFG_REG_CTRL_0); 57*91f16700Schasinglulu uint32_t phys_base_lo = (uint32_t)phys_base & 0xFFF00000; 58*91f16700Schasinglulu uint32_t phys_base_hi = (uint32_t)(phys_base >> 32); 59*91f16700Schasinglulu 60*91f16700Schasinglulu /* 61*91f16700Schasinglulu * Check TZDRAM carveout register access status. Setup TZDRAM fence 62*91f16700Schasinglulu * only if access is enabled. 63*91f16700Schasinglulu */ 64*91f16700Schasinglulu if ((sec_reg_ctrl & SECURITY_CFG_WRITE_ACCESS_BIT) == 65*91f16700Schasinglulu SECURITY_CFG_WRITE_ACCESS_ENABLE) { 66*91f16700Schasinglulu 67*91f16700Schasinglulu /* 68*91f16700Schasinglulu * Setup the Memory controller to allow only secure accesses to 69*91f16700Schasinglulu * the TZDRAM carveout 70*91f16700Schasinglulu */ 71*91f16700Schasinglulu INFO("Configuring TrustZone DRAM Memory Carveout\n"); 72*91f16700Schasinglulu 73*91f16700Schasinglulu tegra_mc_write_32(MC_SECURITY_CFG0_0, phys_base_lo); 74*91f16700Schasinglulu tegra_mc_write_32(MC_SECURITY_CFG3_0, phys_base_hi); 75*91f16700Schasinglulu tegra_mc_write_32(MC_SECURITY_CFG1_0, (uint32_t)(size_in_bytes >> 20)); 76*91f16700Schasinglulu 77*91f16700Schasinglulu /* 78*91f16700Schasinglulu * MCE propagates the security configuration values across the 79*91f16700Schasinglulu * CCPLEX. 80*91f16700Schasinglulu */ 81*91f16700Schasinglulu (void)mce_update_gsc_tzdram(); 82*91f16700Schasinglulu } 83*91f16700Schasinglulu } 84