blob: 9e03001a2175878d8316d3c2a9bfd376b8b66386 [file]
/*
* Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
*
* SPDX-License-Identifier: GPL-2.0-only
*/
#include <autoconf.h>
#include <elfloader/gen_config.h>
#include <assembler.h>
#include <armv/assembler.h>
.extern non_boot_core
#if CONFIG_MAX_NUM_NODES > 1
BEGIN_FUNC(imx_non_boot)
/* Invalidate caches before proceeding... */
mov r0, #0
mcr IIALL(r0)
dcache isw
b non_boot_core
END_FUNC(imx_non_boot)
BEGIN_FUNC(non_boot_core)
/* Disable Async aborts that might be pending from bootloader */
cpsid ifa
/* Enable SMP */
mrc ACTLR(r0)
orr r0, r0, #(1 << 6) /* enable SMP bit */
#ifdef CONFIG_ARM_CORTEX_A9
orr r0, r0, #1 /* enable FW bit */
#endif
mcr ACTLR(r0)
ldr r2, =smp_aps_index
ldr r3, =core_stack_alloc - 0x10
/* Get stack index */
mov r0, r2
1: ldrex r1, [r0]
add r1, r1, #1
strex r2, r1, [r0]
teq r2, #0
bne 1b
/* Set up stack */
mov r0, #0x1000
mul r1, r0
add r3, r1
mov sp, r3
b non_boot_main
END_FUNC(non_boot_core)
#endif /* CONFIG_MAX_NUM_NODES */