blob: ce1181a6c55707eed8f648098019b92b45e89402 [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
Vasily Khoruzhick3b5ab622016-03-20 18:37:06 -070056#ifdef CONFIG_CPU_PXA27X
57 /*
58 * enable clock for SRAM
59 */
60 ldr r0,=CKEN
61 ldr r1,[r0]
62 orr r1,r1,#(1 << 20)
63 str r1,[r0]
64#endif
Albert ARIBAUDfacdae52013-01-08 10:18:02 +000065 bl _main
Heiko Schocher3d8f5fa2010-09-17 13:10:46 +020066
67/*------------------------------------------------------------------------------*/
Heiko Schocher3d8f5fa2010-09-17 13:10:46 +020068
Albert ARIBAUD9580b322013-05-19 01:48:15 +000069 .globl c_runtime_cpu_setup
70c_runtime_cpu_setup:
Heiko Schocher3d8f5fa2010-09-17 13:10:46 +020071
Albert ARIBAUD9580b322013-05-19 01:48:15 +000072#ifdef CONFIG_CPU_PXA25X
Marek Vasutf29c11b2010-10-20 19:36:39 +020073 /*
Albert ARIBAUD9580b322013-05-19 01:48:15 +000074 * Unlock (actually, disable) the cache now that board_init_f
75 * is done. We could do this earlier but we would need to add
76 * a new C runtime hook, whereas c_runtime_cpu_setup already
77 * exists.
78 * As this routine is just a call to cpu_init_crit, let us
79 * tail-optimize and do a simple branch here.
Marek Vasutf29c11b2010-10-20 19:36:39 +020080 */
Albert ARIBAUD9580b322013-05-19 01:48:15 +000081 b cpu_init_crit
82#else
Albert ARIBAUDfacdae52013-01-08 10:18:02 +000083 bx lr
Marek Vasutb9b8ea32010-09-28 15:44:10 +020084#endif
Albert ARIBAUDfacdae52013-01-08 10:18:02 +000085
Marek Vasutb9091622011-10-31 14:12:39 +010086/*
87 *************************************************************************
88 *
89 * CPU_init_critical registers
90 *
91 * setup important registers
92 * setup memory timing
93 *
94 *************************************************************************
95 */
Marek Vasut85cc88a2011-11-26 07:20:07 +010096#if !defined(CONFIG_SKIP_LOWLEVEL_INIT) || defined(CONFIG_CPU_PXA25X)
Marek Vasutb9091622011-10-31 14:12:39 +010097cpu_init_crit:
98 /*
99 * flush v4 I/D caches
100 */
101 mov r0, #0
102 mcr p15, 0, r0, c7, c7, 0 /* Invalidate I+D+BTB caches */
103 mcr p15, 0, r0, c8, c7, 0 /* Invalidate Unified TLB */
Markus Klotzbücherd5dfcf92006-02-28 23:11:07 +0100104
Marek Vasutb9091622011-10-31 14:12:39 +0100105 /*
106 * disable MMU stuff and caches
107 */
108 mrc p15, 0, r0, c1, c0, 0
Mike Dunncfe695c2013-06-17 10:47:28 -0700109 bic r0, r0, #0x00003300 @ clear bits 13:12, 9:8 (--VI --RS)
Marek Vasutb9091622011-10-31 14:12:39 +0100110 bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
Yuichiro Goto8d4b7e92016-02-25 10:23:34 +0900111 orr r0, r0, #0x00000002 @ set bit 1 (A) Align
Marek Vasutb9091622011-10-31 14:12:39 +0100112 mcr p15, 0, r0, c1, c0, 0
wdenk1fe2c702003-03-06 21:55:29 +0000113
Marek Vasutb9091622011-10-31 14:12:39 +0100114 mov pc, lr /* back to my caller */
Marek Vasut85cc88a2011-11-26 07:20:07 +0100115#endif /* !CONFIG_SKIP_LOWLEVEL_INIT || CONFIG_CPU_PXA25X */
wdenkc6097192002-11-03 00:24:07 +0000116
Marek Vasutf1ac7842011-11-05 19:26:47 +0100117/*
118 * Enable MMU to use DCache as DRAM.
119 *
120 * This is useful on PXA25x and PXA26x in early bootstages, where there is no
121 * other possible memory available to hold stack.
122 */
Marek Vasut85cc88a2011-11-26 07:20:07 +0100123#ifdef CONFIG_CPU_PXA25X
Marek Vasutf1ac7842011-11-05 19:26:47 +0100124.macro CPWAIT reg
125 mrc p15, 0, \reg, c2, c0, 0
126 mov \reg, \reg
127 sub pc, pc, #4
128.endm
129lock_cache_for_stack:
130 /* Domain access -- enable for all CPs */
131 ldr r0, =0x0000ffff
132 mcr p15, 0, r0, c3, c0, 0
133
134 /* Point TTBR to MMU table */
135 ldr r0, =mmutable
136 mcr p15, 0, r0, c2, c0, 0
137
138 /* Kick in MMU, ICache, DCache, BTB */
139 mrc p15, 0, r0, c1, c0, 0
140 bic r0, #0x1b00
141 bic r0, #0x0087
142 orr r0, #0x1800
143 orr r0, #0x0005
144 mcr p15, 0, r0, c1, c0, 0
145 CPWAIT r0
146
147 /* Unlock Icache, Dcache */
148 mcr p15, 0, r0, c9, c1, 1
149 mcr p15, 0, r0, c9, c2, 1
150
151 /* Flush Icache, Dcache, BTB */
152 mcr p15, 0, r0, c7, c7, 0
153
154 /* Unlock I-TLB, D-TLB */
155 mcr p15, 0, r0, c10, c4, 1
156 mcr p15, 0, r0, c10, c8, 1
157
158 /* Flush TLB */
159 mcr p15, 0, r0, c8, c7, 0
160
161 /* Allocate 4096 bytes of Dcache as RAM */
162
163 /* Drain pending loads and stores */
164 mcr p15, 0, r0, c7, c10, 4
165
166 mov r4, #0x00
167 mov r5, #0x00
168 mov r2, #0x01
169 mcr p15, 0, r0, c9, c2, 0
170 CPWAIT r0
171
172 /* 128 lines reserved (128 x 32bytes = 4096 bytes total) */
173 mov r0, #128
174 ldr r1, =0xfffff000
175
176alloc:
177 mcr p15, 0, r1, c7, c2, 5
178 /* Drain pending loads and stores */
179 mcr p15, 0, r0, c7, c10, 4
180 strd r4, [r1], #8
181 strd r4, [r1], #8
182 strd r4, [r1], #8
183 strd r4, [r1], #8
184 subs r0, #0x01
185 bne alloc
186 /* Drain pending loads and stores */
187 mcr p15, 0, r0, c7, c10, 4
188 mov r2, #0x00
189 mcr p15, 0, r2, c9, c2, 0
190 CPWAIT r0
191
192 mov pc, lr
193
194.section .mmutable, "a"
195mmutable:
196 .align 14
197 /* 0x00000000 - 0xffe00000 : 1:1, uncached mapping */
198 .set __base, 0
199 .rept 0xfff
200 .word (__base << 20) | 0xc12
201 .set __base, __base + 1
202 .endr
203
204 /* 0xfff00000 : 1:1, cached mapping */
205 .word (0xfff << 20) | 0x1c1e
Marek Vasut85cc88a2011-11-26 07:20:07 +0100206#endif /* CONFIG_CPU_PXA25X */