1eae4988bSStefano Babic/* 2eae4988bSStefano Babic * Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de> 3eae4988bSStefano Babic * 4eae4988bSStefano Babic * (C) Copyright 2008-2010 Freescale Semiconductor, Inc. 5eae4988bSStefano Babic * 6eae4988bSStefano Babic * This program is free software; you can redistribute it and/or 7eae4988bSStefano Babic * modify it under the terms of the GNU General Public License as 8eae4988bSStefano Babic * published by the Free Software Foundation; either version 2 of 9eae4988bSStefano Babic * the License, or (at your option) any later version. 10eae4988bSStefano Babic * 11eae4988bSStefano Babic * This program is distributed in the hope that it will be useful, 12eae4988bSStefano Babic * but WITHOUT ANY WARRANTY; without even the implied warranty of 13eae4988bSStefano Babic * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14eae4988bSStefano Babic * GNU General Public License for more details. 15eae4988bSStefano Babic * 16eae4988bSStefano Babic * You should have received a copy of the GNU General Public License 17eae4988bSStefano Babic * along with this program; if not, write to the Free Software 18eae4988bSStefano Babic * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 19eae4988bSStefano Babic * MA 02111-1307 USA 20eae4988bSStefano Babic */ 21eae4988bSStefano Babic 22eae4988bSStefano Babic#include <config.h> 23eae4988bSStefano Babic#include <asm/arch/imx-regs.h> 24*a4814a69SStefano Babic#include <generated/asm-offsets.h> 25eae4988bSStefano Babic#include "mx35pdk.h" 26eae4988bSStefano Babic 27eae4988bSStefano Babic/* 28eae4988bSStefano Babic * return soc version 29eae4988bSStefano Babic * 0x10: TO1 30eae4988bSStefano Babic * 0x20: TO2 31eae4988bSStefano Babic * 0x30: TO3 32eae4988bSStefano Babic */ 33eae4988bSStefano Babic.macro check_soc_version ret, tmp 34eae4988bSStefano Babic ldr \tmp, =IIM_BASE_ADDR 35eae4988bSStefano Babic ldr \ret, [\tmp, #IIM_SREV] 36eae4988bSStefano Babic cmp \ret, #0x00 37eae4988bSStefano Babic moveq \tmp, #ROMPATCH_REV 38eae4988bSStefano Babic ldreq \ret, [\tmp] 39eae4988bSStefano Babic moveq \ret, \ret, lsl #4 40eae4988bSStefano Babic addne \ret, \ret, #0x10 41eae4988bSStefano Babic.endm 42eae4988bSStefano Babic 43eae4988bSStefano Babic/* 44eae4988bSStefano Babic * AIPS setup - Only setup MPROTx registers. 45eae4988bSStefano Babic * The PACR default values are good. 46eae4988bSStefano Babic */ 47eae4988bSStefano Babic.macro init_aips 48eae4988bSStefano Babic /* 49eae4988bSStefano Babic * Set all MPROTx to be non-bufferable, trusted for R/W, 50eae4988bSStefano Babic * not forced to user-mode. 51eae4988bSStefano Babic */ 52eae4988bSStefano Babic ldr r0, =AIPS1_BASE_ADDR 53eae4988bSStefano Babic ldr r1, =AIPS_MPR_CONFIG 54eae4988bSStefano Babic str r1, [r0, #0x00] 55eae4988bSStefano Babic str r1, [r0, #0x04] 56eae4988bSStefano Babic ldr r0, =AIPS2_BASE_ADDR 57eae4988bSStefano Babic str r1, [r0, #0x00] 58eae4988bSStefano Babic str r1, [r0, #0x04] 59eae4988bSStefano Babic 60eae4988bSStefano Babic /* 61eae4988bSStefano Babic * Clear the on and off peripheral modules Supervisor Protect bit 62eae4988bSStefano Babic * for SDMA to access them. Did not change the AIPS control registers 63eae4988bSStefano Babic * (offset 0x20) access type 64eae4988bSStefano Babic */ 65eae4988bSStefano Babic ldr r0, =AIPS1_BASE_ADDR 66eae4988bSStefano Babic ldr r1, =AIPS_OPACR_CONFIG 67eae4988bSStefano Babic str r1, [r0, #0x40] 68eae4988bSStefano Babic str r1, [r0, #0x44] 69eae4988bSStefano Babic str r1, [r0, #0x48] 70eae4988bSStefano Babic str r1, [r0, #0x4C] 71eae4988bSStefano Babic str r1, [r0, #0x50] 72eae4988bSStefano Babic ldr r0, =AIPS2_BASE_ADDR 73eae4988bSStefano Babic str r1, [r0, #0x40] 74eae4988bSStefano Babic str r1, [r0, #0x44] 75eae4988bSStefano Babic str r1, [r0, #0x48] 76eae4988bSStefano Babic str r1, [r0, #0x4C] 77eae4988bSStefano Babic str r1, [r0, #0x50] 78eae4988bSStefano Babic.endm 79eae4988bSStefano Babic 80eae4988bSStefano Babic/* MAX (Multi-Layer AHB Crossbar Switch) setup */ 81eae4988bSStefano Babic.macro init_max 82eae4988bSStefano Babic ldr r0, =MAX_BASE_ADDR 83eae4988bSStefano Babic /* MPR - priority is M4 > M2 > M3 > M5 > M0 > M1 */ 84eae4988bSStefano Babic ldr r1, =MAX_MPR_CONFIG 85eae4988bSStefano Babic str r1, [r0, #0x000] /* for S0 */ 86eae4988bSStefano Babic str r1, [r0, #0x100] /* for S1 */ 87eae4988bSStefano Babic str r1, [r0, #0x200] /* for S2 */ 88eae4988bSStefano Babic str r1, [r0, #0x300] /* for S3 */ 89eae4988bSStefano Babic str r1, [r0, #0x400] /* for S4 */ 90eae4988bSStefano Babic /* SGPCR - always park on last master */ 91eae4988bSStefano Babic ldr r1, =MAX_SGPCR_CONFIG 92eae4988bSStefano Babic str r1, [r0, #0x010] /* for S0 */ 93eae4988bSStefano Babic str r1, [r0, #0x110] /* for S1 */ 94eae4988bSStefano Babic str r1, [r0, #0x210] /* for S2 */ 95eae4988bSStefano Babic str r1, [r0, #0x310] /* for S3 */ 96eae4988bSStefano Babic str r1, [r0, #0x410] /* for S4 */ 97eae4988bSStefano Babic /* MGPCR - restore default values */ 98eae4988bSStefano Babic ldr r1, =MAX_MGPCR_CONFIG 99eae4988bSStefano Babic str r1, [r0, #0x800] /* for M0 */ 100eae4988bSStefano Babic str r1, [r0, #0x900] /* for M1 */ 101eae4988bSStefano Babic str r1, [r0, #0xA00] /* for M2 */ 102eae4988bSStefano Babic str r1, [r0, #0xB00] /* for M3 */ 103eae4988bSStefano Babic str r1, [r0, #0xC00] /* for M4 */ 104eae4988bSStefano Babic str r1, [r0, #0xD00] /* for M5 */ 105eae4988bSStefano Babic.endm 106eae4988bSStefano Babic 107eae4988bSStefano Babic/* M3IF setup */ 108eae4988bSStefano Babic.macro init_m3if 109eae4988bSStefano Babic /* Configure M3IF registers */ 110eae4988bSStefano Babic ldr r1, =M3IF_BASE_ADDR 111eae4988bSStefano Babic /* 112eae4988bSStefano Babic * M3IF Control Register (M3IFCTL) 113eae4988bSStefano Babic * MRRP[0] = L2CC0 not on priority list (0 << 0) = 0x00000000 114eae4988bSStefano Babic * MRRP[1] = L2CC1 not on priority list (0 << 0) = 0x00000000 115eae4988bSStefano Babic * MRRP[2] = MBX not on priority list (0 << 0) = 0x00000000 116eae4988bSStefano Babic * MRRP[3] = MAX1 not on priority list (0 << 0) = 0x00000000 117eae4988bSStefano Babic * MRRP[4] = SDMA not on priority list (0 << 0) = 0x00000000 118eae4988bSStefano Babic * MRRP[5] = MPEG4 not on priority list (0 << 0) = 0x00000000 119eae4988bSStefano Babic * MRRP[6] = IPU1 on priority list (1 << 6) = 0x00000040 120eae4988bSStefano Babic * MRRP[7] = IPU2 not on priority list (0 << 0) = 0x00000000 121eae4988bSStefano Babic * ------------ 122eae4988bSStefano Babic * 0x00000040 123eae4988bSStefano Babic */ 124eae4988bSStefano Babic ldr r0, =M3IF_CONFIG 125eae4988bSStefano Babic str r0, [r1] /* M3IF control reg */ 126eae4988bSStefano Babic.endm 127eae4988bSStefano Babic 128eae4988bSStefano Babic/* CPLD on CS5 setup */ 129eae4988bSStefano Babic.macro init_debug_board 130eae4988bSStefano Babic ldr r0, =DBG_BASE_ADDR 131eae4988bSStefano Babic ldr r1, =DBG_CSCR_U_CONFIG 132eae4988bSStefano Babic str r1, [r0, #0x00] 133eae4988bSStefano Babic ldr r1, =DBG_CSCR_L_CONFIG 134eae4988bSStefano Babic str r1, [r0, #0x04] 135eae4988bSStefano Babic ldr r1, =DBG_CSCR_A_CONFIG 136eae4988bSStefano Babic str r1, [r0, #0x08] 137eae4988bSStefano Babic.endm 138eae4988bSStefano Babic 139eae4988bSStefano Babic/* clock setup */ 140eae4988bSStefano Babic.macro init_clock 141eae4988bSStefano Babic ldr r0, =CCM_BASE_ADDR 142eae4988bSStefano Babic 143eae4988bSStefano Babic /* default CLKO to 1/32 of the ARM core*/ 144eae4988bSStefano Babic ldr r1, [r0, #CLKCTL_COSR] 145eae4988bSStefano Babic bic r1, r1, #0x00000FF00 146eae4988bSStefano Babic bic r1, r1, #0x0000000FF 147eae4988bSStefano Babic mov r2, #0x00006C00 148eae4988bSStefano Babic add r2, r2, #0x67 149eae4988bSStefano Babic orr r1, r1, r2 150eae4988bSStefano Babic str r1, [r0, #CLKCTL_COSR] 151eae4988bSStefano Babic 152eae4988bSStefano Babic ldr r2, =CCM_CCMR_CONFIG 153eae4988bSStefano Babic str r2, [r0, #CLKCTL_CCMR] 154eae4988bSStefano Babic 155eae4988bSStefano Babic check_soc_version r1, r2 156eae4988bSStefano Babic cmp r1, #CHIP_REV_2_0 157eae4988bSStefano Babic ldrhs r3, =CCM_MPLL_532_HZ 158eae4988bSStefano Babic bhs 1f 159eae4988bSStefano Babic ldr r2, [r0, #CLKCTL_PDR0] 160eae4988bSStefano Babic tst r2, #CLKMODE_CONSUMER 161eae4988bSStefano Babic ldrne r3, =CCM_MPLL_532_HZ /* consumer path*/ 162eae4988bSStefano Babic ldreq r3, =CCM_MPLL_399_HZ /* auto path*/ 163eae4988bSStefano Babic1: 164eae4988bSStefano Babic str r3, [r0, #CLKCTL_MPCTL] 165eae4988bSStefano Babic 166eae4988bSStefano Babic ldr r1, =CCM_PPLL_300_HZ 167eae4988bSStefano Babic str r1, [r0, #CLKCTL_PPCTL] 168eae4988bSStefano Babic 169eae4988bSStefano Babic ldr r1, =CCM_PDR0_CONFIG 170eae4988bSStefano Babic bic r1, r1, #0x800000 171eae4988bSStefano Babic str r1, [r0, #CLKCTL_PDR0] 172eae4988bSStefano Babic 173eae4988bSStefano Babic ldr r1, [r0, #CLKCTL_CGR0] 174eae4988bSStefano Babic orr r1, r1, #0x0C300000 175eae4988bSStefano Babic str r1, [r0, #CLKCTL_CGR0] 176eae4988bSStefano Babic 177eae4988bSStefano Babic ldr r1, [r0, #CLKCTL_CGR1] 178eae4988bSStefano Babic orr r1, r1, #0x00000C00 179eae4988bSStefano Babic orr r1, r1, #0x00000003 180eae4988bSStefano Babic str r1, [r0, #CLKCTL_CGR1] 181eae4988bSStefano Babic.endm 182eae4988bSStefano Babic 183eae4988bSStefano Babic.macro setup_sdram 184eae4988bSStefano Babic ldr r0, =ESDCTL_BASE_ADDR 185eae4988bSStefano Babic mov r3, #0x2000 186eae4988bSStefano Babic str r3, [r0, #0x0] 187eae4988bSStefano Babic str r3, [r0, #0x8] 188eae4988bSStefano Babic 189eae4988bSStefano Babic /*ip(r12) has used to save lr register in upper calling*/ 190eae4988bSStefano Babic mov fp, lr 191eae4988bSStefano Babic 192eae4988bSStefano Babic mov r5, #0x00 193eae4988bSStefano Babic mov r2, #0x00 194eae4988bSStefano Babic mov r1, #CSD0_BASE_ADDR 195eae4988bSStefano Babic bl setup_sdram_bank 1966b5acfc1SStefano Babic 1976b5acfc1SStefano Babic mov r5, #0x00 1986b5acfc1SStefano Babic mov r2, #0x00 1996b5acfc1SStefano Babic mov r1, #CSD1_BASE_ADDR 2006b5acfc1SStefano Babic bl setup_sdram_bank 201eae4988bSStefano Babic 202eae4988bSStefano Babic mov lr, fp 203eae4988bSStefano Babic 204eae4988bSStefano Babic1: 205eae4988bSStefano Babic ldr r3, =ESDCTL_DELAY_LINE5 206eae4988bSStefano Babic str r3, [r0, #0x30] 207eae4988bSStefano Babic.endm 208eae4988bSStefano Babic 209eae4988bSStefano Babic.globl lowlevel_init 210eae4988bSStefano Babiclowlevel_init: 211eae4988bSStefano Babic mov r10, lr 212eae4988bSStefano Babic 213eae4988bSStefano Babic mrc 15, 0, r1, c1, c0, 0 214eae4988bSStefano Babic 215eae4988bSStefano Babic mrc 15, 0, r0, c1, c0, 1 216eae4988bSStefano Babic orr r0, r0, #7 217eae4988bSStefano Babic mcr 15, 0, r0, c1, c0, 1 218eae4988bSStefano Babic orr r1, r1, #(1<<11) 219eae4988bSStefano Babic 220eae4988bSStefano Babic /* Set unaligned access enable */ 221eae4988bSStefano Babic orr r1, r1, #(1<<22) 222eae4988bSStefano Babic 223eae4988bSStefano Babic /* Set low int latency enable */ 224eae4988bSStefano Babic orr r1, r1, #(1<<21) 225eae4988bSStefano Babic 226eae4988bSStefano Babic mcr 15, 0, r1, c1, c0, 0 227eae4988bSStefano Babic 228eae4988bSStefano Babic mov r0, #0 229eae4988bSStefano Babic 230eae4988bSStefano Babic /* Set branch prediction enable */ 231eae4988bSStefano Babic mcr 15, 0, r0, c15, c2, 4 232eae4988bSStefano Babic 233eae4988bSStefano Babic mcr 15, 0, r0, c7, c7, 0 /* invalidate I cache and D cache */ 234eae4988bSStefano Babic mcr 15, 0, r0, c8, c7, 0 /* invalidate TLBs */ 235eae4988bSStefano Babic mcr 15, 0, r0, c7, c10, 4 /* Drain the write buffer */ 236eae4988bSStefano Babic 237eae4988bSStefano Babic /* 238eae4988bSStefano Babic * initializes very early AIPS 239eae4988bSStefano Babic * Then it also initializes Multi-Layer AHB Crossbar Switch, 240eae4988bSStefano Babic * M3IF 241eae4988bSStefano Babic * Also setup the Peripheral Port Remap register inside the core 242eae4988bSStefano Babic */ 243eae4988bSStefano Babic ldr r0, =0x40000015 /* start from AIPS 2GB region */ 244eae4988bSStefano Babic mcr p15, 0, r0, c15, c2, 4 245eae4988bSStefano Babic 246eae4988bSStefano Babic init_aips 247eae4988bSStefano Babic 248eae4988bSStefano Babic init_max 249eae4988bSStefano Babic 250eae4988bSStefano Babic init_m3if 251eae4988bSStefano Babic 252eae4988bSStefano Babic init_clock 253eae4988bSStefano Babic init_debug_board 254eae4988bSStefano Babic 255eae4988bSStefano Babic cmp pc, #PHYS_SDRAM_1 256eae4988bSStefano Babic blo init_sdram_start 257eae4988bSStefano Babic cmp pc, #(PHYS_SDRAM_1 + PHYS_SDRAM_1_SIZE) 258eae4988bSStefano Babic blo skip_sdram_setup 259eae4988bSStefano Babic 260eae4988bSStefano Babicinit_sdram_start: 261eae4988bSStefano Babic /*init_sdram*/ 262eae4988bSStefano Babic setup_sdram 263eae4988bSStefano Babic 264eae4988bSStefano Babicskip_sdram_setup: 265eae4988bSStefano Babic mov lr, r10 266eae4988bSStefano Babic mov pc, lr 267eae4988bSStefano Babic 268eae4988bSStefano Babic 269eae4988bSStefano Babic/* 270eae4988bSStefano Babic * r0: ESDCTL control base, r1: sdram slot base 271eae4988bSStefano Babic * r2: DDR type(0:DDR2, 1:MDDR) r3, r4:working base 272eae4988bSStefano Babic */ 273eae4988bSStefano Babicsetup_sdram_bank: 274eae4988bSStefano Babic mov r3, #0xE 275eae4988bSStefano Babic tst r2, #0x1 276eae4988bSStefano Babic orreq r3, r3, #0x300 /*DDR2*/ 277eae4988bSStefano Babic str r3, [r0, #0x10] 278eae4988bSStefano Babic bic r3, r3, #0x00A 279eae4988bSStefano Babic str r3, [r0, #0x10] 280eae4988bSStefano Babic beq 2f 281eae4988bSStefano Babic 282eae4988bSStefano Babic mov r3, #0x20000 283eae4988bSStefano Babic1: subs r3, r3, #1 284eae4988bSStefano Babic bne 1b 285eae4988bSStefano Babic 286eae4988bSStefano Babic2: tst r2, #0x1 287eae4988bSStefano Babic ldreq r3, =ESDCTL_DDR2_CONFIG 288eae4988bSStefano Babic ldrne r3, =ESDCTL_MDDR_CONFIG 289eae4988bSStefano Babic cmp r1, #CSD1_BASE_ADDR 290eae4988bSStefano Babic strlo r3, [r0, #0x4] 291eae4988bSStefano Babic strhs r3, [r0, #0xC] 292eae4988bSStefano Babic 293eae4988bSStefano Babic ldr r3, =ESDCTL_0x92220000 294eae4988bSStefano Babic strlo r3, [r0, #0x0] 295eae4988bSStefano Babic strhs r3, [r0, #0x8] 296eae4988bSStefano Babic mov r3, #0xDA 297eae4988bSStefano Babic ldr r4, =ESDCTL_PRECHARGE 298eae4988bSStefano Babic strb r3, [r1, r4] 299eae4988bSStefano Babic 300eae4988bSStefano Babic tst r2, #0x1 301eae4988bSStefano Babic bne skip_set_mode 302eae4988bSStefano Babic 303eae4988bSStefano Babic cmp r1, #CSD1_BASE_ADDR 304eae4988bSStefano Babic ldr r3, =ESDCTL_0xB2220000 305eae4988bSStefano Babic strlo r3, [r0, #0x0] 306eae4988bSStefano Babic strhs r3, [r0, #0x8] 307eae4988bSStefano Babic mov r3, #0xDA 308eae4988bSStefano Babic ldr r4, =ESDCTL_DDR2_EMR2 309eae4988bSStefano Babic strb r3, [r1, r4] 310eae4988bSStefano Babic ldr r4, =ESDCTL_DDR2_EMR3 311eae4988bSStefano Babic strb r3, [r1, r4] 312eae4988bSStefano Babic ldr r4, =ESDCTL_DDR2_EN_DLL 313eae4988bSStefano Babic strb r3, [r1, r4] 314eae4988bSStefano Babic ldr r4, =ESDCTL_DDR2_RESET_DLL 315eae4988bSStefano Babic strb r3, [r1, r4] 316eae4988bSStefano Babic 317eae4988bSStefano Babic ldr r3, =ESDCTL_0x92220000 318eae4988bSStefano Babic strlo r3, [r0, #0x0] 319eae4988bSStefano Babic strhs r3, [r0, #0x8] 320eae4988bSStefano Babic mov r3, #0xDA 321eae4988bSStefano Babic ldr r4, =ESDCTL_PRECHARGE 322eae4988bSStefano Babic strb r3, [r1, r4] 323eae4988bSStefano Babic 324eae4988bSStefano Babicskip_set_mode: 325eae4988bSStefano Babic cmp r1, #CSD1_BASE_ADDR 326eae4988bSStefano Babic ldr r3, =ESDCTL_0xA2220000 327eae4988bSStefano Babic strlo r3, [r0, #0x0] 328eae4988bSStefano Babic strhs r3, [r0, #0x8] 329eae4988bSStefano Babic mov r3, #0xDA 330eae4988bSStefano Babic strb r3, [r1] 331eae4988bSStefano Babic strb r3, [r1] 332eae4988bSStefano Babic 333eae4988bSStefano Babic ldr r3, =ESDCTL_0xB2220000 334eae4988bSStefano Babic strlo r3, [r0, #0x0] 335eae4988bSStefano Babic strhs r3, [r0, #0x8] 336eae4988bSStefano Babic tst r2, #0x1 337eae4988bSStefano Babic ldreq r4, =ESDCTL_DDR2_MR 338eae4988bSStefano Babic ldrne r4, =ESDCTL_MDDR_MR 339eae4988bSStefano Babic mov r3, #0xDA 340eae4988bSStefano Babic strb r3, [r1, r4] 341eae4988bSStefano Babic ldreq r4, =ESDCTL_DDR2_OCD_DEFAULT 342eae4988bSStefano Babic streqb r3, [r1, r4] 343eae4988bSStefano Babic ldreq r4, =ESDCTL_DDR2_EN_DLL 344eae4988bSStefano Babic ldrne r4, =ESDCTL_MDDR_EMR 345eae4988bSStefano Babic strb r3, [r1, r4] 346eae4988bSStefano Babic 347eae4988bSStefano Babic cmp r1, #CSD1_BASE_ADDR 348eae4988bSStefano Babic ldr r3, =ESDCTL_0x82228080 349eae4988bSStefano Babic strlo r3, [r0, #0x0] 350eae4988bSStefano Babic strhs r3, [r0, #0x8] 351eae4988bSStefano Babic 352eae4988bSStefano Babic tst r2, #0x1 353eae4988bSStefano Babic moveq r4, #0x20000 354eae4988bSStefano Babic movne r4, #0x200 355eae4988bSStefano Babic1: subs r4, r4, #1 356eae4988bSStefano Babic bne 1b 357eae4988bSStefano Babic 358eae4988bSStefano Babic str r3, [r1, #0x100] 359eae4988bSStefano Babic ldr r4, [r1, #0x100] 360eae4988bSStefano Babic cmp r3, r4 361eae4988bSStefano Babic movne r3, #1 362eae4988bSStefano Babic moveq r3, #0 363eae4988bSStefano Babic 364eae4988bSStefano Babic mov pc, lr 365