184ad6884SPeter Tyser/* 284ad6884SPeter Tyser * armboot - Startup Code for ARM920 CPU-core 384ad6884SPeter Tyser * 4fa82f871SAlbert ARIBAUD * Copyright (c) 2001 Marius Gröger <mag@sysgo.de> 5fa82f871SAlbert ARIBAUD * Copyright (c) 2002 Alex Züpke <azu@sysgo.de> 684ad6884SPeter Tyser * Copyright (c) 2002 Gary Jennejohn <garyj@denx.de> 784ad6884SPeter Tyser * 81a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 984ad6884SPeter Tyser */ 1084ad6884SPeter Tyser 1125ddd1fbSWolfgang Denk#include <asm-offsets.h> 1284ad6884SPeter Tyser#include <common.h> 1384ad6884SPeter Tyser#include <config.h> 1484ad6884SPeter Tyser 1584ad6884SPeter Tyser/* 1684ad6884SPeter Tyser ************************************************************************* 1784ad6884SPeter Tyser * 1884ad6884SPeter Tyser * Startup Code (called from the ARM reset exception vector) 1984ad6884SPeter Tyser * 2084ad6884SPeter Tyser * do important init only if we don't start from memory! 2184ad6884SPeter Tyser * relocate armboot to ram 2284ad6884SPeter Tyser * setup stack 2384ad6884SPeter Tyser * jump to second stage 2484ad6884SPeter Tyser * 2584ad6884SPeter Tyser ************************************************************************* 2684ad6884SPeter Tyser */ 2784ad6884SPeter Tyser 2841623c91SAlbert ARIBAUD .globl reset 2984ad6884SPeter Tyser 3041623c91SAlbert ARIBAUDreset: 31cc7cdcbdSHeiko Schocher /* 32cc7cdcbdSHeiko Schocher * set the cpu to SVC32 mode 33cc7cdcbdSHeiko Schocher */ 34cc7cdcbdSHeiko Schocher mrs r0, cpsr 35cc7cdcbdSHeiko Schocher bic r0, r0, #0x1f 36cc7cdcbdSHeiko Schocher orr r0, r0, #0xd3 37cc7cdcbdSHeiko Schocher msr cpsr, r0 38cc7cdcbdSHeiko Schocher 39cc7cdcbdSHeiko Schocher#if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK) 40cc7cdcbdSHeiko Schocher /* 41cc7cdcbdSHeiko Schocher * relocate exception table 42cc7cdcbdSHeiko Schocher */ 43cc7cdcbdSHeiko Schocher ldr r0, =_start 44cc7cdcbdSHeiko Schocher ldr r1, =0x0 45cc7cdcbdSHeiko Schocher mov r2, #16 46cc7cdcbdSHeiko Schochercopyex: 47cc7cdcbdSHeiko Schocher subs r2, r2, #1 48cc7cdcbdSHeiko Schocher ldr r3, [r0], #4 49cc7cdcbdSHeiko Schocher str r3, [r1], #4 50cc7cdcbdSHeiko Schocher bne copyex 51cc7cdcbdSHeiko Schocher#endif 52cc7cdcbdSHeiko Schocher 53cc7cdcbdSHeiko Schocher /* 54cc7cdcbdSHeiko Schocher * we do sys-critical inits only at reboot, 55cc7cdcbdSHeiko Schocher * not when booting from ram! 56cc7cdcbdSHeiko Schocher */ 57cc7cdcbdSHeiko Schocher#ifndef CONFIG_SKIP_LOWLEVEL_INIT 58cc7cdcbdSHeiko Schocher bl cpu_init_crit 59cc7cdcbdSHeiko Schocher#endif 60cc7cdcbdSHeiko Schocher 61e05e5de7SAlbert ARIBAUD bl _main 62cc7cdcbdSHeiko Schocher 63cc7cdcbdSHeiko Schocher/*------------------------------------------------------------------------------*/ 64cc7cdcbdSHeiko Schocher 65e05e5de7SAlbert ARIBAUD .globl c_runtime_cpu_setup 66e05e5de7SAlbert ARIBAUDc_runtime_cpu_setup: 67e05e5de7SAlbert ARIBAUD 68e05e5de7SAlbert ARIBAUD mov pc, lr 69e05e5de7SAlbert ARIBAUD 7084ad6884SPeter Tyser/* 7184ad6884SPeter Tyser ************************************************************************* 7284ad6884SPeter Tyser * 7384ad6884SPeter Tyser * CPU_init_critical registers 7484ad6884SPeter Tyser * 7584ad6884SPeter Tyser * setup important registers 7684ad6884SPeter Tyser * setup memory timing 7784ad6884SPeter Tyser * 7884ad6884SPeter Tyser ************************************************************************* 7984ad6884SPeter Tyser */ 8084ad6884SPeter Tyser 8184ad6884SPeter Tyser 8284ad6884SPeter Tyser#ifndef CONFIG_SKIP_LOWLEVEL_INIT 8384ad6884SPeter Tysercpu_init_crit: 8484ad6884SPeter Tyser /* 8584ad6884SPeter Tyser * flush v4 I/D caches 8684ad6884SPeter Tyser */ 8784ad6884SPeter Tyser mov r0, #0 8884ad6884SPeter Tyser mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */ 8984ad6884SPeter Tyser mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */ 9084ad6884SPeter Tyser 9184ad6884SPeter Tyser /* 9284ad6884SPeter Tyser * disable MMU stuff and caches 9384ad6884SPeter Tyser */ 9484ad6884SPeter Tyser mrc p15, 0, r0, c1, c0, 0 9584ad6884SPeter Tyser bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS) 9684ad6884SPeter Tyser bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM) 97ba10b852SYuichiro Goto orr r0, r0, #0x00000002 @ set bit 1 (A) Align 9884ad6884SPeter Tyser orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache 9984ad6884SPeter Tyser mcr p15, 0, r0, c1, c0, 0 10084ad6884SPeter Tyser 101*b5bd0982SSimon Glass#ifndef CONFIG_SKIP_LOWLEVEL_INIT_ONLY 10284ad6884SPeter Tyser /* 10384ad6884SPeter Tyser * before relocating, we have to setup RAM timing 10484ad6884SPeter Tyser * because memory timing is board-dependend, you will 10584ad6884SPeter Tyser * find a lowlevel_init.S in your board directory. 10684ad6884SPeter Tyser */ 10784ad6884SPeter Tyser mov ip, lr 10884ad6884SPeter Tyser 10984ad6884SPeter Tyser bl lowlevel_init 11084ad6884SPeter Tyser mov lr, ip 111*b5bd0982SSimon Glass#endif 11284ad6884SPeter Tyser mov pc, lr 11384ad6884SPeter Tyser#endif /* CONFIG_SKIP_LOWLEVEL_INIT */ 114