summaryrefslogtreecommitdiff
path: root/arch/arm/cpu/armv8/lowlevel_init.S
diff options
context:
space:
mode:
authorAndre Przywara <andre.przywara@arm.com>2017-01-02 11:48:27 +0000
committerJagan Teki <jagan@openedev.com>2017-01-04 16:37:40 +0100
commitaa9226f0edba6a07c59e2645533e5cf625096cc9 (patch)
tree49d3609ef4d2db5c74e23b26f4aaa1d48cfb0097 /arch/arm/cpu/armv8/lowlevel_init.S
parentebda0cc5090d758b5f2a99b4ea116d27e4402255 (diff)
downloadu-boot-imx-aa9226f0edba6a07c59e2645533e5cf625096cc9.zip
u-boot-imx-aa9226f0edba6a07c59e2645533e5cf625096cc9.tar.gz
u-boot-imx-aa9226f0edba6a07c59e2645533e5cf625096cc9.tar.bz2
armv8: add lowlevel_init.S
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>
Diffstat (limited to 'arch/arm/cpu/armv8/lowlevel_init.S')
-rw-r--r--arch/arm/cpu/armv8/lowlevel_init.S44
1 files changed, 44 insertions, 0 deletions
diff --git a/arch/arm/cpu/armv8/lowlevel_init.S b/arch/arm/cpu/armv8/lowlevel_init.S
new file mode 100644
index 0000000..189e35f
--- /dev/null
+++ b/arch/arm/cpu/armv8/lowlevel_init.S
@@ -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)