blob: ff592ba81017ec731c1691a0174d7488b3e2b8ec [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001/* SPDX-License-Identifier: GPL-2.0+ */
wdenk6f213472003-08-29 22:00:43 +00002/*
3 * armboot - Startup Code for ARM926EJS CPU-core
4 *
5 * Copyright (c) 2003 Texas Instruments
6 *
wdenka56bd922004-06-06 23:13:55 +00007 * ----- Adapted for OMAP1610 OMAP730 from ARM925t code ------
wdenk6f213472003-08-29 22:00:43 +00008 *
Albert ARIBAUDfa82f872011-08-04 18:45:45 +02009 * Copyright (c) 2001 Marius Gröger <mag@sysgo.de>
10 * Copyright (c) 2002 Alex Züpke <azu@sysgo.de>
Detlev Zundel792a09e2009-05-13 10:54:10 +020011 * Copyright (c) 2002 Gary Jennejohn <garyj@denx.de>
wdenk6f213472003-08-29 22:00:43 +000012 * Copyright (c) 2003 Richard Woodruff <r-woodruff2@ti.com>
13 * Copyright (c) 2003 Kshitij <kshitij@ti.com>
Albert ARIBAUD57b4bce2011-04-22 19:41:02 +020014 * Copyright (c) 2010 Albert Aribaud <albert.u.boot@aribaud.net>
wdenk6f213472003-08-29 22:00:43 +000015 */
16
Wolfgang Denk25ddd1f2010-10-26 14:34:52 +020017#include <asm-offsets.h>
wdenk6f213472003-08-29 22:00:43 +000018#include <config.h>
Wolfgang Denkfcd3c872009-07-24 00:17:48 +020019#include <common.h>
wdenk6f213472003-08-29 22:00:43 +000020
wdenk6f213472003-08-29 22:00:43 +000021/*
22 *************************************************************************
23 *
wdenk6f213472003-08-29 22:00:43 +000024 * Startup Code (reset vector)
25 *
26 * do important init only if we don't start from memory!
27 * setup Memory and board specific bits prior to relocation.
28 * relocate armboot to ram
29 * setup stack
30 *
31 *************************************************************************
32 */
33
Albert ARIBAUD41623c92014-04-15 16:13:51 +020034 .globl reset
Heiko Schocherab86f722010-09-17 13:10:42 +020035
36reset:
37 /*
38 * set the cpu to SVC32 mode
39 */
40 mrs r0,cpsr
41 bic r0,r0,#0x1f
42 orr r0,r0,#0xd3
43 msr cpsr,r0
44
45 /*
46 * we do sys-critical inits only at reboot,
47 * not when booting from ram!
48 */
Christian Riesch27b66622012-02-02 00:44:37 +000049#ifndef CONFIG_SKIP_LOWLEVEL_INIT
Heiko Schocherab86f722010-09-17 13:10:42 +020050 bl cpu_init_crit
Christian Riesch27b66622012-02-02 00:44:37 +000051#endif
Heiko Schocherab86f722010-09-17 13:10:42 +020052
Albert ARIBAUDe05e5de2013-01-08 10:18:02 +000053 bl _main
Heiko Schocherab86f722010-09-17 13:10:42 +020054
55/*------------------------------------------------------------------------------*/
56
Albert ARIBAUDe05e5de2013-01-08 10:18:02 +000057 .globl c_runtime_cpu_setup
58c_runtime_cpu_setup:
59
60 bx lr
61
wdenk6f213472003-08-29 22:00:43 +000062/*
63 *************************************************************************
64 *
65 * CPU_init_critical registers
66 *
67 * setup important registers
68 * setup memory timing
69 *
70 *************************************************************************
71 */
Christian Riesch27b66622012-02-02 00:44:37 +000072#ifndef CONFIG_SKIP_LOWLEVEL_INIT
wdenk6f213472003-08-29 22:00:43 +000073cpu_init_crit:
74 /*
Sughosh Ganuda104e02012-02-02 00:44:38 +000075 * flush D cache before disabling it
wdenk6f213472003-08-29 22:00:43 +000076 */
77 mov r0, #0
Sughosh Ganuda104e02012-02-02 00:44:38 +000078flush_dcache:
79 mrc p15, 0, r15, c7, c10, 3
80 bne flush_dcache
81
82 mcr p15, 0, r0, c8, c7, 0 /* invalidate TLB */
83 mcr p15, 0, r0, c7, c5, 0 /* invalidate I Cache */
wdenk6f213472003-08-29 22:00:43 +000084
85 /*
Christian Rieschd735a992012-02-02 00:44:40 +000086 * disable MMU and D cache
Trevor Woerner10015022019-05-03 09:41:00 -040087 * enable I cache if SYS_ICACHE_OFF is not defined
wdenk6f213472003-08-29 22:00:43 +000088 */
89 mrc p15, 0, r0, c1, c0, 0
Christian Rieschb67d8812012-02-02 00:44:39 +000090 bic r0, r0, #0x00000300 /* clear bits 9:8 (---- --RS) */
wdenk6f213472003-08-29 22:00:43 +000091 bic r0, r0, #0x00000087 /* clear bits 7, 2:0 (B--- -CAM) */
Christian Rieschb67d8812012-02-02 00:44:39 +000092#ifdef CONFIG_SYS_EXCEPTION_VECTORS_HIGH
93 orr r0, r0, #0x00002000 /* set bit 13 (--V- ----) */
94#else
95 bic r0, r0, #0x00002000 /* clear bit 13 (--V- ----) */
96#endif
Yuichiro Gotoba10b852016-02-25 10:23:34 +090097 orr r0, r0, #0x00000002 /* set bit 1 (A) Align */
Trevor Woerner10015022019-05-03 09:41:00 -040098#if !CONFIG_IS_ENABLED(SYS_ICACHE_OFF)
wdenk6f213472003-08-29 22:00:43 +000099 orr r0, r0, #0x00001000 /* set bit 12 (I) I-Cache */
Christian Rieschd735a992012-02-02 00:44:40 +0000100#endif
wdenk6f213472003-08-29 22:00:43 +0000101 mcr p15, 0, r0, c1, c0, 0
102
Simon Glassb5bd0982016-05-05 07:28:06 -0600103#ifndef CONFIG_SKIP_LOWLEVEL_INIT_ONLY
wdenk6f213472003-08-29 22:00:43 +0000104 /*
105 * Go setup Memory and board specific bits prior to relocation.
106 */
Mans Rullgardda372af2018-04-21 16:11:07 +0100107 mov r4, lr /* perserve link reg across call */
Wolfgang Denk87cb6862005-10-06 17:08:18 +0200108 bl lowlevel_init /* go setup pll,mux,memory */
Mans Rullgardda372af2018-04-21 16:11:07 +0100109 mov lr, r4 /* restore link */
Simon Glassb5bd0982016-05-05 07:28:06 -0600110#endif
Heiko Schocherca4b5582011-11-09 20:06:23 +0000111 mov pc, lr /* back to my caller */
Christian Riesch27b66622012-02-02 00:44:37 +0000112#endif /* CONFIG_SKIP_LOWLEVEL_INIT */