For boards that call s_init() when the SPL runs, we are expected to setup an early stack before calling this C function. Implement the proper AArch64 version of this based on the ARMv7 code. This allows sunxi boards to setup the basic peripherals even with a 64-bit SPL. Signed-off-by: Andre Przywara <andre.przywara@arm.com> Reviewed-by: Simon Glass <sjg@chromium.org> Reviewed-by: Jagan Teki <jagan@openedev.com>master
parent
ebda0cc509
commit
aa9226f0ed
@ -0,0 +1,44 @@ |
||||
/* |
||||
* A lowlevel_init function that sets up the stack to call a C function to |
||||
* perform further init. |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <asm-offsets.h> |
||||
#include <config.h> |
||||
#include <linux/linkage.h> |
||||
|
||||
ENTRY(lowlevel_init) |
||||
/* |
||||
* Setup a temporary stack. Global data is not available yet. |
||||
*/ |
||||
#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK) |
||||
ldr w0, =CONFIG_SPL_STACK |
||||
#else |
||||
ldr w0, =CONFIG_SYS_INIT_SP_ADDR |
||||
#endif |
||||
bic sp, x0, #0xf /* 16-byte alignment for ABI compliance */ |
||||
|
||||
/* |
||||
* Save the old LR(passed in x29) and the current LR to stack |
||||
*/ |
||||
stp x29, x30, [sp, #-16]! |
||||
|
||||
/* |
||||
* Call the very early init function. This should do only the |
||||
* absolute bare minimum to get started. It should not: |
||||
* |
||||
* - set up DRAM |
||||
* - use global_data |
||||
* - clear BSS |
||||
* - try to start a console |
||||
* |
||||
* For boards with SPL this should be empty since SPL can do all of |
||||
* this init in the SPL board_init_f() function which is called |
||||
* immediately after this. |
||||
*/ |
||||
bl s_init |
||||
ldp x29, x30, [sp] |
||||
ret |
||||
ENDPROC(lowlevel_init) |
Loading…
Reference in new issue