1*576afd4fSJean-Christophe PLAGNIOL-VILLARD/* 2*576afd4fSJean-Christophe PLAGNIOL-VILLARD * Board specific setup info 3*576afd4fSJean-Christophe PLAGNIOL-VILLARD * 4*576afd4fSJean-Christophe PLAGNIOL-VILLARD * (C) Copyright 2004, ARM Ltd. 5*576afd4fSJean-Christophe PLAGNIOL-VILLARD * Philippe Robin, <philippe.robin@arm.com> 6*576afd4fSJean-Christophe PLAGNIOL-VILLARD * 7*576afd4fSJean-Christophe PLAGNIOL-VILLARD * See file CREDITS for list of people who contributed to this 8*576afd4fSJean-Christophe PLAGNIOL-VILLARD * project. 9*576afd4fSJean-Christophe PLAGNIOL-VILLARD * 10*576afd4fSJean-Christophe PLAGNIOL-VILLARD * This program is free software; you can redistribute it and/or 11*576afd4fSJean-Christophe PLAGNIOL-VILLARD * modify it under the terms of the GNU General Public License as 12*576afd4fSJean-Christophe PLAGNIOL-VILLARD * published by the Free Software Foundation; either version 2 of 13*576afd4fSJean-Christophe PLAGNIOL-VILLARD * the License, or (at your option) any later version. 14*576afd4fSJean-Christophe PLAGNIOL-VILLARD * 15*576afd4fSJean-Christophe PLAGNIOL-VILLARD * This program is distributed in the hope that it will be useful, 16*576afd4fSJean-Christophe PLAGNIOL-VILLARD * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*576afd4fSJean-Christophe PLAGNIOL-VILLARD * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*576afd4fSJean-Christophe PLAGNIOL-VILLARD * GNU General Public License for more details. 19*576afd4fSJean-Christophe PLAGNIOL-VILLARD * 20*576afd4fSJean-Christophe PLAGNIOL-VILLARD * You should have received a copy of the GNU General Public License 21*576afd4fSJean-Christophe PLAGNIOL-VILLARD * along with this program; if not, write to the Free Software 22*576afd4fSJean-Christophe PLAGNIOL-VILLARD * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 23*576afd4fSJean-Christophe PLAGNIOL-VILLARD * MA 02111-1307 USA 24*576afd4fSJean-Christophe PLAGNIOL-VILLARD */ 25*576afd4fSJean-Christophe PLAGNIOL-VILLARD 26*576afd4fSJean-Christophe PLAGNIOL-VILLARD#include <config.h> 27*576afd4fSJean-Christophe PLAGNIOL-VILLARD#include <version.h> 28*576afd4fSJean-Christophe PLAGNIOL-VILLARD 29*576afd4fSJean-Christophe PLAGNIOL-VILLARD /* Reset using CM control register */ 30*576afd4fSJean-Christophe PLAGNIOL-VILLARD.global reset_cpu 31*576afd4fSJean-Christophe PLAGNIOL-VILLARDreset_cpu: 32*576afd4fSJean-Christophe PLAGNIOL-VILLARD mov r0, #CM_BASE 33*576afd4fSJean-Christophe PLAGNIOL-VILLARD ldr r1,[r0,#OS_CTRL] 34*576afd4fSJean-Christophe PLAGNIOL-VILLARD orr r1,r1,#CMMASK_RESET 35*576afd4fSJean-Christophe PLAGNIOL-VILLARD str r1,[r0,#OS_CTRL] 36*576afd4fSJean-Christophe PLAGNIOL-VILLARD 37*576afd4fSJean-Christophe PLAGNIOL-VILLARDreset_failed: 38*576afd4fSJean-Christophe PLAGNIOL-VILLARD b reset_failed 39*576afd4fSJean-Christophe PLAGNIOL-VILLARD 40*576afd4fSJean-Christophe PLAGNIOL-VILLARD/* Set up the platform, once the cpu has been initialized */ 41*576afd4fSJean-Christophe PLAGNIOL-VILLARD.globl lowlevel_init 42*576afd4fSJean-Christophe PLAGNIOL-VILLARDlowlevel_init: 43*576afd4fSJean-Christophe PLAGNIOL-VILLARD /* If U-Boot has been run after the ARM boot monitor 44*576afd4fSJean-Christophe PLAGNIOL-VILLARD * then all the necessary actions have been done 45*576afd4fSJean-Christophe PLAGNIOL-VILLARD * otherwise we are running from user flash mapped to 0x00000000 46*576afd4fSJean-Christophe PLAGNIOL-VILLARD * --- DO NOT REMAP BEFORE THE CODE HAS BEEN RELOCATED -- 47*576afd4fSJean-Christophe PLAGNIOL-VILLARD * Changes to the (possibly soft) reset defaults of the processor 48*576afd4fSJean-Christophe PLAGNIOL-VILLARD * itself should be performed in cpu/arm<>/start.S 49*576afd4fSJean-Christophe PLAGNIOL-VILLARD * This function affects only the core module or board settings 50*576afd4fSJean-Christophe PLAGNIOL-VILLARD */ 51*576afd4fSJean-Christophe PLAGNIOL-VILLARD 52*576afd4fSJean-Christophe PLAGNIOL-VILLARD#ifdef CONFIG_CM_INIT 53*576afd4fSJean-Christophe PLAGNIOL-VILLARD /* CM has an initialization register 54*576afd4fSJean-Christophe PLAGNIOL-VILLARD * - bits in it are wired into test-chip pins to force 55*576afd4fSJean-Christophe PLAGNIOL-VILLARD * reset defaults 56*576afd4fSJean-Christophe PLAGNIOL-VILLARD * - may need to change its contents for U-Boot 57*576afd4fSJean-Christophe PLAGNIOL-VILLARD */ 58*576afd4fSJean-Christophe PLAGNIOL-VILLARD 59*576afd4fSJean-Christophe PLAGNIOL-VILLARD /* set the desired CM specific value */ 60*576afd4fSJean-Christophe PLAGNIOL-VILLARD mov r2,#CMMASK_LOWVEC /* Vectors at 0x00000000 for all */ 61*576afd4fSJean-Christophe PLAGNIOL-VILLARD 62*576afd4fSJean-Christophe PLAGNIOL-VILLARD#if defined (CONFIG_CM10200E) || defined (CONFIG_CM10220E) 63*576afd4fSJean-Christophe PLAGNIOL-VILLARD orr r2,r2,#CMMASK_INIT_102 64*576afd4fSJean-Christophe PLAGNIOL-VILLARD#else 65*576afd4fSJean-Christophe PLAGNIOL-VILLARD 66*576afd4fSJean-Christophe PLAGNIOL-VILLARD#if !defined (CONFIG_CM920T) && !defined (CONFIG_CM920T_ETM) && \ 67*576afd4fSJean-Christophe PLAGNIOL-VILLARD !defined (CONFIG_CM940T) 68*576afd4fSJean-Christophe PLAGNIOL-VILLARD 69*576afd4fSJean-Christophe PLAGNIOL-VILLARD#ifdef CONFIG_CM_MULTIPLE_SSRAM 70*576afd4fSJean-Christophe PLAGNIOL-VILLARD /* set simple mapping */ 71*576afd4fSJean-Christophe PLAGNIOL-VILLARD and r2,r2,#CMMASK_MAP_SIMPLE 72*576afd4fSJean-Christophe PLAGNIOL-VILLARD#endif /* #ifdef CONFIG_CM_MULTIPLE_SSRAM */ 73*576afd4fSJean-Christophe PLAGNIOL-VILLARD 74*576afd4fSJean-Christophe PLAGNIOL-VILLARD#ifdef CONFIG_CM_TCRAM 75*576afd4fSJean-Christophe PLAGNIOL-VILLARD /* disable TCRAM */ 76*576afd4fSJean-Christophe PLAGNIOL-VILLARD and r2,r2,#CMMASK_TCRAM_DISABLE 77*576afd4fSJean-Christophe PLAGNIOL-VILLARD#endif /* #ifdef CONFIG_CM_TCRAM */ 78*576afd4fSJean-Christophe PLAGNIOL-VILLARD 79*576afd4fSJean-Christophe PLAGNIOL-VILLARD#if defined (CONFIG_CM926EJ_S) || defined (CONFIG_CM1026EJ_S) || \ 80*576afd4fSJean-Christophe PLAGNIOL-VILLARD defined (CONFIG_CM1136JF_S) 81*576afd4fSJean-Christophe PLAGNIOL-VILLARD 82*576afd4fSJean-Christophe PLAGNIOL-VILLARD and r2,r2,#CMMASK_LE 83*576afd4fSJean-Christophe PLAGNIOL-VILLARD 84*576afd4fSJean-Christophe PLAGNIOL-VILLARD#endif /* cpu with little endian initialization */ 85*576afd4fSJean-Christophe PLAGNIOL-VILLARD 86*576afd4fSJean-Christophe PLAGNIOL-VILLARD orr r2,r2,#CMMASK_CMxx6_COMMON 87*576afd4fSJean-Christophe PLAGNIOL-VILLARD 88*576afd4fSJean-Christophe PLAGNIOL-VILLARD#endif /* CMxx6 code */ 89*576afd4fSJean-Christophe PLAGNIOL-VILLARD 90*576afd4fSJean-Christophe PLAGNIOL-VILLARD#endif /* ARM102xxE value */ 91*576afd4fSJean-Christophe PLAGNIOL-VILLARD 92*576afd4fSJean-Christophe PLAGNIOL-VILLARD /* read CM_INIT */ 93*576afd4fSJean-Christophe PLAGNIOL-VILLARD mov r0, #CM_BASE 94*576afd4fSJean-Christophe PLAGNIOL-VILLARD ldr r1, [r0, #OS_INIT] 95*576afd4fSJean-Christophe PLAGNIOL-VILLARD /* check against desired bit setting */ 96*576afd4fSJean-Christophe PLAGNIOL-VILLARD and r3,r1,r2 97*576afd4fSJean-Christophe PLAGNIOL-VILLARD cmp r3,r2 98*576afd4fSJean-Christophe PLAGNIOL-VILLARD beq init_reg_OK 99*576afd4fSJean-Christophe PLAGNIOL-VILLARD 100*576afd4fSJean-Christophe PLAGNIOL-VILLARD /* lock for change */ 101*576afd4fSJean-Christophe PLAGNIOL-VILLARD mov r3, #CMVAL_LOCK1 102*576afd4fSJean-Christophe PLAGNIOL-VILLARD add r3,r3,#CMVAL_LOCK2 103*576afd4fSJean-Christophe PLAGNIOL-VILLARD str r3, [r0, #OS_LOCK] 104*576afd4fSJean-Christophe PLAGNIOL-VILLARD /* set desired value */ 105*576afd4fSJean-Christophe PLAGNIOL-VILLARD orr r1,r1,r2 106*576afd4fSJean-Christophe PLAGNIOL-VILLARD /* write & relock CM_INIT */ 107*576afd4fSJean-Christophe PLAGNIOL-VILLARD str r1, [r0, #OS_INIT] 108*576afd4fSJean-Christophe PLAGNIOL-VILLARD mov r1, #CMVAL_UNLOCK 109*576afd4fSJean-Christophe PLAGNIOL-VILLARD str r1, [r0, #OS_LOCK] 110*576afd4fSJean-Christophe PLAGNIOL-VILLARD 111*576afd4fSJean-Christophe PLAGNIOL-VILLARD /* soft reset so new values used */ 112*576afd4fSJean-Christophe PLAGNIOL-VILLARD b reset_cpu 113*576afd4fSJean-Christophe PLAGNIOL-VILLARD 114*576afd4fSJean-Christophe PLAGNIOL-VILLARDinit_reg_OK: 115*576afd4fSJean-Christophe PLAGNIOL-VILLARD 116*576afd4fSJean-Christophe PLAGNIOL-VILLARD#endif /* CONFIG_CM_INIT */ 117*576afd4fSJean-Christophe PLAGNIOL-VILLARD 118*576afd4fSJean-Christophe PLAGNIOL-VILLARD mov pc, lr 119*576afd4fSJean-Christophe PLAGNIOL-VILLARD 120*576afd4fSJean-Christophe PLAGNIOL-VILLARD#ifdef CONFIG_CM_SPD_DETECT 121*576afd4fSJean-Christophe PLAGNIOL-VILLARD /* Fast memory is available for the DRAM data 122*576afd4fSJean-Christophe PLAGNIOL-VILLARD * - ensure it has been transferred, then summarize the data 123*576afd4fSJean-Christophe PLAGNIOL-VILLARD * into a CM register 124*576afd4fSJean-Christophe PLAGNIOL-VILLARD */ 125*576afd4fSJean-Christophe PLAGNIOL-VILLARD.globl dram_query 126*576afd4fSJean-Christophe PLAGNIOL-VILLARDdram_query: 127*576afd4fSJean-Christophe PLAGNIOL-VILLARD stmfd r13!,{r4-r6,lr} 128*576afd4fSJean-Christophe PLAGNIOL-VILLARD /* set up SDRAM info */ 129*576afd4fSJean-Christophe PLAGNIOL-VILLARD /* - based on example code from the CM User Guide */ 130*576afd4fSJean-Christophe PLAGNIOL-VILLARD mov r0, #CM_BASE 131*576afd4fSJean-Christophe PLAGNIOL-VILLARD 132*576afd4fSJean-Christophe PLAGNIOL-VILLARDreadspdbit: 133*576afd4fSJean-Christophe PLAGNIOL-VILLARD ldr r1, [r0, #OS_SDRAM] /* read the SDRAM register */ 134*576afd4fSJean-Christophe PLAGNIOL-VILLARD and r1, r1, #0x20 /* mask SPD bit (5) */ 135*576afd4fSJean-Christophe PLAGNIOL-VILLARD cmp r1, #0x20 /* test if set */ 136*576afd4fSJean-Christophe PLAGNIOL-VILLARD bne readspdbit 137*576afd4fSJean-Christophe PLAGNIOL-VILLARD 138*576afd4fSJean-Christophe PLAGNIOL-VILLARDsetupsdram: 139*576afd4fSJean-Christophe PLAGNIOL-VILLARD add r0, r0, #OS_SPD /* address the copy of the SDP data */ 140*576afd4fSJean-Christophe PLAGNIOL-VILLARD ldrb r1, [r0, #3] /* number of row address lines */ 141*576afd4fSJean-Christophe PLAGNIOL-VILLARD ldrb r2, [r0, #4] /* number of column address lines */ 142*576afd4fSJean-Christophe PLAGNIOL-VILLARD ldrb r3, [r0, #5] /* number of banks */ 143*576afd4fSJean-Christophe PLAGNIOL-VILLARD ldrb r4, [r0, #31] /* module bank density */ 144*576afd4fSJean-Christophe PLAGNIOL-VILLARD mul r5, r4, r3 /* size of SDRAM (MB divided by 4) */ 145*576afd4fSJean-Christophe PLAGNIOL-VILLARD mov r5, r5, ASL#2 /* size in MB */ 146*576afd4fSJean-Christophe PLAGNIOL-VILLARD mov r0, #CM_BASE /* reload for later code */ 147*576afd4fSJean-Christophe PLAGNIOL-VILLARD cmp r5, #0x10 /* is it 16MB? */ 148*576afd4fSJean-Christophe PLAGNIOL-VILLARD bne not16 149*576afd4fSJean-Christophe PLAGNIOL-VILLARD mov r6, #0x2 /* store size and CAS latency of 2 */ 150*576afd4fSJean-Christophe PLAGNIOL-VILLARD b writesize 151*576afd4fSJean-Christophe PLAGNIOL-VILLARD 152*576afd4fSJean-Christophe PLAGNIOL-VILLARDnot16: 153*576afd4fSJean-Christophe PLAGNIOL-VILLARD cmp r5, #0x20 /* is it 32MB? */ 154*576afd4fSJean-Christophe PLAGNIOL-VILLARD bne not32 155*576afd4fSJean-Christophe PLAGNIOL-VILLARD mov r6, #0x6 156*576afd4fSJean-Christophe PLAGNIOL-VILLARD b writesize 157*576afd4fSJean-Christophe PLAGNIOL-VILLARD 158*576afd4fSJean-Christophe PLAGNIOL-VILLARDnot32: 159*576afd4fSJean-Christophe PLAGNIOL-VILLARD cmp r5, #0x40 /* is it 64MB? */ 160*576afd4fSJean-Christophe PLAGNIOL-VILLARD bne not64 161*576afd4fSJean-Christophe PLAGNIOL-VILLARD mov r6, #0xa 162*576afd4fSJean-Christophe PLAGNIOL-VILLARD b writesize 163*576afd4fSJean-Christophe PLAGNIOL-VILLARD 164*576afd4fSJean-Christophe PLAGNIOL-VILLARDnot64: 165*576afd4fSJean-Christophe PLAGNIOL-VILLARD cmp r5, #0x80 /* is it 128MB? */ 166*576afd4fSJean-Christophe PLAGNIOL-VILLARD bne not128 167*576afd4fSJean-Christophe PLAGNIOL-VILLARD mov r6, #0xe 168*576afd4fSJean-Christophe PLAGNIOL-VILLARD b writesize 169*576afd4fSJean-Christophe PLAGNIOL-VILLARD 170*576afd4fSJean-Christophe PLAGNIOL-VILLARDnot128: 171*576afd4fSJean-Christophe PLAGNIOL-VILLARD /* if it is none of these sizes then it is either 256MB, or 172*576afd4fSJean-Christophe PLAGNIOL-VILLARD * there is no SDRAM fitted so default to 256MB 173*576afd4fSJean-Christophe PLAGNIOL-VILLARD */ 174*576afd4fSJean-Christophe PLAGNIOL-VILLARD mov r6, #0x12 175*576afd4fSJean-Christophe PLAGNIOL-VILLARD 176*576afd4fSJean-Christophe PLAGNIOL-VILLARDwritesize: 177*576afd4fSJean-Christophe PLAGNIOL-VILLARD mov r1, r1, ASL#8 /* row addr lines from SDRAM reg */ 178*576afd4fSJean-Christophe PLAGNIOL-VILLARD orr r2, r1, r2, ASL#12 /* OR in column address lines */ 179*576afd4fSJean-Christophe PLAGNIOL-VILLARD orr r3, r2, r3, ASL#16 /* OR in number of banks */ 180*576afd4fSJean-Christophe PLAGNIOL-VILLARD orr r6, r6, r3 /* OR in size and CAS latency */ 181*576afd4fSJean-Christophe PLAGNIOL-VILLARD str r6, [r0, #OS_SDRAM] /* store SDRAM parameters */ 182*576afd4fSJean-Christophe PLAGNIOL-VILLARD 183*576afd4fSJean-Christophe PLAGNIOL-VILLARD#endif /* #ifdef CONFIG_CM_SPD_DETECT */ 184*576afd4fSJean-Christophe PLAGNIOL-VILLARD 185*576afd4fSJean-Christophe PLAGNIOL-VILLARD ldmfd r13!,{r4-r6,pc} /* back to caller */ 186*576afd4fSJean-Christophe PLAGNIOL-VILLARD 187*576afd4fSJean-Christophe PLAGNIOL-VILLARD#ifdef CONFIG_CM_REMAP 188*576afd4fSJean-Christophe PLAGNIOL-VILLARD /* CM remap bit is operational 189*576afd4fSJean-Christophe PLAGNIOL-VILLARD * - use it to map writeable memory at 0x00000000, in place of flash 190*576afd4fSJean-Christophe PLAGNIOL-VILLARD */ 191*576afd4fSJean-Christophe PLAGNIOL-VILLARD.globl cm_remap 192*576afd4fSJean-Christophe PLAGNIOL-VILLARDcm_remap: 193*576afd4fSJean-Christophe PLAGNIOL-VILLARD stmfd r13!,{r4-r10,lr} 194*576afd4fSJean-Christophe PLAGNIOL-VILLARD 195*576afd4fSJean-Christophe PLAGNIOL-VILLARD mov r0, #CM_BASE 196*576afd4fSJean-Christophe PLAGNIOL-VILLARD ldr r1, [r0, #OS_CTRL] 197*576afd4fSJean-Christophe PLAGNIOL-VILLARD orr r1, r1, #CMMASK_REMAP /* set remap and led bits */ 198*576afd4fSJean-Christophe PLAGNIOL-VILLARD str r1, [r0, #OS_CTRL] 199*576afd4fSJean-Christophe PLAGNIOL-VILLARD 200*576afd4fSJean-Christophe PLAGNIOL-VILLARD /* Now 0x00000000 is writeable, replace the vectors */ 201*576afd4fSJean-Christophe PLAGNIOL-VILLARD ldr r0, =_start /* r0 <- start of vectors */ 202*576afd4fSJean-Christophe PLAGNIOL-VILLARD ldr r2, =_armboot_start /* r2 <- past vectors */ 203*576afd4fSJean-Christophe PLAGNIOL-VILLARD sub r1,r1,r1 /* destination 0x00000000 */ 204*576afd4fSJean-Christophe PLAGNIOL-VILLARD 205*576afd4fSJean-Christophe PLAGNIOL-VILLARDcopy_vec: 206*576afd4fSJean-Christophe PLAGNIOL-VILLARD ldmia r0!, {r3-r10} /* copy from source address [r0] */ 207*576afd4fSJean-Christophe PLAGNIOL-VILLARD stmia r1!, {r3-r10} /* copy to target address [r1] */ 208*576afd4fSJean-Christophe PLAGNIOL-VILLARD cmp r0, r2 /* until source end address [r2] */ 209*576afd4fSJean-Christophe PLAGNIOL-VILLARD ble copy_vec 210*576afd4fSJean-Christophe PLAGNIOL-VILLARD 211*576afd4fSJean-Christophe PLAGNIOL-VILLARD ldmfd r13!,{r4-r10,pc} /* back to caller */ 212*576afd4fSJean-Christophe PLAGNIOL-VILLARD 213*576afd4fSJean-Christophe PLAGNIOL-VILLARD#endif /* #ifdef CONFIG_CM_REMAP */ 214