[U-Boot] [PATCH 04/24] armv8: add lowlevel_init.S

Alexander Graf agraf at suse.de
Mon Nov 21 16:34:06 CET 2016



On 20/11/2016 15:56, Andre Przywara wrote:
> 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 on with a
> 64-bit SPL.
>
> Signed-off-by: Andre Przywara <andre.przywara at arm.com>

Isn't that what _main in ./arch/arm/lib/crt0_64.S is supposed to do? 
That should be used for the SPL flow too, no?

> ---
>  arch/arm/cpu/armv8/Makefile        |  1 +
>  arch/arm/cpu/armv8/lowlevel_init.S | 44 ++++++++++++++++++++++++++++++++++++++
>  2 files changed, 45 insertions(+)
>  create mode 100644 arch/arm/cpu/armv8/lowlevel_init.S
>
> diff --git a/arch/arm/cpu/armv8/Makefile b/arch/arm/cpu/armv8/Makefile
> index dea1465..799a752 100644
> --- a/arch/arm/cpu/armv8/Makefile
> +++ b/arch/arm/cpu/armv8/Makefile
> @@ -25,3 +25,4 @@ obj-$(CONFIG_FSL_LAYERSCAPE) += fsl-layerscape/
>  obj-$(CONFIG_S32V234) += s32v234/
>  obj-$(CONFIG_ARCH_ZYNQMP) += zynqmp/
>  obj-$(CONFIG_TARGET_HIKEY) += hisilicon/
> +obj-$(CONFIG_ARCH_SUNXI) += lowlevel_init.o
> 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.

So this comment says that s_init shouldn't even be used for SPL and 
instead we should use board_init_f which is what crt0 calls.


Alex


More information about the U-Boot mailing list