blob: eaa078831154e0b1eb7d9c6d293dd111dfcfc5dd [file] [log] [blame]
/*
* Copyright (c) 2018-2019, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <arch.h>
#include <asm_macros.S>
#include <tftf.h>
.globl tftf_entrypoint
.globl tftf_hotplug_entry
/* ----------------------------------------------------------------------------
* Cold boot entry point for the primary CPU.
* ----------------------------------------------------------------------------
*/
func tftf_entrypoint
bl arch_init
/* --------------------------------------------------------------------
* Invalidate the RW memory used by TFTF image.
* This is done to safeguard against possible corruption of this
* memory by dirty cache lines in a system cache as a result of use
* by an earlier boot loader stage.
* --------------------------------------------------------------------
*/
ldr r0, =__DATA_START__
ldr r1, =__DATA_END__
sub r1, r1, r0
bl inv_dcache_range
/* --------------------------------------------------------------------
* This code is expected to be executed only by the primary CPU.
* Save the mpid for the first core that executes and if a secondary
* CPU has lost its way make it spin forever.
* --------------------------------------------------------------------
*/
bl save_primary_mpid
/* --------------------------------------------------------------------
* Zero out NOBITS sections. There are 2 of them:
* - the .bss section;
* - the coherent memory section.
* --------------------------------------------------------------------
*/
ldr r0, =__BSS_START__
ldr r1, =__BSS_SIZE__
bl zeromem
ldr r0, =__COHERENT_RAM_START__
ldr r1, =__COHERENT_RAM_UNALIGNED_SIZE__
bl zeromem
/* --------------------------------------------------------------------
* Give ourselves a small coherent stack to ease the pain of
* initializing the MMU
* --------------------------------------------------------------------
*/
ldcopr r0, MPIDR
bl platform_set_coherent_stack
bl tftf_early_platform_setup
bl tftf_plat_arch_setup
/* --------------------------------------------------------------------
* Give ourselves a stack allocated in Normal -IS-WBWA memory
* --------------------------------------------------------------------
*/
ldcopr r0, MPIDR
bl platform_set_stack
/* --------------------------------------------------------------------
* tftf_cold_boot_main() will perform the remaining architectural and
* platform setup, initialise the test framework's state, then run the
* tests.
* --------------------------------------------------------------------
*/
b tftf_cold_boot_main
endfunc tftf_entrypoint
/* ----------------------------------------------------------------------------
* Entry point for a CPU that has just been powered up.
* In : r0 - context_id
* ----------------------------------------------------------------------------
*/
func tftf_hotplug_entry
/* --------------------------------------------------------------------
* Preserve the context_id in a callee-saved register
* --------------------------------------------------------------------
*/
mov r4, r0
bl arch_init
/* --------------------------------------------------------------------
* Give ourselves a small coherent stack to ease the pain of
* initializing the MMU
* --------------------------------------------------------------------
*/
ldcopr r0, MPIDR
bl platform_set_coherent_stack
/* --------------------------------------------------------------------
* Enable the MMU
* --------------------------------------------------------------------
*/
bl tftf_plat_enable_mmu
/* --------------------------------------------------------------------
* Give ourselves a stack in normal memory.
* --------------------------------------------------------------------
*/
ldcopr r0, MPIDR
bl platform_set_stack
/* --------------------------------------------------------------------
* Save the context_id for later retrieval by tests
* --------------------------------------------------------------------
*/
ldcopr r0, MPIDR
ldr r1, =MPID_MASK
and r0, r0, r1
bl platform_get_core_pos
mov r1, r4
bl tftf_set_cpu_on_ctx_id
/* --------------------------------------------------------------------
* Jump to warm boot main function
* --------------------------------------------------------------------
*/
b tftf_warm_boot_main
endfunc tftf_hotplug_entry
/* ----------------------------------------------------------------------------
* Initialize architectural state.
* ----------------------------------------------------------------------------
*/
func arch_init
/* Set the exception vectors. */
ldr r0, =tftf_vector
stcopr r0, HVBAR
/* Enable the instruction cache. */
ldr r0, =(HSCTLR_RES1 | HSCTLR_I_BIT)
stcopr r0, HSCTLR
isb
bx lr
endfunc arch_init
/* ----------------------------------------------------------------------------
* Saves the mpid of the primary core and if the primary core
* is already saved then it loops infinitely.
* ----------------------------------------------------------------------------
*/
func save_primary_mpid
ldr r1, =tftf_primary_core
ldr r0, [r1]
mov r2, #INVALID_MPID
cmp r0, r2
bne panic
ldr r2, =MPID_MASK
ldcopr r0, MPIDR
and r0, r0, r2
str r0, [r1]
bx lr
panic:
/* Primary core MPID already saved */
b panic
endfunc save_primary_mpid