| /******************************************************************************* |
| 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) |
| /****************************************************************************** |
| * static definitions for several dimms |
| *******************************************************************************/ |
| #if defined(DB_MV78XX0) || defined(DB_MV88F632X) |
| #if defined(MV78100) |
| /* DDR2 boards 512MB 333MHz */ |
| #define STATIC_SDRAM0_BANK0_SIZE 0x1ffffff1 /* 0x1504 */ |
| #define STATIC_SDRAM_CONFIG 0x43048C30 /* 0x1400 */ |
| #define STATIC_DUNIT_CTRL_LOW 0x38543000 /* 0x1404 */ |
| #define STATIC_SDRAM_TIME_CTRL_LOW 0x22125441 /* 0x1408 */ |
| #define STATIC_SDRAM_TIME_CTRL_HI 0x00000A29 /* 0x140c */ |
| #define STATIC_SDRAM_ADDR_CTRL 0x00000088 /* 0x1410 */ |
| #define STATIC_SDRAM_MODE 0x00000652 /* 0x141c */ |
| #define STATIC_SDRAM_EXT_MODE 0x00000040 /* 0x1420 */ |
| #define STATIC_DUNIT_CTRL_HI 0x0000FFFF /* 0x1424 */ |
| #define STATIC_SDRAM_DDR2_TIMING_LO 0x00085520 /* 0x1428 */ |
| #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_DDR2_TIMING_HI 0x00008552 /* 0x147C */ |
| |
| #elif defined(MV78200) |
| /* 512MB per CD, 800Mhz cl5 */ |
| #define STATIC_DRAM_BANK_CS0 |
| #define STATIC_DRAM_BANK_CS2 |
| |
| #define STATIC_SDRAM0_BANK0_SIZE 0x1ffffff1 /* 0x1504 */ |
| #define STATIC_SDRAM1_BANK0_SIZE 0x1ffffff9 /* 0x1514 */ |
| #define STATIC_SDRAM1_BANK0_BASE 0x20000000 /* 0x1510 */ |
| |
| |
| #define STATIC_SDRAM_CONFIG 0x43008C30 /* 0x1400 */ |
| #define STATIC_DUNIT_CTRL_LOW 0x37543010 /* 0x1404 */ |
| #define STATIC_SDRAM_TIME_CTRL_LOW 0x22125441 /* 0x1408 */ |
| #define STATIC_SDRAM_TIME_CTRL_HI 0x00000A29 /* 0x140c */ |
| |
| #define STATIC_SDRAM_ADDR_CTRL 0x00008888 /* 0x1410 */ |
| #define STATIC_SDRAM_MODE 0x00000652 /* 0x141c */ |
| |
| #define STATIC_SDRAM_EXT_MODE 0x00000044 /* 0x1420 */ |
| #define STATIC_DUNIT_CTRL_HI 0x0000FF7F /* 0x1424 */ |
| #define STATIC_SDRAM_DDR2_TIMING_LO 0x00085520 /* 0x1428 */ |
| |
| #define STATIC_SDRAM_DDR2_TIMING_HI 0x00008552 /* 0x147C */ |
| |
| #define STATIC_SDRAM_ODT_CTRL_LOW 0x030C030C /* 0x1494 */ |
| #define STATIC_SDRAM_ODT_CTRL_HI 0x00000000 /* 0x1498 */ |
| #define STATIC_SDRAM_DUNIT_ODT_CTRL 0x0000F40F /* 0x149c */ |
| |
| #endif |
| |
| #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 */ |
| |
| #define STATIC_SDRAM1_BANK0_SIZE 0x0FFFFFF1 /* 0x1514 */ |
| #define STATIC_SDRAM1_BANK0_BASE 0x10000000 /* 0x1510 */ |
| |
| #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 */ |
| |
| #endif /* MV_STATIC_DRAM_ON_BOARD */ |
| |
| .globl dramBoot1 |
| dramBoot1: |
| .word 0 |
| /************************************************************* |
| * basic timing init |
| **************************************************************/ |
| .globl _mvDramInitTiming |
| _mvDramInitTiming: |
| /* 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 pc, lr |
| |
| |
| #if defined(MV_STATIC_DRAM_ON_BOARD) |
| /************************************************************* |
| * basic init for static DRAM (on board dram no SPD) |
| **************************************************************/ |
| |
| .globl _mvDramIfStaticInit |
| _mvDramIfStaticInit: |
| |
| mov r11, LR /* Save link register */ |
| mov r10, r2 |
| bl _mvDramInitTiming |
| |
| /* 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)) |
| |
| #ifdef STATIC_DRAM_BANK_CS2 |
| ldr r6, = STATIC_SDRAM1_BANK0_SIZE |
| MV_REG_WRITE_ASM(r6, r5, SDRAM_SIZE_REG(0,2)) |
| ldr r6, = STATIC_SDRAM1_BANK0_BASE |
| MV_REG_WRITE_ASM(r6, r5, SDRAM_BASE_ADDR_REG (0,2)) |
| #endif |
| |
| |
| /* 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 MTD_NAND_LNC_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 |
| #ifdef STATIC_DRAM_BANK_CS2 |
| ldr r0, =2 |
| bl _mvDramIfEccMemInit |
| #endif |
| ldr r0, =0 |
| #endif |
| 1: |
| mov r2, r10 |
| mov PC, r11 /* r11 is saved link register */ |
| |
| #else /* #if defined(MV_STATIC_DRAM_ON_BOARD) */ |
| |
| /******************************************************************************* |
| * 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 */ |
| |
| bl _mvDramInitTiming |
| |
| 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: |
| #if defined(MV78XX0) && !defined(MV632X) |
| /* 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 |