Home | History | Annotate | Download | only in armv8
      1 /* SPDX-License-Identifier: GPL-2.0+ */
      2 /*
      3  * A lowlevel_init function that sets up the stack to call a C function to
      4  * perform further init.
      5  */
      6 
      7 #include <asm-offsets.h>
      8 #include <config.h>
      9 #include <linux/linkage.h>
     10 
     11 ENTRY(lowlevel_init)
     12 	/*
     13 	 * Setup a temporary stack. Global data is not available yet.
     14 	 */
     15 #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)
     16 	ldr	w0, =CONFIG_SPL_STACK
     17 #else
     18 	ldr	w0, =CONFIG_SYS_INIT_SP_ADDR
     19 #endif
     20 	bic	sp, x0, #0xf	/* 16-byte alignment for ABI compliance */
     21 
     22 	/*
     23 	 * Save the old LR(passed in x29) and the current LR to stack
     24 	 */
     25 	stp	x29, x30, [sp, #-16]!
     26 
     27 	/*
     28 	 * Call the very early init function. This should do only the
     29 	 * absolute bare minimum to get started. It should not:
     30 	 *
     31 	 * - set up DRAM
     32 	 * - use global_data
     33 	 * - clear BSS
     34 	 * - try to start a console
     35 	 *
     36 	 * For boards with SPL this should be empty since SPL can do all of
     37 	 * this init in the SPL board_init_f() function which is called
     38 	 * immediately after this.
     39 	 */
     40 	bl	s_init
     41 	ldp	x29, x30, [sp]
     42 	ret
     43 ENDPROC(lowlevel_init)
     44