1*1f497308SPankaj Gupta /* 2*1f497308SPankaj Gupta * Copyright 2018-2021 NXP 3*1f497308SPankaj Gupta * 4*1f497308SPankaj Gupta * SPDX-License-Identifier: BSD-3-Clause 5*1f497308SPankaj Gupta * 6*1f497308SPankaj Gupta */ 7*1f497308SPankaj Gupta 8*1f497308SPankaj Gupta #include <assert.h> 9*1f497308SPankaj Gupta #include <errno.h> 10*1f497308SPankaj Gupta #include <stdbool.h> 11*1f497308SPankaj Gupta #include <stdint.h> 12*1f497308SPankaj Gupta #include <stdio.h> 13*1f497308SPankaj Gupta #include <stdlib.h> 14*1f497308SPankaj Gupta #include <string.h> 15*1f497308SPankaj Gupta 16*1f497308SPankaj Gupta #include <common/debug.h> 17*1f497308SPankaj Gupta #include <ddr.h> 18*1f497308SPankaj Gupta #include <lib/utils.h> 19*1f497308SPankaj Gupta #include <load_img.h> 20*1f497308SPankaj Gupta 21*1f497308SPankaj Gupta #include "plat_common.h" 22*1f497308SPankaj Gupta #include <platform_def.h> 23*1f497308SPankaj Gupta 24*1f497308SPankaj Gupta #ifdef CONFIG_STATIC_DDR 25*1f497308SPankaj Gupta 26*1f497308SPankaj Gupta const struct ddr_cfg_regs static_3200 = { 27*1f497308SPankaj Gupta .cs[0].bnds = U(0x03FFU), 28*1f497308SPankaj Gupta .cs[1].bnds = U(0x03FF), 29*1f497308SPankaj Gupta .cs[0].config = U(0x80050422), 30*1f497308SPankaj Gupta .cs[1].config = U(0x80000422), 31*1f497308SPankaj Gupta .cs[2].bnds = U(0x00), 32*1f497308SPankaj Gupta .cs[3].bnds = U(0x00), 33*1f497308SPankaj Gupta .cs[2].config = U(0x00), 34*1f497308SPankaj Gupta .cs[3].config = U(0x00), 35*1f497308SPankaj Gupta .timing_cfg[0] = U(0xFFAA0018), 36*1f497308SPankaj Gupta .timing_cfg[1] = U(0x646A8844), 37*1f497308SPankaj Gupta .timing_cfg[2] = U(0x00058022), 38*1f497308SPankaj Gupta .timing_cfg[3] = U(0x13622100), 39*1f497308SPankaj Gupta .timing_cfg[4] = U(0x02), 40*1f497308SPankaj Gupta .timing_cfg[5] = U(0x07401400), 41*1f497308SPankaj Gupta .timing_cfg[7] = U(0x3BB00000), 42*1f497308SPankaj Gupta .timing_cfg[8] = U(0x0944AC00), 43*1f497308SPankaj Gupta .sdram_cfg[0] = U(0x65044008), 44*1f497308SPankaj Gupta .sdram_cfg[1] = U(0x00401011), 45*1f497308SPankaj Gupta .sdram_cfg[2] = U(0x00), 46*1f497308SPankaj Gupta .sdram_mode[0] = U(0x06010C50), 47*1f497308SPankaj Gupta .sdram_mode[1] = U(0x00280400), 48*1f497308SPankaj Gupta .sdram_mode[2] = U(0x00), 49*1f497308SPankaj Gupta .sdram_mode[3] = U(0x00), 50*1f497308SPankaj Gupta .sdram_mode[4] = U(0x00), 51*1f497308SPankaj Gupta .sdram_mode[5] = U(0x00), 52*1f497308SPankaj Gupta .sdram_mode[6] = U(0x00), 53*1f497308SPankaj Gupta .sdram_mode[7] = U(0x00), 54*1f497308SPankaj Gupta .sdram_mode[8] = U(0x0500), 55*1f497308SPankaj Gupta .sdram_mode[9] = U(0x10240000), 56*1f497308SPankaj Gupta .sdram_mode[10] = U(0x00), 57*1f497308SPankaj Gupta .sdram_mode[11] = U(0x00), 58*1f497308SPankaj Gupta .sdram_mode[12] = U(0x00), 59*1f497308SPankaj Gupta .sdram_mode[13] = U(0x00), 60*1f497308SPankaj Gupta .sdram_mode[14] = U(0x00), 61*1f497308SPankaj Gupta .sdram_mode[15] = U(0x00), 62*1f497308SPankaj Gupta .md_cntl = U(0x00), 63*1f497308SPankaj Gupta .interval = U(0x30C00000), 64*1f497308SPankaj Gupta .data_init = U(0xDEADBEEF), 65*1f497308SPankaj Gupta .init_addr = U(0x00), 66*1f497308SPankaj Gupta .zq_cntl = U(0x8A090705), 67*1f497308SPankaj Gupta .sdram_rcw[0] = U(0x00), 68*1f497308SPankaj Gupta .sdram_rcw[1] = U(0x00), 69*1f497308SPankaj Gupta .sdram_rcw[2] = U(0x00), 70*1f497308SPankaj Gupta .sdram_rcw[3] = U(0x00), 71*1f497308SPankaj Gupta .sdram_rcw[4] = U(0x00), 72*1f497308SPankaj Gupta .sdram_rcw[5] = U(0x00), 73*1f497308SPankaj Gupta .err_disable = U(0x00), 74*1f497308SPankaj Gupta .err_int_en = U(0x00), 75*1f497308SPankaj Gupta }; 76*1f497308SPankaj Gupta 77*1f497308SPankaj Gupta const struct ddr_cfg_regs static_2900 = { 78*1f497308SPankaj Gupta .cs[0].bnds = U(0x03FF), 79*1f497308SPankaj Gupta .cs[1].bnds = U(0x03FF), 80*1f497308SPankaj Gupta .cs[0].config = U(0x80050422), 81*1f497308SPankaj Gupta .cs[1].config = U(0x80000422), 82*1f497308SPankaj Gupta .cs[2].bnds = U(0x00), 83*1f497308SPankaj Gupta .cs[3].bnds = U(0x00), 84*1f497308SPankaj Gupta .cs[2].config = U(0x00), 85*1f497308SPankaj Gupta .cs[3].config = U(0x00), 86*1f497308SPankaj Gupta .timing_cfg[0] = U(0xFF990018), 87*1f497308SPankaj Gupta .timing_cfg[1] = U(0x4F4A4844), 88*1f497308SPankaj Gupta .timing_cfg[2] = U(0x0005601F), 89*1f497308SPankaj Gupta .timing_cfg[3] = U(0x125F2100), 90*1f497308SPankaj Gupta .timing_cfg[4] = U(0x02), 91*1f497308SPankaj Gupta .timing_cfg[5] = U(0x07401400), 92*1f497308SPankaj Gupta .timing_cfg[7] = U(0x3AA00000), 93*1f497308SPankaj Gupta .timing_cfg[8] = U(0x09449B00), 94*1f497308SPankaj Gupta .sdram_cfg[0] = U(0x65044008), 95*1f497308SPankaj Gupta .sdram_cfg[1] = U(0x00401011), 96*1f497308SPankaj Gupta .sdram_cfg[2] = U(0x00), 97*1f497308SPankaj Gupta .sdram_mode[0] = U(0x06010C50), 98*1f497308SPankaj Gupta .sdram_mode[1] = U(0x00280400), 99*1f497308SPankaj Gupta .sdram_mode[2] = U(0x00), 100*1f497308SPankaj Gupta .sdram_mode[3] = U(0x00), 101*1f497308SPankaj Gupta .sdram_mode[4] = U(0x00), 102*1f497308SPankaj Gupta .sdram_mode[5] = U(0x00), 103*1f497308SPankaj Gupta .sdram_mode[6] = U(0x00), 104*1f497308SPankaj Gupta .sdram_mode[7] = U(0x00), 105*1f497308SPankaj Gupta .sdram_mode[8] = U(0x0500), 106*1f497308SPankaj Gupta .sdram_mode[9] = U(0x10240000), 107*1f497308SPankaj Gupta .sdram_mode[10] = U(0x00), 108*1f497308SPankaj Gupta .sdram_mode[11] = U(0x00), 109*1f497308SPankaj Gupta .sdram_mode[12] = U(0x00), 110*1f497308SPankaj Gupta .sdram_mode[13] = U(0x00), 111*1f497308SPankaj Gupta .sdram_mode[14] = U(0x00), 112*1f497308SPankaj Gupta .sdram_mode[15] = U(0x00), 113*1f497308SPankaj Gupta .md_cntl = U(0x00), 114*1f497308SPankaj Gupta .interval = U(0x2C2E0000), 115*1f497308SPankaj Gupta .data_init = U(0xDEADBEEF), 116*1f497308SPankaj Gupta .init_addr = U(0x00), 117*1f497308SPankaj Gupta .zq_cntl = U(0x8A090705), 118*1f497308SPankaj Gupta .sdram_rcw[0] = U(0x00), 119*1f497308SPankaj Gupta .sdram_rcw[1] = U(0x00), 120*1f497308SPankaj Gupta .sdram_rcw[2] = U(0x00), 121*1f497308SPankaj Gupta .sdram_rcw[3] = U(0x00), 122*1f497308SPankaj Gupta .sdram_rcw[4] = U(0x00), 123*1f497308SPankaj Gupta .sdram_rcw[5] = U(0x00), 124*1f497308SPankaj Gupta .err_disable = U(0x00), 125*1f497308SPankaj Gupta .err_int_en = U(0x00), 126*1f497308SPankaj Gupta }; 127*1f497308SPankaj Gupta 128*1f497308SPankaj Gupta const struct ddr_cfg_regs static_2600 = { 129*1f497308SPankaj Gupta .cs[0].bnds = U(0x03FF), 130*1f497308SPankaj Gupta .cs[1].bnds = U(0x03FF), 131*1f497308SPankaj Gupta .cs[0].config = U(0x80050422), 132*1f497308SPankaj Gupta .cs[1].config = U(0x80000422), 133*1f497308SPankaj Gupta .cs[2].bnds = U(0x00), 134*1f497308SPankaj Gupta .cs[3].bnds = U(0x00), 135*1f497308SPankaj Gupta .cs[2].config = U(0x00), 136*1f497308SPankaj Gupta .cs[3].config = U(0x00), 137*1f497308SPankaj Gupta .timing_cfg[0] = U(0xFF880018), 138*1f497308SPankaj Gupta .timing_cfg[1] = U(0x2A24F444), 139*1f497308SPankaj Gupta .timing_cfg[2] = U(0x007141DC), 140*1f497308SPankaj Gupta .timing_cfg[3] = U(0x125B2100), 141*1f497308SPankaj Gupta .timing_cfg[4] = U(0x02), 142*1f497308SPankaj Gupta .timing_cfg[5] = U(0x06401400), 143*1f497308SPankaj Gupta .timing_cfg[7] = U(0x28800000), 144*1f497308SPankaj Gupta .timing_cfg[8] = U(0x07338A00), 145*1f497308SPankaj Gupta .sdram_cfg[0] = U(0x65044008), 146*1f497308SPankaj Gupta .sdram_cfg[1] = U(0x00401011), 147*1f497308SPankaj Gupta .sdram_cfg[2] = U(0x00), 148*1f497308SPankaj Gupta .sdram_mode[0] = U(0x06010A70), 149*1f497308SPankaj Gupta .sdram_mode[1] = U(0x00200400), 150*1f497308SPankaj Gupta .sdram_mode[2] = U(0x00), 151*1f497308SPankaj Gupta .sdram_mode[3] = U(0x00), 152*1f497308SPankaj Gupta .sdram_mode[4] = U(0x00), 153*1f497308SPankaj Gupta .sdram_mode[5] = U(0x00), 154*1f497308SPankaj Gupta .sdram_mode[6] = U(0x00), 155*1f497308SPankaj Gupta .sdram_mode[7] = U(0x00), 156*1f497308SPankaj Gupta .sdram_mode[8] = U(0x0500), 157*1f497308SPankaj Gupta .sdram_mode[9] = U(0x0C240000), 158*1f497308SPankaj Gupta .sdram_mode[10] = U(0x00), 159*1f497308SPankaj Gupta .sdram_mode[11] = U(0x00), 160*1f497308SPankaj Gupta .sdram_mode[12] = U(0x00), 161*1f497308SPankaj Gupta .sdram_mode[13] = U(0x00), 162*1f497308SPankaj Gupta .sdram_mode[14] = U(0x00), 163*1f497308SPankaj Gupta .sdram_mode[15] = U(0x00), 164*1f497308SPankaj Gupta .md_cntl = U(0x00), 165*1f497308SPankaj Gupta .interval = U(0x279C0000), 166*1f497308SPankaj Gupta .data_init = U(0xDEADBEEF), 167*1f497308SPankaj Gupta .init_addr = U(0x00), 168*1f497308SPankaj Gupta .zq_cntl = U(0x8A090705), 169*1f497308SPankaj Gupta .sdram_rcw[0] = U(0x00), 170*1f497308SPankaj Gupta .sdram_rcw[1] = U(0x00), 171*1f497308SPankaj Gupta .sdram_rcw[2] = U(0x00), 172*1f497308SPankaj Gupta .sdram_rcw[3] = U(0x00), 173*1f497308SPankaj Gupta .sdram_rcw[4] = U(0x00), 174*1f497308SPankaj Gupta .sdram_rcw[5] = U(0x00), 175*1f497308SPankaj Gupta .err_disable = U(0x00), 176*1f497308SPankaj Gupta .err_int_en = U(0x00), 177*1f497308SPankaj Gupta }; 178*1f497308SPankaj Gupta 179*1f497308SPankaj Gupta const struct dimm_params static_dimm = { 180*1f497308SPankaj Gupta .rdimm = 0U, 181*1f497308SPankaj Gupta .primary_sdram_width = 64U, 182*1f497308SPankaj Gupta .ec_sdram_width = 8U, 183*1f497308SPankaj Gupta .n_ranks = 2U, 184*1f497308SPankaj Gupta .device_width = 8U, 185*1f497308SPankaj Gupta .mirrored_dimm = 1U, 186*1f497308SPankaj Gupta }; 187*1f497308SPankaj Gupta 188*1f497308SPankaj Gupta /* Sample code using two UDIMM MT18ASF1G72AZ-2G6B1, on each DDR controller */ 189*1f497308SPankaj Gupta unsigned long long board_static_ddr(struct ddr_info *priv) 190*1f497308SPankaj Gupta { 191*1f497308SPankaj Gupta memcpy(&priv->ddr_reg, &static_2900, sizeof(static_2900)); 192*1f497308SPankaj Gupta memcpy(&priv->dimm, &static_dimm, sizeof(static_dimm)); 193*1f497308SPankaj Gupta priv->conf.cs_on_dimm[0] = 0x3; 194*1f497308SPankaj Gupta ddr_board_options(priv); 195*1f497308SPankaj Gupta compute_ddr_phy(priv); 196*1f497308SPankaj Gupta 197*1f497308SPankaj Gupta return ULL(0x400000000); 198*1f497308SPankaj Gupta } 199*1f497308SPankaj Gupta 200*1f497308SPankaj Gupta #elif defined(CONFIG_DDR_NODIMM) 201*1f497308SPankaj Gupta /* 202*1f497308SPankaj Gupta * Sample code to bypass reading SPD. This is a sample, not recommended 203*1f497308SPankaj Gupta * for boards with slots. DDR model number: UDIMM MT18ASF1G72AZ-2G6B1. 204*1f497308SPankaj Gupta */ 205*1f497308SPankaj Gupta struct dimm_params ddr_raw_timing = { 206*1f497308SPankaj Gupta .n_ranks = 2U, 207*1f497308SPankaj Gupta .rank_density = U(0x200000000), 208*1f497308SPankaj Gupta .capacity = U(0x400000000), 209*1f497308SPankaj Gupta .primary_sdram_width = 64U, 210*1f497308SPankaj Gupta .ec_sdram_width = 8U, 211*1f497308SPankaj Gupta .device_width = 8U, 212*1f497308SPankaj Gupta .die_density = U(0x5), 213*1f497308SPankaj Gupta .rdimm = 0U, 214*1f497308SPankaj Gupta .mirrored_dimm = 1U, 215*1f497308SPankaj Gupta .n_row_addr = 16U, 216*1f497308SPankaj Gupta .n_col_addr = 10U, 217*1f497308SPankaj Gupta .bank_addr_bits = 0U, 218*1f497308SPankaj Gupta .bank_group_bits = 2U, 219*1f497308SPankaj Gupta .edc_config = 2U, 220*1f497308SPankaj Gupta .burst_lengths_bitmask = U(0x0c), 221*1f497308SPankaj Gupta .tckmin_x_ps = 625, 222*1f497308SPankaj Gupta .tckmax_ps = 1600, 223*1f497308SPankaj Gupta .caslat_x = U(0x15FFFC00), 224*1f497308SPankaj Gupta .taa_ps = 13750, 225*1f497308SPankaj Gupta .trcd_ps = 13750, 226*1f497308SPankaj Gupta .trp_ps = 13750, 227*1f497308SPankaj Gupta .tras_ps = 32000, 228*1f497308SPankaj Gupta .trc_ps = 457500, 229*1f497308SPankaj Gupta .twr_ps = 15000, 230*1f497308SPankaj Gupta .trfc1_ps = 350000, 231*1f497308SPankaj Gupta .trfc2_ps = 260000, 232*1f497308SPankaj Gupta .trfc4_ps = 160000, 233*1f497308SPankaj Gupta .tfaw_ps = 21000, 234*1f497308SPankaj Gupta .trrds_ps = 2500, 235*1f497308SPankaj Gupta .trrdl_ps = 4900, 236*1f497308SPankaj Gupta .tccdl_ps = 5000, 237*1f497308SPankaj Gupta .refresh_rate_ps = 7800000U, 238*1f497308SPankaj Gupta }; 239*1f497308SPankaj Gupta 240*1f497308SPankaj Gupta int ddr_get_ddr_params(struct dimm_params *pdimm, 241*1f497308SPankaj Gupta struct ddr_conf *conf) 242*1f497308SPankaj Gupta { 243*1f497308SPankaj Gupta static const char dimm_model[] = "Fixed DDR on board"; 244*1f497308SPankaj Gupta 245*1f497308SPankaj Gupta conf->dimm_in_use[0] = 1; /* Modify accordingly */ 246*1f497308SPankaj Gupta memcpy(pdimm, &ddr_raw_timing, sizeof(struct dimm_params)); 247*1f497308SPankaj Gupta memcpy(pdimm->mpart, dimm_model, sizeof(dimm_model) - 1); 248*1f497308SPankaj Gupta 249*1f497308SPankaj Gupta /* valid DIMM mask, change accordingly, together with dimm_on_ctlr. */ 250*1f497308SPankaj Gupta return 0x5; 251*1f497308SPankaj Gupta } 252*1f497308SPankaj Gupta #endif /* CONFIG_DDR_NODIMM */ 253*1f497308SPankaj Gupta 254*1f497308SPankaj Gupta int ddr_board_options(struct ddr_info *priv) 255*1f497308SPankaj Gupta { 256*1f497308SPankaj Gupta struct memctl_opt *popts = &priv->opt; 257*1f497308SPankaj Gupta const struct ddr_conf *conf = &priv->conf; 258*1f497308SPankaj Gupta 259*1f497308SPankaj Gupta popts->vref_dimm = U(0x19); /* range 1, 83.4% */ 260*1f497308SPankaj Gupta popts->rtt_override = 1U; 261*1f497308SPankaj Gupta popts->rtt_override_value = 0x5U; /* RTT being used as 60 ohm */ 262*1f497308SPankaj Gupta popts->rtt_park = 120U; 263*1f497308SPankaj Gupta popts->otf_burst_chop_en = 0; 264*1f497308SPankaj Gupta popts->burst_length = DDR_BL8; 265*1f497308SPankaj Gupta popts->trwt_override = 1U; 266*1f497308SPankaj Gupta popts->bstopre = 0U; /* auto precharge */ 267*1f497308SPankaj Gupta popts->addr_hash = 1; 268*1f497308SPankaj Gupta 269*1f497308SPankaj Gupta /* Set ODT impedance on PHY side */ 270*1f497308SPankaj Gupta switch (conf->cs_on_dimm[1]) { 271*1f497308SPankaj Gupta case 0xc: /* Two slots dual rank */ 272*1f497308SPankaj Gupta case 0x4: /* Two slots single rank, not valid for interleaving */ 273*1f497308SPankaj Gupta popts->trwt = U(0xf); 274*1f497308SPankaj Gupta popts->twrt = U(0x7); 275*1f497308SPankaj Gupta popts->trrt = U(0x7); 276*1f497308SPankaj Gupta popts->twwt = U(0x7); 277*1f497308SPankaj Gupta popts->vref_phy = U(0x6B); /* 83.6% */ 278*1f497308SPankaj Gupta popts->odt = 60U; 279*1f497308SPankaj Gupta popts->phy_tx_impedance = 28U; 280*1f497308SPankaj Gupta break; 281*1f497308SPankaj Gupta case 0: /* Ont slot used */ 282*1f497308SPankaj Gupta default: 283*1f497308SPankaj Gupta popts->trwt = U(0x3); 284*1f497308SPankaj Gupta popts->twrt = U(0x3); 285*1f497308SPankaj Gupta popts->trrt = U(0x3); 286*1f497308SPankaj Gupta popts->twwt = U(0x3); 287*1f497308SPankaj Gupta popts->vref_phy = U(0x5D); /* 72% */ 288*1f497308SPankaj Gupta popts->odt = 60U; 289*1f497308SPankaj Gupta popts->phy_tx_impedance = 28U; 290*1f497308SPankaj Gupta break; 291*1f497308SPankaj Gupta } 292*1f497308SPankaj Gupta 293*1f497308SPankaj Gupta return 0; 294*1f497308SPankaj Gupta } 295*1f497308SPankaj Gupta 296*1f497308SPankaj Gupta #ifdef NXP_WARM_BOOT 297*1f497308SPankaj Gupta long long init_ddr(uint32_t wrm_bt_flg) 298*1f497308SPankaj Gupta #else 299*1f497308SPankaj Gupta long long init_ddr(void) 300*1f497308SPankaj Gupta #endif 301*1f497308SPankaj Gupta { 302*1f497308SPankaj Gupta int spd_addr[] = { 0x51, 0x52, 0x53, 0x54 }; 303*1f497308SPankaj Gupta struct ddr_info info; 304*1f497308SPankaj Gupta struct sysinfo sys; 305*1f497308SPankaj Gupta long long dram_size; 306*1f497308SPankaj Gupta 307*1f497308SPankaj Gupta zeromem(&sys, sizeof(sys)); 308*1f497308SPankaj Gupta if (get_clocks(&sys) != 0) { 309*1f497308SPankaj Gupta ERROR("System clocks are not set\n"); 310*1f497308SPankaj Gupta panic(); 311*1f497308SPankaj Gupta } 312*1f497308SPankaj Gupta debug("platform clock %lu\n", sys.freq_platform); 313*1f497308SPankaj Gupta debug("DDR PLL1 %lu\n", sys.freq_ddr_pll0); 314*1f497308SPankaj Gupta debug("DDR PLL2 %lu\n", sys.freq_ddr_pll1); 315*1f497308SPankaj Gupta 316*1f497308SPankaj Gupta zeromem(&info, sizeof(info)); 317*1f497308SPankaj Gupta 318*1f497308SPankaj Gupta /* Set two DDRC. Unused DDRC will be removed automatically. */ 319*1f497308SPankaj Gupta info.num_ctlrs = NUM_OF_DDRC; 320*1f497308SPankaj Gupta info.spd_addr = spd_addr; 321*1f497308SPankaj Gupta info.ddr[0] = (void *)NXP_DDR_ADDR; 322*1f497308SPankaj Gupta info.ddr[1] = (void *)NXP_DDR2_ADDR; 323*1f497308SPankaj Gupta info.phy[0] = (void *)NXP_DDR_PHY1_ADDR; 324*1f497308SPankaj Gupta info.phy[1] = (void *)NXP_DDR_PHY2_ADDR; 325*1f497308SPankaj Gupta info.clk = get_ddr_freq(&sys, 0); 326*1f497308SPankaj Gupta info.img_loadr = load_img; 327*1f497308SPankaj Gupta info.phy_gen2_fw_img_buf = PHY_GEN2_FW_IMAGE_BUFFER; 328*1f497308SPankaj Gupta if (info.clk == 0) { 329*1f497308SPankaj Gupta info.clk = get_ddr_freq(&sys, 1); 330*1f497308SPankaj Gupta } 331*1f497308SPankaj Gupta info.dimm_on_ctlr = DDRC_NUM_DIMM; 332*1f497308SPankaj Gupta 333*1f497308SPankaj Gupta info.warm_boot_flag = DDR_WRM_BOOT_NT_SUPPORTED; 334*1f497308SPankaj Gupta #ifdef NXP_WARM_BOOT 335*1f497308SPankaj Gupta if (wrm_bt_flg != 0) { 336*1f497308SPankaj Gupta info.warm_boot_flag = DDR_WARM_BOOT; 337*1f497308SPankaj Gupta } else { 338*1f497308SPankaj Gupta info.warm_boot_flag = DDR_COLD_BOOT; 339*1f497308SPankaj Gupta } 340*1f497308SPankaj Gupta #endif 341*1f497308SPankaj Gupta 342*1f497308SPankaj Gupta dram_size = dram_init(&info 343*1f497308SPankaj Gupta #if defined(NXP_HAS_CCN504) || defined(NXP_HAS_CCN508) 344*1f497308SPankaj Gupta , NXP_CCN_HN_F_0_ADDR 345*1f497308SPankaj Gupta #endif 346*1f497308SPankaj Gupta ); 347*1f497308SPankaj Gupta 348*1f497308SPankaj Gupta 349*1f497308SPankaj Gupta if (dram_size < 0) { 350*1f497308SPankaj Gupta ERROR("DDR init failed.\n"); 351*1f497308SPankaj Gupta } 352*1f497308SPankaj Gupta 353*1f497308SPankaj Gupta return dram_size; 354*1f497308SPankaj Gupta } 355