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> 18f56348afSSteve Sakoman#include <version.h> 19a8c68639SAneesh V#include <asm/system.h> 2074236acaSAneesh V#include <linux/linkage.h> 21f56348afSSteve Sakoman 22f56348afSSteve Sakoman/************************************************************************* 23f56348afSSteve Sakoman * 24f56348afSSteve Sakoman * Startup Code (reset vector) 25f56348afSSteve Sakoman * 26f56348afSSteve Sakoman * do important init only if we don't start from memory! 27f56348afSSteve Sakoman * setup Memory and board specific bits prior to relocation. 28f56348afSSteve Sakoman * relocate armboot to ram 29f56348afSSteve Sakoman * setup stack 30f56348afSSteve Sakoman * 31f56348afSSteve Sakoman *************************************************************************/ 32f56348afSSteve Sakoman 3341623c91SAlbert ARIBAUD .globl reset 34e11c6c27SSimon Glass .globl save_boot_params_ret 35561142afSHeiko Schocher 36561142afSHeiko Schocherreset: 37e11c6c27SSimon Glass /* Allow the board to save important registers */ 38e11c6c27SSimon Glass b save_boot_params 39e11c6c27SSimon Glasssave_boot_params_ret: 40561142afSHeiko Schocher /* 41c4a4e2e2SAndre Przywara * disable interrupts (FIQ and IRQ), also set the cpu to SVC32 mode, 42c4a4e2e2SAndre Przywara * except if in HYP mode already 43561142afSHeiko Schocher */ 44561142afSHeiko Schocher mrs r0, cpsr 45c4a4e2e2SAndre Przywara and r1, r0, #0x1f @ mask mode bits 46c4a4e2e2SAndre Przywara teq r1, #0x1a @ test for HYP mode 47c4a4e2e2SAndre Przywara bicne r0, r0, #0x1f @ clear all mode bits 48c4a4e2e2SAndre Przywara orrne r0, r0, #0x13 @ set SVC mode 49c4a4e2e2SAndre Przywara orr r0, r0, #0xc0 @ disable FIQ and IRQ 50561142afSHeiko Schocher msr cpsr,r0 51561142afSHeiko Schocher 52a8c68639SAneesh V/* 53a8c68639SAneesh V * Setup vector: 54a8c68639SAneesh V * (OMAP4 spl TEXT_BASE is not 32 byte aligned. 55a8c68639SAneesh V * Continue to use ROM code vector only in OMAP4 spl) 56a8c68639SAneesh V */ 57840fe95cSSiarhei Siamashka#if !(defined(CONFIG_OMAP44XX) && defined(CONFIG_SPL_BUILD)) 580f274f53SPeng Fan /* Set V=0 in CP15 SCTLR register - for VBAR to point to vector */ 590f274f53SPeng Fan mrc p15, 0, r0, c1, c0, 0 @ Read CP15 SCTLR Register 60a8c68639SAneesh V bic r0, #CR_V @ V = 0 610f274f53SPeng Fan mcr p15, 0, r0, c1, c0, 0 @ Write CP15 SCTLR Register 62a8c68639SAneesh V 63a8c68639SAneesh V /* Set vector address in CP15 VBAR register */ 64a8c68639SAneesh V ldr r0, =_start 65a8c68639SAneesh V mcr p15, 0, r0, c12, c0, 0 @Set VBAR 66a8c68639SAneesh V#endif 67a8c68639SAneesh V 68561142afSHeiko Schocher /* the mask ROM code should have PLL and others stable */ 69561142afSHeiko Schocher#ifndef CONFIG_SKIP_LOWLEVEL_INIT 7080433c9aSSimon Glass bl cpu_init_cp15 71561142afSHeiko Schocher bl cpu_init_crit 72561142afSHeiko Schocher#endif 73561142afSHeiko Schocher 74e05e5de7SAlbert ARIBAUD bl _main 75561142afSHeiko Schocher 76561142afSHeiko Schocher/*------------------------------------------------------------------------------*/ 77561142afSHeiko Schocher 78e05e5de7SAlbert ARIBAUDENTRY(c_runtime_cpu_setup) 79c2dd0d45SAneesh V/* 80c2dd0d45SAneesh V * If I-cache is enabled invalidate it 81c2dd0d45SAneesh V */ 82c2dd0d45SAneesh V#ifndef CONFIG_SYS_ICACHE_OFF 83c2dd0d45SAneesh V mcr p15, 0, r0, c7, c5, 0 @ invalidate icache 84c2dd0d45SAneesh V mcr p15, 0, r0, c7, c10, 4 @ DSB 85c2dd0d45SAneesh V mcr p15, 0, r0, c7, c5, 4 @ ISB 86c2dd0d45SAneesh V#endif 87f8b9d1d3STetsuyuki Kobayashi 88e05e5de7SAlbert ARIBAUD bx lr 89561142afSHeiko Schocher 90e05e5de7SAlbert ARIBAUDENDPROC(c_runtime_cpu_setup) 91c3d3a541SHeiko Schocher 92f56348afSSteve Sakoman/************************************************************************* 93f56348afSSteve Sakoman * 946f0dba85STetsuyuki Kobayashi * void save_boot_params(u32 r0, u32 r1, u32 r2, u32 r3) 956f0dba85STetsuyuki Kobayashi * __attribute__((weak)); 966f0dba85STetsuyuki Kobayashi * 976f0dba85STetsuyuki Kobayashi * Stack pointer is not yet initialized at this moment 986f0dba85STetsuyuki Kobayashi * Don't save anything to stack even if compiled with -O0 996f0dba85STetsuyuki Kobayashi * 1006f0dba85STetsuyuki Kobayashi *************************************************************************/ 1016f0dba85STetsuyuki KobayashiENTRY(save_boot_params) 102e11c6c27SSimon Glass b save_boot_params_ret @ back to my caller 1036f0dba85STetsuyuki KobayashiENDPROC(save_boot_params) 1046f0dba85STetsuyuki Kobayashi .weak save_boot_params 1056f0dba85STetsuyuki Kobayashi 1066f0dba85STetsuyuki Kobayashi/************************************************************************* 1076f0dba85STetsuyuki Kobayashi * 10880433c9aSSimon Glass * cpu_init_cp15 109f56348afSSteve Sakoman * 11080433c9aSSimon Glass * Setup CP15 registers (cache, MMU, TLBs). The I-cache is turned on unless 11180433c9aSSimon Glass * CONFIG_SYS_ICACHE_OFF is defined. 112f56348afSSteve Sakoman * 113f56348afSSteve Sakoman *************************************************************************/ 11474236acaSAneesh VENTRY(cpu_init_cp15) 115f56348afSSteve Sakoman /* 116f56348afSSteve Sakoman * Invalidate L1 I/D 117f56348afSSteve Sakoman */ 118f56348afSSteve Sakoman mov r0, #0 @ set up for MCR 119f56348afSSteve Sakoman mcr p15, 0, r0, c8, c7, 0 @ invalidate TLBs 120f56348afSSteve Sakoman mcr p15, 0, r0, c7, c5, 0 @ invalidate icache 121c2dd0d45SAneesh V mcr p15, 0, r0, c7, c5, 6 @ invalidate BP array 122c2dd0d45SAneesh V mcr p15, 0, r0, c7, c10, 4 @ DSB 123c2dd0d45SAneesh V mcr p15, 0, r0, c7, c5, 4 @ ISB 124f56348afSSteve Sakoman 125f56348afSSteve Sakoman /* 126f56348afSSteve Sakoman * disable MMU stuff and caches 127f56348afSSteve Sakoman */ 128f56348afSSteve Sakoman mrc p15, 0, r0, c1, c0, 0 129f56348afSSteve Sakoman bic r0, r0, #0x00002000 @ clear bits 13 (--V-) 130f56348afSSteve Sakoman bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM) 131f56348afSSteve Sakoman orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align 132c2dd0d45SAneesh V orr r0, r0, #0x00000800 @ set bit 11 (Z---) BTB 133c2dd0d45SAneesh V#ifdef CONFIG_SYS_ICACHE_OFF 134c2dd0d45SAneesh V bic r0, r0, #0x00001000 @ clear bit 12 (I) I-cache 135c2dd0d45SAneesh V#else 136c2dd0d45SAneesh V orr r0, r0, #0x00001000 @ set bit 12 (I) I-cache 137c2dd0d45SAneesh V#endif 138f56348afSSteve Sakoman mcr p15, 0, r0, c1, c0, 0 1390678587fSStephen Warren 140c5d4752cSStephen Warren#ifdef CONFIG_ARM_ERRATA_716044 141c5d4752cSStephen Warren mrc p15, 0, r0, c1, c0, 0 @ read system control register 142c5d4752cSStephen Warren orr r0, r0, #1 << 11 @ set bit #11 143c5d4752cSStephen Warren mcr p15, 0, r0, c1, c0, 0 @ write system control register 144c5d4752cSStephen Warren#endif 145c5d4752cSStephen Warren 146f71cbfe3SNitin Garg#if (defined(CONFIG_ARM_ERRATA_742230) || defined(CONFIG_ARM_ERRATA_794072)) 1470678587fSStephen Warren mrc p15, 0, r0, c15, c0, 1 @ read diagnostic register 1480678587fSStephen Warren orr r0, r0, #1 << 4 @ set bit #4 1490678587fSStephen Warren mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register 1500678587fSStephen Warren#endif 1510678587fSStephen Warren 1520678587fSStephen Warren#ifdef CONFIG_ARM_ERRATA_743622 1530678587fSStephen Warren mrc p15, 0, r0, c15, c0, 1 @ read diagnostic register 1540678587fSStephen Warren orr r0, r0, #1 << 6 @ set bit #6 1550678587fSStephen Warren mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register 1560678587fSStephen Warren#endif 1570678587fSStephen Warren 1580678587fSStephen Warren#ifdef CONFIG_ARM_ERRATA_751472 1590678587fSStephen Warren mrc p15, 0, r0, c15, c0, 1 @ read diagnostic register 1600678587fSStephen Warren orr r0, r0, #1 << 11 @ set bit #11 1610678587fSStephen Warren mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register 1620678587fSStephen Warren#endif 163b7588e3bSNitin Garg#ifdef CONFIG_ARM_ERRATA_761320 164b7588e3bSNitin Garg mrc p15, 0, r0, c15, c0, 1 @ read diagnostic register 165b7588e3bSNitin Garg orr r0, r0, #1 << 21 @ set bit #21 166b7588e3bSNitin Garg mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register 167b7588e3bSNitin Garg#endif 1680678587fSStephen Warren 169c616a0dfSNishanth Menon mov r5, lr @ Store my Caller 170c616a0dfSNishanth Menon mrc p15, 0, r1, c0, c0, 0 @ r1 has Read Main ID Register (MIDR) 171c616a0dfSNishanth Menon mov r3, r1, lsr #20 @ get variant field 172c616a0dfSNishanth Menon and r3, r3, #0xf @ r3 has CPU variant 173c616a0dfSNishanth Menon and r4, r1, #0xf @ r4 has CPU revision 174c616a0dfSNishanth Menon mov r2, r3, lsl #4 @ shift variant field for combined value 175c616a0dfSNishanth Menon orr r2, r4, r2 @ r2 has combined CPU variant + revision 176c616a0dfSNishanth Menon 177c616a0dfSNishanth Menon#ifdef CONFIG_ARM_ERRATA_798870 178c616a0dfSNishanth Menon cmp r2, #0x30 @ Applies to lower than R3p0 179c616a0dfSNishanth Menon bge skip_errata_798870 @ skip if not affected rev 180c616a0dfSNishanth Menon cmp r2, #0x20 @ Applies to including and above R2p0 181c616a0dfSNishanth Menon blt skip_errata_798870 @ skip if not affected rev 182c616a0dfSNishanth Menon 183c616a0dfSNishanth Menon mrc p15, 1, r0, c15, c0, 0 @ read l2 aux ctrl reg 184c616a0dfSNishanth Menon orr r0, r0, #1 << 7 @ Enable hazard-detect timeout 185c616a0dfSNishanth Menon push {r1-r5} @ Save the cpu info registers 186c616a0dfSNishanth Menon bl v7_arch_cp15_set_l2aux_ctrl 187c616a0dfSNishanth Menon isb @ Recommended ISB after l2actlr update 188c616a0dfSNishanth Menon pop {r1-r5} @ Restore the cpu info - fall through 189c616a0dfSNishanth Menonskip_errata_798870: 190c616a0dfSNishanth Menon#endif 191c616a0dfSNishanth Menon 192b45c48a7SNishanth Menon#ifdef CONFIG_ARM_ERRATA_454179 193b45c48a7SNishanth Menon cmp r2, #0x21 @ Only on < r2p1 194b45c48a7SNishanth Menon bge skip_errata_454179 195b45c48a7SNishanth Menon 196b45c48a7SNishanth Menon mrc p15, 0, r0, c1, c0, 1 @ Read ACR 197b45c48a7SNishanth Menon orr r0, r0, #(0x3 << 6) @ Set DBSM(BIT7) and IBE(BIT6) bits 198b45c48a7SNishanth Menon push {r1-r5} @ Save the cpu info registers 199b45c48a7SNishanth Menon bl v7_arch_cp15_set_acr 200b45c48a7SNishanth Menon pop {r1-r5} @ Restore the cpu info - fall through 201b45c48a7SNishanth Menon 202b45c48a7SNishanth Menonskip_errata_454179: 203b45c48a7SNishanth Menon#endif 204b45c48a7SNishanth Menon 205*5902f4ceSNishanth Menon#ifdef CONFIG_ARM_ERRATA_430973 206*5902f4ceSNishanth Menon cmp r2, #0x21 @ Only on < r2p1 207*5902f4ceSNishanth Menon bge skip_errata_430973 208*5902f4ceSNishanth Menon 209*5902f4ceSNishanth Menon mrc p15, 0, r0, c1, c0, 1 @ Read ACR 210*5902f4ceSNishanth Menon orr r0, r0, #(0x1 << 6) @ Set IBE bit 211*5902f4ceSNishanth Menon push {r1-r5} @ Save the cpu info registers 212*5902f4ceSNishanth Menon bl v7_arch_cp15_set_acr 213*5902f4ceSNishanth Menon pop {r1-r5} @ Restore the cpu info - fall through 214*5902f4ceSNishanth Menon 215*5902f4ceSNishanth Menonskip_errata_430973: 216*5902f4ceSNishanth Menon#endif 217*5902f4ceSNishanth Menon 218c616a0dfSNishanth Menon mov pc, r5 @ back to my caller 21974236acaSAneesh VENDPROC(cpu_init_cp15) 22080433c9aSSimon Glass 22180433c9aSSimon Glass#ifndef CONFIG_SKIP_LOWLEVEL_INIT 22280433c9aSSimon Glass/************************************************************************* 22380433c9aSSimon Glass * 22480433c9aSSimon Glass * CPU_init_critical registers 22580433c9aSSimon Glass * 22680433c9aSSimon Glass * setup important registers 22780433c9aSSimon Glass * setup memory timing 22880433c9aSSimon Glass * 22980433c9aSSimon Glass *************************************************************************/ 23074236acaSAneesh VENTRY(cpu_init_crit) 231f56348afSSteve Sakoman /* 232f56348afSSteve Sakoman * Jump to board specific initialization... 233f56348afSSteve Sakoman * The Mask ROM will have already initialized 234f56348afSSteve Sakoman * basic memory. Go here to bump up clock rate and handle 235f56348afSSteve Sakoman * wake up conditions. 236f56348afSSteve Sakoman */ 23763ee53a7SBenoît Thébaudeau b lowlevel_init @ go setup pll,mux,memory 23874236acaSAneesh VENDPROC(cpu_init_crit) 23922193540SRob Herring#endif 240