blob: a602d4e693745e3f1a631010cf87b35babdfe862 [file] [log] [blame]
Guennadi Liakhovetski9b077732008-08-31 00:39:46 +02001/*
Cyril Chemparathy678e0082010-06-07 14:13:27 -04002 * armboot - Startup Code for ARM1176 CPU-core
Guennadi Liakhovetski9b077732008-08-31 00:39:46 +02003 *
4 * Copyright (c) 2007 Samsung Electronics
5 *
6 * Copyright (C) 2008
7 * Guennadi Liakhovetki, DENX Software Engineering, <lg@denx.de>
8 *
Wolfgang Denk1a459662013-07-08 09:37:19 +02009 * SPDX-License-Identifier: GPL-2.0+
Guennadi Liakhovetski9b077732008-08-31 00:39:46 +020010 *
11 * 2007-09-21 - Restructured codes by jsgood (jsgood.yang@samsung.com)
12 * 2007-09-21 - Added MoviNAND and OneNAND boot codes by
13 * jsgood (jsgood.yang@samsung.com)
14 * Base codes by scsuh (sc.suh)
15 */
16
Wolfgang Denk25ddd1f2010-10-26 14:34:52 +020017#include <asm-offsets.h>
Guennadi Liakhovetski9b077732008-08-31 00:39:46 +020018#include <config.h>
Guennadi Liakhovetski9b077732008-08-31 00:39:46 +020019
Benoît Thébaudeau9ce8e232013-04-11 09:36:02 +000020#ifndef CONFIG_SYS_PHY_UBOOT_BASE
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020021#define CONFIG_SYS_PHY_UBOOT_BASE CONFIG_SYS_UBOOT_BASE
Guennadi Liakhovetski9b077732008-08-31 00:39:46 +020022#endif
23
24/*
25 *************************************************************************
26 *
Guennadi Liakhovetski9b077732008-08-31 00:39:46 +020027 * Startup Code (reset vector)
28 *
29 * do important init only if we don't start from memory!
30 * setup Memory and board specific bits prior to relocation.
31 * relocate armboot to ram
32 * setup stack
33 *
34 *************************************************************************
35 */
36
Albert ARIBAUD41623c92014-04-15 16:13:51 +020037 .globl reset
Heiko Schochera51dd672010-09-17 13:10:53 +020038
39reset:
40 /*
41 * set the cpu to SVC32 mode
42 */
43 mrs r0, cpsr
44 bic r0, r0, #0x3f
45 orr r0, r0, #0xd3
46 msr cpsr, r0
47
48/*
49 *************************************************************************
50 *
51 * CPU_init_critical registers
52 *
53 * setup important registers
54 * setup memory timing
55 *
56 *************************************************************************
57 */
58 /*
59 * we do sys-critical inits only at reboot,
60 * not when booting from ram!
61 */
62cpu_init_crit:
63 /*
64 * When booting from NAND - it has definitely been a reset, so, no need
65 * to flush caches and disable the MMU
66 */
Benoît Thébaudeau66f30bf2013-04-11 09:36:01 +000067#ifndef CONFIG_SPL_BUILD
Heiko Schochera51dd672010-09-17 13:10:53 +020068 /*
69 * flush v4 I/D caches
70 */
71 mov r0, #0
72 mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */
73 mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */
74
75 /*
76 * disable MMU stuff and caches
77 */
78 mrc p15, 0, r0, c1, c0, 0
79 bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)
80 bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
Yuichiro Gotoba10b852016-02-25 10:23:34 +090081 orr r0, r0, #0x00000002 @ set bit 1 (A) Align
Heiko Schochera51dd672010-09-17 13:10:53 +020082 orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
83
84 /* Prepare to disable the MMU */
85 adr r2, mmu_disable_phys
Wolfgang Denk14d0a022010-10-07 21:51:12 +020086 sub r2, r2, #(CONFIG_SYS_PHY_UBOOT_BASE - CONFIG_SYS_TEXT_BASE)
Heiko Schochera51dd672010-09-17 13:10:53 +020087 b mmu_disable
88
89 .align 5
90 /* Run in a single cache-line */
91mmu_disable:
92 mcr p15, 0, r0, c1, c0, 0
93 nop
94 nop
95 mov pc, r2
96mmu_disable_phys:
97
Heiko Schochera51dd672010-09-17 13:10:53 +020098#endif
99
100 /*
101 * Go setup Memory and board specific bits prior to relocation.
102 */
103 bl lowlevel_init /* go setup pll,mux,memory */
104
Albert ARIBAUDe05e5de2013-01-08 10:18:02 +0000105 bl _main
Heiko Schochera51dd672010-09-17 13:10:53 +0200106
107/*------------------------------------------------------------------------------*/
108
Albert ARIBAUDe05e5de2013-01-08 10:18:02 +0000109 .globl c_runtime_cpu_setup
110c_runtime_cpu_setup:
111
112 mov pc, lr