From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alexander Graf Date: Mon, 21 Nov 2016 16:34:06 +0100 Subject: [U-Boot] [PATCH 04/24] armv8: add lowlevel_init.S In-Reply-To: <1479653838-3574-5-git-send-email-andre.przywara@arm.com> References: <1479653838-3574-1-git-send-email-andre.przywara@arm.com> <1479653838-3574-5-git-send-email-andre.przywara@arm.com> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de 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 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 > +#include > +#include > + > +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