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> 18a8c68639SAneesh V#include <asm/system.h> 1974236acaSAneesh V#include <linux/linkage.h> 20d31d4a2dSKeerthy#include <asm/armv7.h> 21f56348afSSteve Sakoman 22f56348afSSteve Sakoman/************************************************************************* 23f56348afSSteve Sakoman * 24f56348afSSteve Sakoman * Startup Code (reset vector) 25f56348afSSteve Sakoman * 26003b09daSPavel Machek * Do important init only if we don't start from memory! 27003b09daSPavel Machek * Setup memory and board specific bits prior to relocation. 28003b09daSPavel Machek * Relocate armboot to ram. Setup stack. 29f56348afSSteve Sakoman * 30f56348afSSteve Sakoman *************************************************************************/ 31f56348afSSteve Sakoman 3241623c91SAlbert ARIBAUD .globl reset 33e11c6c27SSimon Glass .globl save_boot_params_ret 34d31d4a2dSKeerthy#ifdef CONFIG_ARMV7_LPAE 35d31d4a2dSKeerthy .global switch_to_hypervisor_ret 36d31d4a2dSKeerthy#endif 37561142afSHeiko Schocher 38561142afSHeiko Schocherreset: 39e11c6c27SSimon Glass /* Allow the board to save important registers */ 40e11c6c27SSimon Glass b save_boot_params 41e11c6c27SSimon Glasssave_boot_params_ret: 42d31d4a2dSKeerthy#ifdef CONFIG_ARMV7_LPAE 43d31d4a2dSKeerthy/* 44d31d4a2dSKeerthy * check for Hypervisor support 45d31d4a2dSKeerthy */ 46d31d4a2dSKeerthy mrc p15, 0, r0, c0, c1, 1 @ read ID_PFR1 47d31d4a2dSKeerthy and r0, r0, #CPUID_ARM_VIRT_MASK @ mask virtualization bits 48d31d4a2dSKeerthy cmp r0, #(1 << CPUID_ARM_VIRT_SHIFT) 49d31d4a2dSKeerthy beq switch_to_hypervisor 50d31d4a2dSKeerthyswitch_to_hypervisor_ret: 51d31d4a2dSKeerthy#endif 52561142afSHeiko Schocher /* 53c4a4e2e2SAndre Przywara * disable interrupts (FIQ and IRQ), also set the cpu to SVC32 mode, 54c4a4e2e2SAndre Przywara * except if in HYP mode already 55561142afSHeiko Schocher */ 56561142afSHeiko Schocher mrs r0, cpsr 57c4a4e2e2SAndre Przywara and r1, r0, #0x1f @ mask mode bits 58c4a4e2e2SAndre Przywara teq r1, #0x1a @ test for HYP mode 59c4a4e2e2SAndre Przywara bicne r0, r0, #0x1f @ clear all mode bits 60c4a4e2e2SAndre Przywara orrne r0, r0, #0x13 @ set SVC mode 61c4a4e2e2SAndre Przywara orr r0, r0, #0xc0 @ disable FIQ and IRQ 62561142afSHeiko Schocher msr cpsr,r0 63561142afSHeiko Schocher 64a8c68639SAneesh V/* 65a8c68639SAneesh V * Setup vector: 66a8c68639SAneesh V * (OMAP4 spl TEXT_BASE is not 32 byte aligned. 67a8c68639SAneesh V * Continue to use ROM code vector only in OMAP4 spl) 68a8c68639SAneesh V */ 69840fe95cSSiarhei Siamashka#if !(defined(CONFIG_OMAP44XX) && defined(CONFIG_SPL_BUILD)) 700f274f53SPeng Fan /* Set V=0 in CP15 SCTLR register - for VBAR to point to vector */ 710f274f53SPeng Fan mrc p15, 0, r0, c1, c0, 0 @ Read CP15 SCTLR Register 72a8c68639SAneesh V bic r0, #CR_V @ V = 0 730f274f53SPeng Fan mcr p15, 0, r0, c1, c0, 0 @ Write CP15 SCTLR Register 74a8c68639SAneesh V 75a8c68639SAneesh V /* Set vector address in CP15 VBAR register */ 76a8c68639SAneesh V ldr r0, =_start 77a8c68639SAneesh V mcr p15, 0, r0, c12, c0, 0 @Set VBAR 78a8c68639SAneesh V#endif 79a8c68639SAneesh V 80561142afSHeiko Schocher /* the mask ROM code should have PLL and others stable */ 81561142afSHeiko Schocher#ifndef CONFIG_SKIP_LOWLEVEL_INIT 8280433c9aSSimon Glass bl cpu_init_cp15 83b5bd0982SSimon Glass#ifndef CONFIG_SKIP_LOWLEVEL_INIT_ONLY 84561142afSHeiko Schocher bl cpu_init_crit 85561142afSHeiko Schocher#endif 86b5bd0982SSimon Glass#endif 87561142afSHeiko Schocher 88e05e5de7SAlbert ARIBAUD bl _main 89561142afSHeiko Schocher 90561142afSHeiko Schocher/*------------------------------------------------------------------------------*/ 91561142afSHeiko Schocher 92e05e5de7SAlbert ARIBAUDENTRY(c_runtime_cpu_setup) 93c2dd0d45SAneesh V/* 94c2dd0d45SAneesh V * If I-cache is enabled invalidate it 95c2dd0d45SAneesh V */ 96c2dd0d45SAneesh V#ifndef CONFIG_SYS_ICACHE_OFF 97c2dd0d45SAneesh V mcr p15, 0, r0, c7, c5, 0 @ invalidate icache 98c2dd0d45SAneesh V mcr p15, 0, r0, c7, c10, 4 @ DSB 99c2dd0d45SAneesh V mcr p15, 0, r0, c7, c5, 4 @ ISB 100c2dd0d45SAneesh V#endif 101f8b9d1d3STetsuyuki Kobayashi 102e05e5de7SAlbert ARIBAUD bx lr 103561142afSHeiko Schocher 104e05e5de7SAlbert ARIBAUDENDPROC(c_runtime_cpu_setup) 105c3d3a541SHeiko Schocher 106f56348afSSteve Sakoman/************************************************************************* 107f56348afSSteve Sakoman * 1086f0dba85STetsuyuki Kobayashi * void save_boot_params(u32 r0, u32 r1, u32 r2, u32 r3) 1096f0dba85STetsuyuki Kobayashi * __attribute__((weak)); 1106f0dba85STetsuyuki Kobayashi * 1116f0dba85STetsuyuki Kobayashi * Stack pointer is not yet initialized at this moment 1126f0dba85STetsuyuki Kobayashi * Don't save anything to stack even if compiled with -O0 1136f0dba85STetsuyuki Kobayashi * 1146f0dba85STetsuyuki Kobayashi *************************************************************************/ 1156f0dba85STetsuyuki KobayashiENTRY(save_boot_params) 116e11c6c27SSimon Glass b save_boot_params_ret @ back to my caller 1176f0dba85STetsuyuki KobayashiENDPROC(save_boot_params) 1186f0dba85STetsuyuki Kobayashi .weak save_boot_params 1196f0dba85STetsuyuki Kobayashi 120d31d4a2dSKeerthy#ifdef CONFIG_ARMV7_LPAE 121d31d4a2dSKeerthyENTRY(switch_to_hypervisor) 122d31d4a2dSKeerthy b switch_to_hypervisor_ret 123d31d4a2dSKeerthyENDPROC(switch_to_hypervisor) 124d31d4a2dSKeerthy .weak switch_to_hypervisor 125d31d4a2dSKeerthy#endif 126d31d4a2dSKeerthy 1276f0dba85STetsuyuki Kobayashi/************************************************************************* 1286f0dba85STetsuyuki Kobayashi * 12980433c9aSSimon Glass * cpu_init_cp15 130f56348afSSteve Sakoman * 13180433c9aSSimon Glass * Setup CP15 registers (cache, MMU, TLBs). The I-cache is turned on unless 13280433c9aSSimon Glass * CONFIG_SYS_ICACHE_OFF is defined. 133f56348afSSteve Sakoman * 134f56348afSSteve Sakoman *************************************************************************/ 13574236acaSAneesh VENTRY(cpu_init_cp15) 136f56348afSSteve Sakoman /* 137f56348afSSteve Sakoman * Invalidate L1 I/D 138f56348afSSteve Sakoman */ 139f56348afSSteve Sakoman mov r0, #0 @ set up for MCR 140f56348afSSteve Sakoman mcr p15, 0, r0, c8, c7, 0 @ invalidate TLBs 141f56348afSSteve Sakoman mcr p15, 0, r0, c7, c5, 0 @ invalidate icache 142c2dd0d45SAneesh V mcr p15, 0, r0, c7, c5, 6 @ invalidate BP array 143c2dd0d45SAneesh V mcr p15, 0, r0, c7, c10, 4 @ DSB 144c2dd0d45SAneesh V mcr p15, 0, r0, c7, c5, 4 @ ISB 145f56348afSSteve Sakoman 146f56348afSSteve Sakoman /* 147f56348afSSteve Sakoman * disable MMU stuff and caches 148f56348afSSteve Sakoman */ 149f56348afSSteve Sakoman mrc p15, 0, r0, c1, c0, 0 150f56348afSSteve Sakoman bic r0, r0, #0x00002000 @ clear bits 13 (--V-) 151f56348afSSteve Sakoman bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM) 152f56348afSSteve Sakoman orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align 153c2dd0d45SAneesh V orr r0, r0, #0x00000800 @ set bit 11 (Z---) BTB 154c2dd0d45SAneesh V#ifdef CONFIG_SYS_ICACHE_OFF 155c2dd0d45SAneesh V bic r0, r0, #0x00001000 @ clear bit 12 (I) I-cache 156c2dd0d45SAneesh V#else 157c2dd0d45SAneesh V orr r0, r0, #0x00001000 @ set bit 12 (I) I-cache 158c2dd0d45SAneesh V#endif 159f56348afSSteve Sakoman mcr p15, 0, r0, c1, c0, 0 1600678587fSStephen Warren 161c5d4752cSStephen Warren#ifdef CONFIG_ARM_ERRATA_716044 162c5d4752cSStephen Warren mrc p15, 0, r0, c1, c0, 0 @ read system control register 163c5d4752cSStephen Warren orr r0, r0, #1 << 11 @ set bit #11 164c5d4752cSStephen Warren mcr p15, 0, r0, c1, c0, 0 @ write system control register 165c5d4752cSStephen Warren#endif 166c5d4752cSStephen Warren 167f71cbfe3SNitin Garg#if (defined(CONFIG_ARM_ERRATA_742230) || defined(CONFIG_ARM_ERRATA_794072)) 1680678587fSStephen Warren mrc p15, 0, r0, c15, c0, 1 @ read diagnostic register 1690678587fSStephen Warren orr r0, r0, #1 << 4 @ set bit #4 1700678587fSStephen Warren mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register 1710678587fSStephen Warren#endif 1720678587fSStephen Warren 1730678587fSStephen Warren#ifdef CONFIG_ARM_ERRATA_743622 1740678587fSStephen Warren mrc p15, 0, r0, c15, c0, 1 @ read diagnostic register 1750678587fSStephen Warren orr r0, r0, #1 << 6 @ set bit #6 1760678587fSStephen Warren mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register 1770678587fSStephen Warren#endif 1780678587fSStephen Warren 1790678587fSStephen Warren#ifdef CONFIG_ARM_ERRATA_751472 1800678587fSStephen Warren mrc p15, 0, r0, c15, c0, 1 @ read diagnostic register 1810678587fSStephen Warren orr r0, r0, #1 << 11 @ set bit #11 1820678587fSStephen Warren mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register 1830678587fSStephen Warren#endif 184b7588e3bSNitin Garg#ifdef CONFIG_ARM_ERRATA_761320 185b7588e3bSNitin Garg mrc p15, 0, r0, c15, c0, 1 @ read diagnostic register 186b7588e3bSNitin Garg orr r0, r0, #1 << 21 @ set bit #21 187b7588e3bSNitin Garg mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register 188b7588e3bSNitin Garg#endif 1890678587fSStephen Warren 190c616a0dfSNishanth Menon mov r5, lr @ Store my Caller 191c616a0dfSNishanth Menon mrc p15, 0, r1, c0, c0, 0 @ r1 has Read Main ID Register (MIDR) 192c616a0dfSNishanth Menon mov r3, r1, lsr #20 @ get variant field 193c616a0dfSNishanth Menon and r3, r3, #0xf @ r3 has CPU variant 194c616a0dfSNishanth Menon and r4, r1, #0xf @ r4 has CPU revision 195c616a0dfSNishanth Menon mov r2, r3, lsl #4 @ shift variant field for combined value 196c616a0dfSNishanth Menon orr r2, r4, r2 @ r2 has combined CPU variant + revision 197c616a0dfSNishanth Menon 198c616a0dfSNishanth Menon#ifdef CONFIG_ARM_ERRATA_798870 199c616a0dfSNishanth Menon cmp r2, #0x30 @ Applies to lower than R3p0 200c616a0dfSNishanth Menon bge skip_errata_798870 @ skip if not affected rev 201c616a0dfSNishanth Menon cmp r2, #0x20 @ Applies to including and above R2p0 202c616a0dfSNishanth Menon blt skip_errata_798870 @ skip if not affected rev 203c616a0dfSNishanth Menon 204c616a0dfSNishanth Menon mrc p15, 1, r0, c15, c0, 0 @ read l2 aux ctrl reg 205c616a0dfSNishanth Menon orr r0, r0, #1 << 7 @ Enable hazard-detect timeout 206c616a0dfSNishanth Menon push {r1-r5} @ Save the cpu info registers 207c616a0dfSNishanth Menon bl v7_arch_cp15_set_l2aux_ctrl 208c616a0dfSNishanth Menon isb @ Recommended ISB after l2actlr update 209c616a0dfSNishanth Menon pop {r1-r5} @ Restore the cpu info - fall through 210c616a0dfSNishanth Menonskip_errata_798870: 211c616a0dfSNishanth Menon#endif 212c616a0dfSNishanth Menon 213a615d0beSNishanth Menon#ifdef CONFIG_ARM_ERRATA_801819 214a615d0beSNishanth Menon cmp r2, #0x24 @ Applies to lt including R2p4 215a615d0beSNishanth Menon bgt skip_errata_801819 @ skip if not affected rev 216a615d0beSNishanth Menon cmp r2, #0x20 @ Applies to including and above R2p0 217a615d0beSNishanth Menon blt skip_errata_801819 @ skip if not affected rev 218a615d0beSNishanth Menon mrc p15, 0, r0, c0, c0, 6 @ pick up REVIDR reg 219a615d0beSNishanth Menon and r0, r0, #1 << 3 @ check REVIDR[3] 220a615d0beSNishanth Menon cmp r0, #1 << 3 221a615d0beSNishanth Menon beq skip_errata_801819 @ skip erratum if REVIDR[3] is set 222a615d0beSNishanth Menon 223a615d0beSNishanth Menon mrc p15, 0, r0, c1, c0, 1 @ read auxilary control register 224a615d0beSNishanth Menon orr r0, r0, #3 << 27 @ Disables streaming. All write-allocate 225a615d0beSNishanth Menon @ lines allocate in the L1 or L2 cache. 226a615d0beSNishanth Menon orr r0, r0, #3 << 25 @ Disables streaming. All write-allocate 227a615d0beSNishanth Menon @ lines allocate in the L1 cache. 228a615d0beSNishanth Menon push {r1-r5} @ Save the cpu info registers 229a615d0beSNishanth Menon bl v7_arch_cp15_set_acr 230a615d0beSNishanth Menon pop {r1-r5} @ Restore the cpu info - fall through 231a615d0beSNishanth Menonskip_errata_801819: 232a615d0beSNishanth Menon#endif 233a615d0beSNishanth Menon 234b45c48a7SNishanth Menon#ifdef CONFIG_ARM_ERRATA_454179 235b45c48a7SNishanth Menon cmp r2, #0x21 @ Only on < r2p1 236b45c48a7SNishanth Menon bge skip_errata_454179 237b45c48a7SNishanth Menon 238b45c48a7SNishanth Menon mrc p15, 0, r0, c1, c0, 1 @ Read ACR 239b45c48a7SNishanth Menon orr r0, r0, #(0x3 << 6) @ Set DBSM(BIT7) and IBE(BIT6) bits 240b45c48a7SNishanth Menon push {r1-r5} @ Save the cpu info registers 241b45c48a7SNishanth Menon bl v7_arch_cp15_set_acr 242b45c48a7SNishanth Menon pop {r1-r5} @ Restore the cpu info - fall through 243b45c48a7SNishanth Menon 244b45c48a7SNishanth Menonskip_errata_454179: 245b45c48a7SNishanth Menon#endif 246b45c48a7SNishanth Menon 2475902f4ceSNishanth Menon#ifdef CONFIG_ARM_ERRATA_430973 2485902f4ceSNishanth Menon cmp r2, #0x21 @ Only on < r2p1 2495902f4ceSNishanth Menon bge skip_errata_430973 2505902f4ceSNishanth Menon 2515902f4ceSNishanth Menon mrc p15, 0, r0, c1, c0, 1 @ Read ACR 2525902f4ceSNishanth Menon orr r0, r0, #(0x1 << 6) @ Set IBE bit 2535902f4ceSNishanth Menon push {r1-r5} @ Save the cpu info registers 2545902f4ceSNishanth Menon bl v7_arch_cp15_set_acr 2555902f4ceSNishanth Menon pop {r1-r5} @ Restore the cpu info - fall through 2565902f4ceSNishanth Menon 2575902f4ceSNishanth Menonskip_errata_430973: 2585902f4ceSNishanth Menon#endif 2595902f4ceSNishanth Menon 2609b4d65f9SNishanth Menon#ifdef CONFIG_ARM_ERRATA_621766 2619b4d65f9SNishanth Menon cmp r2, #0x21 @ Only on < r2p1 2629b4d65f9SNishanth Menon bge skip_errata_621766 2639b4d65f9SNishanth Menon 2649b4d65f9SNishanth Menon mrc p15, 0, r0, c1, c0, 1 @ Read ACR 2659b4d65f9SNishanth Menon orr r0, r0, #(0x1 << 5) @ Set L1NEON bit 2669b4d65f9SNishanth Menon push {r1-r5} @ Save the cpu info registers 2679b4d65f9SNishanth Menon bl v7_arch_cp15_set_acr 2689b4d65f9SNishanth Menon pop {r1-r5} @ Restore the cpu info - fall through 2699b4d65f9SNishanth Menon 2709b4d65f9SNishanth Menonskip_errata_621766: 2719b4d65f9SNishanth Menon#endif 2729b4d65f9SNishanth Menon 273*19a75b8cSSiarhei Siamashka#ifdef CONFIG_ARM_ERRATA_725233 274*19a75b8cSSiarhei Siamashka cmp r2, #0x21 @ Only on < r2p1 (Cortex A8) 275*19a75b8cSSiarhei Siamashka bge skip_errata_725233 276*19a75b8cSSiarhei Siamashka 277*19a75b8cSSiarhei Siamashka mrc p15, 1, r0, c9, c0, 2 @ Read L2ACR 278*19a75b8cSSiarhei Siamashka orr r0, r0, #(0x1 << 27) @ L2 PLD data forwarding disable 279*19a75b8cSSiarhei Siamashka push {r1-r5} @ Save the cpu info registers 280*19a75b8cSSiarhei Siamashka bl v7_arch_cp15_set_l2aux_ctrl 281*19a75b8cSSiarhei Siamashka pop {r1-r5} @ Restore the cpu info - fall through 282*19a75b8cSSiarhei Siamashka 283*19a75b8cSSiarhei Siamashkaskip_errata_725233: 284*19a75b8cSSiarhei Siamashka#endif 285*19a75b8cSSiarhei Siamashka 286c616a0dfSNishanth Menon mov pc, r5 @ back to my caller 28774236acaSAneesh VENDPROC(cpu_init_cp15) 28880433c9aSSimon Glass 289b5bd0982SSimon Glass#if !defined(CONFIG_SKIP_LOWLEVEL_INIT) && \ 290b5bd0982SSimon Glass !defined(CONFIG_SKIP_LOWLEVEL_INIT_ONLY) 29180433c9aSSimon Glass/************************************************************************* 29280433c9aSSimon Glass * 29380433c9aSSimon Glass * CPU_init_critical registers 29480433c9aSSimon Glass * 29580433c9aSSimon Glass * setup important registers 29680433c9aSSimon Glass * setup memory timing 29780433c9aSSimon Glass * 29880433c9aSSimon Glass *************************************************************************/ 29974236acaSAneesh VENTRY(cpu_init_crit) 300f56348afSSteve Sakoman /* 301f56348afSSteve Sakoman * Jump to board specific initialization... 302f56348afSSteve Sakoman * The Mask ROM will have already initialized 303f56348afSSteve Sakoman * basic memory. Go here to bump up clock rate and handle 304f56348afSSteve Sakoman * wake up conditions. 305f56348afSSteve Sakoman */ 30663ee53a7SBenoît Thébaudeau b lowlevel_init @ go setup pll,mux,memory 30774236acaSAneesh VENDPROC(cpu_init_crit) 30822193540SRob Herring#endif 309