1*e595107eSHao Zhang /* 2*e595107eSHao Zhang * Keystone2: DDR3 initialization 3*e595107eSHao Zhang * 4*e595107eSHao Zhang * (C) Copyright 2012-2014 5*e595107eSHao Zhang * Texas Instruments Incorporated, <www.ti.com> 6*e595107eSHao Zhang * 7*e595107eSHao Zhang * SPDX-License-Identifier: GPL-2.0+ 8*e595107eSHao Zhang */ 9*e595107eSHao Zhang 10*e595107eSHao Zhang #include <common.h> 11*e595107eSHao Zhang #include <asm/arch/ddr3.h> 12*e595107eSHao Zhang #include <asm/arch/hardware.h> 13*e595107eSHao Zhang #include <asm/io.h> 14*e595107eSHao Zhang #include <i2c.h> 15*e595107eSHao Zhang 16*e595107eSHao Zhang /************************* *****************************/ 17*e595107eSHao Zhang static struct ddr3_phy_config ddr3phy_1600_64A = { 18*e595107eSHao Zhang .pllcr = 0x0001C000ul, 19*e595107eSHao Zhang .pgcr1_mask = (IODDRM_MASK | ZCKSEL_MASK), 20*e595107eSHao Zhang .pgcr1_val = ((1 << 2) | (1 << 7) | (1 << 23)), 21*e595107eSHao Zhang .ptr0 = 0x42C21590ul, 22*e595107eSHao Zhang .ptr1 = 0xD05612C0ul, 23*e595107eSHao Zhang .ptr2 = 0, /* not set in gel */ 24*e595107eSHao Zhang .ptr3 = 0x0D861A80ul, 25*e595107eSHao Zhang .ptr4 = 0x0C827100ul, 26*e595107eSHao Zhang .dcr_mask = (PDQ_MASK | MPRDQ_MASK | BYTEMASK_MASK | NOSRA_MASK), 27*e595107eSHao Zhang .dcr_val = ((1 << 10) | (1 << 27)), 28*e595107eSHao Zhang .dtpr0 = 0xA19DBB66ul, 29*e595107eSHao Zhang .dtpr1 = 0x12868300ul, 30*e595107eSHao Zhang .dtpr2 = 0x50035200ul, 31*e595107eSHao Zhang .mr0 = 0x00001C70ul, 32*e595107eSHao Zhang .mr1 = 0x00000006ul, 33*e595107eSHao Zhang .mr2 = 0x00000018ul, 34*e595107eSHao Zhang .dtcr = 0x730035C7ul, 35*e595107eSHao Zhang .pgcr2 = 0x00F07A12ul, 36*e595107eSHao Zhang .zq0cr1 = 0x0000005Dul, 37*e595107eSHao Zhang .zq1cr1 = 0x0000005Bul, 38*e595107eSHao Zhang .zq2cr1 = 0x0000005Bul, 39*e595107eSHao Zhang .pir_v1 = 0x00000033ul, 40*e595107eSHao Zhang .pir_v2 = 0x0000FF81ul, 41*e595107eSHao Zhang }; 42*e595107eSHao Zhang 43*e595107eSHao Zhang static struct ddr3_emif_config ddr3_1600_64 = { 44*e595107eSHao Zhang .sdcfg = 0x6200CE6aul, 45*e595107eSHao Zhang .sdtim1 = 0x16709C55ul, 46*e595107eSHao Zhang .sdtim2 = 0x00001D4Aul, 47*e595107eSHao Zhang .sdtim3 = 0x435DFF54ul, 48*e595107eSHao Zhang .sdtim4 = 0x553F0CFFul, 49*e595107eSHao Zhang .zqcfg = 0xF0073200ul, 50*e595107eSHao Zhang .sdrfc = 0x00001869ul, 51*e595107eSHao Zhang }; 52*e595107eSHao Zhang 53*e595107eSHao Zhang static struct ddr3_phy_config ddr3phy_1600_32 = { 54*e595107eSHao Zhang .pllcr = 0x0001C000ul, 55*e595107eSHao Zhang .pgcr1_mask = (IODDRM_MASK | ZCKSEL_MASK), 56*e595107eSHao Zhang .pgcr1_val = ((1 << 2) | (1 << 7) | (1 << 23)), 57*e595107eSHao Zhang .ptr0 = 0x42C21590ul, 58*e595107eSHao Zhang .ptr1 = 0xD05612C0ul, 59*e595107eSHao Zhang .ptr2 = 0, /* not set in gel */ 60*e595107eSHao Zhang .ptr3 = 0x0D861A80ul, 61*e595107eSHao Zhang .ptr4 = 0x0C827100ul, 62*e595107eSHao Zhang .dcr_mask = (PDQ_MASK | MPRDQ_MASK | BYTEMASK_MASK | NOSRA_MASK), 63*e595107eSHao Zhang .dcr_val = ((1 << 10) | (1 << 27)), 64*e595107eSHao Zhang .dtpr0 = 0xA19DBB66ul, 65*e595107eSHao Zhang .dtpr1 = 0x12868300ul, 66*e595107eSHao Zhang .dtpr2 = 0x50035200ul, 67*e595107eSHao Zhang .mr0 = 0x00001C70ul, 68*e595107eSHao Zhang .mr1 = 0x00000006ul, 69*e595107eSHao Zhang .mr2 = 0x00000018ul, 70*e595107eSHao Zhang .dtcr = 0x730035C7ul, 71*e595107eSHao Zhang .pgcr2 = 0x00F07A12ul, 72*e595107eSHao Zhang .zq0cr1 = 0x0000005Dul, 73*e595107eSHao Zhang .zq1cr1 = 0x0000005Bul, 74*e595107eSHao Zhang .zq2cr1 = 0x0000005Bul, 75*e595107eSHao Zhang .pir_v1 = 0x00000033ul, 76*e595107eSHao Zhang .pir_v2 = 0x0000FF81ul, 77*e595107eSHao Zhang }; 78*e595107eSHao Zhang 79*e595107eSHao Zhang static struct ddr3_emif_config ddr3_1600_32 = { 80*e595107eSHao Zhang .sdcfg = 0x6200DE6aul, 81*e595107eSHao Zhang .sdtim1 = 0x16709C55ul, 82*e595107eSHao Zhang .sdtim2 = 0x00001D4Aul, 83*e595107eSHao Zhang .sdtim3 = 0x435DFF54ul, 84*e595107eSHao Zhang .sdtim4 = 0x553F0CFFul, 85*e595107eSHao Zhang .zqcfg = 0x70073200ul, 86*e595107eSHao Zhang .sdrfc = 0x00001869ul, 87*e595107eSHao Zhang }; 88*e595107eSHao Zhang 89*e595107eSHao Zhang /************************* *****************************/ 90*e595107eSHao Zhang static struct ddr3_phy_config ddr3phy_1333_64A = { 91*e595107eSHao Zhang .pllcr = 0x0005C000ul, 92*e595107eSHao Zhang .pgcr1_mask = (IODDRM_MASK | ZCKSEL_MASK), 93*e595107eSHao Zhang .pgcr1_val = ((1 << 2) | (1 << 7) | (1 << 23)), 94*e595107eSHao Zhang .ptr0 = 0x42C21590ul, 95*e595107eSHao Zhang .ptr1 = 0xD05612C0ul, 96*e595107eSHao Zhang .ptr2 = 0, /* not set in gel */ 97*e595107eSHao Zhang .ptr3 = 0x0B4515C2ul, 98*e595107eSHao Zhang .ptr4 = 0x0A6E08B4ul, 99*e595107eSHao Zhang .dcr_mask = (PDQ_MASK | MPRDQ_MASK | BYTEMASK_MASK | 100*e595107eSHao Zhang NOSRA_MASK | UDIMM_MASK), 101*e595107eSHao Zhang .dcr_val = ((1 << 10) | (1 << 27) | (1 << 29)), 102*e595107eSHao Zhang .dtpr0 = 0x8558AA55ul, 103*e595107eSHao Zhang .dtpr1 = 0x12857280ul, 104*e595107eSHao Zhang .dtpr2 = 0x5002C200ul, 105*e595107eSHao Zhang .mr0 = 0x00001A60ul, 106*e595107eSHao Zhang .mr1 = 0x00000006ul, 107*e595107eSHao Zhang .mr2 = 0x00000010ul, 108*e595107eSHao Zhang .dtcr = 0x710035C7ul, 109*e595107eSHao Zhang .pgcr2 = 0x00F065B8ul, 110*e595107eSHao Zhang .zq0cr1 = 0x0000005Dul, 111*e595107eSHao Zhang .zq1cr1 = 0x0000005Bul, 112*e595107eSHao Zhang .zq2cr1 = 0x0000005Bul, 113*e595107eSHao Zhang .pir_v1 = 0x00000033ul, 114*e595107eSHao Zhang .pir_v2 = 0x0000FF81ul, 115*e595107eSHao Zhang }; 116*e595107eSHao Zhang 117*e595107eSHao Zhang static struct ddr3_emif_config ddr3_1333_64 = { 118*e595107eSHao Zhang .sdcfg = 0x62008C62ul, 119*e595107eSHao Zhang .sdtim1 = 0x125C8044ul, 120*e595107eSHao Zhang .sdtim2 = 0x00001D29ul, 121*e595107eSHao Zhang .sdtim3 = 0x32CDFF43ul, 122*e595107eSHao Zhang .sdtim4 = 0x543F0ADFul, 123*e595107eSHao Zhang .zqcfg = 0xF0073200ul, 124*e595107eSHao Zhang .sdrfc = 0x00001457ul, 125*e595107eSHao Zhang }; 126*e595107eSHao Zhang 127*e595107eSHao Zhang static struct ddr3_phy_config ddr3phy_1333_32 = { 128*e595107eSHao Zhang .pllcr = 0x0005C000ul, 129*e595107eSHao Zhang .pgcr1_mask = (IODDRM_MASK | ZCKSEL_MASK), 130*e595107eSHao Zhang .pgcr1_val = ((1 << 2) | (1 << 7) | (1 << 23)), 131*e595107eSHao Zhang .ptr0 = 0x42C21590ul, 132*e595107eSHao Zhang .ptr1 = 0xD05612C0ul, 133*e595107eSHao Zhang .ptr2 = 0, /* not set in gel */ 134*e595107eSHao Zhang .ptr3 = 0x0B4515C2ul, 135*e595107eSHao Zhang .ptr4 = 0x0A6E08B4ul, 136*e595107eSHao Zhang .dcr_mask = (PDQ_MASK | MPRDQ_MASK | BYTEMASK_MASK | 137*e595107eSHao Zhang NOSRA_MASK | UDIMM_MASK), 138*e595107eSHao Zhang .dcr_val = ((1 << 10) | (1 << 27) | (1 << 29)), 139*e595107eSHao Zhang .dtpr0 = 0x8558AA55ul, 140*e595107eSHao Zhang .dtpr1 = 0x12857280ul, 141*e595107eSHao Zhang .dtpr2 = 0x5002C200ul, 142*e595107eSHao Zhang .mr0 = 0x00001A60ul, 143*e595107eSHao Zhang .mr1 = 0x00000006ul, 144*e595107eSHao Zhang .mr2 = 0x00000010ul, 145*e595107eSHao Zhang .dtcr = 0x710035C7ul, 146*e595107eSHao Zhang .pgcr2 = 0x00F065B8ul, 147*e595107eSHao Zhang .zq0cr1 = 0x0000005Dul, 148*e595107eSHao Zhang .zq1cr1 = 0x0000005Bul, 149*e595107eSHao Zhang .zq2cr1 = 0x0000005Bul, 150*e595107eSHao Zhang .pir_v1 = 0x00000033ul, 151*e595107eSHao Zhang .pir_v2 = 0x0000FF81ul, 152*e595107eSHao Zhang }; 153*e595107eSHao Zhang 154*e595107eSHao Zhang static struct ddr3_emif_config ddr3_1333_32 = { 155*e595107eSHao Zhang .sdcfg = 0x62009C62ul, 156*e595107eSHao Zhang .sdtim1 = 0x125C8044ul, 157*e595107eSHao Zhang .sdtim2 = 0x00001D29ul, 158*e595107eSHao Zhang .sdtim3 = 0x32CDFF43ul, 159*e595107eSHao Zhang .sdtim4 = 0x543F0ADFul, 160*e595107eSHao Zhang .zqcfg = 0xf0073200ul, 161*e595107eSHao Zhang .sdrfc = 0x00001457ul, 162*e595107eSHao Zhang }; 163*e595107eSHao Zhang 164*e595107eSHao Zhang /************************* *****************************/ 165*e595107eSHao Zhang static struct ddr3_phy_config ddr3phy_1333_64 = { 166*e595107eSHao Zhang .pllcr = 0x0005C000ul, 167*e595107eSHao Zhang .pgcr1_mask = (IODDRM_MASK | ZCKSEL_MASK), 168*e595107eSHao Zhang .pgcr1_val = ((1 << 2) | (1 << 7) | (1 << 23)), 169*e595107eSHao Zhang .ptr0 = 0x42C21590ul, 170*e595107eSHao Zhang .ptr1 = 0xD05612C0ul, 171*e595107eSHao Zhang .ptr2 = 0, /* not set in gel */ 172*e595107eSHao Zhang .ptr3 = 0x0B4515C2ul, 173*e595107eSHao Zhang .ptr4 = 0x0A6E08B4ul, 174*e595107eSHao Zhang .dcr_mask = (PDQ_MASK | MPRDQ_MASK | BYTEMASK_MASK | NOSRA_MASK), 175*e595107eSHao Zhang .dcr_val = ((1 << 10) | (1 << 27)), 176*e595107eSHao Zhang .dtpr0 = 0x8558AA55ul, 177*e595107eSHao Zhang .dtpr1 = 0x12857280ul, 178*e595107eSHao Zhang .dtpr2 = 0x5002C200ul, 179*e595107eSHao Zhang .mr0 = 0x00001A60ul, 180*e595107eSHao Zhang .mr1 = 0x00000006ul, 181*e595107eSHao Zhang .mr2 = 0x00000010ul, 182*e595107eSHao Zhang .dtcr = 0x710035C7ul, 183*e595107eSHao Zhang .pgcr2 = 0x00F065B8ul, 184*e595107eSHao Zhang .zq0cr1 = 0x0000005Dul, 185*e595107eSHao Zhang .zq1cr1 = 0x0000005Bul, 186*e595107eSHao Zhang .zq2cr1 = 0x0000005Bul, 187*e595107eSHao Zhang .pir_v1 = 0x00000033ul, 188*e595107eSHao Zhang .pir_v2 = 0x0000FF81ul, 189*e595107eSHao Zhang }; 190*e595107eSHao Zhang /******************************************************/ 191*e595107eSHao Zhang 192*e595107eSHao Zhang /* DDR PHY Configs Updated for PG 2.0 193*e595107eSHao Zhang * zq0,1,2cr1 are updated for PG 2.0 specific configs *_pg2 */ 194*e595107eSHao Zhang static struct ddr3_phy_config ddr3phy_1600_64A_pg2 = { 195*e595107eSHao Zhang .pllcr = 0x0001C000ul, 196*e595107eSHao Zhang .pgcr1_mask = (IODDRM_MASK | ZCKSEL_MASK), 197*e595107eSHao Zhang .pgcr1_val = ((1 << 2) | (1 << 7) | (1 << 23)), 198*e595107eSHao Zhang .ptr0 = 0x42C21590ul, 199*e595107eSHao Zhang .ptr1 = 0xD05612C0ul, 200*e595107eSHao Zhang .ptr2 = 0, /* not set in gel */ 201*e595107eSHao Zhang .ptr3 = 0x0D861A80ul, 202*e595107eSHao Zhang .ptr4 = 0x0C827100ul, 203*e595107eSHao Zhang .dcr_mask = (PDQ_MASK | MPRDQ_MASK | BYTEMASK_MASK), 204*e595107eSHao Zhang .dcr_val = ((1 << 10)), 205*e595107eSHao Zhang .dtpr0 = 0xA19DBB66ul, 206*e595107eSHao Zhang .dtpr1 = 0x32868300ul, 207*e595107eSHao Zhang .dtpr2 = 0x50035200ul, 208*e595107eSHao Zhang .mr0 = 0x00001C70ul, 209*e595107eSHao Zhang .mr1 = 0x00000006ul, 210*e595107eSHao Zhang .mr2 = 0x00000018ul, 211*e595107eSHao Zhang .dtcr = 0x730035C7ul, 212*e595107eSHao Zhang .pgcr2 = 0x00F07A12ul, 213*e595107eSHao Zhang .zq0cr1 = 0x0001005Dul, 214*e595107eSHao Zhang .zq1cr1 = 0x0001005Bul, 215*e595107eSHao Zhang .zq2cr1 = 0x0001005Bul, 216*e595107eSHao Zhang .pir_v1 = 0x00000033ul, 217*e595107eSHao Zhang .pir_v2 = 0x0000FF81ul, 218*e595107eSHao Zhang }; 219*e595107eSHao Zhang 220*e595107eSHao Zhang static struct ddr3_phy_config ddr3phy_1333_64A_pg2 = { 221*e595107eSHao Zhang .pllcr = 0x0005C000ul, 222*e595107eSHao Zhang .pgcr1_mask = (IODDRM_MASK | ZCKSEL_MASK), 223*e595107eSHao Zhang .pgcr1_val = ((1 << 2) | (1 << 7) | (1 << 23)), 224*e595107eSHao Zhang .ptr0 = 0x42C21590ul, 225*e595107eSHao Zhang .ptr1 = 0xD05612C0ul, 226*e595107eSHao Zhang .ptr2 = 0, /* not set in gel */ 227*e595107eSHao Zhang .ptr3 = 0x0B4515C2ul, 228*e595107eSHao Zhang .ptr4 = 0x0A6E08B4ul, 229*e595107eSHao Zhang .dcr_mask = (PDQ_MASK | MPRDQ_MASK | BYTEMASK_MASK), 230*e595107eSHao Zhang .dcr_val = ((1 << 10)), 231*e595107eSHao Zhang .dtpr0 = 0x8558AA55ul, 232*e595107eSHao Zhang .dtpr1 = 0x32857280ul, 233*e595107eSHao Zhang .dtpr2 = 0x5002C200ul, 234*e595107eSHao Zhang .mr0 = 0x00001A60ul, 235*e595107eSHao Zhang .mr1 = 0x00000006ul, 236*e595107eSHao Zhang .mr2 = 0x00000010ul, 237*e595107eSHao Zhang .dtcr = 0x710035C7ul, 238*e595107eSHao Zhang .pgcr2 = 0x00F065B8ul, 239*e595107eSHao Zhang .zq0cr1 = 0x0001005Dul, 240*e595107eSHao Zhang .zq1cr1 = 0x0001005Bul, 241*e595107eSHao Zhang .zq2cr1 = 0x0001005Bul, 242*e595107eSHao Zhang .pir_v1 = 0x00000033ul, 243*e595107eSHao Zhang .pir_v2 = 0x0000FF81ul, 244*e595107eSHao Zhang }; 245*e595107eSHao Zhang 246*e595107eSHao Zhang int get_dimm_params(char *dimm_name) 247*e595107eSHao Zhang { 248*e595107eSHao Zhang u8 spd_params[256]; 249*e595107eSHao Zhang int ret; 250*e595107eSHao Zhang int old_bus; 251*e595107eSHao Zhang 252*e595107eSHao Zhang i2c_init(CONFIG_SYS_DAVINCI_I2C_SPEED, CONFIG_SYS_DAVINCI_I2C_SLAVE); 253*e595107eSHao Zhang 254*e595107eSHao Zhang old_bus = i2c_get_bus_num(); 255*e595107eSHao Zhang i2c_set_bus_num(1); 256*e595107eSHao Zhang 257*e595107eSHao Zhang ret = i2c_read(0x53, 0, 1, spd_params, 256); 258*e595107eSHao Zhang 259*e595107eSHao Zhang i2c_set_bus_num(old_bus); 260*e595107eSHao Zhang 261*e595107eSHao Zhang dimm_name[0] = '\0'; 262*e595107eSHao Zhang 263*e595107eSHao Zhang if (ret) { 264*e595107eSHao Zhang puts("Cannot read DIMM params\n"); 265*e595107eSHao Zhang return 1; 266*e595107eSHao Zhang } 267*e595107eSHao Zhang 268*e595107eSHao Zhang /* 269*e595107eSHao Zhang * We need to convert spd data to dimm parameters 270*e595107eSHao Zhang * and to DDR3 EMIF and PHY regirsters values. 271*e595107eSHao Zhang * For now we just return DIMM type string value. 272*e595107eSHao Zhang * Caller may use this value to choose appropriate 273*e595107eSHao Zhang * a pre-set DDR3 configuration 274*e595107eSHao Zhang */ 275*e595107eSHao Zhang 276*e595107eSHao Zhang strncpy(dimm_name, (char *)&spd_params[0x80], 18); 277*e595107eSHao Zhang dimm_name[18] = '\0'; 278*e595107eSHao Zhang 279*e595107eSHao Zhang return 0; 280*e595107eSHao Zhang } 281*e595107eSHao Zhang 282*e595107eSHao Zhang struct pll_init_data ddr3a_333 = DDR3_PLL_333(A); 283*e595107eSHao Zhang struct pll_init_data ddr3b_333 = DDR3_PLL_333(B); 284*e595107eSHao Zhang struct pll_init_data ddr3a_400 = DDR3_PLL_400(A); 285*e595107eSHao Zhang struct pll_init_data ddr3b_400 = DDR3_PLL_400(B); 286*e595107eSHao Zhang 287*e595107eSHao Zhang void ddr3_init(void) 288*e595107eSHao Zhang { 289*e595107eSHao Zhang char dimm_name[32]; 290*e595107eSHao Zhang 291*e595107eSHao Zhang get_dimm_params(dimm_name); 292*e595107eSHao Zhang 293*e595107eSHao Zhang printf("Detected SO-DIMM [%s]\n", dimm_name); 294*e595107eSHao Zhang 295*e595107eSHao Zhang if (!strcmp(dimm_name, "18KSF1G72HZ-1G6E2 ")) { 296*e595107eSHao Zhang init_pll(&ddr3a_400); 297*e595107eSHao Zhang if (cpu_revision() > 0) { 298*e595107eSHao Zhang if (cpu_revision() > 1) { 299*e595107eSHao Zhang /* PG 2.0 */ 300*e595107eSHao Zhang /* Reset DDR3A PHY after PLL enabled */ 301*e595107eSHao Zhang ddr3_reset_ddrphy(); 302*e595107eSHao Zhang ddr3_init_ddrphy(KS2_DDR3A_DDRPHYC, 303*e595107eSHao Zhang &ddr3phy_1600_64A_pg2); 304*e595107eSHao Zhang } else { 305*e595107eSHao Zhang /* PG 1.1 */ 306*e595107eSHao Zhang ddr3_init_ddrphy(KS2_DDR3A_DDRPHYC, 307*e595107eSHao Zhang &ddr3phy_1600_64A); 308*e595107eSHao Zhang } 309*e595107eSHao Zhang 310*e595107eSHao Zhang ddr3_init_ddremif(KS2_DDR3A_EMIF_CTRL_BASE, 311*e595107eSHao Zhang &ddr3_1600_64); 312*e595107eSHao Zhang printf("DRAM: Capacity 8 GiB (includes reported below)\n"); 313*e595107eSHao Zhang } else { 314*e595107eSHao Zhang ddr3_init_ddrphy(KS2_DDR3A_DDRPHYC, &ddr3phy_1600_32); 315*e595107eSHao Zhang ddr3_init_ddremif(KS2_DDR3A_EMIF_CTRL_BASE, 316*e595107eSHao Zhang &ddr3_1600_32); 317*e595107eSHao Zhang printf("DRAM: Capacity 4 GiB (includes reported below)\n"); 318*e595107eSHao Zhang } 319*e595107eSHao Zhang } else if (!strcmp(dimm_name, "SQR-SD3T-2G1333SED")) { 320*e595107eSHao Zhang init_pll(&ddr3a_333); 321*e595107eSHao Zhang if (cpu_revision() > 0) { 322*e595107eSHao Zhang if (cpu_revision() > 1) { 323*e595107eSHao Zhang /* PG 2.0 */ 324*e595107eSHao Zhang /* Reset DDR3A PHY after PLL enabled */ 325*e595107eSHao Zhang ddr3_reset_ddrphy(); 326*e595107eSHao Zhang ddr3_init_ddrphy(KS2_DDR3A_DDRPHYC, 327*e595107eSHao Zhang &ddr3phy_1333_64A_pg2); 328*e595107eSHao Zhang } else { 329*e595107eSHao Zhang /* PG 1.1 */ 330*e595107eSHao Zhang ddr3_init_ddrphy(KS2_DDR3A_DDRPHYC, 331*e595107eSHao Zhang &ddr3phy_1333_64A); 332*e595107eSHao Zhang } 333*e595107eSHao Zhang ddr3_init_ddremif(KS2_DDR3A_EMIF_CTRL_BASE, 334*e595107eSHao Zhang &ddr3_1333_64); 335*e595107eSHao Zhang } else { 336*e595107eSHao Zhang ddr3_init_ddrphy(KS2_DDR3A_DDRPHYC, &ddr3phy_1333_32); 337*e595107eSHao Zhang ddr3_init_ddremif(KS2_DDR3A_EMIF_CTRL_BASE, 338*e595107eSHao Zhang &ddr3_1333_32); 339*e595107eSHao Zhang } 340*e595107eSHao Zhang } else { 341*e595107eSHao Zhang printf("Unknown SO-DIMM. Cannot configure DDR3\n"); 342*e595107eSHao Zhang while (1) 343*e595107eSHao Zhang ; 344*e595107eSHao Zhang } 345*e595107eSHao Zhang 346*e595107eSHao Zhang init_pll(&ddr3b_333); 347*e595107eSHao Zhang ddr3_init_ddrphy(KS2_DDR3B_DDRPHYC, &ddr3phy_1333_64); 348*e595107eSHao Zhang ddr3_init_ddremif(KS2_DDR3B_EMIF_CTRL_BASE, &ddr3_1333_64); 349*e595107eSHao Zhang } 350