blob: 9ddcacf314c7c6063e4ef97f5e1345a6b5d03848 [file] [log] [blame]
Varun Wadekar00759902017-05-31 11:41:00 -07001/*
Pritesh Raithatha45ea6892017-12-18 23:00:05 -08002 * Copyright (c) 2019-2020, NVIDIA CORPORATION. All rights reserved.
Varun Wadekar00759902017-05-31 11:41:00 -07003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Varun Wadekar128f46a2019-10-24 16:06:12 -07007#include <assert.h>
8#include <common/bl_common.h>
9#include <mce.h>
Varun Wadekar00759902017-05-31 11:41:00 -070010#include <memctrl_v2.h>
Varun Wadekar128f46a2019-10-24 16:06:12 -070011#include <tegra_platform.h>
Varun Wadekard4a698f2019-08-26 10:20:53 -070012#include <tegra_private.h>
Varun Wadekar00759902017-05-31 11:41:00 -070013
14/*******************************************************************************
Pritesh Raithatha75c94432018-08-03 15:48:15 +053015 * Array to hold MC context for Tegra194
16 ******************************************************************************/
17static __attribute__((aligned(16))) mc_regs_t tegra194_mc_context[] = {
18 _START_OF_TABLE_,
Pritesh Raithatha75c94432018-08-03 15:48:15 +053019 mc_smmu_bypass_cfg, /* TBU settings */
20 _END_OF_TABLE_,
21};
22
23/*******************************************************************************
24 * Handler to return the pointer to the MC's context struct
25 ******************************************************************************/
Varun Wadekard4a698f2019-08-26 10:20:53 -070026mc_regs_t *plat_memctrl_get_sys_suspend_ctx(void)
Pritesh Raithatha75c94432018-08-03 15:48:15 +053027{
28 /* index of _END_OF_TABLE_ */
29 tegra194_mc_context[0].val = (uint32_t)ARRAY_SIZE(tegra194_mc_context) - 1U;
30
31 return tegra194_mc_context;
32}
33
34/*******************************************************************************
Varun Wadekard4a698f2019-08-26 10:20:53 -070035 * Handler to restore platform specific settings to the memory controller
Varun Wadekar00759902017-05-31 11:41:00 -070036 ******************************************************************************/
Varun Wadekard4a698f2019-08-26 10:20:53 -070037void plat_memctrl_restore(void)
38{
39 UNUSED_FUNC_NOP(); /* do nothing */
40}
Varun Wadekar00759902017-05-31 11:41:00 -070041
42/*******************************************************************************
Varun Wadekard4a698f2019-08-26 10:20:53 -070043 * Handler to program platform specific settings to the memory controller
Varun Wadekar00759902017-05-31 11:41:00 -070044 ******************************************************************************/
Varun Wadekard4a698f2019-08-26 10:20:53 -070045void plat_memctrl_setup(void)
Varun Wadekar00759902017-05-31 11:41:00 -070046{
Varun Wadekard4a698f2019-08-26 10:20:53 -070047 UNUSED_FUNC_NOP(); /* do nothing */
Steven Kaoee93ed12017-11-14 19:12:58 +080048}
49
50/*******************************************************************************
51 * Handler to program the scratch registers with TZDRAM settings for the
52 * resume firmware
53 ******************************************************************************/
54void plat_memctrl_tzdram_setup(uint64_t phys_base, uint64_t size_in_bytes)
55{
Steven Kaob2b43052017-11-30 11:53:29 +080056 uint32_t sec_reg_ctrl = tegra_mc_read_32(MC_SECURITY_CFG_REG_CTRL_0);
Varun Wadekar22ddd8a2019-04-22 16:12:30 -070057 uint32_t phys_base_lo = (uint32_t)phys_base & 0xFFF00000;
58 uint32_t phys_base_hi = (uint32_t)(phys_base >> 32);
Steven Kaob2b43052017-11-30 11:53:29 +080059
Steven Kaoee93ed12017-11-14 19:12:58 +080060 /*
Steven Kaob2b43052017-11-30 11:53:29 +080061 * Check TZDRAM carveout register access status. Setup TZDRAM fence
62 * only if access is enabled.
Steven Kaoee93ed12017-11-14 19:12:58 +080063 */
Steven Kaob2b43052017-11-30 11:53:29 +080064 if ((sec_reg_ctrl & SECURITY_CFG_WRITE_ACCESS_BIT) ==
65 SECURITY_CFG_WRITE_ACCESS_ENABLE) {
Steven Kaoee93ed12017-11-14 19:12:58 +080066
67 /*
68 * Setup the Memory controller to allow only secure accesses to
69 * the TZDRAM carveout
70 */
71 INFO("Configuring TrustZone DRAM Memory Carveout\n");
72
Varun Wadekar22ddd8a2019-04-22 16:12:30 -070073 tegra_mc_write_32(MC_SECURITY_CFG0_0, phys_base_lo);
74 tegra_mc_write_32(MC_SECURITY_CFG3_0, phys_base_hi);
Steven Kaoee93ed12017-11-14 19:12:58 +080075 tegra_mc_write_32(MC_SECURITY_CFG1_0, (uint32_t)(size_in_bytes >> 20));
76
77 /*
78 * MCE propagates the security configuration values across the
79 * CCPLEX.
80 */
81 (void)mce_update_gsc_tzdram();
82 }
83}