13cf3183fSVarun Wadekar /* 293c78ed2SAntonio Nino Diaz * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. 33cf3183fSVarun Wadekar * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 53cf3183fSVarun Wadekar */ 63cf3183fSVarun Wadekar 768c7de6fSVarun Wadekar #include <string.h> 8*09d40e0eSAntonio Nino Diaz 9*09d40e0eSAntonio Nino Diaz #include <arch_helpers.h> 10*09d40e0eSAntonio Nino Diaz #include <common/debug.h> 11*09d40e0eSAntonio Nino Diaz #include <lib/mmio.h> 12*09d40e0eSAntonio Nino Diaz 13*09d40e0eSAntonio Nino Diaz #include <mce.h> 14b47d97b3SVarun Wadekar #include <tegra_def.h> 1568c7de6fSVarun Wadekar #include <tegra_private.h> 16b47d97b3SVarun Wadekar 17b47d97b3SVarun Wadekar #define MISCREG_CPU_RESET_VECTOR 0x2000 18b47d97b3SVarun Wadekar #define MISCREG_AA64_RST_LOW 0x2004 19b47d97b3SVarun Wadekar #define MISCREG_AA64_RST_HIGH 0x2008 20b47d97b3SVarun Wadekar 21b47d97b3SVarun Wadekar #define SCRATCH_SECURE_RSV1_SCRATCH_0 0x658 22b47d97b3SVarun Wadekar #define SCRATCH_SECURE_RSV1_SCRATCH_1 0x65C 23b47d97b3SVarun Wadekar 24b47d97b3SVarun Wadekar #define CPU_RESET_MODE_AA64 1 25b47d97b3SVarun Wadekar 2693c78ed2SAntonio Nino Diaz extern void memcpy16(void *dest, const void *src, unsigned int length); 2793c78ed2SAntonio Nino Diaz 2868c7de6fSVarun Wadekar extern uint64_t tegra_bl31_phys_base; 2968c7de6fSVarun Wadekar extern uint64_t __tegra186_cpu_reset_handler_end; 30b47d97b3SVarun Wadekar 313cf3183fSVarun Wadekar /******************************************************************************* 323cf3183fSVarun Wadekar * Setup secondary CPU vectors 333cf3183fSVarun Wadekar ******************************************************************************/ 343cf3183fSVarun Wadekar void plat_secondary_setup(void) 353cf3183fSVarun Wadekar { 36b47d97b3SVarun Wadekar uint32_t addr_low, addr_high; 3768c7de6fSVarun Wadekar plat_params_from_bl2_t *params_from_bl2 = bl31_get_plat_params(); 3868c7de6fSVarun Wadekar uint64_t cpu_reset_handler_base; 39b47d97b3SVarun Wadekar 40b47d97b3SVarun Wadekar INFO("Setting up secondary CPU boot\n"); 41b47d97b3SVarun Wadekar 4268c7de6fSVarun Wadekar if ((tegra_bl31_phys_base >= TEGRA_TZRAM_BASE) && 4368c7de6fSVarun Wadekar (tegra_bl31_phys_base <= (TEGRA_TZRAM_BASE + TEGRA_TZRAM_SIZE))) { 4468c7de6fSVarun Wadekar 4568c7de6fSVarun Wadekar /* 4668c7de6fSVarun Wadekar * The BL31 code resides in the TZSRAM which loses state 4768c7de6fSVarun Wadekar * when we enter System Suspend. Copy the wakeup trampoline 4868c7de6fSVarun Wadekar * code to TZDRAM to help us exit from System Suspend. 4968c7de6fSVarun Wadekar */ 5068c7de6fSVarun Wadekar cpu_reset_handler_base = params_from_bl2->tzdram_base; 5168c7de6fSVarun Wadekar memcpy16((void *)((uintptr_t)cpu_reset_handler_base), 5268c7de6fSVarun Wadekar (void *)(uintptr_t)tegra186_cpu_reset_handler, 5368c7de6fSVarun Wadekar (uintptr_t)&__tegra186_cpu_reset_handler_end - 5468c7de6fSVarun Wadekar (uintptr_t)tegra186_cpu_reset_handler); 5568c7de6fSVarun Wadekar 5668c7de6fSVarun Wadekar } else { 5768c7de6fSVarun Wadekar cpu_reset_handler_base = (uintptr_t)tegra_secure_entrypoint; 5868c7de6fSVarun Wadekar } 5968c7de6fSVarun Wadekar 6068c7de6fSVarun Wadekar addr_low = (uint32_t)cpu_reset_handler_base | CPU_RESET_MODE_AA64; 6168c7de6fSVarun Wadekar addr_high = (uint32_t)((cpu_reset_handler_base >> 32) & 0x7ff); 62b47d97b3SVarun Wadekar 63b47d97b3SVarun Wadekar /* write lower 32 bits first, then the upper 11 bits */ 64b47d97b3SVarun Wadekar mmio_write_32(TEGRA_MISC_BASE + MISCREG_AA64_RST_LOW, addr_low); 65b47d97b3SVarun Wadekar mmio_write_32(TEGRA_MISC_BASE + MISCREG_AA64_RST_HIGH, addr_high); 66b47d97b3SVarun Wadekar 67b47d97b3SVarun Wadekar /* save reset vector to be used during SYSTEM_SUSPEND exit */ 68b47d97b3SVarun Wadekar mmio_write_32(TEGRA_SCRATCH_BASE + SCRATCH_SECURE_RSV1_SCRATCH_0, 69b47d97b3SVarun Wadekar addr_low); 70b47d97b3SVarun Wadekar mmio_write_32(TEGRA_SCRATCH_BASE + SCRATCH_SECURE_RSV1_SCRATCH_1, 71b47d97b3SVarun Wadekar addr_high); 72b47d97b3SVarun Wadekar 73b47d97b3SVarun Wadekar /* update reset vector address to the CCPLEX */ 74a259293eSKrishna Sitaraman mce_update_reset_vector(); 753cf3183fSVarun Wadekar } 76