xref: /rk3399_rockchip-uboot/arch/arm/cpu/armv7/start.S (revision 5902f4ce0f2bd1411e40dc0ece3598a0fc19b2ae)
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>
18f56348afSSteve Sakoman#include <version.h>
19a8c68639SAneesh V#include <asm/system.h>
2074236acaSAneesh V#include <linux/linkage.h>
21f56348afSSteve Sakoman
22f56348afSSteve Sakoman/*************************************************************************
23f56348afSSteve Sakoman *
24f56348afSSteve Sakoman * Startup Code (reset vector)
25f56348afSSteve Sakoman *
26f56348afSSteve Sakoman * do important init only if we don't start from memory!
27f56348afSSteve Sakoman * setup Memory and board specific bits prior to relocation.
28f56348afSSteve Sakoman * relocate armboot to ram
29f56348afSSteve Sakoman * setup stack
30f56348afSSteve Sakoman *
31f56348afSSteve Sakoman *************************************************************************/
32f56348afSSteve Sakoman
3341623c91SAlbert ARIBAUD	.globl	reset
34e11c6c27SSimon Glass	.globl	save_boot_params_ret
35561142afSHeiko Schocher
36561142afSHeiko Schocherreset:
37e11c6c27SSimon Glass	/* Allow the board to save important registers */
38e11c6c27SSimon Glass	b	save_boot_params
39e11c6c27SSimon Glasssave_boot_params_ret:
40561142afSHeiko Schocher	/*
41c4a4e2e2SAndre Przywara	 * disable interrupts (FIQ and IRQ), also set the cpu to SVC32 mode,
42c4a4e2e2SAndre Przywara	 * except if in HYP mode already
43561142afSHeiko Schocher	 */
44561142afSHeiko Schocher	mrs	r0, cpsr
45c4a4e2e2SAndre Przywara	and	r1, r0, #0x1f		@ mask mode bits
46c4a4e2e2SAndre Przywara	teq	r1, #0x1a		@ test for HYP mode
47c4a4e2e2SAndre Przywara	bicne	r0, r0, #0x1f		@ clear all mode bits
48c4a4e2e2SAndre Przywara	orrne	r0, r0, #0x13		@ set SVC mode
49c4a4e2e2SAndre Przywara	orr	r0, r0, #0xc0		@ disable FIQ and IRQ
50561142afSHeiko Schocher	msr	cpsr,r0
51561142afSHeiko Schocher
52a8c68639SAneesh V/*
53a8c68639SAneesh V * Setup vector:
54a8c68639SAneesh V * (OMAP4 spl TEXT_BASE is not 32 byte aligned.
55a8c68639SAneesh V * Continue to use ROM code vector only in OMAP4 spl)
56a8c68639SAneesh V */
57840fe95cSSiarhei Siamashka#if !(defined(CONFIG_OMAP44XX) && defined(CONFIG_SPL_BUILD))
580f274f53SPeng Fan	/* Set V=0 in CP15 SCTLR register - for VBAR to point to vector */
590f274f53SPeng Fan	mrc	p15, 0, r0, c1, c0, 0	@ Read CP15 SCTLR Register
60a8c68639SAneesh V	bic	r0, #CR_V		@ V = 0
610f274f53SPeng Fan	mcr	p15, 0, r0, c1, c0, 0	@ Write CP15 SCTLR Register
62a8c68639SAneesh V
63a8c68639SAneesh V	/* Set vector address in CP15 VBAR register */
64a8c68639SAneesh V	ldr	r0, =_start
65a8c68639SAneesh V	mcr	p15, 0, r0, c12, c0, 0	@Set VBAR
66a8c68639SAneesh V#endif
67a8c68639SAneesh V
68561142afSHeiko Schocher	/* the mask ROM code should have PLL and others stable */
69561142afSHeiko Schocher#ifndef CONFIG_SKIP_LOWLEVEL_INIT
7080433c9aSSimon Glass	bl	cpu_init_cp15
71561142afSHeiko Schocher	bl	cpu_init_crit
72561142afSHeiko Schocher#endif
73561142afSHeiko Schocher
74e05e5de7SAlbert ARIBAUD	bl	_main
75561142afSHeiko Schocher
76561142afSHeiko Schocher/*------------------------------------------------------------------------------*/
77561142afSHeiko Schocher
78e05e5de7SAlbert ARIBAUDENTRY(c_runtime_cpu_setup)
79c2dd0d45SAneesh V/*
80c2dd0d45SAneesh V * If I-cache is enabled invalidate it
81c2dd0d45SAneesh V */
82c2dd0d45SAneesh V#ifndef CONFIG_SYS_ICACHE_OFF
83c2dd0d45SAneesh V	mcr	p15, 0, r0, c7, c5, 0	@ invalidate icache
84c2dd0d45SAneesh V	mcr     p15, 0, r0, c7, c10, 4	@ DSB
85c2dd0d45SAneesh V	mcr     p15, 0, r0, c7, c5, 4	@ ISB
86c2dd0d45SAneesh V#endif
87f8b9d1d3STetsuyuki Kobayashi
88e05e5de7SAlbert ARIBAUD	bx	lr
89561142afSHeiko Schocher
90e05e5de7SAlbert ARIBAUDENDPROC(c_runtime_cpu_setup)
91c3d3a541SHeiko Schocher
92f56348afSSteve Sakoman/*************************************************************************
93f56348afSSteve Sakoman *
946f0dba85STetsuyuki Kobayashi * void save_boot_params(u32 r0, u32 r1, u32 r2, u32 r3)
956f0dba85STetsuyuki Kobayashi *	__attribute__((weak));
966f0dba85STetsuyuki Kobayashi *
976f0dba85STetsuyuki Kobayashi * Stack pointer is not yet initialized at this moment
986f0dba85STetsuyuki Kobayashi * Don't save anything to stack even if compiled with -O0
996f0dba85STetsuyuki Kobayashi *
1006f0dba85STetsuyuki Kobayashi *************************************************************************/
1016f0dba85STetsuyuki KobayashiENTRY(save_boot_params)
102e11c6c27SSimon Glass	b	save_boot_params_ret		@ back to my caller
1036f0dba85STetsuyuki KobayashiENDPROC(save_boot_params)
1046f0dba85STetsuyuki Kobayashi	.weak	save_boot_params
1056f0dba85STetsuyuki Kobayashi
1066f0dba85STetsuyuki Kobayashi/*************************************************************************
1076f0dba85STetsuyuki Kobayashi *
10880433c9aSSimon Glass * cpu_init_cp15
109f56348afSSteve Sakoman *
11080433c9aSSimon Glass * Setup CP15 registers (cache, MMU, TLBs). The I-cache is turned on unless
11180433c9aSSimon Glass * CONFIG_SYS_ICACHE_OFF is defined.
112f56348afSSteve Sakoman *
113f56348afSSteve Sakoman *************************************************************************/
11474236acaSAneesh VENTRY(cpu_init_cp15)
115f56348afSSteve Sakoman	/*
116f56348afSSteve Sakoman	 * Invalidate L1 I/D
117f56348afSSteve Sakoman	 */
118f56348afSSteve Sakoman	mov	r0, #0			@ set up for MCR
119f56348afSSteve Sakoman	mcr	p15, 0, r0, c8, c7, 0	@ invalidate TLBs
120f56348afSSteve Sakoman	mcr	p15, 0, r0, c7, c5, 0	@ invalidate icache
121c2dd0d45SAneesh V	mcr	p15, 0, r0, c7, c5, 6	@ invalidate BP array
122c2dd0d45SAneesh V	mcr     p15, 0, r0, c7, c10, 4	@ DSB
123c2dd0d45SAneesh V	mcr     p15, 0, r0, c7, c5, 4	@ ISB
124f56348afSSteve Sakoman
125f56348afSSteve Sakoman	/*
126f56348afSSteve Sakoman	 * disable MMU stuff and caches
127f56348afSSteve Sakoman	 */
128f56348afSSteve Sakoman	mrc	p15, 0, r0, c1, c0, 0
129f56348afSSteve Sakoman	bic	r0, r0, #0x00002000	@ clear bits 13 (--V-)
130f56348afSSteve Sakoman	bic	r0, r0, #0x00000007	@ clear bits 2:0 (-CAM)
131f56348afSSteve Sakoman	orr	r0, r0, #0x00000002	@ set bit 1 (--A-) Align
132c2dd0d45SAneesh V	orr	r0, r0, #0x00000800	@ set bit 11 (Z---) BTB
133c2dd0d45SAneesh V#ifdef CONFIG_SYS_ICACHE_OFF
134c2dd0d45SAneesh V	bic	r0, r0, #0x00001000	@ clear bit 12 (I) I-cache
135c2dd0d45SAneesh V#else
136c2dd0d45SAneesh V	orr	r0, r0, #0x00001000	@ set bit 12 (I) I-cache
137c2dd0d45SAneesh V#endif
138f56348afSSteve Sakoman	mcr	p15, 0, r0, c1, c0, 0
1390678587fSStephen Warren
140c5d4752cSStephen Warren#ifdef CONFIG_ARM_ERRATA_716044
141c5d4752cSStephen Warren	mrc	p15, 0, r0, c1, c0, 0	@ read system control register
142c5d4752cSStephen Warren	orr	r0, r0, #1 << 11	@ set bit #11
143c5d4752cSStephen Warren	mcr	p15, 0, r0, c1, c0, 0	@ write system control register
144c5d4752cSStephen Warren#endif
145c5d4752cSStephen Warren
146f71cbfe3SNitin Garg#if (defined(CONFIG_ARM_ERRATA_742230) || defined(CONFIG_ARM_ERRATA_794072))
1470678587fSStephen Warren	mrc	p15, 0, r0, c15, c0, 1	@ read diagnostic register
1480678587fSStephen Warren	orr	r0, r0, #1 << 4		@ set bit #4
1490678587fSStephen Warren	mcr	p15, 0, r0, c15, c0, 1	@ write diagnostic register
1500678587fSStephen Warren#endif
1510678587fSStephen Warren
1520678587fSStephen Warren#ifdef CONFIG_ARM_ERRATA_743622
1530678587fSStephen Warren	mrc	p15, 0, r0, c15, c0, 1	@ read diagnostic register
1540678587fSStephen Warren	orr	r0, r0, #1 << 6		@ set bit #6
1550678587fSStephen Warren	mcr	p15, 0, r0, c15, c0, 1	@ write diagnostic register
1560678587fSStephen Warren#endif
1570678587fSStephen Warren
1580678587fSStephen Warren#ifdef CONFIG_ARM_ERRATA_751472
1590678587fSStephen Warren	mrc	p15, 0, r0, c15, c0, 1	@ read diagnostic register
1600678587fSStephen Warren	orr	r0, r0, #1 << 11	@ set bit #11
1610678587fSStephen Warren	mcr	p15, 0, r0, c15, c0, 1	@ write diagnostic register
1620678587fSStephen Warren#endif
163b7588e3bSNitin Garg#ifdef CONFIG_ARM_ERRATA_761320
164b7588e3bSNitin Garg	mrc	p15, 0, r0, c15, c0, 1	@ read diagnostic register
165b7588e3bSNitin Garg	orr	r0, r0, #1 << 21	@ set bit #21
166b7588e3bSNitin Garg	mcr	p15, 0, r0, c15, c0, 1	@ write diagnostic register
167b7588e3bSNitin Garg#endif
1680678587fSStephen Warren
169c616a0dfSNishanth Menon	mov	r5, lr			@ Store my Caller
170c616a0dfSNishanth Menon	mrc	p15, 0, r1, c0, c0, 0	@ r1 has Read Main ID Register (MIDR)
171c616a0dfSNishanth Menon	mov	r3, r1, lsr #20		@ get variant field
172c616a0dfSNishanth Menon	and	r3, r3, #0xf		@ r3 has CPU variant
173c616a0dfSNishanth Menon	and	r4, r1, #0xf		@ r4 has CPU revision
174c616a0dfSNishanth Menon	mov	r2, r3, lsl #4		@ shift variant field for combined value
175c616a0dfSNishanth Menon	orr	r2, r4, r2		@ r2 has combined CPU variant + revision
176c616a0dfSNishanth Menon
177c616a0dfSNishanth Menon#ifdef CONFIG_ARM_ERRATA_798870
178c616a0dfSNishanth Menon	cmp	r2, #0x30		@ Applies to lower than R3p0
179c616a0dfSNishanth Menon	bge	skip_errata_798870      @ skip if not affected rev
180c616a0dfSNishanth Menon	cmp	r2, #0x20		@ Applies to including and above R2p0
181c616a0dfSNishanth Menon	blt	skip_errata_798870      @ skip if not affected rev
182c616a0dfSNishanth Menon
183c616a0dfSNishanth Menon	mrc	p15, 1, r0, c15, c0, 0  @ read l2 aux ctrl reg
184c616a0dfSNishanth Menon	orr	r0, r0, #1 << 7         @ Enable hazard-detect timeout
185c616a0dfSNishanth Menon	push	{r1-r5}			@ Save the cpu info registers
186c616a0dfSNishanth Menon	bl	v7_arch_cp15_set_l2aux_ctrl
187c616a0dfSNishanth Menon	isb				@ Recommended ISB after l2actlr update
188c616a0dfSNishanth Menon	pop	{r1-r5}			@ Restore the cpu info - fall through
189c616a0dfSNishanth Menonskip_errata_798870:
190c616a0dfSNishanth Menon#endif
191c616a0dfSNishanth Menon
192b45c48a7SNishanth Menon#ifdef CONFIG_ARM_ERRATA_454179
193b45c48a7SNishanth Menon	cmp	r2, #0x21		@ Only on < r2p1
194b45c48a7SNishanth Menon	bge	skip_errata_454179
195b45c48a7SNishanth Menon
196b45c48a7SNishanth Menon	mrc	p15, 0, r0, c1, c0, 1	@ Read ACR
197b45c48a7SNishanth Menon	orr	r0, r0, #(0x3 << 6)	@ Set DBSM(BIT7) and IBE(BIT6) bits
198b45c48a7SNishanth Menon	push	{r1-r5}			@ Save the cpu info registers
199b45c48a7SNishanth Menon	bl	v7_arch_cp15_set_acr
200b45c48a7SNishanth Menon	pop	{r1-r5}			@ Restore the cpu info - fall through
201b45c48a7SNishanth Menon
202b45c48a7SNishanth Menonskip_errata_454179:
203b45c48a7SNishanth Menon#endif
204b45c48a7SNishanth Menon
205*5902f4ceSNishanth Menon#ifdef CONFIG_ARM_ERRATA_430973
206*5902f4ceSNishanth Menon	cmp	r2, #0x21		@ Only on < r2p1
207*5902f4ceSNishanth Menon	bge	skip_errata_430973
208*5902f4ceSNishanth Menon
209*5902f4ceSNishanth Menon	mrc	p15, 0, r0, c1, c0, 1	@ Read ACR
210*5902f4ceSNishanth Menon	orr	r0, r0, #(0x1 << 6)	@ Set IBE bit
211*5902f4ceSNishanth Menon	push	{r1-r5}			@ Save the cpu info registers
212*5902f4ceSNishanth Menon	bl	v7_arch_cp15_set_acr
213*5902f4ceSNishanth Menon	pop	{r1-r5}			@ Restore the cpu info - fall through
214*5902f4ceSNishanth Menon
215*5902f4ceSNishanth Menonskip_errata_430973:
216*5902f4ceSNishanth Menon#endif
217*5902f4ceSNishanth Menon
218c616a0dfSNishanth Menon	mov	pc, r5			@ back to my caller
21974236acaSAneesh VENDPROC(cpu_init_cp15)
22080433c9aSSimon Glass
22180433c9aSSimon Glass#ifndef CONFIG_SKIP_LOWLEVEL_INIT
22280433c9aSSimon Glass/*************************************************************************
22380433c9aSSimon Glass *
22480433c9aSSimon Glass * CPU_init_critical registers
22580433c9aSSimon Glass *
22680433c9aSSimon Glass * setup important registers
22780433c9aSSimon Glass * setup memory timing
22880433c9aSSimon Glass *
22980433c9aSSimon Glass *************************************************************************/
23074236acaSAneesh VENTRY(cpu_init_crit)
231f56348afSSteve Sakoman	/*
232f56348afSSteve Sakoman	 * Jump to board specific initialization...
233f56348afSSteve Sakoman	 * The Mask ROM will have already initialized
234f56348afSSteve Sakoman	 * basic memory. Go here to bump up clock rate and handle
235f56348afSSteve Sakoman	 * wake up conditions.
236f56348afSSteve Sakoman	 */
23763ee53a7SBenoît Thébaudeau	b	lowlevel_init		@ go setup pll,mux,memory
23874236acaSAneesh VENDPROC(cpu_init_crit)
23922193540SRob Herring#endif
240