blob: 879390be2ddebca91de05e86f88e3f88605e1d22 [file] [log] [blame]
wdenkc6097192002-11-03 00:24:07 +00001/*
Marek Vasutb9091622011-10-31 14:12:39 +01002 * armboot - Startup Code for XScale CPU-core
wdenkc6097192002-11-03 00:24:07 +00003 *
4 * Copyright (C) 1998 Dan Malek <dmalek@jlc.net>
5 * Copyright (C) 1999 Magnus Damm <kieraypc01.p.y.kie.era.ericsson.se>
6 * Copyright (C) 2000 Wolfgang Denk <wd@denx.de>
wdenkc0aa5c52003-12-06 19:49:23 +00007 * Copyright (C) 2001 Alex Zuepke <azu@sysgo.de>
Marek Vasutb9091622011-10-31 14:12:39 +01008 * Copyright (C) 2001 Marius Groger <mag@sysgo.de>
9 * Copyright (C) 2002 Alex Zupke <azu@sysgo.de>
10 * Copyright (C) 2002 Gary Jennejohn <garyj@denx.de>
wdenk1fe2c702003-03-06 21:55:29 +000011 * Copyright (C) 2002 Kyle Harris <kharris@nexus-tech.net>
Wolfgang Denk61ccd1d2006-03-06 23:18:48 +010012 * Copyright (C) 2003 Kai-Uwe Bloem <kai-uwe.bloem@auerswald.de>
Marek Vasutb9091622011-10-31 14:12:39 +010013 * Copyright (C) 2003 Kshitij <kshitij@ti.com>
14 * Copyright (C) 2003 Richard Woodruff <r-woodruff2@ti.com>
15 * Copyright (C) 2003 Robert Schwebel <r.schwebel@pengutronix.de>
16 * Copyright (C) 2004 Texas Instruments <r-woodruff2@ti.com>
17 * Copyright (C) 2010 Marek Vasut <marek.vasut@gmail.com>
wdenkc6097192002-11-03 00:24:07 +000018 *
Wolfgang Denkbd8ec7e2013-10-07 13:07:26 +020019 * SPDX-License-Identifier: GPL-2.0+
wdenkc6097192002-11-03 00:24:07 +000020 */
21
Wolfgang Denk0191e472010-10-26 14:34:52 +020022#include <asm-offsets.h>
wdenkc6097192002-11-03 00:24:07 +000023#include <config.h>
Marek Vasutf1ac7842011-11-05 19:26:47 +010024
wdenkc6097192002-11-03 00:24:07 +000025/*
Marek Vasutb9091622011-10-31 14:12:39 +010026 *************************************************************************
27 *
wdenkc6097192002-11-03 00:24:07 +000028 * Startup Code (reset vector)
29 *
Marek Vasutb9091622011-10-31 14:12:39 +010030 * do important init only if we don't start from memory!
31 * setup Memory and board specific bits prior to relocation.
32 * relocate armboot to ram
33 * setup stack
34 *
35 *************************************************************************
wdenkc6097192002-11-03 00:24:07 +000036 */
37
Albert ARIBAUD9852cc62014-04-15 16:13:51 +020038 .globl reset
Heiko Schocher3d8f5fa2010-09-17 13:10:46 +020039
40reset:
41 /*
42 * set the cpu to SVC32 mode
43 */
44 mrs r0,cpsr
45 bic r0,r0,#0x1f
46 orr r0,r0,#0xd3
47 msr cpsr,r0
48
Marek Vasutb9091622011-10-31 14:12:39 +010049#ifndef CONFIG_SKIP_LOWLEVEL_INIT
50 bl cpu_init_crit
51#endif
Heiko Schocher3d8f5fa2010-09-17 13:10:46 +020052
Marek Vasut85cc88a2011-11-26 07:20:07 +010053#ifdef CONFIG_CPU_PXA25X
Marek Vasutf1ac7842011-11-05 19:26:47 +010054 bl lock_cache_for_stack
55#endif
56
Albert ARIBAUDfacdae52013-01-08 10:18:02 +000057 bl _main
Heiko Schocher3d8f5fa2010-09-17 13:10:46 +020058
59/*------------------------------------------------------------------------------*/
Heiko Schocher3d8f5fa2010-09-17 13:10:46 +020060
Albert ARIBAUD9580b322013-05-19 01:48:15 +000061 .globl c_runtime_cpu_setup
62c_runtime_cpu_setup:
Heiko Schocher3d8f5fa2010-09-17 13:10:46 +020063
Albert ARIBAUD9580b322013-05-19 01:48:15 +000064#ifdef CONFIG_CPU_PXA25X
Marek Vasutf29c11b2010-10-20 19:36:39 +020065 /*
Albert ARIBAUD9580b322013-05-19 01:48:15 +000066 * Unlock (actually, disable) the cache now that board_init_f
67 * is done. We could do this earlier but we would need to add
68 * a new C runtime hook, whereas c_runtime_cpu_setup already
69 * exists.
70 * As this routine is just a call to cpu_init_crit, let us
71 * tail-optimize and do a simple branch here.
Marek Vasutf29c11b2010-10-20 19:36:39 +020072 */
Albert ARIBAUD9580b322013-05-19 01:48:15 +000073 b cpu_init_crit
74#else
Albert ARIBAUDfacdae52013-01-08 10:18:02 +000075 bx lr
Marek Vasutb9b8ea32010-09-28 15:44:10 +020076#endif
Albert ARIBAUDfacdae52013-01-08 10:18:02 +000077
Marek Vasutb9091622011-10-31 14:12:39 +010078/*
79 *************************************************************************
80 *
81 * CPU_init_critical registers
82 *
83 * setup important registers
84 * setup memory timing
85 *
86 *************************************************************************
87 */
Marek Vasut85cc88a2011-11-26 07:20:07 +010088#if !defined(CONFIG_SKIP_LOWLEVEL_INIT) || defined(CONFIG_CPU_PXA25X)
Marek Vasutb9091622011-10-31 14:12:39 +010089cpu_init_crit:
90 /*
91 * flush v4 I/D caches
92 */
93 mov r0, #0
94 mcr p15, 0, r0, c7, c7, 0 /* Invalidate I+D+BTB caches */
95 mcr p15, 0, r0, c8, c7, 0 /* Invalidate Unified TLB */
Markus Klotzbücherd5dfcf92006-02-28 23:11:07 +010096
Marek Vasutb9091622011-10-31 14:12:39 +010097 /*
98 * disable MMU stuff and caches
99 */
100 mrc p15, 0, r0, c1, c0, 0
Mike Dunncfe695c2013-06-17 10:47:28 -0700101 bic r0, r0, #0x00003300 @ clear bits 13:12, 9:8 (--VI --RS)
Marek Vasutb9091622011-10-31 14:12:39 +0100102 bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
103 orr r0, r0, #0x00000002 @ set bit 2 (A) Align
Marek Vasutb9091622011-10-31 14:12:39 +0100104 mcr p15, 0, r0, c1, c0, 0
wdenk1fe2c702003-03-06 21:55:29 +0000105
Marek Vasutb9091622011-10-31 14:12:39 +0100106 mov pc, lr /* back to my caller */
Marek Vasut85cc88a2011-11-26 07:20:07 +0100107#endif /* !CONFIG_SKIP_LOWLEVEL_INIT || CONFIG_CPU_PXA25X */
wdenkc6097192002-11-03 00:24:07 +0000108
Marek Vasutf1ac7842011-11-05 19:26:47 +0100109/*
110 * Enable MMU to use DCache as DRAM.
111 *
112 * This is useful on PXA25x and PXA26x in early bootstages, where there is no
113 * other possible memory available to hold stack.
114 */
Marek Vasut85cc88a2011-11-26 07:20:07 +0100115#ifdef CONFIG_CPU_PXA25X
Marek Vasutf1ac7842011-11-05 19:26:47 +0100116.macro CPWAIT reg
117 mrc p15, 0, \reg, c2, c0, 0
118 mov \reg, \reg
119 sub pc, pc, #4
120.endm
121lock_cache_for_stack:
122 /* Domain access -- enable for all CPs */
123 ldr r0, =0x0000ffff
124 mcr p15, 0, r0, c3, c0, 0
125
126 /* Point TTBR to MMU table */
127 ldr r0, =mmutable
128 mcr p15, 0, r0, c2, c0, 0
129
130 /* Kick in MMU, ICache, DCache, BTB */
131 mrc p15, 0, r0, c1, c0, 0
132 bic r0, #0x1b00
133 bic r0, #0x0087
134 orr r0, #0x1800
135 orr r0, #0x0005
136 mcr p15, 0, r0, c1, c0, 0
137 CPWAIT r0
138
139 /* Unlock Icache, Dcache */
140 mcr p15, 0, r0, c9, c1, 1
141 mcr p15, 0, r0, c9, c2, 1
142
143 /* Flush Icache, Dcache, BTB */
144 mcr p15, 0, r0, c7, c7, 0
145
146 /* Unlock I-TLB, D-TLB */
147 mcr p15, 0, r0, c10, c4, 1
148 mcr p15, 0, r0, c10, c8, 1
149
150 /* Flush TLB */
151 mcr p15, 0, r0, c8, c7, 0
152
153 /* Allocate 4096 bytes of Dcache as RAM */
154
155 /* Drain pending loads and stores */
156 mcr p15, 0, r0, c7, c10, 4
157
158 mov r4, #0x00
159 mov r5, #0x00
160 mov r2, #0x01
161 mcr p15, 0, r0, c9, c2, 0
162 CPWAIT r0
163
164 /* 128 lines reserved (128 x 32bytes = 4096 bytes total) */
165 mov r0, #128
166 ldr r1, =0xfffff000
167
168alloc:
169 mcr p15, 0, r1, c7, c2, 5
170 /* Drain pending loads and stores */
171 mcr p15, 0, r0, c7, c10, 4
172 strd r4, [r1], #8
173 strd r4, [r1], #8
174 strd r4, [r1], #8
175 strd r4, [r1], #8
176 subs r0, #0x01
177 bne alloc
178 /* Drain pending loads and stores */
179 mcr p15, 0, r0, c7, c10, 4
180 mov r2, #0x00
181 mcr p15, 0, r2, c9, c2, 0
182 CPWAIT r0
183
184 mov pc, lr
185
186.section .mmutable, "a"
187mmutable:
188 .align 14
189 /* 0x00000000 - 0xffe00000 : 1:1, uncached mapping */
190 .set __base, 0
191 .rept 0xfff
192 .word (__base << 20) | 0xc12
193 .set __base, __base + 1
194 .endr
195
196 /* 0xfff00000 : 1:1, cached mapping */
197 .word (0xfff << 20) | 0x1c1e
Marek Vasut85cc88a2011-11-26 07:20:07 +0100198#endif /* CONFIG_CPU_PXA25X */