xref: /rk3399_rockchip-uboot/arch/arm/cpu/armv7/start.S (revision 19a75b8cf8d17fffa9493bf3f3e380d76eccd8dd)
1f56348afSSteve Sakoman/*
2f56348afSSteve Sakoman * armboot - Startup Code for OMAP3530/ARM Cortex CPU-core
3f56348afSSteve Sakoman *
4f56348afSSteve Sakoman * Copyright (c) 2004	Texas Instruments <r-woodruff2@ti.com>
5f56348afSSteve Sakoman *
6f56348afSSteve Sakoman * Copyright (c) 2001	Marius Gröger <mag@sysgo.de>
7f56348afSSteve Sakoman * Copyright (c) 2002	Alex Züpke <azu@sysgo.de>
8f56348afSSteve Sakoman * Copyright (c) 2002	Gary Jennejohn <garyj@denx.de>
9f56348afSSteve Sakoman * Copyright (c) 2003	Richard Woodruff <r-woodruff2@ti.com>
10f56348afSSteve Sakoman * Copyright (c) 2003	Kshitij <kshitij@ti.com>
11f56348afSSteve Sakoman * Copyright (c) 2006-2008 Syed Mohammed Khasim <x0khasim@ti.com>
12f56348afSSteve Sakoman *
131a459660SWolfgang Denk * SPDX-License-Identifier:	GPL-2.0+
14f56348afSSteve Sakoman */
15f56348afSSteve Sakoman
1625ddd1fbSWolfgang Denk#include <asm-offsets.h>
17f56348afSSteve Sakoman#include <config.h>
18a8c68639SAneesh V#include <asm/system.h>
1974236acaSAneesh V#include <linux/linkage.h>
20d31d4a2dSKeerthy#include <asm/armv7.h>
21f56348afSSteve Sakoman
22f56348afSSteve Sakoman/*************************************************************************
23f56348afSSteve Sakoman *
24f56348afSSteve Sakoman * Startup Code (reset vector)
25f56348afSSteve Sakoman *
26003b09daSPavel Machek * Do important init only if we don't start from memory!
27003b09daSPavel Machek * Setup memory and board specific bits prior to relocation.
28003b09daSPavel Machek * Relocate armboot to ram. Setup stack.
29f56348afSSteve Sakoman *
30f56348afSSteve Sakoman *************************************************************************/
31f56348afSSteve Sakoman
3241623c91SAlbert ARIBAUD	.globl	reset
33e11c6c27SSimon Glass	.globl	save_boot_params_ret
34d31d4a2dSKeerthy#ifdef CONFIG_ARMV7_LPAE
35d31d4a2dSKeerthy	.global	switch_to_hypervisor_ret
36d31d4a2dSKeerthy#endif
37561142afSHeiko Schocher
38561142afSHeiko Schocherreset:
39e11c6c27SSimon Glass	/* Allow the board to save important registers */
40e11c6c27SSimon Glass	b	save_boot_params
41e11c6c27SSimon Glasssave_boot_params_ret:
42d31d4a2dSKeerthy#ifdef CONFIG_ARMV7_LPAE
43d31d4a2dSKeerthy/*
44d31d4a2dSKeerthy * check for Hypervisor support
45d31d4a2dSKeerthy */
46d31d4a2dSKeerthy	mrc	p15, 0, r0, c0, c1, 1		@ read ID_PFR1
47d31d4a2dSKeerthy	and	r0, r0, #CPUID_ARM_VIRT_MASK	@ mask virtualization bits
48d31d4a2dSKeerthy	cmp	r0, #(1 << CPUID_ARM_VIRT_SHIFT)
49d31d4a2dSKeerthy	beq	switch_to_hypervisor
50d31d4a2dSKeerthyswitch_to_hypervisor_ret:
51d31d4a2dSKeerthy#endif
52561142afSHeiko Schocher	/*
53c4a4e2e2SAndre Przywara	 * disable interrupts (FIQ and IRQ), also set the cpu to SVC32 mode,
54c4a4e2e2SAndre Przywara	 * except if in HYP mode already
55561142afSHeiko Schocher	 */
56561142afSHeiko Schocher	mrs	r0, cpsr
57c4a4e2e2SAndre Przywara	and	r1, r0, #0x1f		@ mask mode bits
58c4a4e2e2SAndre Przywara	teq	r1, #0x1a		@ test for HYP mode
59c4a4e2e2SAndre Przywara	bicne	r0, r0, #0x1f		@ clear all mode bits
60c4a4e2e2SAndre Przywara	orrne	r0, r0, #0x13		@ set SVC mode
61c4a4e2e2SAndre Przywara	orr	r0, r0, #0xc0		@ disable FIQ and IRQ
62561142afSHeiko Schocher	msr	cpsr,r0
63561142afSHeiko Schocher
64a8c68639SAneesh V/*
65a8c68639SAneesh V * Setup vector:
66a8c68639SAneesh V * (OMAP4 spl TEXT_BASE is not 32 byte aligned.
67a8c68639SAneesh V * Continue to use ROM code vector only in OMAP4 spl)
68a8c68639SAneesh V */
69840fe95cSSiarhei Siamashka#if !(defined(CONFIG_OMAP44XX) && defined(CONFIG_SPL_BUILD))
700f274f53SPeng Fan	/* Set V=0 in CP15 SCTLR register - for VBAR to point to vector */
710f274f53SPeng Fan	mrc	p15, 0, r0, c1, c0, 0	@ Read CP15 SCTLR Register
72a8c68639SAneesh V	bic	r0, #CR_V		@ V = 0
730f274f53SPeng Fan	mcr	p15, 0, r0, c1, c0, 0	@ Write CP15 SCTLR Register
74a8c68639SAneesh V
75a8c68639SAneesh V	/* Set vector address in CP15 VBAR register */
76a8c68639SAneesh V	ldr	r0, =_start
77a8c68639SAneesh V	mcr	p15, 0, r0, c12, c0, 0	@Set VBAR
78a8c68639SAneesh V#endif
79a8c68639SAneesh V
80561142afSHeiko Schocher	/* the mask ROM code should have PLL and others stable */
81561142afSHeiko Schocher#ifndef CONFIG_SKIP_LOWLEVEL_INIT
8280433c9aSSimon Glass	bl	cpu_init_cp15
83b5bd0982SSimon Glass#ifndef CONFIG_SKIP_LOWLEVEL_INIT_ONLY
84561142afSHeiko Schocher	bl	cpu_init_crit
85561142afSHeiko Schocher#endif
86b5bd0982SSimon Glass#endif
87561142afSHeiko Schocher
88e05e5de7SAlbert ARIBAUD	bl	_main
89561142afSHeiko Schocher
90561142afSHeiko Schocher/*------------------------------------------------------------------------------*/
91561142afSHeiko Schocher
92e05e5de7SAlbert ARIBAUDENTRY(c_runtime_cpu_setup)
93c2dd0d45SAneesh V/*
94c2dd0d45SAneesh V * If I-cache is enabled invalidate it
95c2dd0d45SAneesh V */
96c2dd0d45SAneesh V#ifndef CONFIG_SYS_ICACHE_OFF
97c2dd0d45SAneesh V	mcr	p15, 0, r0, c7, c5, 0	@ invalidate icache
98c2dd0d45SAneesh V	mcr     p15, 0, r0, c7, c10, 4	@ DSB
99c2dd0d45SAneesh V	mcr     p15, 0, r0, c7, c5, 4	@ ISB
100c2dd0d45SAneesh V#endif
101f8b9d1d3STetsuyuki Kobayashi
102e05e5de7SAlbert ARIBAUD	bx	lr
103561142afSHeiko Schocher
104e05e5de7SAlbert ARIBAUDENDPROC(c_runtime_cpu_setup)
105c3d3a541SHeiko Schocher
106f56348afSSteve Sakoman/*************************************************************************
107f56348afSSteve Sakoman *
1086f0dba85STetsuyuki Kobayashi * void save_boot_params(u32 r0, u32 r1, u32 r2, u32 r3)
1096f0dba85STetsuyuki Kobayashi *	__attribute__((weak));
1106f0dba85STetsuyuki Kobayashi *
1116f0dba85STetsuyuki Kobayashi * Stack pointer is not yet initialized at this moment
1126f0dba85STetsuyuki Kobayashi * Don't save anything to stack even if compiled with -O0
1136f0dba85STetsuyuki Kobayashi *
1146f0dba85STetsuyuki Kobayashi *************************************************************************/
1156f0dba85STetsuyuki KobayashiENTRY(save_boot_params)
116e11c6c27SSimon Glass	b	save_boot_params_ret		@ back to my caller
1176f0dba85STetsuyuki KobayashiENDPROC(save_boot_params)
1186f0dba85STetsuyuki Kobayashi	.weak	save_boot_params
1196f0dba85STetsuyuki Kobayashi
120d31d4a2dSKeerthy#ifdef CONFIG_ARMV7_LPAE
121d31d4a2dSKeerthyENTRY(switch_to_hypervisor)
122d31d4a2dSKeerthy	b	switch_to_hypervisor_ret
123d31d4a2dSKeerthyENDPROC(switch_to_hypervisor)
124d31d4a2dSKeerthy	.weak	switch_to_hypervisor
125d31d4a2dSKeerthy#endif
126d31d4a2dSKeerthy
1276f0dba85STetsuyuki Kobayashi/*************************************************************************
1286f0dba85STetsuyuki Kobayashi *
12980433c9aSSimon Glass * cpu_init_cp15
130f56348afSSteve Sakoman *
13180433c9aSSimon Glass * Setup CP15 registers (cache, MMU, TLBs). The I-cache is turned on unless
13280433c9aSSimon Glass * CONFIG_SYS_ICACHE_OFF is defined.
133f56348afSSteve Sakoman *
134f56348afSSteve Sakoman *************************************************************************/
13574236acaSAneesh VENTRY(cpu_init_cp15)
136f56348afSSteve Sakoman	/*
137f56348afSSteve Sakoman	 * Invalidate L1 I/D
138f56348afSSteve Sakoman	 */
139f56348afSSteve Sakoman	mov	r0, #0			@ set up for MCR
140f56348afSSteve Sakoman	mcr	p15, 0, r0, c8, c7, 0	@ invalidate TLBs
141f56348afSSteve Sakoman	mcr	p15, 0, r0, c7, c5, 0	@ invalidate icache
142c2dd0d45SAneesh V	mcr	p15, 0, r0, c7, c5, 6	@ invalidate BP array
143c2dd0d45SAneesh V	mcr     p15, 0, r0, c7, c10, 4	@ DSB
144c2dd0d45SAneesh V	mcr     p15, 0, r0, c7, c5, 4	@ ISB
145f56348afSSteve Sakoman
146f56348afSSteve Sakoman	/*
147f56348afSSteve Sakoman	 * disable MMU stuff and caches
148f56348afSSteve Sakoman	 */
149f56348afSSteve Sakoman	mrc	p15, 0, r0, c1, c0, 0
150f56348afSSteve Sakoman	bic	r0, r0, #0x00002000	@ clear bits 13 (--V-)
151f56348afSSteve Sakoman	bic	r0, r0, #0x00000007	@ clear bits 2:0 (-CAM)
152f56348afSSteve Sakoman	orr	r0, r0, #0x00000002	@ set bit 1 (--A-) Align
153c2dd0d45SAneesh V	orr	r0, r0, #0x00000800	@ set bit 11 (Z---) BTB
154c2dd0d45SAneesh V#ifdef CONFIG_SYS_ICACHE_OFF
155c2dd0d45SAneesh V	bic	r0, r0, #0x00001000	@ clear bit 12 (I) I-cache
156c2dd0d45SAneesh V#else
157c2dd0d45SAneesh V	orr	r0, r0, #0x00001000	@ set bit 12 (I) I-cache
158c2dd0d45SAneesh V#endif
159f56348afSSteve Sakoman	mcr	p15, 0, r0, c1, c0, 0
1600678587fSStephen Warren
161c5d4752cSStephen Warren#ifdef CONFIG_ARM_ERRATA_716044
162c5d4752cSStephen Warren	mrc	p15, 0, r0, c1, c0, 0	@ read system control register
163c5d4752cSStephen Warren	orr	r0, r0, #1 << 11	@ set bit #11
164c5d4752cSStephen Warren	mcr	p15, 0, r0, c1, c0, 0	@ write system control register
165c5d4752cSStephen Warren#endif
166c5d4752cSStephen Warren
167f71cbfe3SNitin Garg#if (defined(CONFIG_ARM_ERRATA_742230) || defined(CONFIG_ARM_ERRATA_794072))
1680678587fSStephen Warren	mrc	p15, 0, r0, c15, c0, 1	@ read diagnostic register
1690678587fSStephen Warren	orr	r0, r0, #1 << 4		@ set bit #4
1700678587fSStephen Warren	mcr	p15, 0, r0, c15, c0, 1	@ write diagnostic register
1710678587fSStephen Warren#endif
1720678587fSStephen Warren
1730678587fSStephen Warren#ifdef CONFIG_ARM_ERRATA_743622
1740678587fSStephen Warren	mrc	p15, 0, r0, c15, c0, 1	@ read diagnostic register
1750678587fSStephen Warren	orr	r0, r0, #1 << 6		@ set bit #6
1760678587fSStephen Warren	mcr	p15, 0, r0, c15, c0, 1	@ write diagnostic register
1770678587fSStephen Warren#endif
1780678587fSStephen Warren
1790678587fSStephen Warren#ifdef CONFIG_ARM_ERRATA_751472
1800678587fSStephen Warren	mrc	p15, 0, r0, c15, c0, 1	@ read diagnostic register
1810678587fSStephen Warren	orr	r0, r0, #1 << 11	@ set bit #11
1820678587fSStephen Warren	mcr	p15, 0, r0, c15, c0, 1	@ write diagnostic register
1830678587fSStephen Warren#endif
184b7588e3bSNitin Garg#ifdef CONFIG_ARM_ERRATA_761320
185b7588e3bSNitin Garg	mrc	p15, 0, r0, c15, c0, 1	@ read diagnostic register
186b7588e3bSNitin Garg	orr	r0, r0, #1 << 21	@ set bit #21
187b7588e3bSNitin Garg	mcr	p15, 0, r0, c15, c0, 1	@ write diagnostic register
188b7588e3bSNitin Garg#endif
1890678587fSStephen Warren
190c616a0dfSNishanth Menon	mov	r5, lr			@ Store my Caller
191c616a0dfSNishanth Menon	mrc	p15, 0, r1, c0, c0, 0	@ r1 has Read Main ID Register (MIDR)
192c616a0dfSNishanth Menon	mov	r3, r1, lsr #20		@ get variant field
193c616a0dfSNishanth Menon	and	r3, r3, #0xf		@ r3 has CPU variant
194c616a0dfSNishanth Menon	and	r4, r1, #0xf		@ r4 has CPU revision
195c616a0dfSNishanth Menon	mov	r2, r3, lsl #4		@ shift variant field for combined value
196c616a0dfSNishanth Menon	orr	r2, r4, r2		@ r2 has combined CPU variant + revision
197c616a0dfSNishanth Menon
198c616a0dfSNishanth Menon#ifdef CONFIG_ARM_ERRATA_798870
199c616a0dfSNishanth Menon	cmp	r2, #0x30		@ Applies to lower than R3p0
200c616a0dfSNishanth Menon	bge	skip_errata_798870      @ skip if not affected rev
201c616a0dfSNishanth Menon	cmp	r2, #0x20		@ Applies to including and above R2p0
202c616a0dfSNishanth Menon	blt	skip_errata_798870      @ skip if not affected rev
203c616a0dfSNishanth Menon
204c616a0dfSNishanth Menon	mrc	p15, 1, r0, c15, c0, 0  @ read l2 aux ctrl reg
205c616a0dfSNishanth Menon	orr	r0, r0, #1 << 7         @ Enable hazard-detect timeout
206c616a0dfSNishanth Menon	push	{r1-r5}			@ Save the cpu info registers
207c616a0dfSNishanth Menon	bl	v7_arch_cp15_set_l2aux_ctrl
208c616a0dfSNishanth Menon	isb				@ Recommended ISB after l2actlr update
209c616a0dfSNishanth Menon	pop	{r1-r5}			@ Restore the cpu info - fall through
210c616a0dfSNishanth Menonskip_errata_798870:
211c616a0dfSNishanth Menon#endif
212c616a0dfSNishanth Menon
213a615d0beSNishanth Menon#ifdef CONFIG_ARM_ERRATA_801819
214a615d0beSNishanth Menon	cmp	r2, #0x24		@ Applies to lt including R2p4
215a615d0beSNishanth Menon	bgt	skip_errata_801819      @ skip if not affected rev
216a615d0beSNishanth Menon	cmp	r2, #0x20		@ Applies to including and above R2p0
217a615d0beSNishanth Menon	blt	skip_errata_801819      @ skip if not affected rev
218a615d0beSNishanth Menon	mrc	p15, 0, r0, c0, c0, 6	@ pick up REVIDR reg
219a615d0beSNishanth Menon	and	r0, r0, #1 << 3		@ check REVIDR[3]
220a615d0beSNishanth Menon	cmp	r0, #1 << 3
221a615d0beSNishanth Menon	beq	skip_errata_801819	@ skip erratum if REVIDR[3] is set
222a615d0beSNishanth Menon
223a615d0beSNishanth Menon	mrc	p15, 0, r0, c1, c0, 1	@ read auxilary control register
224a615d0beSNishanth Menon	orr	r0, r0, #3 << 27	@ Disables streaming. All write-allocate
225a615d0beSNishanth Menon					@ lines allocate in the L1 or L2 cache.
226a615d0beSNishanth Menon	orr	r0, r0, #3 << 25	@ Disables streaming. All write-allocate
227a615d0beSNishanth Menon					@ lines allocate in the L1 cache.
228a615d0beSNishanth Menon	push	{r1-r5}			@ Save the cpu info registers
229a615d0beSNishanth Menon	bl	v7_arch_cp15_set_acr
230a615d0beSNishanth Menon	pop	{r1-r5}			@ Restore the cpu info - fall through
231a615d0beSNishanth Menonskip_errata_801819:
232a615d0beSNishanth Menon#endif
233a615d0beSNishanth Menon
234b45c48a7SNishanth Menon#ifdef CONFIG_ARM_ERRATA_454179
235b45c48a7SNishanth Menon	cmp	r2, #0x21		@ Only on < r2p1
236b45c48a7SNishanth Menon	bge	skip_errata_454179
237b45c48a7SNishanth Menon
238b45c48a7SNishanth Menon	mrc	p15, 0, r0, c1, c0, 1	@ Read ACR
239b45c48a7SNishanth Menon	orr	r0, r0, #(0x3 << 6)	@ Set DBSM(BIT7) and IBE(BIT6) bits
240b45c48a7SNishanth Menon	push	{r1-r5}			@ Save the cpu info registers
241b45c48a7SNishanth Menon	bl	v7_arch_cp15_set_acr
242b45c48a7SNishanth Menon	pop	{r1-r5}			@ Restore the cpu info - fall through
243b45c48a7SNishanth Menon
244b45c48a7SNishanth Menonskip_errata_454179:
245b45c48a7SNishanth Menon#endif
246b45c48a7SNishanth Menon
2475902f4ceSNishanth Menon#ifdef CONFIG_ARM_ERRATA_430973
2485902f4ceSNishanth Menon	cmp	r2, #0x21		@ Only on < r2p1
2495902f4ceSNishanth Menon	bge	skip_errata_430973
2505902f4ceSNishanth Menon
2515902f4ceSNishanth Menon	mrc	p15, 0, r0, c1, c0, 1	@ Read ACR
2525902f4ceSNishanth Menon	orr	r0, r0, #(0x1 << 6)	@ Set IBE bit
2535902f4ceSNishanth Menon	push	{r1-r5}			@ Save the cpu info registers
2545902f4ceSNishanth Menon	bl	v7_arch_cp15_set_acr
2555902f4ceSNishanth Menon	pop	{r1-r5}			@ Restore the cpu info - fall through
2565902f4ceSNishanth Menon
2575902f4ceSNishanth Menonskip_errata_430973:
2585902f4ceSNishanth Menon#endif
2595902f4ceSNishanth Menon
2609b4d65f9SNishanth Menon#ifdef CONFIG_ARM_ERRATA_621766
2619b4d65f9SNishanth Menon	cmp	r2, #0x21		@ Only on < r2p1
2629b4d65f9SNishanth Menon	bge	skip_errata_621766
2639b4d65f9SNishanth Menon
2649b4d65f9SNishanth Menon	mrc	p15, 0, r0, c1, c0, 1	@ Read ACR
2659b4d65f9SNishanth Menon	orr	r0, r0, #(0x1 << 5)	@ Set L1NEON bit
2669b4d65f9SNishanth Menon	push	{r1-r5}			@ Save the cpu info registers
2679b4d65f9SNishanth Menon	bl	v7_arch_cp15_set_acr
2689b4d65f9SNishanth Menon	pop	{r1-r5}			@ Restore the cpu info - fall through
2699b4d65f9SNishanth Menon
2709b4d65f9SNishanth Menonskip_errata_621766:
2719b4d65f9SNishanth Menon#endif
2729b4d65f9SNishanth Menon
273*19a75b8cSSiarhei Siamashka#ifdef CONFIG_ARM_ERRATA_725233
274*19a75b8cSSiarhei Siamashka	cmp	r2, #0x21		@ Only on < r2p1 (Cortex A8)
275*19a75b8cSSiarhei Siamashka	bge	skip_errata_725233
276*19a75b8cSSiarhei Siamashka
277*19a75b8cSSiarhei Siamashka	mrc	p15, 1, r0, c9, c0, 2	@ Read L2ACR
278*19a75b8cSSiarhei Siamashka	orr	r0, r0, #(0x1 << 27)	@ L2 PLD data forwarding disable
279*19a75b8cSSiarhei Siamashka	push	{r1-r5}			@ Save the cpu info registers
280*19a75b8cSSiarhei Siamashka	bl	v7_arch_cp15_set_l2aux_ctrl
281*19a75b8cSSiarhei Siamashka	pop	{r1-r5}			@ Restore the cpu info - fall through
282*19a75b8cSSiarhei Siamashka
283*19a75b8cSSiarhei Siamashkaskip_errata_725233:
284*19a75b8cSSiarhei Siamashka#endif
285*19a75b8cSSiarhei Siamashka
286c616a0dfSNishanth Menon	mov	pc, r5			@ back to my caller
28774236acaSAneesh VENDPROC(cpu_init_cp15)
28880433c9aSSimon Glass
289b5bd0982SSimon Glass#if !defined(CONFIG_SKIP_LOWLEVEL_INIT) && \
290b5bd0982SSimon Glass	!defined(CONFIG_SKIP_LOWLEVEL_INIT_ONLY)
29180433c9aSSimon Glass/*************************************************************************
29280433c9aSSimon Glass *
29380433c9aSSimon Glass * CPU_init_critical registers
29480433c9aSSimon Glass *
29580433c9aSSimon Glass * setup important registers
29680433c9aSSimon Glass * setup memory timing
29780433c9aSSimon Glass *
29880433c9aSSimon Glass *************************************************************************/
29974236acaSAneesh VENTRY(cpu_init_crit)
300f56348afSSteve Sakoman	/*
301f56348afSSteve Sakoman	 * Jump to board specific initialization...
302f56348afSSteve Sakoman	 * The Mask ROM will have already initialized
303f56348afSSteve Sakoman	 * basic memory. Go here to bump up clock rate and handle
304f56348afSSteve Sakoman	 * wake up conditions.
305f56348afSSteve Sakoman	 */
30663ee53a7SBenoît Thébaudeau	b	lowlevel_init		@ go setup pll,mux,memory
30774236acaSAneesh VENDPROC(cpu_init_crit)
30822193540SRob Herring#endif
309