xref: /OK3568_Linux_fs/u-boot/arch/arm/cpu/armv7/start.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/*
2*4882a593Smuzhiyun * armboot - Startup Code for OMAP3530/ARM Cortex CPU-core
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright (c) 2004	Texas Instruments <r-woodruff2@ti.com>
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Copyright (c) 2001	Marius Gröger <mag@sysgo.de>
7*4882a593Smuzhiyun * Copyright (c) 2002	Alex Züpke <azu@sysgo.de>
8*4882a593Smuzhiyun * Copyright (c) 2002	Gary Jennejohn <garyj@denx.de>
9*4882a593Smuzhiyun * Copyright (c) 2003	Richard Woodruff <r-woodruff2@ti.com>
10*4882a593Smuzhiyun * Copyright (c) 2003	Kshitij <kshitij@ti.com>
11*4882a593Smuzhiyun * Copyright (c) 2006-2008 Syed Mohammed Khasim <x0khasim@ti.com>
12*4882a593Smuzhiyun *
13*4882a593Smuzhiyun * SPDX-License-Identifier:	GPL-2.0+
14*4882a593Smuzhiyun */
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun#include <asm-offsets.h>
17*4882a593Smuzhiyun#include <config.h>
18*4882a593Smuzhiyun#include <asm/system.h>
19*4882a593Smuzhiyun#include <linux/linkage.h>
20*4882a593Smuzhiyun#include <asm/armv7.h>
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun/*************************************************************************
23*4882a593Smuzhiyun *
24*4882a593Smuzhiyun * Startup Code (reset vector)
25*4882a593Smuzhiyun *
26*4882a593Smuzhiyun * Do important init only if we don't start from memory!
27*4882a593Smuzhiyun * Setup memory and board specific bits prior to relocation.
28*4882a593Smuzhiyun * Relocate armboot to ram. Setup stack.
29*4882a593Smuzhiyun *
30*4882a593Smuzhiyun *************************************************************************/
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun	.globl	reset
33*4882a593Smuzhiyun	.globl	save_boot_params_ret
34*4882a593Smuzhiyun	.type   save_boot_params_ret,%function
35*4882a593Smuzhiyun#ifdef CONFIG_ARMV7_LPAE
36*4882a593Smuzhiyun	.global	switch_to_hypervisor_ret
37*4882a593Smuzhiyun#endif
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun#if !CONFIG_IS_ENABLED(TINY_FRAMEWORK)
40*4882a593Smuzhiyun
41*4882a593Smuzhiyunreset:
42*4882a593Smuzhiyun	/* Allow the board to save important registers */
43*4882a593Smuzhiyun	b	save_boot_params
44*4882a593Smuzhiyunsave_boot_params_ret:
45*4882a593Smuzhiyun#ifdef CONFIG_ARMV7_LPAE
46*4882a593Smuzhiyun/*
47*4882a593Smuzhiyun * check for Hypervisor support
48*4882a593Smuzhiyun */
49*4882a593Smuzhiyun	mrc	p15, 0, r0, c0, c1, 1		@ read ID_PFR1
50*4882a593Smuzhiyun	and	r0, r0, #CPUID_ARM_VIRT_MASK	@ mask virtualization bits
51*4882a593Smuzhiyun	cmp	r0, #(1 << CPUID_ARM_VIRT_SHIFT)
52*4882a593Smuzhiyun	beq	switch_to_hypervisor
53*4882a593Smuzhiyunswitch_to_hypervisor_ret:
54*4882a593Smuzhiyun#endif
55*4882a593Smuzhiyun	/*
56*4882a593Smuzhiyun	 * disable interrupts (FIQ and IRQ), also set the cpu to SVC32 mode,
57*4882a593Smuzhiyun	 * except if in HYP mode already
58*4882a593Smuzhiyun	 */
59*4882a593Smuzhiyun	mrs	r0, cpsr
60*4882a593Smuzhiyun	and	r1, r0, #0x1f		@ mask mode bits
61*4882a593Smuzhiyun	teq	r1, #0x1a		@ test for HYP mode
62*4882a593Smuzhiyun	bicne	r0, r0, #0x1f		@ clear all mode bits
63*4882a593Smuzhiyun	orrne	r0, r0, #0x13		@ set SVC mode
64*4882a593Smuzhiyun	orr	r0, r0, #0xc0		@ disable FIQ and IRQ
65*4882a593Smuzhiyun	msr	cpsr,r0
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun	/* Enable ACTLR.SMP bit */
68*4882a593Smuzhiyun	mrc	p15, 0, r0, c1, c0, 1
69*4882a593Smuzhiyun	orr	r0, r0, #(1 << 6)	@ Enable ACTLR.SMP bit
70*4882a593Smuzhiyun	mcr	p15, 0, r0, c1, c0, 1
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun/*
73*4882a593Smuzhiyun * Setup vector:
74*4882a593Smuzhiyun * (OMAP4 spl TEXT_BASE is not 32 byte aligned.
75*4882a593Smuzhiyun * Continue to use ROM code vector only in OMAP4 spl)
76*4882a593Smuzhiyun */
77*4882a593Smuzhiyun#if !(defined(CONFIG_OMAP44XX) && defined(CONFIG_SPL_BUILD))
78*4882a593Smuzhiyun	/* Set V=0 in CP15 SCTLR register - for VBAR to point to vector */
79*4882a593Smuzhiyun	mrc	p15, 0, r0, c1, c0, 0	@ Read CP15 SCTLR Register
80*4882a593Smuzhiyun	bic	r0, #CR_V		@ V = 0
81*4882a593Smuzhiyun	mcr	p15, 0, r0, c1, c0, 0	@ Write CP15 SCTLR Register
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun	/* Set vector address in CP15 VBAR register */
84*4882a593Smuzhiyun	ldr	r0, =_start
85*4882a593Smuzhiyun	mcr	p15, 0, r0, c12, c0, 0	@Set VBAR
86*4882a593Smuzhiyun#endif
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun	/* Enable Asynchronous external abort after vectors setup */
89*4882a593Smuzhiyun	mrs	r0, cpsr
90*4882a593Smuzhiyun	bic	r0, r0, #0x100		@ CPSR.A bit
91*4882a593Smuzhiyun	msr	cpsr_x,r0
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun	/* the mask ROM code should have PLL and others stable */
94*4882a593Smuzhiyun#ifndef CONFIG_SKIP_LOWLEVEL_INIT
95*4882a593Smuzhiyun	bl	cpu_init_cp15
96*4882a593Smuzhiyun#ifndef CONFIG_SKIP_LOWLEVEL_INIT_ONLY
97*4882a593Smuzhiyun	bl	cpu_init_crit
98*4882a593Smuzhiyun#endif
99*4882a593Smuzhiyun#endif
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun	bl	_main
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun/*------------------------------------------------------------------------------*/
104*4882a593Smuzhiyun
105*4882a593SmuzhiyunENTRY(c_runtime_cpu_setup)
106*4882a593Smuzhiyun/*
107*4882a593Smuzhiyun * If I-cache is enabled invalidate it
108*4882a593Smuzhiyun */
109*4882a593Smuzhiyun#ifndef CONFIG_SYS_ICACHE_OFF
110*4882a593Smuzhiyun	mcr	p15, 0, r0, c7, c5, 0	@ invalidate icache
111*4882a593Smuzhiyun	mcr     p15, 0, r0, c7, c10, 4	@ DSB
112*4882a593Smuzhiyun	mcr     p15, 0, r0, c7, c5, 4	@ ISB
113*4882a593Smuzhiyun#endif
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun	bx	lr
116*4882a593Smuzhiyun
117*4882a593SmuzhiyunENDPROC(c_runtime_cpu_setup)
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun#endif/* !CONFIG_IS_ENABLED(TINY_FRAMEWORK) */
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun/*************************************************************************
122*4882a593Smuzhiyun *
123*4882a593Smuzhiyun * void save_boot_params(u32 r0, u32 r1, u32 r2, u32 r3)
124*4882a593Smuzhiyun *	__attribute__((weak));
125*4882a593Smuzhiyun *
126*4882a593Smuzhiyun * Stack pointer is not yet initialized at this moment
127*4882a593Smuzhiyun * Don't save anything to stack even if compiled with -O0
128*4882a593Smuzhiyun *
129*4882a593Smuzhiyun *************************************************************************/
130*4882a593SmuzhiyunENTRY(save_boot_params)
131*4882a593Smuzhiyun	b	save_boot_params_ret		@ back to my caller
132*4882a593SmuzhiyunENDPROC(save_boot_params)
133*4882a593Smuzhiyun	.weak	save_boot_params
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun#ifdef CONFIG_ARMV7_LPAE
136*4882a593SmuzhiyunENTRY(switch_to_hypervisor)
137*4882a593Smuzhiyun	b	switch_to_hypervisor_ret
138*4882a593SmuzhiyunENDPROC(switch_to_hypervisor)
139*4882a593Smuzhiyun	.weak	switch_to_hypervisor
140*4882a593Smuzhiyun#endif
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun/*************************************************************************
143*4882a593Smuzhiyun *
144*4882a593Smuzhiyun * cpu_init_cp15
145*4882a593Smuzhiyun *
146*4882a593Smuzhiyun * Setup CP15 registers (cache, MMU, TLBs). The I-cache is turned on unless
147*4882a593Smuzhiyun * CONFIG_SYS_ICACHE_OFF is defined.
148*4882a593Smuzhiyun *
149*4882a593Smuzhiyun *************************************************************************/
150*4882a593SmuzhiyunENTRY(cpu_init_cp15)
151*4882a593Smuzhiyun	/*
152*4882a593Smuzhiyun	 * Invalidate L1 I/D
153*4882a593Smuzhiyun	 */
154*4882a593Smuzhiyun	mov	r0, #0			@ set up for MCR
155*4882a593Smuzhiyun	mcr	p15, 0, r0, c8, c7, 0	@ invalidate TLBs
156*4882a593Smuzhiyun	mcr	p15, 0, r0, c7, c5, 0	@ invalidate icache
157*4882a593Smuzhiyun	mcr	p15, 0, r0, c7, c5, 6	@ invalidate BP array
158*4882a593Smuzhiyun	mcr     p15, 0, r0, c7, c10, 4	@ DSB
159*4882a593Smuzhiyun	mcr     p15, 0, r0, c7, c5, 4	@ ISB
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun	/*
162*4882a593Smuzhiyun	 * disable MMU stuff and caches
163*4882a593Smuzhiyun	 */
164*4882a593Smuzhiyun	mrc	p15, 0, r0, c1, c0, 0
165*4882a593Smuzhiyun	bic	r0, r0, #0x00002000	@ clear bits 13 (--V-)
166*4882a593Smuzhiyun	bic	r0, r0, #0x00000007	@ clear bits 2:0 (-CAM)
167*4882a593Smuzhiyun#if 0 /* There is unalign access when decompress firmware. */
168*4882a593Smuzhiyun	orr	r0, r0, #0x00000002	@ set bit 1 (--A-) Align
169*4882a593Smuzhiyun#endif
170*4882a593Smuzhiyun	orr	r0, r0, #0x00000800	@ set bit 11 (Z---) BTB
171*4882a593Smuzhiyun#ifdef CONFIG_SYS_ICACHE_OFF
172*4882a593Smuzhiyun	bic	r0, r0, #0x00001000	@ clear bit 12 (I) I-cache
173*4882a593Smuzhiyun#else
174*4882a593Smuzhiyun	orr	r0, r0, #0x00001000	@ set bit 12 (I) I-cache
175*4882a593Smuzhiyun#endif
176*4882a593Smuzhiyun	mcr	p15, 0, r0, c1, c0, 0
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_716044
179*4882a593Smuzhiyun	mrc	p15, 0, r0, c1, c0, 0	@ read system control register
180*4882a593Smuzhiyun	orr	r0, r0, #1 << 11	@ set bit #11
181*4882a593Smuzhiyun	mcr	p15, 0, r0, c1, c0, 0	@ write system control register
182*4882a593Smuzhiyun#endif
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun#if (defined(CONFIG_ARM_ERRATA_742230) || defined(CONFIG_ARM_ERRATA_794072))
185*4882a593Smuzhiyun	mrc	p15, 0, r0, c15, c0, 1	@ read diagnostic register
186*4882a593Smuzhiyun	orr	r0, r0, #1 << 4		@ set bit #4
187*4882a593Smuzhiyun	mcr	p15, 0, r0, c15, c0, 1	@ write diagnostic register
188*4882a593Smuzhiyun#endif
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_743622
191*4882a593Smuzhiyun	mrc	p15, 0, r0, c15, c0, 1	@ read diagnostic register
192*4882a593Smuzhiyun	orr	r0, r0, #1 << 6		@ set bit #6
193*4882a593Smuzhiyun	mcr	p15, 0, r0, c15, c0, 1	@ write diagnostic register
194*4882a593Smuzhiyun#endif
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_751472
197*4882a593Smuzhiyun	mrc	p15, 0, r0, c15, c0, 1	@ read diagnostic register
198*4882a593Smuzhiyun	orr	r0, r0, #1 << 11	@ set bit #11
199*4882a593Smuzhiyun	mcr	p15, 0, r0, c15, c0, 1	@ write diagnostic register
200*4882a593Smuzhiyun#endif
201*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_761320
202*4882a593Smuzhiyun	mrc	p15, 0, r0, c15, c0, 1	@ read diagnostic register
203*4882a593Smuzhiyun	orr	r0, r0, #1 << 21	@ set bit #21
204*4882a593Smuzhiyun	mcr	p15, 0, r0, c15, c0, 1	@ write diagnostic register
205*4882a593Smuzhiyun#endif
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_845369
208*4882a593Smuzhiyun	mrc     p15, 0, r0, c15, c0, 1	@ read diagnostic register
209*4882a593Smuzhiyun	orr     r0, r0, #1 << 22	@ set bit #22
210*4882a593Smuzhiyun	mcr     p15, 0, r0, c15, c0, 1	@ write diagnostic register
211*4882a593Smuzhiyun#endif
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun	mov	r5, lr			@ Store my Caller
214*4882a593Smuzhiyun	mrc	p15, 0, r1, c0, c0, 0	@ r1 has Read Main ID Register (MIDR)
215*4882a593Smuzhiyun	mov	r3, r1, lsr #20		@ get variant field
216*4882a593Smuzhiyun	and	r3, r3, #0xf		@ r3 has CPU variant
217*4882a593Smuzhiyun	and	r4, r1, #0xf		@ r4 has CPU revision
218*4882a593Smuzhiyun	mov	r2, r3, lsl #4		@ shift variant field for combined value
219*4882a593Smuzhiyun	orr	r2, r4, r2		@ r2 has combined CPU variant + revision
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_798870
222*4882a593Smuzhiyun	cmp	r2, #0x30		@ Applies to lower than R3p0
223*4882a593Smuzhiyun	bge	skip_errata_798870      @ skip if not affected rev
224*4882a593Smuzhiyun	cmp	r2, #0x20		@ Applies to including and above R2p0
225*4882a593Smuzhiyun	blt	skip_errata_798870      @ skip if not affected rev
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun	mrc	p15, 1, r0, c15, c0, 0  @ read l2 aux ctrl reg
228*4882a593Smuzhiyun	orr	r0, r0, #1 << 7         @ Enable hazard-detect timeout
229*4882a593Smuzhiyun	push	{r1-r5}			@ Save the cpu info registers
230*4882a593Smuzhiyun	bl	v7_arch_cp15_set_l2aux_ctrl
231*4882a593Smuzhiyun	isb				@ Recommended ISB after l2actlr update
232*4882a593Smuzhiyun	pop	{r1-r5}			@ Restore the cpu info - fall through
233*4882a593Smuzhiyunskip_errata_798870:
234*4882a593Smuzhiyun#endif
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_801819
237*4882a593Smuzhiyun	cmp	r2, #0x24		@ Applies to lt including R2p4
238*4882a593Smuzhiyun	bgt	skip_errata_801819      @ skip if not affected rev
239*4882a593Smuzhiyun	cmp	r2, #0x20		@ Applies to including and above R2p0
240*4882a593Smuzhiyun	blt	skip_errata_801819      @ skip if not affected rev
241*4882a593Smuzhiyun	mrc	p15, 0, r0, c0, c0, 6	@ pick up REVIDR reg
242*4882a593Smuzhiyun	and	r0, r0, #1 << 3		@ check REVIDR[3]
243*4882a593Smuzhiyun	cmp	r0, #1 << 3
244*4882a593Smuzhiyun	beq	skip_errata_801819	@ skip erratum if REVIDR[3] is set
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun	mrc	p15, 0, r0, c1, c0, 1	@ read auxilary control register
247*4882a593Smuzhiyun	orr	r0, r0, #3 << 27	@ Disables streaming. All write-allocate
248*4882a593Smuzhiyun					@ lines allocate in the L1 or L2 cache.
249*4882a593Smuzhiyun	orr	r0, r0, #3 << 25	@ Disables streaming. All write-allocate
250*4882a593Smuzhiyun					@ lines allocate in the L1 cache.
251*4882a593Smuzhiyun	push	{r1-r5}			@ Save the cpu info registers
252*4882a593Smuzhiyun	bl	v7_arch_cp15_set_acr
253*4882a593Smuzhiyun	pop	{r1-r5}			@ Restore the cpu info - fall through
254*4882a593Smuzhiyunskip_errata_801819:
255*4882a593Smuzhiyun#endif
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_454179
258*4882a593Smuzhiyun	cmp	r2, #0x21		@ Only on < r2p1
259*4882a593Smuzhiyun	bge	skip_errata_454179
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun	mrc	p15, 0, r0, c1, c0, 1	@ Read ACR
262*4882a593Smuzhiyun	orr	r0, r0, #(0x3 << 6)	@ Set DBSM(BIT7) and IBE(BIT6) bits
263*4882a593Smuzhiyun	push	{r1-r5}			@ Save the cpu info registers
264*4882a593Smuzhiyun	bl	v7_arch_cp15_set_acr
265*4882a593Smuzhiyun	pop	{r1-r5}			@ Restore the cpu info - fall through
266*4882a593Smuzhiyun
267*4882a593Smuzhiyunskip_errata_454179:
268*4882a593Smuzhiyun#endif
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_430973
271*4882a593Smuzhiyun	cmp	r2, #0x21		@ Only on < r2p1
272*4882a593Smuzhiyun	bge	skip_errata_430973
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun	mrc	p15, 0, r0, c1, c0, 1	@ Read ACR
275*4882a593Smuzhiyun	orr	r0, r0, #(0x1 << 6)	@ Set IBE bit
276*4882a593Smuzhiyun	push	{r1-r5}			@ Save the cpu info registers
277*4882a593Smuzhiyun	bl	v7_arch_cp15_set_acr
278*4882a593Smuzhiyun	pop	{r1-r5}			@ Restore the cpu info - fall through
279*4882a593Smuzhiyun
280*4882a593Smuzhiyunskip_errata_430973:
281*4882a593Smuzhiyun#endif
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_621766
284*4882a593Smuzhiyun	cmp	r2, #0x21		@ Only on < r2p1
285*4882a593Smuzhiyun	bge	skip_errata_621766
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun	mrc	p15, 0, r0, c1, c0, 1	@ Read ACR
288*4882a593Smuzhiyun	orr	r0, r0, #(0x1 << 5)	@ Set L1NEON bit
289*4882a593Smuzhiyun	push	{r1-r5}			@ Save the cpu info registers
290*4882a593Smuzhiyun	bl	v7_arch_cp15_set_acr
291*4882a593Smuzhiyun	pop	{r1-r5}			@ Restore the cpu info - fall through
292*4882a593Smuzhiyun
293*4882a593Smuzhiyunskip_errata_621766:
294*4882a593Smuzhiyun#endif
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_725233
297*4882a593Smuzhiyun	cmp	r2, #0x21		@ Only on < r2p1 (Cortex A8)
298*4882a593Smuzhiyun	bge	skip_errata_725233
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun	mrc	p15, 1, r0, c9, c0, 2	@ Read L2ACR
301*4882a593Smuzhiyun	orr	r0, r0, #(0x1 << 27)	@ L2 PLD data forwarding disable
302*4882a593Smuzhiyun	push	{r1-r5}			@ Save the cpu info registers
303*4882a593Smuzhiyun	bl	v7_arch_cp15_set_l2aux_ctrl
304*4882a593Smuzhiyun	pop	{r1-r5}			@ Restore the cpu info - fall through
305*4882a593Smuzhiyun
306*4882a593Smuzhiyunskip_errata_725233:
307*4882a593Smuzhiyun#endif
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_852421
310*4882a593Smuzhiyun	mrc	p15, 0, r0, c15, c0, 1	@ read diagnostic register
311*4882a593Smuzhiyun	orr	r0, r0, #1 << 24	@ set bit #24
312*4882a593Smuzhiyun	mcr	p15, 0, r0, c15, c0, 1	@ write diagnostic register
313*4882a593Smuzhiyun#endif
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_852423
316*4882a593Smuzhiyun	mrc	p15, 0, r0, c15, c0, 1	@ read diagnostic register
317*4882a593Smuzhiyun	orr	r0, r0, #1 << 12	@ set bit #12
318*4882a593Smuzhiyun	mcr	p15, 0, r0, c15, c0, 1	@ write diagnostic register
319*4882a593Smuzhiyun#endif
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun#if defined(CONFIG_ARM_ZERO_CNTVOFF) && defined(CONFIG_SPL_BUILD)
322*4882a593Smuzhiyun	/*
323*4882a593Smuzhiyun	 * CNTVOFF usage constraints:
324*4882a593Smuzhiyun	 * Only accessible from Hyp mode, or from Monitor mode when SCR.NS is
325*4882a593Smuzhiyun	 * set to 1.
326*4882a593Smuzhiyun	 */
327*4882a593Smuzhiyun	/* switch to MON */
328*4882a593Smuzhiyun	cps #22
329*4882a593Smuzhiyun	isb
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun	/* Update SCR.NS to non Secure mode */
332*4882a593Smuzhiyun	mrc	p15, 0, r0, c1, c1, 0
333*4882a593Smuzhiyun	orr r0, r0, #(1 << 0)
334*4882a593Smuzhiyun	mcr	p15, 0, r0, c1, c1, 0
335*4882a593Smuzhiyun	isb
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun	/* set vtimer virtual offset 0 */
338*4882a593Smuzhiyun	mov	r0, #0
339*4882a593Smuzhiyun	mcrr	p15, 4, r0, r0, c14	@ CNTVOFF
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun	/* Update SCR.NS to Secure mode */
342*4882a593Smuzhiyun	mrc	p15, 0, r0, c1, c1, 0
343*4882a593Smuzhiyun	bic r0, r0, #(1 << 0)
344*4882a593Smuzhiyun	mcr	p15, 0, r0, c1, c1, 0
345*4882a593Smuzhiyun	isb
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun	/* switch back to SVC */
348*4882a593Smuzhiyun	cps #19
349*4882a593Smuzhiyun	isb
350*4882a593Smuzhiyun#endif
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun	mov	pc, r5			@ back to my caller
353*4882a593SmuzhiyunENDPROC(cpu_init_cp15)
354*4882a593Smuzhiyun
355*4882a593Smuzhiyun#if !defined(CONFIG_SKIP_LOWLEVEL_INIT) && \
356*4882a593Smuzhiyun	!defined(CONFIG_SKIP_LOWLEVEL_INIT_ONLY)
357*4882a593Smuzhiyun/*************************************************************************
358*4882a593Smuzhiyun *
359*4882a593Smuzhiyun * CPU_init_critical registers
360*4882a593Smuzhiyun *
361*4882a593Smuzhiyun * setup important registers
362*4882a593Smuzhiyun * setup memory timing
363*4882a593Smuzhiyun *
364*4882a593Smuzhiyun *************************************************************************/
365*4882a593SmuzhiyunENTRY(cpu_init_crit)
366*4882a593Smuzhiyun	/*
367*4882a593Smuzhiyun	 * Jump to board specific initialization...
368*4882a593Smuzhiyun	 * The Mask ROM will have already initialized
369*4882a593Smuzhiyun	 * basic memory. Go here to bump up clock rate and handle
370*4882a593Smuzhiyun	 * wake up conditions.
371*4882a593Smuzhiyun	 */
372*4882a593Smuzhiyun	b	lowlevel_init		@ go setup pll,mux,memory
373*4882a593SmuzhiyunENDPROC(cpu_init_crit)
374*4882a593Smuzhiyun#endif
375