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
18.pushsection .text.s_init, "ax"
19WEAK(s_init)
20	bx	lr
21ENDPROC(s_init)
22.popsection
23
24.pushsection .text.lowlevel_init, "ax"
25WEAK(lowlevel_init)
26	/*
27	 * Setup a temporary stack. Global data is not available yet.
28	 */
29#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)
30	ldr	sp, =CONFIG_SPL_STACK
31#else
32	ldr	sp, =CONFIG_SYS_INIT_SP_ADDR
33#endif
34	bic	sp, sp, #7 /* 8-byte alignment for ABI compliance */
35#ifdef CONFIG_SPL_DM
36	mov	r9, #0
37#else
38	/*
39	 * Set up global data for boards that still need it. This will be
40	 * removed soon.
41	 */
42#ifdef CONFIG_SPL_BUILD
43	ldr	r9, =gdata
44#else
45	sub	sp, sp, #GD_SIZE
46	bic	sp, sp, #7
47	mov	r9, sp
48#endif
49#endif
50	/*
51	 * Save the old lr(passed in ip) and the current lr to stack
52	 */
53	push	{ip, lr}
54
55	/*
56	 * Call the very early init function. This should do only the
57	 * absolute bare minimum to get started. It should not:
58	 *
59	 * - set up DRAM
60	 * - use global_data
61	 * - clear BSS
62	 * - try to start a console
63	 *
64	 * For boards with SPL this should be empty since SPL can do all of
65	 * this init in the SPL board_init_f() function which is called
66	 * immediately after this.
67	 */
68	bl	s_init
69	pop	{ip, pc}
70ENDPROC(lowlevel_init)
71.popsection
72