141612559SVarun Wadekar /* 2*2ac7b223SJeetesh Burman * Copyright (c) 2019-2020, NVIDIA CORPORATION. All rights reserved. 341612559SVarun Wadekar * 441612559SVarun Wadekar * SPDX-License-Identifier: BSD-3-Clause 541612559SVarun Wadekar */ 641612559SVarun Wadekar 741612559SVarun Wadekar #include <arch_helpers.h> 841612559SVarun Wadekar #include <common/debug.h> 941612559SVarun Wadekar #include <lib/mmio.h> 1041612559SVarun Wadekar #include <mce.h> 1141612559SVarun Wadekar #include <string.h> 12653fc380SVarun Wadekar #include <tegra194_private.h> 1341612559SVarun Wadekar #include <tegra_def.h> 1441612559SVarun Wadekar #include <tegra_private.h> 1541612559SVarun Wadekar 16*2ac7b223SJeetesh Burman extern uint64_t tegra_bl31_phys_base; 17*2ac7b223SJeetesh Burman 18b6533b56SAnthony Zhou #define MISCREG_AA64_RST_LOW 0x2004U 19b6533b56SAnthony Zhou #define MISCREG_AA64_RST_HIGH 0x2008U 2041612559SVarun Wadekar 21b6533b56SAnthony Zhou #define CPU_RESET_MODE_AA64 1U 2241612559SVarun Wadekar 2341612559SVarun Wadekar /******************************************************************************* 2441612559SVarun Wadekar * Setup secondary CPU vectors 2541612559SVarun Wadekar ******************************************************************************/ 2641612559SVarun Wadekar void plat_secondary_setup(void) 2741612559SVarun Wadekar { 2841612559SVarun Wadekar uint32_t addr_low, addr_high; 2941612559SVarun Wadekar plat_params_from_bl2_t *params_from_bl2 = bl31_get_plat_params(); 30*2ac7b223SJeetesh Burman uint64_t cpu_reset_handler_base, cpu_reset_handler_size, tzdram_addr; 31*2ac7b223SJeetesh Burman uint64_t src_len_bytes = BL_END - tegra_bl31_phys_base; 3241612559SVarun Wadekar 3341612559SVarun Wadekar INFO("Setting up secondary CPU boot\n"); 3441612559SVarun Wadekar 35*2ac7b223SJeetesh Burman tzdram_addr = params_from_bl2->tzdram_base + 36*2ac7b223SJeetesh Burman tegra194_get_cpu_reset_handler_size(); 37*2ac7b223SJeetesh Burman 38653fc380SVarun Wadekar /* 39653fc380SVarun Wadekar * The BL31 code resides in the TZSRAM which loses state 40653fc380SVarun Wadekar * when we enter System Suspend. Copy the wakeup trampoline 41653fc380SVarun Wadekar * code to TZDRAM to help us exit from System Suspend. 42653fc380SVarun Wadekar */ 43653fc380SVarun Wadekar cpu_reset_handler_base = tegra194_get_cpu_reset_handler_base(); 44653fc380SVarun Wadekar cpu_reset_handler_size = tegra194_get_cpu_reset_handler_size(); 45653fc380SVarun Wadekar memcpy((void *)((uintptr_t)params_from_bl2->tzdram_base), 46653fc380SVarun Wadekar (void *)((uintptr_t)cpu_reset_handler_base), 47653fc380SVarun Wadekar cpu_reset_handler_size); 4841612559SVarun Wadekar 49653fc380SVarun Wadekar /* TZDRAM base will be used as the "resume" address */ 50653fc380SVarun Wadekar addr_low = (uint32_t)params_from_bl2->tzdram_base | CPU_RESET_MODE_AA64; 51653fc380SVarun Wadekar addr_high = (uint32_t)((params_from_bl2->tzdram_base >> 32U) & 0x7ffU); 5241612559SVarun Wadekar 5341612559SVarun Wadekar /* write lower 32 bits first, then the upper 11 bits */ 5441612559SVarun Wadekar mmio_write_32(TEGRA_MISC_BASE + MISCREG_AA64_RST_LOW, addr_low); 5541612559SVarun Wadekar mmio_write_32(TEGRA_MISC_BASE + MISCREG_AA64_RST_HIGH, addr_high); 5641612559SVarun Wadekar 5741612559SVarun Wadekar /* save reset vector to be used during SYSTEM_SUSPEND exit */ 58192fd367SSteven Kao mmio_write_32(TEGRA_SCRATCH_BASE + SCRATCH_RESET_VECTOR_LO, 5941612559SVarun Wadekar addr_low); 60192fd367SSteven Kao mmio_write_32(TEGRA_SCRATCH_BASE + SCRATCH_RESET_VECTOR_HI, 6141612559SVarun Wadekar addr_high); 62*2ac7b223SJeetesh Burman mmio_write_32(TEGRA_SCRATCH_BASE + SECURE_SCRATCH_RSV72_LO, 63*2ac7b223SJeetesh Burman (uint32_t)tzdram_addr); 64*2ac7b223SJeetesh Burman mmio_write_32(TEGRA_SCRATCH_BASE + SECURE_SCRATCH_RSV72_HI, 65*2ac7b223SJeetesh Burman (uint32_t)src_len_bytes); 6641612559SVarun Wadekar } 67