xref: /arm-trusted-firmware/plat/nvidia/tegra/soc/t194/plat_memctrl.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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