1/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 *  armboot - Startup Code for ARM720 CPU-core
4 *
5 *  Copyright (c) 2001	Marius Gröger <mag@sysgo.de>
6 *  Copyright (c) 2002	Alex Züpke <azu@sysgo.de>
7 */
8
9#include <asm-offsets.h>
10#include <config.h>
11
12/*
13 *************************************************************************
14 *
15 * Startup Code (reset vector)
16 *
17 * do important init only if we don't start from RAM!
18 * relocate armboot to ram
19 * setup stack
20 * jump to second stage
21 *
22 *************************************************************************
23 */
24
25	.globl	reset
26
27reset:
28	/*
29	 * set the cpu to SVC32 mode
30	 */
31	mrs	r0,cpsr
32	bic	r0,r0,#0x1f
33	orr	r0,r0,#0xd3
34	msr	cpsr,r0
35
36	/*
37	 * we do sys-critical inits only at reboot,
38	 * not when booting from ram!
39	 */
40#if !defined(CONFIG_SKIP_LOWLEVEL_INIT) && \
41		!defined(CONFIG_SKIP_LOWLEVEL_INIT_ONLY)
42	bl	cpu_init_crit
43#endif
44
45	bl	_main
46
47/*------------------------------------------------------------------------------*/
48
49	.globl	c_runtime_cpu_setup
50c_runtime_cpu_setup:
51
52	mov	pc, lr
53
54/*
55 *************************************************************************
56 *
57 * CPU_init_critical registers
58 *
59 * setup important registers
60 * setup memory timing
61 *
62 *************************************************************************
63 */
64
65#if !defined(CONFIG_SKIP_LOWLEVEL_INIT) && \
66		!defined(CONFIG_SKIP_LOWLEVEL_INIT_ONLY)
67cpu_init_crit:
68
69	mov	ip, lr
70	/*
71	 * before relocating, we have to setup RAM timing
72	 * because memory timing is board-dependent, you will
73	 * find a lowlevel_init.S in your board directory.
74	 */
75	bl	lowlevel_init
76	mov	lr, ip
77
78	mov	pc, lr
79#endif /* CONFIG_SKIP_LOWLEVEL_INIT */
80