1/* 2 * A lowlevel_init function that sets up the stack to call a C function to 3 * perform further init. 4 * 5 * (C) Copyright 2010 6 * Texas Instruments, <www.ti.com> 7 * 8 * Author : 9 * Aneesh V <aneesh@ti.com> 10 * 11 * SPDX-License-Identifier: GPL-2.0+ 12 */ 13 14#include <asm-offsets.h> 15#include <config.h> 16#include <linux/linkage.h> 17 18ENTRY(lowlevel_init) 19 /* 20 * Setup a temporary stack. Global data is not available yet. 21 */ 22#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK) 23 ldr sp, =CONFIG_SPL_STACK 24#else 25 ldr sp, =CONFIG_SYS_INIT_SP_ADDR 26#endif 27 bic sp, sp, #7 /* 8-byte alignment for ABI compliance */ 28#ifdef CONFIG_SPL_DM 29 mov r9, #0 30#else 31 /* 32 * Set up global data for boards that still need it. This will be 33 * removed soon. 34 */ 35#ifdef CONFIG_SPL_BUILD 36 ldr r9, =gdata 37#else 38 sub sp, sp, #GD_SIZE 39 bic sp, sp, #7 40 mov r9, sp 41#endif 42#endif 43 /* 44 * Save the old lr(passed in ip) and the current lr to stack 45 */ 46 push {ip, lr} 47 48 /* 49 * Call the very early init function. This should do only the 50 * absolute bare minimum to get started. It should not: 51 * 52 * - set up DRAM 53 * - use global_data 54 * - clear BSS 55 * - try to start a console 56 * 57 * For boards with SPL this should be empty since SPL can do all of 58 * this init in the SPL board_init_f() function which is called 59 * immediately after this. 60 */ 61 bl s_init 62 pop {ip, pc} 63ENDPROC(lowlevel_init) 64