blob: 427b0b132165b8003233a3280e097b02a4891e0b [file] [log] [blame]
Tom Rini41aebf82012-08-08 17:03:10 -07001/*
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 *
Wolfgang Denk1a459662013-07-08 09:37:19 +020011 * SPDX-License-Identifier: GPL-2.0+
Tom Rini41aebf82012-08-08 17:03:10 -070012 */
13
14#include <asm-offsets.h>
15#include <config.h>
16#include <linux/linkage.h>
17
18ENTRY(lowlevel_init)
19 /*
Simon Glass24a6bc02015-03-03 08:02:57 -070020 * Setup a temporary stack. Global data is not available yet.
Tom Rini41aebf82012-08-08 17:03:10 -070021 */
22 ldr sp, =CONFIG_SYS_INIT_SP_ADDR
Tom Rini975b71b2012-08-09 08:22:06 -070023 bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
Simon Glass24a6bc02015-03-03 08:02:57 -070024#ifdef CONFIG_DM
25 mov r9, #0
26#else
27 /*
28 * Set up global data for boards that still need it. This will be
29 * removed soon.
30 */
SRICHARAN R4a0eb752013-04-24 00:41:24 +000031#ifdef CONFIG_SPL_BUILD
Jeroen Hofsteefe1378a2013-09-21 14:04:41 +020032 ldr r9, =gdata
SRICHARAN R4a0eb752013-04-24 00:41:24 +000033#else
Andreas Bießmann6ba2bc82013-11-27 16:09:29 +010034 sub sp, sp, #GD_SIZE
SRICHARAN R4a0eb752013-04-24 00:41:24 +000035 bic sp, sp, #7
Jeroen Hofsteefe1378a2013-09-21 14:04:41 +020036 mov r9, sp
SRICHARAN R4a0eb752013-04-24 00:41:24 +000037#endif
Simon Glass24a6bc02015-03-03 08:02:57 -070038#endif
Tom Rini41aebf82012-08-08 17:03:10 -070039 /*
40 * Save the old lr(passed in ip) and the current lr to stack
41 */
42 push {ip, lr}
43
44 /*
Simon Glass24a6bc02015-03-03 08:02:57 -070045 * Call the very early init function. This should do only the
46 * absolute bare minimum to get started. It should not:
47 *
48 * - set up DRAM
49 * - use global_data
50 * - clear BSS
51 * - try to start a console
52 *
53 * For boards with SPL this should be empty since SPL can do all of
54 * this init in the SPL board_init_f() function which is called
55 * immediately after this.
Tom Rini41aebf82012-08-08 17:03:10 -070056 */
57 bl s_init
58 pop {ip, pc}
59ENDPROC(lowlevel_init)