1*4882a593Smuzhiyun/* 2*4882a593Smuzhiyun * armboot - Startup Code for OMAP3530/ARM Cortex CPU-core 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (c) 2004 Texas Instruments <r-woodruff2@ti.com> 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (c) 2001 Marius Gröger <mag@sysgo.de> 7*4882a593Smuzhiyun * Copyright (c) 2002 Alex Züpke <azu@sysgo.de> 8*4882a593Smuzhiyun * Copyright (c) 2002 Gary Jennejohn <garyj@denx.de> 9*4882a593Smuzhiyun * Copyright (c) 2003 Richard Woodruff <r-woodruff2@ti.com> 10*4882a593Smuzhiyun * Copyright (c) 2003 Kshitij <kshitij@ti.com> 11*4882a593Smuzhiyun * Copyright (c) 2006-2008 Syed Mohammed Khasim <x0khasim@ti.com> 12*4882a593Smuzhiyun * 13*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 14*4882a593Smuzhiyun */ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun#include <asm-offsets.h> 17*4882a593Smuzhiyun#include <config.h> 18*4882a593Smuzhiyun#include <asm/system.h> 19*4882a593Smuzhiyun#include <linux/linkage.h> 20*4882a593Smuzhiyun#include <asm/armv7.h> 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun/************************************************************************* 23*4882a593Smuzhiyun * 24*4882a593Smuzhiyun * Startup Code (reset vector) 25*4882a593Smuzhiyun * 26*4882a593Smuzhiyun * Do important init only if we don't start from memory! 27*4882a593Smuzhiyun * Setup memory and board specific bits prior to relocation. 28*4882a593Smuzhiyun * Relocate armboot to ram. Setup stack. 29*4882a593Smuzhiyun * 30*4882a593Smuzhiyun *************************************************************************/ 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun .globl reset 33*4882a593Smuzhiyun .globl save_boot_params_ret 34*4882a593Smuzhiyun .type save_boot_params_ret,%function 35*4882a593Smuzhiyun#ifdef CONFIG_ARMV7_LPAE 36*4882a593Smuzhiyun .global switch_to_hypervisor_ret 37*4882a593Smuzhiyun#endif 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun#if !CONFIG_IS_ENABLED(TINY_FRAMEWORK) 40*4882a593Smuzhiyun 41*4882a593Smuzhiyunreset: 42*4882a593Smuzhiyun /* Allow the board to save important registers */ 43*4882a593Smuzhiyun b save_boot_params 44*4882a593Smuzhiyunsave_boot_params_ret: 45*4882a593Smuzhiyun#ifdef CONFIG_ARMV7_LPAE 46*4882a593Smuzhiyun/* 47*4882a593Smuzhiyun * check for Hypervisor support 48*4882a593Smuzhiyun */ 49*4882a593Smuzhiyun mrc p15, 0, r0, c0, c1, 1 @ read ID_PFR1 50*4882a593Smuzhiyun and r0, r0, #CPUID_ARM_VIRT_MASK @ mask virtualization bits 51*4882a593Smuzhiyun cmp r0, #(1 << CPUID_ARM_VIRT_SHIFT) 52*4882a593Smuzhiyun beq switch_to_hypervisor 53*4882a593Smuzhiyunswitch_to_hypervisor_ret: 54*4882a593Smuzhiyun#endif 55*4882a593Smuzhiyun /* 56*4882a593Smuzhiyun * disable interrupts (FIQ and IRQ), also set the cpu to SVC32 mode, 57*4882a593Smuzhiyun * except if in HYP mode already 58*4882a593Smuzhiyun */ 59*4882a593Smuzhiyun mrs r0, cpsr 60*4882a593Smuzhiyun and r1, r0, #0x1f @ mask mode bits 61*4882a593Smuzhiyun teq r1, #0x1a @ test for HYP mode 62*4882a593Smuzhiyun bicne r0, r0, #0x1f @ clear all mode bits 63*4882a593Smuzhiyun orrne r0, r0, #0x13 @ set SVC mode 64*4882a593Smuzhiyun orr r0, r0, #0xc0 @ disable FIQ and IRQ 65*4882a593Smuzhiyun msr cpsr,r0 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /* Enable ACTLR.SMP bit */ 68*4882a593Smuzhiyun mrc p15, 0, r0, c1, c0, 1 69*4882a593Smuzhiyun orr r0, r0, #(1 << 6) @ Enable ACTLR.SMP bit 70*4882a593Smuzhiyun mcr p15, 0, r0, c1, c0, 1 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun/* 73*4882a593Smuzhiyun * Setup vector: 74*4882a593Smuzhiyun * (OMAP4 spl TEXT_BASE is not 32 byte aligned. 75*4882a593Smuzhiyun * Continue to use ROM code vector only in OMAP4 spl) 76*4882a593Smuzhiyun */ 77*4882a593Smuzhiyun#if !(defined(CONFIG_OMAP44XX) && defined(CONFIG_SPL_BUILD)) 78*4882a593Smuzhiyun /* Set V=0 in CP15 SCTLR register - for VBAR to point to vector */ 79*4882a593Smuzhiyun mrc p15, 0, r0, c1, c0, 0 @ Read CP15 SCTLR Register 80*4882a593Smuzhiyun bic r0, #CR_V @ V = 0 81*4882a593Smuzhiyun mcr p15, 0, r0, c1, c0, 0 @ Write CP15 SCTLR Register 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun /* Set vector address in CP15 VBAR register */ 84*4882a593Smuzhiyun ldr r0, =_start 85*4882a593Smuzhiyun mcr p15, 0, r0, c12, c0, 0 @Set VBAR 86*4882a593Smuzhiyun#endif 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /* Enable Asynchronous external abort after vectors setup */ 89*4882a593Smuzhiyun mrs r0, cpsr 90*4882a593Smuzhiyun bic r0, r0, #0x100 @ CPSR.A bit 91*4882a593Smuzhiyun msr cpsr_x,r0 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun /* the mask ROM code should have PLL and others stable */ 94*4882a593Smuzhiyun#ifndef CONFIG_SKIP_LOWLEVEL_INIT 95*4882a593Smuzhiyun bl cpu_init_cp15 96*4882a593Smuzhiyun#ifndef CONFIG_SKIP_LOWLEVEL_INIT_ONLY 97*4882a593Smuzhiyun bl cpu_init_crit 98*4882a593Smuzhiyun#endif 99*4882a593Smuzhiyun#endif 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun bl _main 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun/*------------------------------------------------------------------------------*/ 104*4882a593Smuzhiyun 105*4882a593SmuzhiyunENTRY(c_runtime_cpu_setup) 106*4882a593Smuzhiyun/* 107*4882a593Smuzhiyun * If I-cache is enabled invalidate it 108*4882a593Smuzhiyun */ 109*4882a593Smuzhiyun#ifndef CONFIG_SYS_ICACHE_OFF 110*4882a593Smuzhiyun mcr p15, 0, r0, c7, c5, 0 @ invalidate icache 111*4882a593Smuzhiyun mcr p15, 0, r0, c7, c10, 4 @ DSB 112*4882a593Smuzhiyun mcr p15, 0, r0, c7, c5, 4 @ ISB 113*4882a593Smuzhiyun#endif 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun bx lr 116*4882a593Smuzhiyun 117*4882a593SmuzhiyunENDPROC(c_runtime_cpu_setup) 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun#endif/* !CONFIG_IS_ENABLED(TINY_FRAMEWORK) */ 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun/************************************************************************* 122*4882a593Smuzhiyun * 123*4882a593Smuzhiyun * void save_boot_params(u32 r0, u32 r1, u32 r2, u32 r3) 124*4882a593Smuzhiyun * __attribute__((weak)); 125*4882a593Smuzhiyun * 126*4882a593Smuzhiyun * Stack pointer is not yet initialized at this moment 127*4882a593Smuzhiyun * Don't save anything to stack even if compiled with -O0 128*4882a593Smuzhiyun * 129*4882a593Smuzhiyun *************************************************************************/ 130*4882a593SmuzhiyunENTRY(save_boot_params) 131*4882a593Smuzhiyun b save_boot_params_ret @ back to my caller 132*4882a593SmuzhiyunENDPROC(save_boot_params) 133*4882a593Smuzhiyun .weak save_boot_params 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun#ifdef CONFIG_ARMV7_LPAE 136*4882a593SmuzhiyunENTRY(switch_to_hypervisor) 137*4882a593Smuzhiyun b switch_to_hypervisor_ret 138*4882a593SmuzhiyunENDPROC(switch_to_hypervisor) 139*4882a593Smuzhiyun .weak switch_to_hypervisor 140*4882a593Smuzhiyun#endif 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun/************************************************************************* 143*4882a593Smuzhiyun * 144*4882a593Smuzhiyun * cpu_init_cp15 145*4882a593Smuzhiyun * 146*4882a593Smuzhiyun * Setup CP15 registers (cache, MMU, TLBs). The I-cache is turned on unless 147*4882a593Smuzhiyun * CONFIG_SYS_ICACHE_OFF is defined. 148*4882a593Smuzhiyun * 149*4882a593Smuzhiyun *************************************************************************/ 150*4882a593SmuzhiyunENTRY(cpu_init_cp15) 151*4882a593Smuzhiyun /* 152*4882a593Smuzhiyun * Invalidate L1 I/D 153*4882a593Smuzhiyun */ 154*4882a593Smuzhiyun mov r0, #0 @ set up for MCR 155*4882a593Smuzhiyun mcr p15, 0, r0, c8, c7, 0 @ invalidate TLBs 156*4882a593Smuzhiyun mcr p15, 0, r0, c7, c5, 0 @ invalidate icache 157*4882a593Smuzhiyun mcr p15, 0, r0, c7, c5, 6 @ invalidate BP array 158*4882a593Smuzhiyun mcr p15, 0, r0, c7, c10, 4 @ DSB 159*4882a593Smuzhiyun mcr p15, 0, r0, c7, c5, 4 @ ISB 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun /* 162*4882a593Smuzhiyun * disable MMU stuff and caches 163*4882a593Smuzhiyun */ 164*4882a593Smuzhiyun mrc p15, 0, r0, c1, c0, 0 165*4882a593Smuzhiyun bic r0, r0, #0x00002000 @ clear bits 13 (--V-) 166*4882a593Smuzhiyun bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM) 167*4882a593Smuzhiyun#if 0 /* There is unalign access when decompress firmware. */ 168*4882a593Smuzhiyun orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align 169*4882a593Smuzhiyun#endif 170*4882a593Smuzhiyun orr r0, r0, #0x00000800 @ set bit 11 (Z---) BTB 171*4882a593Smuzhiyun#ifdef CONFIG_SYS_ICACHE_OFF 172*4882a593Smuzhiyun bic r0, r0, #0x00001000 @ clear bit 12 (I) I-cache 173*4882a593Smuzhiyun#else 174*4882a593Smuzhiyun orr r0, r0, #0x00001000 @ set bit 12 (I) I-cache 175*4882a593Smuzhiyun#endif 176*4882a593Smuzhiyun mcr p15, 0, r0, c1, c0, 0 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_716044 179*4882a593Smuzhiyun mrc p15, 0, r0, c1, c0, 0 @ read system control register 180*4882a593Smuzhiyun orr r0, r0, #1 << 11 @ set bit #11 181*4882a593Smuzhiyun mcr p15, 0, r0, c1, c0, 0 @ write system control register 182*4882a593Smuzhiyun#endif 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun#if (defined(CONFIG_ARM_ERRATA_742230) || defined(CONFIG_ARM_ERRATA_794072)) 185*4882a593Smuzhiyun mrc p15, 0, r0, c15, c0, 1 @ read diagnostic register 186*4882a593Smuzhiyun orr r0, r0, #1 << 4 @ set bit #4 187*4882a593Smuzhiyun mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register 188*4882a593Smuzhiyun#endif 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_743622 191*4882a593Smuzhiyun mrc p15, 0, r0, c15, c0, 1 @ read diagnostic register 192*4882a593Smuzhiyun orr r0, r0, #1 << 6 @ set bit #6 193*4882a593Smuzhiyun mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register 194*4882a593Smuzhiyun#endif 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_751472 197*4882a593Smuzhiyun mrc p15, 0, r0, c15, c0, 1 @ read diagnostic register 198*4882a593Smuzhiyun orr r0, r0, #1 << 11 @ set bit #11 199*4882a593Smuzhiyun mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register 200*4882a593Smuzhiyun#endif 201*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_761320 202*4882a593Smuzhiyun mrc p15, 0, r0, c15, c0, 1 @ read diagnostic register 203*4882a593Smuzhiyun orr r0, r0, #1 << 21 @ set bit #21 204*4882a593Smuzhiyun mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register 205*4882a593Smuzhiyun#endif 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_845369 208*4882a593Smuzhiyun mrc p15, 0, r0, c15, c0, 1 @ read diagnostic register 209*4882a593Smuzhiyun orr r0, r0, #1 << 22 @ set bit #22 210*4882a593Smuzhiyun mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register 211*4882a593Smuzhiyun#endif 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun mov r5, lr @ Store my Caller 214*4882a593Smuzhiyun mrc p15, 0, r1, c0, c0, 0 @ r1 has Read Main ID Register (MIDR) 215*4882a593Smuzhiyun mov r3, r1, lsr #20 @ get variant field 216*4882a593Smuzhiyun and r3, r3, #0xf @ r3 has CPU variant 217*4882a593Smuzhiyun and r4, r1, #0xf @ r4 has CPU revision 218*4882a593Smuzhiyun mov r2, r3, lsl #4 @ shift variant field for combined value 219*4882a593Smuzhiyun orr r2, r4, r2 @ r2 has combined CPU variant + revision 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_798870 222*4882a593Smuzhiyun cmp r2, #0x30 @ Applies to lower than R3p0 223*4882a593Smuzhiyun bge skip_errata_798870 @ skip if not affected rev 224*4882a593Smuzhiyun cmp r2, #0x20 @ Applies to including and above R2p0 225*4882a593Smuzhiyun blt skip_errata_798870 @ skip if not affected rev 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun mrc p15, 1, r0, c15, c0, 0 @ read l2 aux ctrl reg 228*4882a593Smuzhiyun orr r0, r0, #1 << 7 @ Enable hazard-detect timeout 229*4882a593Smuzhiyun push {r1-r5} @ Save the cpu info registers 230*4882a593Smuzhiyun bl v7_arch_cp15_set_l2aux_ctrl 231*4882a593Smuzhiyun isb @ Recommended ISB after l2actlr update 232*4882a593Smuzhiyun pop {r1-r5} @ Restore the cpu info - fall through 233*4882a593Smuzhiyunskip_errata_798870: 234*4882a593Smuzhiyun#endif 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_801819 237*4882a593Smuzhiyun cmp r2, #0x24 @ Applies to lt including R2p4 238*4882a593Smuzhiyun bgt skip_errata_801819 @ skip if not affected rev 239*4882a593Smuzhiyun cmp r2, #0x20 @ Applies to including and above R2p0 240*4882a593Smuzhiyun blt skip_errata_801819 @ skip if not affected rev 241*4882a593Smuzhiyun mrc p15, 0, r0, c0, c0, 6 @ pick up REVIDR reg 242*4882a593Smuzhiyun and r0, r0, #1 << 3 @ check REVIDR[3] 243*4882a593Smuzhiyun cmp r0, #1 << 3 244*4882a593Smuzhiyun beq skip_errata_801819 @ skip erratum if REVIDR[3] is set 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun mrc p15, 0, r0, c1, c0, 1 @ read auxilary control register 247*4882a593Smuzhiyun orr r0, r0, #3 << 27 @ Disables streaming. All write-allocate 248*4882a593Smuzhiyun @ lines allocate in the L1 or L2 cache. 249*4882a593Smuzhiyun orr r0, r0, #3 << 25 @ Disables streaming. All write-allocate 250*4882a593Smuzhiyun @ lines allocate in the L1 cache. 251*4882a593Smuzhiyun push {r1-r5} @ Save the cpu info registers 252*4882a593Smuzhiyun bl v7_arch_cp15_set_acr 253*4882a593Smuzhiyun pop {r1-r5} @ Restore the cpu info - fall through 254*4882a593Smuzhiyunskip_errata_801819: 255*4882a593Smuzhiyun#endif 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_454179 258*4882a593Smuzhiyun cmp r2, #0x21 @ Only on < r2p1 259*4882a593Smuzhiyun bge skip_errata_454179 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun mrc p15, 0, r0, c1, c0, 1 @ Read ACR 262*4882a593Smuzhiyun orr r0, r0, #(0x3 << 6) @ Set DBSM(BIT7) and IBE(BIT6) bits 263*4882a593Smuzhiyun push {r1-r5} @ Save the cpu info registers 264*4882a593Smuzhiyun bl v7_arch_cp15_set_acr 265*4882a593Smuzhiyun pop {r1-r5} @ Restore the cpu info - fall through 266*4882a593Smuzhiyun 267*4882a593Smuzhiyunskip_errata_454179: 268*4882a593Smuzhiyun#endif 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_430973 271*4882a593Smuzhiyun cmp r2, #0x21 @ Only on < r2p1 272*4882a593Smuzhiyun bge skip_errata_430973 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun mrc p15, 0, r0, c1, c0, 1 @ Read ACR 275*4882a593Smuzhiyun orr r0, r0, #(0x1 << 6) @ Set IBE bit 276*4882a593Smuzhiyun push {r1-r5} @ Save the cpu info registers 277*4882a593Smuzhiyun bl v7_arch_cp15_set_acr 278*4882a593Smuzhiyun pop {r1-r5} @ Restore the cpu info - fall through 279*4882a593Smuzhiyun 280*4882a593Smuzhiyunskip_errata_430973: 281*4882a593Smuzhiyun#endif 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_621766 284*4882a593Smuzhiyun cmp r2, #0x21 @ Only on < r2p1 285*4882a593Smuzhiyun bge skip_errata_621766 286*4882a593Smuzhiyun 287*4882a593Smuzhiyun mrc p15, 0, r0, c1, c0, 1 @ Read ACR 288*4882a593Smuzhiyun orr r0, r0, #(0x1 << 5) @ Set L1NEON bit 289*4882a593Smuzhiyun push {r1-r5} @ Save the cpu info registers 290*4882a593Smuzhiyun bl v7_arch_cp15_set_acr 291*4882a593Smuzhiyun pop {r1-r5} @ Restore the cpu info - fall through 292*4882a593Smuzhiyun 293*4882a593Smuzhiyunskip_errata_621766: 294*4882a593Smuzhiyun#endif 295*4882a593Smuzhiyun 296*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_725233 297*4882a593Smuzhiyun cmp r2, #0x21 @ Only on < r2p1 (Cortex A8) 298*4882a593Smuzhiyun bge skip_errata_725233 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun mrc p15, 1, r0, c9, c0, 2 @ Read L2ACR 301*4882a593Smuzhiyun orr r0, r0, #(0x1 << 27) @ L2 PLD data forwarding disable 302*4882a593Smuzhiyun push {r1-r5} @ Save the cpu info registers 303*4882a593Smuzhiyun bl v7_arch_cp15_set_l2aux_ctrl 304*4882a593Smuzhiyun pop {r1-r5} @ Restore the cpu info - fall through 305*4882a593Smuzhiyun 306*4882a593Smuzhiyunskip_errata_725233: 307*4882a593Smuzhiyun#endif 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_852421 310*4882a593Smuzhiyun mrc p15, 0, r0, c15, c0, 1 @ read diagnostic register 311*4882a593Smuzhiyun orr r0, r0, #1 << 24 @ set bit #24 312*4882a593Smuzhiyun mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register 313*4882a593Smuzhiyun#endif 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_852423 316*4882a593Smuzhiyun mrc p15, 0, r0, c15, c0, 1 @ read diagnostic register 317*4882a593Smuzhiyun orr r0, r0, #1 << 12 @ set bit #12 318*4882a593Smuzhiyun mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register 319*4882a593Smuzhiyun#endif 320*4882a593Smuzhiyun 321*4882a593Smuzhiyun#if defined(CONFIG_ARM_ZERO_CNTVOFF) && defined(CONFIG_SPL_BUILD) 322*4882a593Smuzhiyun /* 323*4882a593Smuzhiyun * CNTVOFF usage constraints: 324*4882a593Smuzhiyun * Only accessible from Hyp mode, or from Monitor mode when SCR.NS is 325*4882a593Smuzhiyun * set to 1. 326*4882a593Smuzhiyun */ 327*4882a593Smuzhiyun /* switch to MON */ 328*4882a593Smuzhiyun cps #22 329*4882a593Smuzhiyun isb 330*4882a593Smuzhiyun 331*4882a593Smuzhiyun /* Update SCR.NS to non Secure mode */ 332*4882a593Smuzhiyun mrc p15, 0, r0, c1, c1, 0 333*4882a593Smuzhiyun orr r0, r0, #(1 << 0) 334*4882a593Smuzhiyun mcr p15, 0, r0, c1, c1, 0 335*4882a593Smuzhiyun isb 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun /* set vtimer virtual offset 0 */ 338*4882a593Smuzhiyun mov r0, #0 339*4882a593Smuzhiyun mcrr p15, 4, r0, r0, c14 @ CNTVOFF 340*4882a593Smuzhiyun 341*4882a593Smuzhiyun /* Update SCR.NS to Secure mode */ 342*4882a593Smuzhiyun mrc p15, 0, r0, c1, c1, 0 343*4882a593Smuzhiyun bic r0, r0, #(1 << 0) 344*4882a593Smuzhiyun mcr p15, 0, r0, c1, c1, 0 345*4882a593Smuzhiyun isb 346*4882a593Smuzhiyun 347*4882a593Smuzhiyun /* switch back to SVC */ 348*4882a593Smuzhiyun cps #19 349*4882a593Smuzhiyun isb 350*4882a593Smuzhiyun#endif 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun mov pc, r5 @ back to my caller 353*4882a593SmuzhiyunENDPROC(cpu_init_cp15) 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun#if !defined(CONFIG_SKIP_LOWLEVEL_INIT) && \ 356*4882a593Smuzhiyun !defined(CONFIG_SKIP_LOWLEVEL_INIT_ONLY) 357*4882a593Smuzhiyun/************************************************************************* 358*4882a593Smuzhiyun * 359*4882a593Smuzhiyun * CPU_init_critical registers 360*4882a593Smuzhiyun * 361*4882a593Smuzhiyun * setup important registers 362*4882a593Smuzhiyun * setup memory timing 363*4882a593Smuzhiyun * 364*4882a593Smuzhiyun *************************************************************************/ 365*4882a593SmuzhiyunENTRY(cpu_init_crit) 366*4882a593Smuzhiyun /* 367*4882a593Smuzhiyun * Jump to board specific initialization... 368*4882a593Smuzhiyun * The Mask ROM will have already initialized 369*4882a593Smuzhiyun * basic memory. Go here to bump up clock rate and handle 370*4882a593Smuzhiyun * wake up conditions. 371*4882a593Smuzhiyun */ 372*4882a593Smuzhiyun b lowlevel_init @ go setup pll,mux,memory 373*4882a593SmuzhiyunENDPROC(cpu_init_crit) 374*4882a593Smuzhiyun#endif 375