ocf: update to version 20120127
[15.05/openwrt.git] / target / linux / generic / files / crypto / ocf / kirkwood / mvHal / mv_hal / ddr2 / mvDramIfBasicInit.S
diff --git a/target/linux/generic/files/crypto/ocf/kirkwood/mvHal/mv_hal/ddr2/mvDramIfBasicInit.S b/target/linux/generic/files/crypto/ocf/kirkwood/mvHal/mv_hal/ddr2/mvDramIfBasicInit.S
new file mode 100644 (file)
index 0000000..7672381
--- /dev/null
@@ -0,0 +1,986 @@
+/*******************************************************************************
+Copyright (C) Marvell International Ltd. and its affiliates
+
+This software file (the "File") is owned and distributed by Marvell
+International Ltd. and/or its affiliates ("Marvell") under the following
+alternative licensing terms.  Once you have made an election to distribute the
+File under one of the following license alternatives, please (i) delete this
+introductory statement regarding license alternatives, (ii) delete the two
+license alternatives that you have not elected to use and (iii) preserve the
+Marvell copyright notice above.
+
+********************************************************************************
+Marvell Commercial License Option
+
+If you received this File from Marvell and you have entered into a commercial
+license agreement (a "Commercial License") with Marvell, the File is licensed
+to you under the terms of the applicable Commercial License.
+
+********************************************************************************
+Marvell GPL License Option
+
+If you received this File from Marvell, you may opt to use, redistribute and/or
+modify this File in accordance with the terms and conditions of the General
+Public License Version 2, June 1991 (the "GPL License"), a copy of which is
+available along with the File in the license.txt file or by writing to the Free
+Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
+on the worldwide web at http://www.gnu.org/licenses/gpl.txt.
+
+THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
+WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
+DISCLAIMED.  The GPL License provides additional details about this warranty
+disclaimer.
+********************************************************************************
+Marvell BSD License Option
+
+If you received this File from Marvell, you may opt to use, redistribute and/or
+modify this File under the following licensing terms.
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    *   Redistributions of source code must retain the above copyright notice,
+           this list of conditions and the following disclaimer.
+
+    *   Redistributions in binary form must reproduce the above copyright
+        notice, this list of conditions and the following disclaimer in the
+        documentation and/or other materials provided with the distribution.
+
+    *   Neither the name of Marvell nor the names of its contributors may be
+        used to endorse or promote products derived from this software without
+        specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*******************************************************************************/
+
+#define        _ASMLANGUAGE
+#define MV_ASMLANGUAGE
+#include "mvSysHwConfig.h"
+#include "mvOsAsm.h"
+#include "boardEnv/mvBoardEnvSpec.h"
+#include "ctrlEnv/sys/mvCpuIfRegs.h"
+#include "mvDramIfConfig.h"
+#include "mvDramIfRegs.h"
+#include "pex/mvPexRegs.h"
+#include "ctrlEnv/mvCtrlEnvSpec.h"
+#include "ctrlEnv/mvCtrlEnvAsm.h"
+#include "mvCommon.h"
+
+/* defines */
+
+#if defined(MV_STATIC_DRAM_ON_BOARD) 
+.globl dramBoot1
+dramBoot1:
+        .word   0
+
+/******************************************************************************
+*
+*
+*
+*
+*******************************************************************************/
+#if defined(DB_MV78XX0) || defined(DB_MV88F632X)
+/* DDR2 boards 512MB 333MHz */
+#define STATIC_SDRAM0_BANK0_SIZE               0x1ffffff1 /*   0x1504  */ 
+#define STATIC_SDRAM_CONFIG                    0x43048C30 /*   0x1400  */      
+#define STATIC_SDRAM_MODE                      0x00000652 /*   0x141c  */      
+#define STATIC_DUNIT_CTRL_LOW                  0x38543000 /*   0x1404  */  
+#define STATIC_DUNIT_CTRL_HI                   0x0000FFFF /*   0x1424  */  
+#define STATIC_SDRAM_ADDR_CTRL                 0x00000088 /*   0x1410  */  
+#define STATIC_SDRAM_TIME_CTRL_LOW             0x22125441 /*   0x1408  */  
+#define STATIC_SDRAM_TIME_CTRL_HI              0x00000A29 /*   0x140c  */  
+#define STATIC_SDRAM_ODT_CTRL_LOW              0x84210000 /*   0x1494  */  
+#define STATIC_SDRAM_ODT_CTRL_HI               0x00000000 /*   0x1498  */  
+#define STATIC_SDRAM_DUNIT_ODT_CTRL                    0x0000E80F /*   0x149c  */  
+#define STATIC_SDRAM_EXT_MODE                          0x00000040 /*   0x1420  */  
+#define STATIC_SDRAM_DDR2_TIMING_LO            0x00085520 /*   0x1428  */  
+#define STATIC_SDRAM_DDR2_TIMING_HI            0x00008552 /*   0x147C  */  
+
+#elif defined(RD_MV78XX0_AMC)
+/* On board DDR2 512MB 400MHz CL5 */
+#define STATIC_SDRAM0_BANK0_SIZE               0x1ffffff1 /*   0x1504  */ 
+#define STATIC_SDRAM_CONFIG                    0x43008C30 /*   0x1400  */      
+#define STATIC_SDRAM_MODE                      0x00000652 /*   0x141c  */      
+#define STATIC_DUNIT_CTRL_LOW                  0x38543000 /*   0x1404  */  
+#define STATIC_DUNIT_CTRL_HI                   0x0000F07F /*   0x1424  */  
+#define STATIC_SDRAM_ADDR_CTRL                 0x000000DD /*   0x1410  */  
+#define STATIC_SDRAM_TIME_CTRL_LOW             0x23135441 /*   0x1408  */  
+#define STATIC_SDRAM_TIME_CTRL_HI              0x00000A32 /*   0x140c  */  
+#define STATIC_SDRAM_ODT_CTRL_LOW              0x84210000 /*   0x1494  */  
+#define STATIC_SDRAM_ODT_CTRL_HI               0x00000000 /*   0x1498  */  
+#define STATIC_SDRAM_DUNIT_ODT_CTRL                    0x0000EB0F /*   0x149c  */  
+#define STATIC_SDRAM_EXT_MODE                          0x00000040 /*   0x1420  */  
+#define STATIC_SDRAM_DDR2_TIMING_LO            0x00085520 /*   0x1428  */  
+#define STATIC_SDRAM_DDR2_TIMING_HI            0x00008552 /*   0x147C  */  
+
+#elif defined(RD_MV78XX0_H3C)
+/* DDR2 boards 512MB 333MHz */
+#define STATIC_SDRAM0_BANK0_SIZE               0x1ffffff1 /*   0x1504  */ 
+#define STATIC_SDRAM_CONFIG                    0x43048a25 /*   0x1400  */      
+#define STATIC_SDRAM_MODE                      0x00000652 /*   0x141c  */      
+#define STATIC_DUNIT_CTRL_LOW                  0x38543000 /*   0x1404  */  
+#define STATIC_DUNIT_CTRL_HI                   0x0000F07F /*   0x1424  */  
+#define STATIC_SDRAM_ADDR_CTRL                 0x00000088 /*   0x1410  */  
+#define STATIC_SDRAM_TIME_CTRL_LOW             0x2202444e /*   0x1408  */  
+#define STATIC_SDRAM_TIME_CTRL_HI              0x00000A22 /*   0x140c  */  
+#define STATIC_SDRAM_ODT_CTRL_LOW              0x84210000 /*   0x1494  */  
+#define STATIC_SDRAM_ODT_CTRL_HI               0x00000000 /*   0x1498  */  
+#define STATIC_SDRAM_DUNIT_ODT_CTRL                    0x0000EB0F /*   0x149c  */  
+#define STATIC_SDRAM_EXT_MODE                          0x00000040 /*   0x1420  */  
+#define STATIC_SDRAM_DDR2_TIMING_LO            0x00085520 /*   0x1428  */  
+#define STATIC_SDRAM_DDR2_TIMING_HI            0x00008552 /*   0x147C  */  
+
+#elif defined(RD_MV78XX0_PCAC)
+/* DDR2 boards 256MB 200MHz */
+#define STATIC_SDRAM0_BANK0_SIZE               0x0ffffff1 /*   0x1504  */ 
+#define STATIC_SDRAM_CONFIG                    0x43000a25 /*   0x1400  */      
+#define STATIC_SDRAM_MODE                      0x00000652 /*   0x141c  */      
+#define STATIC_DUNIT_CTRL_LOW                  0x38543000 /*   0x1404  */  
+#define STATIC_DUNIT_CTRL_HI                   0x0000F07F /*   0x1424  */  
+#define STATIC_SDRAM_ADDR_CTRL                 0x000000DD /*   0x1410  */  
+#define STATIC_SDRAM_TIME_CTRL_LOW             0x2202444e /*   0x1408  */  
+#define STATIC_SDRAM_TIME_CTRL_HI              0x00000822 /*   0x140c  */  
+#define STATIC_SDRAM_ODT_CTRL_LOW              0x84210000 /*   0x1494  */  
+#define STATIC_SDRAM_ODT_CTRL_HI               0x00000000 /*   0x1498  */  
+#define STATIC_SDRAM_DUNIT_ODT_CTRL                    0x0000EB0F /*   0x149c  */  
+#define STATIC_SDRAM_EXT_MODE                          0x00000040 /*   0x1420  */  
+#define STATIC_SDRAM_DDR2_TIMING_LO            0x00085520 /*   0x1428  */  
+#define STATIC_SDRAM_DDR2_TIMING_HI            0x00008552 /*   0x147C  */  
+
+#else
+/* DDR2 MV88F6281 boards 256MB 400MHz */
+#define STATIC_SDRAM0_BANK0_SIZE               0x0FFFFFF1 /*   0x1504  */ 
+#define STATIC_SDRAM_CONFIG                    0x43000c30 /*   0x1400  */      
+#define STATIC_SDRAM_MODE                      0x00000C52 /*   0x141c  */      
+#define STATIC_DUNIT_CTRL_LOW                  0x39543000 /*   0x1404  */  
+#define STATIC_DUNIT_CTRL_HI                   0x0000F1FF /*   0x1424  */  
+#define STATIC_SDRAM_ADDR_CTRL                 0x000000cc /*   0x1410  */  
+#define STATIC_SDRAM_TIME_CTRL_LOW             0x22125451 /*   0x1408  */  
+#define STATIC_SDRAM_TIME_CTRL_HI              0x00000A33 /*   0x140c  */  
+#define STATIC_SDRAM_ODT_CTRL_LOW              0x003C0000 /*   0x1494  */  
+#define STATIC_SDRAM_ODT_CTRL_HI               0x00000000 /*   0x1498  */  
+#define STATIC_SDRAM_DUNIT_ODT_CTRL                    0x0000F80F /*   0x149c  */  
+#define STATIC_SDRAM_EXT_MODE                          0x00000042 /*   0x1420  */  
+#define STATIC_SDRAM_DDR2_TIMING_LO            0x00085520 /*   0x1428  */  
+#define STATIC_SDRAM_DDR2_TIMING_HI            0x00008552 /*   0x147C  */  
+#endif /* MV78XX0 */
+
+       .globl _mvDramIfStaticInit
+_mvDramIfStaticInit:
+
+       mov     r11, LR                 /* Save link register */
+       mov     r10, r2
+
+#ifdef MV78XX0
+        MV_REG_READ_ASM (r6, r5, SDRAM_DUNIT_CTRL_REG)
+       orr     r6, r6, #BIT4   /* Enable 2T mode */
+       bic     r6, r6, #BIT6   /* clear ctrlPos */
+        MV_REG_WRITE_ASM (r6, r5, SDRAM_DUNIT_CTRL_REG)
+#endif
+
+       /*DDR SDRAM Initialization Control */
+       ldr     r6, =DSICR_INIT_EN
+       MV_REG_WRITE_ASM (r6, r1, DDR_SDRAM_INIT_CTRL_REG)
+2:     MV_REG_READ_ASM (r6, r1, DDR_SDRAM_INIT_CTRL_REG)
+         and    r6, r6, #DSICR_INIT_EN
+         cmp    r6, #0
+         bne 2b
+
+        /* If we boot from NAND jump to DRAM address */
+        mov     r5, #1
+        ldr     r6, =dramBoot1
+        str     r5, [r6]                /* We started executing from DRAM */
+
+        ldr     r6, dramBoot1
+        cmp     r6, #0
+        bne     1f
+
+       /* set all dram windows to 0 */
+       mov     r6, #0
+       MV_REG_WRITE_ASM(r6, r5, SDRAM_SIZE_REG(0,0))
+       MV_REG_WRITE_ASM(r6, r5, SDRAM_SIZE_REG(0,1))
+       MV_REG_WRITE_ASM(r6, r5, SDRAM_SIZE_REG(0,2))
+       MV_REG_WRITE_ASM(r6, r5, SDRAM_SIZE_REG(0,3))
+       ldr     r6, = STATIC_SDRAM0_BANK0_SIZE
+       MV_REG_WRITE_ASM(r6, r5, SDRAM_SIZE_REG(0,0))
+
+
+       /* set all dram configuration in temp registers */
+       ldr     r6, = STATIC_SDRAM0_BANK0_SIZE
+       MV_REG_WRITE_ASM(r6, r5, DRAM_BUF_REG0)
+       ldr     r6, = STATIC_SDRAM_CONFIG
+       MV_REG_WRITE_ASM(r6, r5, DRAM_BUF_REG1)
+       ldr     r6, = STATIC_SDRAM_MODE
+       MV_REG_WRITE_ASM(r6, r5, DRAM_BUF_REG2)
+       ldr     r6, = STATIC_DUNIT_CTRL_LOW
+       MV_REG_WRITE_ASM(r6, r5, DRAM_BUF_REG3)
+       ldr     r6, = STATIC_SDRAM_ADDR_CTRL
+       MV_REG_WRITE_ASM(r6, r5, DRAM_BUF_REG4)
+       ldr     r6, = STATIC_SDRAM_TIME_CTRL_LOW
+       MV_REG_WRITE_ASM(r6, r5, DRAM_BUF_REG5)
+       ldr     r6, = STATIC_SDRAM_TIME_CTRL_HI
+       MV_REG_WRITE_ASM(r6, r5, DRAM_BUF_REG6)
+       ldr     r6, = STATIC_SDRAM_ODT_CTRL_LOW
+       MV_REG_WRITE_ASM(r6, r5, DRAM_BUF_REG7)
+       ldr     r6, = STATIC_SDRAM_ODT_CTRL_HI
+       MV_REG_WRITE_ASM(r6, r5, DRAM_BUF_REG8)
+       ldr     r6, = STATIC_SDRAM_DUNIT_ODT_CTRL
+       MV_REG_WRITE_ASM(r6, r5, DRAM_BUF_REG9)
+       ldr     r6, = STATIC_SDRAM_EXT_MODE
+       MV_REG_WRITE_ASM(r6, r5, DRAM_BUF_REG10)
+       ldr     r6, = STATIC_SDRAM_DDR2_TIMING_LO
+       MV_REG_WRITE_ASM(r6, r5, DRAM_BUF_REG11)
+       ldr     r6, = STATIC_SDRAM_DDR2_TIMING_HI
+       MV_REG_WRITE_ASM(r6, r5, DRAM_BUF_REG12)
+#ifndef MV_NAND_BOOT
+       ldr     r6, = STATIC_DUNIT_CTRL_HI
+       MV_REG_WRITE_ASM(r6, r5, DRAM_BUF_REG13)
+#endif
+
+       ldr     sp,=0
+       bl      _mvDramIfConfig
+       ldr     r0, =0
+#ifdef MV78XX0
+       bl      _mvDramIfEccMemInit 
+#endif
+1:
+       mov     r2, r10
+       mov     PC, r11                 /* r11 is saved link register */
+
+#else  /* #if defined(MV_STATIC_DRAM_ON_BOARD) */
+
+.globl dramBoot1
+dramBoot1:
+        .word   0
+
+/*******************************************************************************
+* mvDramIfBasicInit - Basic initialization of DRAM interface
+*
+* DESCRIPTION:
+*       The function will initialize the DRAM for basic usage. The function
+*       will use the TWSI assembly API to extract DIMM parameters according
+*       to which DRAM interface will be initialized.
+*       The function referes to the following DRAM parameters:
+*       1) DIMM is registered or not.
+*       2) DIMM width detection.
+*       3) DIMM density.
+*
+* INPUT:
+*       r3 - required size for initial DRAM.
+*
+* OUTPUT:
+*       None.
+*
+* RETURN:
+*       None.
+*
+*       Note:
+*       r4 holds I2C EEPROM address
+*       r5 holds SDRAM register base address
+*      r7 holds returned values
+*       r8 holds SDRAM various configuration registers value.
+*       r11 holds return function address.
+*******************************************************************************/
+/* Setting the offsets of the I2C registers */
+#define DIMM_TYPE_OFFSET             2
+#define NUM_OF_ROWS_OFFSET            3
+#define NUM_OF_COLS_OFFSET            4
+#define NUM_OF_RANKS                 5
+#define DIMM_CONFIG_TYPE             11
+#define SDRAM_WIDTH_OFFSET           13
+#define NUM_OF_BANKS_OFFSET          17
+#define SUPPORTED_CL_OFFSET          18
+#define DIMM_TYPE_INFO_OFFSET        20         /* DDR2 only    */
+#define SDRAM_MODULES_ATTR_OFFSET    21
+#define RANK_SIZE_OFFSET             31
+
+#define DRAM_DEV_DENSITY_128M         128
+#define DRAM_DEV_DENSITY_256M         256
+#define DRAM_DEV_DENSITY_512M         512
+#define DRAM_DEV_DENSITY_1G          1024
+#define DRAM_DEV_DENSITY_2G          2048
+
+#define DRAM_RANK_DENSITY_128M       0x20
+#define DRAM_RANK_DENSITY_256M       0x40
+#define DRAM_RANK_DENSITY_512M       0x80
+#define DRAM_RANK_DENSITY_1G        0x1
+#define DRAM_RANK_DENSITY_2G        0x2
+
+       .globl _mvDramIfBasicInit
+       .extern _i2cInit
+_mvDramIfBasicInit:
+
+        mov     r11, LR                /* Save link register */
+
+       /* Set Dunit high control register            */
+        MV_REG_READ_ASM (r6, r5, SDRAM_DUNIT_CTRL_HI_REG)
+       orr     r6, r6, #BIT7 /* SDRAM__D2P_EN */
+       orr     r6, r6, #BIT8 /* SDRAM__P2D_EN */
+#ifdef MV78XX0
+       orr     r6, r6, #BIT9 /* SDRAM__ADD_HALF_FCC_EN */
+       orr     r6, r6, #BIT10 /* SDRAM__PUP_ZERO_SKEW_EN */
+       orr     r6, r6, #BIT11 /* SDRAM__WR_MASH_DELAY_EN */
+#endif
+        MV_REG_WRITE_ASM (r6, r5, SDRAM_DUNIT_CTRL_HI_REG)
+
+#ifdef MV78XX0
+        MV_REG_READ_ASM (r6, r5, SDRAM_DUNIT_CTRL_REG)
+       orr     r6, r6, #BIT4   /* Enable 2T mode */
+       bic     r6, r6, #BIT6   /* clear ctrlPos */
+        MV_REG_WRITE_ASM (r6, r5, SDRAM_DUNIT_CTRL_REG)
+#endif
+
+       /*DDR SDRAM Initialization Control */
+       ldr     r6, =DSICR_INIT_EN
+       MV_REG_WRITE_ASM (r6, r1, DDR_SDRAM_INIT_CTRL_REG)
+2:     MV_REG_READ_ASM (r6, r1, DDR_SDRAM_INIT_CTRL_REG)
+         and    r6, r6, #DSICR_INIT_EN
+         cmp    r6, #0
+         bne 2b
+
+        mov     r5, #1
+        ldr     r8, =dramBoot1
+        str     r5, [r8]                /* We started executing from DRAM */
+
+        /* If we boot from NAND jump to DRAM address */
+        ldr     r8, dramBoot1
+        cmp     r8, #0
+        movne   pc, r11
+
+        bl      _i2cInit                /* Initialize TWSI master             */
+
+        /* Check if we have more then 1 dimm */
+       ldr     r6, =0
+       MV_REG_WRITE_ASM (r6, r1, DRAM_BUF_REG14)
+#ifdef MV78XX0
+       bl _is_Second_Dimm_Exist
+       beq single_dimm
+       ldr     r6, =1
+       MV_REG_WRITE_ASM (r6, r1, DRAM_BUF_REG14)
+single_dimm:
+        bl      _i2cInit                /* Initialize TWSI master             */
+#endif
+
+        /* Get default SDRAM Config values */
+        MV_REG_READ_ASM (r8, r5, SDRAM_CONFIG_REG)
+
+        /* Get registered/non registered info from DIMM */
+       bl      _is_Registered
+        beq     nonRegistered
+
+setRegistered:
+        orr     r8, r8, #SDRAM_REGISTERED   /* Set registered bit(17)         */
+nonRegistered:
+#ifdef MV78XX0
+        /* Get ECC/non ECC info from DIMM */
+       bl      _is_Ecc
+        beq     setConfigReg
+
+setEcc:        
+        orr     r8, r8, #SDRAM_ECC_EN   /* Set ecc bit(18)         */
+#endif
+setConfigReg:
+        MV_REG_WRITE_ASM (r8, r5, DRAM_BUF_REG1)
+
+        /* Set maximum CL supported by DIMM */
+       bl      _get_CAL
+
+        /* r7 is DIMM supported CAS (e.g: 3 --> 0x1C)                         */
+        clz     r6, r7
+        rsb     r6, r6, #31     /* r6 = the bit number of MAX CAS supported   */
+
+casDdr2:
+       ldr     r7, =0x41        /* stBurstInDel|stBurstOutDel field value     */
+       ldr     r3, =0x53       /* stBurstInDel|stBurstOutDel registered value*/
+       ldr     r8, =0x32      /* Assuming MAX CL = 3           */
+        cmp     r6, #3          /* If CL = 3 break              */
+        beq     casDdr2Cont
+
+       ldr     r7, =0x53        /* stBurstInDel|stBurstOutDel field value     */
+       ldr     r3, =0x65       /* stBurstInDel|stBurstOutDel registered value*/
+       ldr     r8, =0x42      /* Assuming MAX CL = 4           */
+        cmp     r6, #4          /* If CL = 4 break              */
+        beq     casDdr2Cont
+
+       ldr     r7, =0x65        /* stBurstInDel|stBurstOutDel field value     */
+       ldr     r3, =0x77       /* stBurstInDel|stBurstOutDel registered value*/
+       ldr     r8, =0x52      /* Assuming MAX CL = 5           */
+        cmp     r6, #5          /* If CL = 5 break              */
+        beq     casDdr2Cont
+
+       ldr     r7, =0x77        /* stBurstInDel|stBurstOutDel field value     */
+       ldr     r3, =0x89       /* stBurstInDel|stBurstOutDel registered value*/
+       ldr     r8, =0x62      /* Assuming MAX CL = 6           */
+        cmp     r6, #6          /* If CL = 5 break              */
+        beq     casDdr2Cont                
+
+        /* This is an error. return */
+        b       exit_ddrAutoConfig      /* This is an error !!  */
+casDdr2Cont:
+
+        /* Get default SDRAM Mode values */
+        MV_REG_READ_ASM (r6, r5, SDRAM_MODE_REG)
+        bic     r6, r6, #(BIT6 | BIT5 | BIT4) /* Clear CL filed */
+       orr     r6, r6, r8
+        MV_REG_WRITE_ASM (r6, r5, DRAM_BUF_REG2)
+
+       /* Set Dunit control register according to max CL detected            */
+        MV_REG_READ_ASM (r6, r5, DRAM_BUF_REG1)
+       tst     r6, #SDRAM_REGISTERED
+       beq     setDunitReg
+       mov     r7, r3
+
+setDunitReg:
+#ifdef MV78XX0
+        /* Set SDRAM Extended Mode register for double DIMM */
+       /* Check DRAM frequency for more then 267MHz set ODT Rtt to 50ohm */
+
+        MV_REG_READ_ASM (r4, r5, CPU_RESET_SAMPLE_L_REG)
+       ldr     r5, =MSAR_SYSCLCK_MASK
+       and     r4, r4, r5      
+       ldr     r5, =MSAR_SYSCLCK_333
+       cmp     r4, r5
+       ble     Clock333
+       add r7, r7, #0x10
+Clock333:
+#endif
+
+        MV_REG_READ_ASM (r6, r5, SDRAM_DUNIT_CTRL_REG)
+       bic     r6, r6, #(0xff << 20) /* Clear SBout and SBin */
+       orr     r6, r6, #BIT4   /* Enable 2T mode */
+       bic     r6, r6, #BIT6   /* clear ctrlPos */
+       orr     r6, r6, r7, LSL #20
+        MV_REG_WRITE_ASM (r6, r5, DRAM_BUF_REG3)
+
+       /* Set Dunit high control register            */
+        MV_REG_READ_ASM (r6, r5, SDRAM_DUNIT_CTRL_HI_REG)
+       orr     r6, r6, #BIT7 /* SDRAM__D2P_EN */
+       orr     r6, r6, #BIT8 /* SDRAM__P2D_EN */
+#ifdef MV78XX0
+       orr     r6, r6, #BIT9 /* SDRAM__ADD_HALF_FCC_EN */
+       orr     r6, r6, #BIT10 /* SDRAM__PUP_ZERO_SKEW_EN */
+       orr     r6, r6, #BIT11 /* SDRAM__WR_MASH_DELAY_EN */
+#endif
+        MV_REG_WRITE_ASM (r6, r5, DRAM_BUF_REG13)
+
+        /* DIMM density configuration*/
+        /* Density = (1 << (rowNum + colNum)) * dramWidth * dramBankNum       */
+Density:
+       /* Get bank 0 and 1 density */
+       ldr     r6, =0
+       bl      _getDensity
+
+       mov     r8, r7
+        mov     r8, r8, LSR #20 /* Move density 20 bits to the right  */
+                                /* For example 0x10000000 --> 0x1000 */
+
+        mov     r3, #(SDRAM_DSIZE_256Mb(0) | SDRAM_DSIZE_256Mb(1))
+        cmp     r8, #DRAM_DEV_DENSITY_256M
+        beq     get_bank_2_density
+
+        mov     r3, #(SDRAM_DSIZE_512Mb(0) | SDRAM_DSIZE_512Mb(1))
+        cmp     r8, #DRAM_DEV_DENSITY_512M
+        beq     get_bank_2_density
+
+        mov     r3, #(SDRAM_DSIZE_1Gb(0) | SDRAM_DSIZE_1Gb(1))
+        cmp     r8, #DRAM_DEV_DENSITY_1G
+        beq     get_bank_2_density
+
+        mov     r3, #(SDRAM_DSIZE_2Gb(0) | SDRAM_DSIZE_2Gb(1))
+        cmp     r8, #DRAM_DEV_DENSITY_2G
+        beq     get_bank_2_density
+
+        /* This is an error. return */
+        b       exit_ddrAutoConfig
+
+get_bank_2_density:
+       /* Check for second dimm */
+       MV_REG_READ_ASM (r6, r1, DRAM_BUF_REG14)
+       cmp     r6, #1
+       bne     get_width
+
+       /* Get bank 2 and 3 density */
+       ldr     r6, =2
+       bl      _getDensity
+
+       mov     r8, r7
+        mov     r8, r8, LSR #20 /* Move density 20 bits to the right  */
+                                /* For example 0x10000000 --> 0x1000 */
+
+        orr     r3, r3, #(SDRAM_DSIZE_256Mb(2) | SDRAM_DSIZE_256Mb(3))
+        cmp     r8, #DRAM_DEV_DENSITY_256M
+        beq     get_width
+
+        and     r3, r3, #~(SDRAM_DSIZE_MASK(2) | SDRAM_DSIZE_MASK(3))
+        orr     r3, r3, #(SDRAM_DSIZE_512Mb(2) | SDRAM_DSIZE_512Mb(3))
+        cmp     r8, #DRAM_DEV_DENSITY_512M
+        beq     get_width
+
+        and     r3, r3, #~(SDRAM_DSIZE_MASK(2) | SDRAM_DSIZE_MASK(3))
+        orr     r3, r3, #(SDRAM_DSIZE_1Gb(2) | SDRAM_DSIZE_1Gb(3))
+        cmp     r8, #DRAM_DEV_DENSITY_1G
+        beq     get_width
+
+        and     r3, r3, #~(SDRAM_DSIZE_MASK(2) | SDRAM_DSIZE_MASK(3))
+        orr     r3, r3, #(SDRAM_DSIZE_2Gb(2) | SDRAM_DSIZE_2Gb(3))
+        cmp     r8, #DRAM_DEV_DENSITY_2G
+        beq     get_width
+
+        /* This is an error. return */
+        b       exit_ddrAutoConfig
+
+       /* Get SDRAM width */
+get_width: 
+       /* Get bank 0 and 1 width */
+       ldr     r6, =0
+       bl      _get_width
+
+        cmp     r7, #8           /* x8 devices   */  
+        beq     get_bank_2_width
+
+        orr     r3, r3, #(SDRAM_ADDRSEL_X16(0) | SDRAM_ADDRSEL_X16(1)) /* x16 devices  */
+        cmp     r7, #16
+        beq     get_bank_2_width
+
+        /* This is an error. return */
+        b       exit_ddrAutoConfig
+
+get_bank_2_width:
+       /* Check for second dimm */
+       MV_REG_READ_ASM (r6, r1, DRAM_BUF_REG14)
+       cmp     r6, #1
+       bne     densCont
+
+       /* Get bank 2 and 3 width */
+       ldr     r6, =2
+       bl      _get_width
+
+        cmp     r7, #8           /* x8 devices   */  
+        beq     densCont
+
+        orr     r3, r3, #(SDRAM_ADDRSEL_X16(2) | SDRAM_ADDRSEL_X16(3)) /* x16 devices  */
+        cmp     r7, #16
+        beq     densCont
+
+        /* This is an error. return */
+        b       exit_ddrAutoConfig
+
+densCont:
+        MV_REG_WRITE_ASM (r3, r5, DRAM_BUF_REG4)
+
+        /* Set SDRAM timing control low register */
+       ldr     r4, =SDRAM_TIMING_CTRL_LOW_REG_DEFAULT
+        /* MV_REG_READ_ASM (r4, r5, SDRAM_TIMING_CTRL_LOW_REG) */
+        MV_REG_WRITE_ASM(r4, r5, DRAM_BUF_REG5)
+
+        /* Set SDRAM timing control high register */
+       ldr     r6, =SDRAM_TIMING_CTRL_HIGH_REG_DEFAULT
+
+    MV_REG_READ_ASM (r4, r5, CPU_RESET_SAMPLE_L_REG)
+       ldr     r5, =MSAR_SYSCLCK_MASK
+       and     r4, r4, r5      
+       ldr     r5, =MSAR_SYSCLCK_333
+       cmp     r4, r5
+       blt     timingHighClock333
+    orr r6, r6, #BIT9
+
+timingHighClock333:
+    /* MV_REG_READ_ASM (r6, r5, SDRAM_TIMING_CTRL_HIGH_REG) */
+    MV_REG_WRITE_ASM(r6, r5, DRAM_BUF_REG6)
+
+       /* Check for second dimm */
+       MV_REG_READ_ASM (r6, r1, DRAM_BUF_REG14)
+       cmp     r6, #1
+       bne     single_dimm_odt
+
+        /* Set SDRAM ODT control low register for double DIMM*/        
+        ldr    r4, =DDR2_ODT_CTRL_LOW_CS0_CS1_CS2_CS3_DV
+        MV_REG_WRITE_ASM(r4, r5, DRAM_BUF_REG7)
+
+        /* Set DUNIT ODT control register for double DIMM */
+        ldr    r4, =DDR2_DUNIT_ODT_CTRL_CS0_CS1_CS2_CS3_DV
+        MV_REG_WRITE_ASM(r4, r5, DRAM_BUF_REG9)
+
+#ifdef MV78XX0
+        /* Set SDRAM Extended Mode register for double DIMM */
+       /* Check DRAM frequency for more then 267MHz set ODT Rtt to 50ohm */
+
+        MV_REG_READ_ASM (r4, r5, CPU_RESET_SAMPLE_L_REG)
+       ldr     r5, =MSAR_SYSCLCK_MASK
+       and     r4, r4, r5      
+       ldr     r5, =MSAR_SYSCLCK_267
+       cmp     r4, r5
+       beq     slow_dram_clock_rtt
+       ldr     r5, =MSAR_SYSCLCK_300
+       cmp     r4, r5
+       beq     slow_dram_clock_rtt
+       ldr     r5, =MSAR_SYSCLCK_333
+       cmp     r4, r5
+       beq     fast_dram_clock_rtt
+       ldr     r5, =MSAR_SYSCLCK_400
+       cmp     r4, r5
+       beq     fast_dram_clock_rtt
+
+       b       slow_dram_clock_rtt
+
+fast_dram_clock_rtt:
+        ldr    r4, =DDR_SDRAM_EXT_MODE_FAST_CS0_CS1_CS2_CS3_DV
+        MV_REG_WRITE_ASM(r4, r5, DRAM_BUF_REG10)
+       b odt_config_end
+#endif
+slow_dram_clock_rtt:
+        ldr    r4, =DDR_SDRAM_EXT_MODE_CS0_CS1_CS2_CS3_DV
+        MV_REG_WRITE_ASM(r4, r5, DRAM_BUF_REG10)
+       b odt_config_end
+
+single_dimm_odt:
+        /* Set SDRAM ODT control low register */        
+        ldr    r4, =DDR2_ODT_CTRL_LOW_CS0_CS1_DV
+        MV_REG_WRITE_ASM(r4, r5, DRAM_BUF_REG7)
+
+        /* Set DUNIT ODT control register */
+        ldr    r4, =DDR2_DUNIT_ODT_CTRL_CS0_CS1_DV
+        MV_REG_WRITE_ASM(r4, r5, DRAM_BUF_REG9)
+
+        /* Set SDRAM Extended Mode register */
+        ldr    r4, =DDR_SDRAM_EXT_MODE_CS0_CS1_DV
+        MV_REG_WRITE_ASM(r4, r5, DRAM_BUF_REG10)
+
+odt_config_end:
+        /* SDRAM ODT control high register is left as default */
+        MV_REG_READ_ASM (r4, r5, DDR2_SDRAM_ODT_CTRL_HIGH_REG)
+        MV_REG_WRITE_ASM(r4, r5, DRAM_BUF_REG8)
+
+        /*Read CL and set the DDR2 registers accordingly */
+        MV_REG_READ_ASM (r6, r5, DRAM_BUF_REG2)
+        and r6, r6, #SDRAM_CL_MASK
+        mov r4, r6
+        orr r4, r4, r6, LSL #4
+        orr r4, r4, r6, LSL #8
+        orr r4, r4, r6, LSL #12
+        mov r5, #0x30000
+        add r4, r4, r5
+        sub r4, r4, #0x30
+        /* Set SDRAM Ddr2 Timing Low register */
+        MV_REG_WRITE_ASM(r4, r5, DRAM_BUF_REG11)
+
+        /* Set SDRAM Ddr2 Timing High register */
+        mov r4, r4, LSR #4
+        MV_REG_WRITE_ASM(r4, r5, DRAM_BUF_REG12)
+
+timeParamDone:        
+       /* Close all windows */
+        MV_REG_READ_ASM (r6, r5, SDRAM_SIZE_REG(0,0))
+        and    r6, r6,#~SCSR_SIZE_MASK
+        and    r6, r6,#~1
+        MV_REG_WRITE_ASM (r6, r5, SDRAM_SIZE_REG(0,0))
+        MV_REG_READ_ASM (r6, r5, SDRAM_SIZE_REG(0,1))
+        and    r6, r6,#~SCSR_SIZE_MASK
+        and    r6, r6,#~1
+        MV_REG_WRITE_ASM (r6, r5, SDRAM_SIZE_REG(0,1))
+        MV_REG_READ_ASM (r6, r5, SDRAM_SIZE_REG(0,2))
+        and    r6, r6,#~SCSR_SIZE_MASK
+        and    r6, r6,#~1
+        MV_REG_WRITE_ASM (r6, r5, SDRAM_SIZE_REG(0,2))
+        MV_REG_READ_ASM (r6, r5, SDRAM_SIZE_REG(0,3))
+        and    r6, r6,#~SCSR_SIZE_MASK
+        and    r6, r6,#~1
+        MV_REG_WRITE_ASM (r6, r5, SDRAM_SIZE_REG(0,3))
+
+        /* Set sdram bank 0 size and enable it */
+       ldr     r6, =0
+       bl _mvDramIfGetDimmSizeFromSpd
+#ifdef MV78XX0
+       /* Check DRAM width */
+        MV_REG_READ_ASM (r4, r5, SDRAM_CONFIG_REG)
+       ldr     r5, =SDRAM_DWIDTH_MASK
+       and     r4, r4, r5      
+       ldr     r5, =SDRAM_DWIDTH_64BIT
+       cmp     r4, r5
+       beq     dram_64bit_width
+       /* Utilize only 32bit width */
+       mov     r8, r8, LSR #1
+#else
+       /* Utilize only 16bit width */
+       mov     r8, r8, LSR #2
+#endif
+dram_64bit_width:
+       /* Update first dimm size return value R8 */
+        MV_REG_READ_ASM (r5, r6, SDRAM_SIZE_REG(0,0))
+        ldr    r6, =~SCSR_SIZE_MASK    
+       and     r5, r5, r6
+       orr     r5, r5, r8
+        MV_REG_WRITE_ASM(r5, r8, SDRAM_SIZE_REG(0,0))
+
+       /* Clear bank 2 size */
+        MV_REG_READ_ASM (r6, r5, SDRAM_SIZE_REG(0,2))
+        and    r6, r6,#~SCSR_SIZE_MASK 
+        MV_REG_WRITE_ASM (r6, r5, SDRAM_SIZE_REG(0,2))
+
+       /* Check for second dimm */
+       MV_REG_READ_ASM (r6, r1, DRAM_BUF_REG14)
+       cmp     r6, #1
+       bne     defualt_order
+
+        /* Set sdram bank 2 size */
+       ldr     r6, =2
+       bl _mvDramIfGetDimmSizeFromSpd
+#ifdef MV78XX0
+       /* Check DRAM width */
+        MV_REG_READ_ASM (r4, r5, SDRAM_CONFIG_REG)
+       ldr     r5, =SDRAM_DWIDTH_MASK
+       and     r4, r4, r5      
+       ldr     r5, =SDRAM_DWIDTH_64BIT
+       cmp     r4, r5
+       beq     dram_64bit_width2
+       /* Utilize only 32bit width */
+       mov     r8, r8, LSR #1
+#else
+       /* Utilize only 16bit width */
+       mov     r8, r8, LSR #2
+#endif
+dram_64bit_width2:
+       /* Update first dimm size return value R8 */
+        MV_REG_READ_ASM (r5, r6, SDRAM_SIZE_REG(0,2))
+        ldr    r6, =~SCSR_SIZE_MASK    
+       and     r5, r5, r6
+       orr     r5, r5, r8
+        MV_REG_WRITE_ASM(r5, r8, SDRAM_SIZE_REG(0,2))
+
+       /* Close windows 1 and 3 */
+        MV_REG_READ_ASM (r6, r5, SDRAM_SIZE_REG(0,1))
+        and    r6, r6,#~1
+        MV_REG_WRITE_ASM (r6, r5, SDRAM_SIZE_REG(0,1))
+        MV_REG_READ_ASM (r6, r5, SDRAM_SIZE_REG(0,3))
+        and    r6, r6,#~1
+        MV_REG_WRITE_ASM (r6, r5, SDRAM_SIZE_REG(0,3))
+
+       /* Check dimm size for setting dram bank order */
+        MV_REG_READ_ASM (r6, r5, SDRAM_SIZE_REG(0,0))
+        MV_REG_READ_ASM (r4, r5, SDRAM_SIZE_REG(0,2))
+        and    r6, r6,#SCSR_SIZE_MASK  
+        and    r4, r4,#SCSR_SIZE_MASK  
+       cmp     r6, r4
+       bge     defualt_order
+
+       /* Bank 2 is biger then bank 0 */
+       ldr     r6,=0
+        MV_REG_WRITE_ASM (r6, r5, SDRAM_BASE_ADDR_REG(0,2))
+
+       /* Open win 2 */
+        MV_REG_READ_ASM (r6, r5, SDRAM_SIZE_REG(0,2))
+        orr    r6, r6,#1
+        MV_REG_WRITE_ASM (r6, r5, SDRAM_SIZE_REG(0,2))
+
+       ldr     sp,=0
+       bl      _mvDramIfConfig
+#ifdef MV78XX0
+       /* Init ECC on CS 2 */
+       ldr     r0, =2
+       bl      _mvDramIfEccMemInit
+#endif
+        mov     PC, r11         /* r11 is saved link register */
+
+defualt_order:
+
+       /* Open win 0 */
+        MV_REG_READ_ASM (r6, r5, SDRAM_SIZE_REG(0,0))
+        orr    r6, r6,#1
+        MV_REG_WRITE_ASM (r6, r5, SDRAM_SIZE_REG(0,0))
+
+       ldr     sp,=0
+       bl      _mvDramIfConfig
+#ifdef MV78XX0
+       /* Init ECC on CS 0 */
+       ldr     r0, =0
+       bl      _mvDramIfEccMemInit
+#endif
+exit_ddrAutoConfig:
+        mov     PC, r11         /* r11 is saved link register */
+
+
+/***************************************************************************************/
+/*       r4 holds I2C EEPROM address
+ *       r7 holds I2C EEPROM offset parameter for i2cRead and its --> returned value
+ *       r8 holds SDRAM various configuration registers value.
+ *     r13 holds Link register
+ */
+/**************************/
+_getDensity:
+       mov     r13, LR                            /* Save link register */
+
+       /* Read SPD rank size from DIMM0 */
+        mov     r4, #MV_BOARD_DIMM0_I2C_ADDR       /* reading from DIMM0      */
+
+       cmp     r6, #0
+       beq     1f
+
+       /* Read SPD rank size from DIMM1 */
+        mov     r4, #MV_BOARD_DIMM1_I2C_ADDR /* reading from DIMM1            */
+
+1:
+        mov     r7, #NUM_OF_ROWS_OFFSET            /* offset  3               */
+        bl      _i2cRead
+        mov     r8, r7                             /* r8 save number of rows  */
+
+        mov     r7, #NUM_OF_COLS_OFFSET            /* offset  4               */
+        bl      _i2cRead
+        add     r8, r8, r7                         /* r8 = number of rows + number of col */
+
+        mov     r7, #0x1
+        mov     r8, r7, LSL r8                     /* r8 = (1 << r8)          */
+
+        mov     r7, #SDRAM_WIDTH_OFFSET            /* offset 13 */
+        bl      _i2cRead
+        mul     r8, r7, r8
+
+        mov     r7, #NUM_OF_BANKS_OFFSET           /* offset 17               */
+        bl      _i2cRead
+        mul     r7, r8, r7
+
+       mov     PC, r13
+
+/**************************/
+_get_width:
+       mov     r13, LR                 /* Save link register */
+
+       /* Read SPD rank size from DIMM0 */
+        mov     r4, #MV_BOARD_DIMM0_I2C_ADDR /* reading from DIMM0            */
+
+       cmp     r6, #0
+       beq     1f
+
+       /* Read SPD rank size from DIMM1 */
+        mov     r4, #MV_BOARD_DIMM1_I2C_ADDR /* reading from DIMM1            */
+
+1:
+        /* Get SDRAM width (SPD offset 13) */
+        mov     r7, #SDRAM_WIDTH_OFFSET
+        bl      _i2cRead                /* result in r7                       */
+
+       mov     PC, r13
+
+/**************************/
+_get_CAL:
+       mov     r13, LR                 /* Save link register */
+
+        /* Set maximum CL supported by DIMM */
+        mov     r4, #MV_BOARD_DIMM0_I2C_ADDR /* reading from DIMM0            */
+        mov     r7, #SUPPORTED_CL_OFFSET     /* offset  18 */
+        bl      _i2cRead
+
+       mov     PC, r13
+
+/**************************/
+/* R8 - sdram configuration register.
+ * Return value in flag if no-registered then Z-flag is set
+ */
+_is_Registered:
+       mov     r13, LR                 /* Save link register */
+#if defined(MV645xx)
+        /* Get registered/non registered info from DIMM */
+        tst     r8, #SDRAM_DTYPE_DDR2
+        bne     regDdr2
+
+regDdr1:
+        mov     r4, #MV_BOARD_DIMM0_I2C_ADDR /* reading from DIMM0            */
+        mov     r7, #SDRAM_MODULES_ATTR_OFFSET
+        bl      _i2cRead                /* result in r7                       */
+
+        tst     r7, #0x2
+       b       exit
+#endif
+regDdr2:
+        mov     r4, #MV_BOARD_DIMM0_I2C_ADDR /* reading from DIMM0            */
+        mov     r7, #DIMM_TYPE_INFO_OFFSET
+        bl      _i2cRead                /* result in r7                       */
+
+        tst     r7, #0x11               /* DIMM type = regular RDIMM (0x01)   */
+                                        /* or Mini-RDIMM (0x10)               */
+exit:
+        mov     PC, r13
+
+
+/**************************/
+/* Return value in flag if no-Ecc then Z-flag is set */
+_is_Ecc:
+       mov     r13, LR                 /* Save link register */
+
+        mov     r4, #MV_BOARD_DIMM0_I2C_ADDR /* reading from DIMM0            */
+        mov     r7, #DIMM_CONFIG_TYPE
+        bl      _i2cRead                /* result in r7                       */
+
+        tst     r7, #0x2               /* bit 1 -> Data ECC */
+        mov     PC, r13
+
+/**************************/
+/* Return value in flag if no second DIMM then Z-flag is set */
+_is_Second_Dimm_Exist:
+       mov     r13, LR                 /* Save link register */
+
+        mov     r4, #MV_BOARD_DIMM1_I2C_ADDR /* reading from DIMM0            */
+        mov     r7, #DIMM_TYPE_OFFSET
+        bl      _i2cRead                /* result in r7                       */
+
+       tst     r7, #0x8               /* bit3 is '1' -> DDR 2 */
+        mov     PC, r13
+
+/*******************************************************************************
+* _mvDramIfGetDimmSizeFromSpd  - read bank 0 dram's size
+*
+* DESCRIPTION:
+*       The function will read the bank 0 dram size(SPD version 1.0 and above )  
+*
+* INPUT:
+*       r6 - dram bank number.
+*
+* OUTPUT:
+*      none
+*/
+_mvDramIfGetDimmSizeFromSpd:
+
+       mov     r13, LR                 /* Save link register */
+       
+       /* Read SPD rank size from DIMM0 */
+        mov     r4, #MV_BOARD_DIMM0_I2C_ADDR /* reading from DIMM0            */
+
+       cmp     r6, #0
+       beq     1f
+
+       /* Read SPD rank size from DIMM1 */
+        mov     r4, #MV_BOARD_DIMM1_I2C_ADDR /* reading from DIMM1            */
+
+1:
+        mov     r7, #RANK_SIZE_OFFSET  /* offset  31 */
+        bl      _i2cRead  
+       
+pass_read:
+       ldr     r8, =(0x7 << SCSR_SIZE_OFFS)
+        cmp    r7, #DRAM_RANK_DENSITY_128M
+        beq     endDimmSize
+
+       ldr     r8, =(0xf << SCSR_SIZE_OFFS)
+        cmp    r7, #DRAM_RANK_DENSITY_256M
+        beq     endDimmSize
+        
+        ldr     r8, =(0x1f << SCSR_SIZE_OFFS)
+        cmp    r7, #DRAM_RANK_DENSITY_512M
+        beq     endDimmSize
+        
+        ldr     r8, =(0x3f << SCSR_SIZE_OFFS)
+        cmp    r7, #DRAM_RANK_DENSITY_1G
+        beq     endDimmSize
+
+        ldr     r8, =(0x7f  << SCSR_SIZE_OFFS)     /* DRAM_RANK_DENSITY_2G */
+endDimmSize:
+        mov     PC, r13
+#endif