1*4882a593Smuzhiyun/* 2*4882a593Smuzhiyun * armboot - Startup Code for ARM720 CPU-core 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (c) 2001 Marius Gröger <mag@sysgo.de> 5*4882a593Smuzhiyun * Copyright (c) 2002 Alex Züpke <azu@sysgo.de> 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun#include <asm-offsets.h> 11*4882a593Smuzhiyun#include <config.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun/* 14*4882a593Smuzhiyun ************************************************************************* 15*4882a593Smuzhiyun * 16*4882a593Smuzhiyun * Startup Code (reset vector) 17*4882a593Smuzhiyun * 18*4882a593Smuzhiyun * do important init only if we don't start from RAM! 19*4882a593Smuzhiyun * relocate armboot to ram 20*4882a593Smuzhiyun * setup stack 21*4882a593Smuzhiyun * jump to second stage 22*4882a593Smuzhiyun * 23*4882a593Smuzhiyun ************************************************************************* 24*4882a593Smuzhiyun */ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun .globl reset 27*4882a593Smuzhiyun 28*4882a593Smuzhiyunreset: 29*4882a593Smuzhiyun /* 30*4882a593Smuzhiyun * set the cpu to SVC32 mode 31*4882a593Smuzhiyun */ 32*4882a593Smuzhiyun mrs r0,cpsr 33*4882a593Smuzhiyun bic r0,r0,#0x1f 34*4882a593Smuzhiyun orr r0,r0,#0xd3 35*4882a593Smuzhiyun msr cpsr,r0 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun /* 38*4882a593Smuzhiyun * we do sys-critical inits only at reboot, 39*4882a593Smuzhiyun * not when booting from ram! 40*4882a593Smuzhiyun */ 41*4882a593Smuzhiyun#if !defined(CONFIG_SKIP_LOWLEVEL_INIT) && \ 42*4882a593Smuzhiyun !defined(CONFIG_SKIP_LOWLEVEL_INIT_ONLY) 43*4882a593Smuzhiyun bl cpu_init_crit 44*4882a593Smuzhiyun#endif 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun bl _main 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun/*------------------------------------------------------------------------------*/ 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun .globl c_runtime_cpu_setup 51*4882a593Smuzhiyunc_runtime_cpu_setup: 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun mov pc, lr 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun/* 56*4882a593Smuzhiyun ************************************************************************* 57*4882a593Smuzhiyun * 58*4882a593Smuzhiyun * CPU_init_critical registers 59*4882a593Smuzhiyun * 60*4882a593Smuzhiyun * setup important registers 61*4882a593Smuzhiyun * setup memory timing 62*4882a593Smuzhiyun * 63*4882a593Smuzhiyun ************************************************************************* 64*4882a593Smuzhiyun */ 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun#if !defined(CONFIG_SKIP_LOWLEVEL_INIT) && \ 67*4882a593Smuzhiyun !defined(CONFIG_SKIP_LOWLEVEL_INIT_ONLY) 68*4882a593Smuzhiyuncpu_init_crit: 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun mov ip, lr 71*4882a593Smuzhiyun /* 72*4882a593Smuzhiyun * before relocating, we have to setup RAM timing 73*4882a593Smuzhiyun * because memory timing is board-dependent, you will 74*4882a593Smuzhiyun * find a lowlevel_init.S in your board directory. 75*4882a593Smuzhiyun */ 76*4882a593Smuzhiyun bl lowlevel_init 77*4882a593Smuzhiyun mov lr, ip 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun mov pc, lr 80*4882a593Smuzhiyun#endif /* CONFIG_SKIP_LOWLEVEL_INIT */ 81