Commit 2139c9c8 authored by Varun Wadekar's avatar Varun Wadekar
Browse files

Tegra186: system resume from TZSRAM memory



TZSRAM loses power during System suspend, so the entire contents
are copied to TZDRAM before Sysem Suspend entry. The warmboot code
verifies and restores the contents to TZSRAM during System Resume.

This patch removes the code that sets up CPU vector to point to
TZSRAM during System Resume as a result. The trampoline code can
also be completely removed as a result.

Change-Id: I2830eb1db16efef3dfd96c4e3afc41a307588ca1
Signed-off-by: default avatarVarun Wadekar <vwadekar@nvidia.com>
parent 8336c94d
...@@ -7,9 +7,6 @@ ...@@ -7,9 +7,6 @@
#ifndef TEGRA186_PRIVATE_H #ifndef TEGRA186_PRIVATE_H
#define TEGRA186_PRIVATE_H #define TEGRA186_PRIVATE_H
void tegra186_cpu_reset_handler(void); uint64_t tegra186_get_mc_ctx_size(void);
uint64_t tegra186_get_cpu_reset_handler_base(void);
uint64_t tegra186_get_cpu_reset_handler_size(void);
uint64_t tegra186_get_mc_ctx_offset(void);
#endif /* TEGRA186_PRIVATE_H */ #endif /* TEGRA186_PRIVATE_H */
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
#include <bpmp_ipc.h> #include <bpmp_ipc.h>
#include <pmc.h> #include <pmc.h>
#include <security_engine.h> #include <security_engine.h>
#include <tegra186_private.h>
#include <tegra_private.h> #include <tegra_private.h>
#include "se_private.h" #include "se_private.h"
......
...@@ -10,8 +10,8 @@ ...@@ -10,8 +10,8 @@
#include <mce.h> #include <mce.h>
#include <memctrl_v2.h> #include <memctrl_v2.h>
#include <tegra_mc_def.h>
#include <tegra186_private.h> #include <tegra186_private.h>
#include <tegra_mc_def.h>
#include <tegra_platform.h> #include <tegra_platform.h>
#include <tegra_private.h> #include <tegra_private.h>
...@@ -711,13 +711,6 @@ tegra_mc_settings_t *tegra_get_mc_settings(void) ...@@ -711,13 +711,6 @@ tegra_mc_settings_t *tegra_get_mc_settings(void)
void plat_memctrl_tzdram_setup(uint64_t phys_base, uint64_t size_in_bytes) void plat_memctrl_tzdram_setup(uint64_t phys_base, uint64_t size_in_bytes)
{ {
uint32_t val; uint32_t val;
uint64_t src_base_tzdram;
const plat_params_from_bl2_t *params_from_bl2 = bl31_get_plat_params();
uint64_t src_len_in_bytes = BL31_END - BL31_START;
/* base address of BL3-1 source in TZDRAM */
src_base_tzdram = params_from_bl2->tzdram_base +
tegra186_get_cpu_reset_handler_size();
/* /*
* Setup the Memory controller to allow only secure accesses to * Setup the Memory controller to allow only secure accesses to
...@@ -746,15 +739,6 @@ void plat_memctrl_tzdram_setup(uint64_t phys_base, uint64_t size_in_bytes) ...@@ -746,15 +739,6 @@ void plat_memctrl_tzdram_setup(uint64_t phys_base, uint64_t size_in_bytes)
val = tegra_mc_read_32(MC_SECURITY_CFG3_0) & MC_SECURITY_BOM_HI_MASK; val = tegra_mc_read_32(MC_SECURITY_CFG3_0) & MC_SECURITY_BOM_HI_MASK;
mmio_write_32(TEGRA_SCRATCH_BASE + SCRATCH_TZDRAM_ADDR_HI, val); mmio_write_32(TEGRA_SCRATCH_BASE + SCRATCH_TZDRAM_ADDR_HI, val);
/*
* save tzdram_addr_lo and ATF-size, this would be used in SC7-RF to
* generate SHA256.
*/
mmio_write_32(TEGRA_SCRATCH_BASE + SECURE_SCRATCH_RSV68_LO,
(uint32_t)src_base_tzdram);
mmio_write_32(TEGRA_SCRATCH_BASE + SECURE_SCRATCH_RSV0_HI,
(uint32_t)src_len_in_bytes);
/* /*
* MCE propagates the security configuration values across the * MCE propagates the security configuration values across the
* CCPLEX. * CCPLEX.
......
...@@ -134,8 +134,7 @@ int32_t tegra_soc_pwr_domain_suspend(const psci_power_state_t *target_state) ...@@ -134,8 +134,7 @@ int32_t tegra_soc_pwr_domain_suspend(const psci_power_state_t *target_state)
mmio_write_32(TEGRA_SCRATCH_BASE + SCRATCH_SECURE_BOOTP_FCFG, val); mmio_write_32(TEGRA_SCRATCH_BASE + SCRATCH_SECURE_BOOTP_FCFG, val);
/* save MC context to TZDRAM */ /* save MC context to TZDRAM */
mc_ctx_base = params_from_bl2->tzdram_base + mc_ctx_base = params_from_bl2->tzdram_base;
tegra186_get_mc_ctx_offset();
tegra_mc_save_context((uintptr_t)mc_ctx_base); tegra_mc_save_context((uintptr_t)mc_ctx_base);
/* Prepare for system suspend */ /* Prepare for system suspend */
...@@ -286,7 +285,7 @@ int32_t tegra_soc_pwr_domain_power_down_wfi(const psci_power_state_t *target_sta ...@@ -286,7 +285,7 @@ int32_t tegra_soc_pwr_domain_power_down_wfi(const psci_power_state_t *target_sta
if (stateid_afflvl2 == PSTATE_ID_SOC_POWERDN) { if (stateid_afflvl2 == PSTATE_ID_SOC_POWERDN) {
val = params_from_bl2->tzdram_base + val = params_from_bl2->tzdram_base +
tegra186_get_cpu_reset_handler_size(); tegra186_get_mc_ctx_size();
/* Initialise communication channel with BPMP */ /* Initialise communication channel with BPMP */
assert(tegra_bpmp_ipc_init() == 0); assert(tegra_bpmp_ipc_init() == 0);
...@@ -313,10 +312,19 @@ int32_t tegra_soc_pwr_domain_power_down_wfi(const psci_power_state_t *target_sta ...@@ -313,10 +312,19 @@ int32_t tegra_soc_pwr_domain_power_down_wfi(const psci_power_state_t *target_sta
* BL3-1 over to TZDRAM. * BL3-1 over to TZDRAM.
*/ */
val = params_from_bl2->tzdram_base + val = params_from_bl2->tzdram_base +
tegra186_get_cpu_reset_handler_size(); tegra186_get_mc_ctx_size();
memcpy16((void *)(uintptr_t)val, (void *)(uintptr_t)BL31_BASE, memcpy16((void *)(uintptr_t)val, (void *)(uintptr_t)BL31_BASE,
(uintptr_t)BL31_END - (uintptr_t)BL31_BASE); (uintptr_t)BL31_END - (uintptr_t)BL31_BASE);
/*
* Save code base and size; this would be used by SC7-RF to
* verify binary
*/
mmio_write_32(TEGRA_SCRATCH_BASE + SECURE_SCRATCH_RSV68_LO,
(uint32_t)val);
mmio_write_32(TEGRA_SCRATCH_BASE + SECURE_SCRATCH_RSV0_HI,
(uint32_t)src_len_in_bytes);
ret = tegra_bpmp_ipc_disable_clock(TEGRA186_CLK_SE); ret = tegra_bpmp_ipc_disable_clock(TEGRA186_CLK_SE);
if (ret != 0) { if (ret != 0) {
ERROR("Failed to disable clock\n"); ERROR("Failed to disable clock\n");
......
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
#include <lib/mmio.h> #include <lib/mmio.h>
#include <mce.h> #include <mce.h>
#include <tegra186_private.h>
#include <tegra_def.h> #include <tegra_def.h>
#include <tegra_private.h> #include <tegra_private.h>
...@@ -21,33 +20,18 @@ ...@@ -21,33 +20,18 @@
#define CPU_RESET_MODE_AA64 1U #define CPU_RESET_MODE_AA64 1U
extern void memcpy16(void *dest, const void *src, unsigned int length);
/******************************************************************************* /*******************************************************************************
* Setup secondary CPU vectors * Setup secondary CPU vectors
******************************************************************************/ ******************************************************************************/
void plat_secondary_setup(void) void plat_secondary_setup(void)
{ {
uint32_t addr_low, addr_high; uint32_t addr_low, addr_high;
const plat_params_from_bl2_t *params_from_bl2 = bl31_get_plat_params();
uint64_t cpu_reset_handler_base, cpu_reset_handler_size;
INFO("Setting up secondary CPU boot\n"); INFO("Setting up secondary CPU boot\n");
/*
* The BL31 code resides in the TZSRAM which loses state
* when we enter System Suspend. Copy the wakeup trampoline
* code to TZDRAM to help us exit from System Suspend.
*/
cpu_reset_handler_base = tegra186_get_cpu_reset_handler_base();
cpu_reset_handler_size = tegra186_get_cpu_reset_handler_size();
(void)memcpy16((void *)(uintptr_t)params_from_bl2->tzdram_base,
(const void *)(uintptr_t)cpu_reset_handler_base,
cpu_reset_handler_size);
/* TZDRAM base will be used as the "resume" address */ /* TZDRAM base will be used as the "resume" address */
addr_low = (uint32_t)params_from_bl2->tzdram_base | CPU_RESET_MODE_AA64; addr_low = (uintptr_t)&tegra_secure_entrypoint | CPU_RESET_MODE_AA64;
addr_high = (uint32_t)((params_from_bl2->tzdram_base >> 32U) & 0x7ffU); addr_high = (uintptr_t)(((uintptr_t)&tegra_secure_entrypoint >> 32U) & 0x7ffU);
/* save reset vector to be used during SYSTEM_SUSPEND exit */ /* save reset vector to be used during SYSTEM_SUSPEND exit */
mmio_write_32(TEGRA_SCRATCH_BASE + SCRATCH_RESET_VECTOR_LO, mmio_write_32(TEGRA_SCRATCH_BASE + SCRATCH_RESET_VECTOR_LO,
......
...@@ -14,93 +14,28 @@ ...@@ -14,93 +14,28 @@
#define TEGRA186_MC_CTX_SIZE 0x93 #define TEGRA186_MC_CTX_SIZE 0x93
.globl tegra186_cpu_reset_handler .globl tegra186_get_mc_ctx_size
/* CPU reset handler routine */
func tegra186_cpu_reset_handler _align=4
/* prepare to relocate to TZSRAM */
mov x0, #BL31_BASE
adr x1, __tegra186_cpu_reset_handler_end
adr x2, __tegra186_cpu_reset_handler_data
ldr x2, [x2, #8]
/* memcpy16 */
m_loop16:
cmp x2, #16
b.lt m_loop1
ldp x3, x4, [x1], #16
stp x3, x4, [x0], #16
sub x2, x2, #16
b m_loop16
/* copy byte per byte */
m_loop1:
cbz x2, boot_cpu
ldrb w3, [x1], #1
strb w3, [x0], #1
subs x2, x2, #1
b.ne m_loop1
boot_cpu:
adr x0, __tegra186_cpu_reset_handler_data
ldr x0, [x0]
br x0
endfunc tegra186_cpu_reset_handler
/* /*
* Tegra186 reset data (offset 0x0 - 0x430) * Tegra186 reset data (offset 0x0 - 0x420)
* *
* 0x000: secure world's entrypoint * 0x000: MC context start
* 0x008: BL31 size (RO + RW) * 0x420: MC context end
* 0x00C: MC context start
* 0x42C: MC context end
*/ */
.align 4 .align 4
.type __tegra186_cpu_reset_handler_data, %object
.globl __tegra186_cpu_reset_handler_data
__tegra186_cpu_reset_handler_data:
.quad tegra_secure_entrypoint
.quad __BL31_END__ - BL31_BASE
.globl __tegra186_system_suspend_state
__tegra186_system_suspend_state:
.quad 0
.align 4
.globl __tegra186_mc_context
__tegra186_mc_context: __tegra186_mc_context:
.rept TEGRA186_MC_CTX_SIZE .rept TEGRA186_MC_CTX_SIZE
.quad 0 .quad 0
.endr .endr
.size __tegra186_cpu_reset_handler_data, \
. - __tegra186_cpu_reset_handler_data
.align 4 .align 4
.globl __tegra186_cpu_reset_handler_end __tegra186_mc_context_end:
__tegra186_cpu_reset_handler_end:
.globl tegra186_get_cpu_reset_handler_size
.globl tegra186_get_cpu_reset_handler_base
.globl tegra186_get_mc_ctx_offset
/* return size of the CPU reset handler */
func tegra186_get_cpu_reset_handler_size
adr x0, __tegra186_cpu_reset_handler_end
adr x1, tegra186_cpu_reset_handler
sub x0, x0, x1
ret
endfunc tegra186_get_cpu_reset_handler_size
/* return the start address of the CPU reset handler */
func tegra186_get_cpu_reset_handler_base
adr x0, tegra186_cpu_reset_handler
ret
endfunc tegra186_get_cpu_reset_handler_base
/* return the size of the MC context */ /* return the size of the MC context */
func tegra186_get_mc_ctx_offset func tegra186_get_mc_ctx_size
adr x0, __tegra186_mc_context adr x0, __tegra186_mc_context_end
adr x1, tegra186_cpu_reset_handler adr x1, __tegra186_mc_context
sub x0, x0, x1 sub x0, x0, x1
ret ret
endfunc tegra186_get_mc_ctx_offset endfunc tegra186_get_mc_ctx_size
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment