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