blob: d6226b486241265fdaa7dd387977308b3cfd62e5 [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_mc_def.h>
12#include <tegra_platform.h>
Varun Wadekard4a698f2019-08-26 10:20:53 -070013#include <tegra_private.h>
Varun Wadekar00759902017-05-31 11:41:00 -070014
15/*******************************************************************************
Pritesh Raithatha75c94432018-08-03 15:48:15 +053016 * Array to hold MC context for Tegra194
17 ******************************************************************************/
18static __attribute__((aligned(16))) mc_regs_t tegra194_mc_context[] = {
19 _START_OF_TABLE_,
Pritesh Raithatha75c94432018-08-03 15:48:15 +053020 mc_smmu_bypass_cfg, /* TBU settings */
21 _END_OF_TABLE_,
22};
23
24/*******************************************************************************
25 * Handler to return the pointer to the MC's context struct
26 ******************************************************************************/
Varun Wadekard4a698f2019-08-26 10:20:53 -070027mc_regs_t *plat_memctrl_get_sys_suspend_ctx(void)
Pritesh Raithatha75c94432018-08-03 15:48:15 +053028{
29 /* index of _END_OF_TABLE_ */
30 tegra194_mc_context[0].val = (uint32_t)ARRAY_SIZE(tegra194_mc_context) - 1U;
31
32 return tegra194_mc_context;
33}
34
35/*******************************************************************************
Varun Wadekard4a698f2019-08-26 10:20:53 -070036 * Handler to restore platform specific settings to the memory controller
Varun Wadekar00759902017-05-31 11:41:00 -070037 ******************************************************************************/
Varun Wadekard4a698f2019-08-26 10:20:53 -070038void plat_memctrl_restore(void)
39{
40 UNUSED_FUNC_NOP(); /* do nothing */
41}
Varun Wadekar00759902017-05-31 11:41:00 -070042
43/*******************************************************************************
Varun Wadekard4a698f2019-08-26 10:20:53 -070044 * Handler to program platform specific settings to the memory controller
Varun Wadekar00759902017-05-31 11:41:00 -070045 ******************************************************************************/
Varun Wadekard4a698f2019-08-26 10:20:53 -070046void plat_memctrl_setup(void)
Varun Wadekar00759902017-05-31 11:41:00 -070047{
Varun Wadekard4a698f2019-08-26 10:20:53 -070048 UNUSED_FUNC_NOP(); /* do nothing */
Steven Kaoee93ed12017-11-14 19:12:58 +080049}
50
51/*******************************************************************************
52 * Handler to program the scratch registers with TZDRAM settings for the
53 * resume firmware
54 ******************************************************************************/
55void plat_memctrl_tzdram_setup(uint64_t phys_base, uint64_t size_in_bytes)
56{
Steven Kaob2b43052017-11-30 11:53:29 +080057 uint32_t sec_reg_ctrl = tegra_mc_read_32(MC_SECURITY_CFG_REG_CTRL_0);
Varun Wadekar22ddd8a2019-04-22 16:12:30 -070058 uint32_t phys_base_lo = (uint32_t)phys_base & 0xFFF00000;
59 uint32_t phys_base_hi = (uint32_t)(phys_base >> 32);
Steven Kaob2b43052017-11-30 11:53:29 +080060
Steven Kaoee93ed12017-11-14 19:12:58 +080061 /*
Steven Kaob2b43052017-11-30 11:53:29 +080062 * Check TZDRAM carveout register access status. Setup TZDRAM fence
63 * only if access is enabled.
Steven Kaoee93ed12017-11-14 19:12:58 +080064 */
Steven Kaob2b43052017-11-30 11:53:29 +080065 if ((sec_reg_ctrl & SECURITY_CFG_WRITE_ACCESS_BIT) ==
66 SECURITY_CFG_WRITE_ACCESS_ENABLE) {
Steven Kaoee93ed12017-11-14 19:12:58 +080067
68 /*
69 * Setup the Memory controller to allow only secure accesses to
70 * the TZDRAM carveout
71 */
72 INFO("Configuring TrustZone DRAM Memory Carveout\n");
73
Varun Wadekar22ddd8a2019-04-22 16:12:30 -070074 tegra_mc_write_32(MC_SECURITY_CFG0_0, phys_base_lo);
75 tegra_mc_write_32(MC_SECURITY_CFG3_0, phys_base_hi);
Steven Kaoee93ed12017-11-14 19:12:58 +080076 tegra_mc_write_32(MC_SECURITY_CFG1_0, (uint32_t)(size_in_bytes >> 20));
77
78 /*
79 * MCE propagates the security configuration values across the
80 * CCPLEX.
81 */
82 (void)mce_update_gsc_tzdram();
83 }
84}