1*5614e71bSYork Sun /* 2*5614e71bSYork Sun * Copyright 2008-2012 Freescale Semiconductor, Inc. 3*5614e71bSYork Sun * 4*5614e71bSYork Sun * SPDX-License-Identifier: GPL-2.0+ 5*5614e71bSYork Sun */ 6*5614e71bSYork Sun 7*5614e71bSYork Sun /* 8*5614e71bSYork Sun * Generic driver for Freescale DDR/DDR2/DDR3 memory controller. 9*5614e71bSYork Sun * Based on code from spd_sdram.c 10*5614e71bSYork Sun * Author: James Yang [at freescale.com] 11*5614e71bSYork Sun */ 12*5614e71bSYork Sun 13*5614e71bSYork Sun #include <common.h> 14*5614e71bSYork Sun #include <fsl_ddr_sdram.h> 15*5614e71bSYork Sun 16*5614e71bSYork Sun #include <fsl_ddr.h> 17*5614e71bSYork Sun #include <asm/io.h> 18*5614e71bSYork Sun 19*5614e71bSYork Sun #define _DDR_ADDR CONFIG_SYS_FSL_DDR_ADDR 20*5614e71bSYork Sun 21*5614e71bSYork Sun static u32 fsl_ddr_get_version(void) 22*5614e71bSYork Sun { 23*5614e71bSYork Sun ccsr_ddr_t *ddr; 24*5614e71bSYork Sun u32 ver_major_minor_errata; 25*5614e71bSYork Sun 26*5614e71bSYork Sun ddr = (void *)_DDR_ADDR; 27*5614e71bSYork Sun ver_major_minor_errata = (in_be32(&ddr->ip_rev1) & 0xFFFF) << 8; 28*5614e71bSYork Sun ver_major_minor_errata |= (in_be32(&ddr->ip_rev2) & 0xFF00) >> 8; 29*5614e71bSYork Sun 30*5614e71bSYork Sun return ver_major_minor_errata; 31*5614e71bSYork Sun } 32*5614e71bSYork Sun 33*5614e71bSYork Sun unsigned int picos_to_mclk(unsigned int picos); 34*5614e71bSYork Sun 35*5614e71bSYork Sun /* 36*5614e71bSYork Sun * Determine Rtt value. 37*5614e71bSYork Sun * 38*5614e71bSYork Sun * This should likely be either board or controller specific. 39*5614e71bSYork Sun * 40*5614e71bSYork Sun * Rtt(nominal) - DDR2: 41*5614e71bSYork Sun * 0 = Rtt disabled 42*5614e71bSYork Sun * 1 = 75 ohm 43*5614e71bSYork Sun * 2 = 150 ohm 44*5614e71bSYork Sun * 3 = 50 ohm 45*5614e71bSYork Sun * Rtt(nominal) - DDR3: 46*5614e71bSYork Sun * 0 = Rtt disabled 47*5614e71bSYork Sun * 1 = 60 ohm 48*5614e71bSYork Sun * 2 = 120 ohm 49*5614e71bSYork Sun * 3 = 40 ohm 50*5614e71bSYork Sun * 4 = 20 ohm 51*5614e71bSYork Sun * 5 = 30 ohm 52*5614e71bSYork Sun * 53*5614e71bSYork Sun * FIXME: Apparently 8641 needs a value of 2 54*5614e71bSYork Sun * FIXME: Old code seys if 667 MHz or higher, use 3 on 8572 55*5614e71bSYork Sun * 56*5614e71bSYork Sun * FIXME: There was some effort down this line earlier: 57*5614e71bSYork Sun * 58*5614e71bSYork Sun * unsigned int i; 59*5614e71bSYork Sun * for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL/2; i++) { 60*5614e71bSYork Sun * if (popts->dimmslot[i].num_valid_cs 61*5614e71bSYork Sun * && (popts->cs_local_opts[2*i].odt_rd_cfg 62*5614e71bSYork Sun * || popts->cs_local_opts[2*i].odt_wr_cfg)) { 63*5614e71bSYork Sun * rtt = 2; 64*5614e71bSYork Sun * break; 65*5614e71bSYork Sun * } 66*5614e71bSYork Sun * } 67*5614e71bSYork Sun */ 68*5614e71bSYork Sun static inline int fsl_ddr_get_rtt(void) 69*5614e71bSYork Sun { 70*5614e71bSYork Sun int rtt; 71*5614e71bSYork Sun 72*5614e71bSYork Sun #if defined(CONFIG_SYS_FSL_DDR1) 73*5614e71bSYork Sun rtt = 0; 74*5614e71bSYork Sun #elif defined(CONFIG_SYS_FSL_DDR2) 75*5614e71bSYork Sun rtt = 3; 76*5614e71bSYork Sun #else 77*5614e71bSYork Sun rtt = 0; 78*5614e71bSYork Sun #endif 79*5614e71bSYork Sun 80*5614e71bSYork Sun return rtt; 81*5614e71bSYork Sun } 82*5614e71bSYork Sun 83*5614e71bSYork Sun /* 84*5614e71bSYork Sun * compute the CAS write latency according to DDR3 spec 85*5614e71bSYork Sun * CWL = 5 if tCK >= 2.5ns 86*5614e71bSYork Sun * 6 if 2.5ns > tCK >= 1.875ns 87*5614e71bSYork Sun * 7 if 1.875ns > tCK >= 1.5ns 88*5614e71bSYork Sun * 8 if 1.5ns > tCK >= 1.25ns 89*5614e71bSYork Sun * 9 if 1.25ns > tCK >= 1.07ns 90*5614e71bSYork Sun * 10 if 1.07ns > tCK >= 0.935ns 91*5614e71bSYork Sun * 11 if 0.935ns > tCK >= 0.833ns 92*5614e71bSYork Sun * 12 if 0.833ns > tCK >= 0.75ns 93*5614e71bSYork Sun */ 94*5614e71bSYork Sun static inline unsigned int compute_cas_write_latency(void) 95*5614e71bSYork Sun { 96*5614e71bSYork Sun unsigned int cwl; 97*5614e71bSYork Sun const unsigned int mclk_ps = get_memory_clk_period_ps(); 98*5614e71bSYork Sun 99*5614e71bSYork Sun if (mclk_ps >= 2500) 100*5614e71bSYork Sun cwl = 5; 101*5614e71bSYork Sun else if (mclk_ps >= 1875) 102*5614e71bSYork Sun cwl = 6; 103*5614e71bSYork Sun else if (mclk_ps >= 1500) 104*5614e71bSYork Sun cwl = 7; 105*5614e71bSYork Sun else if (mclk_ps >= 1250) 106*5614e71bSYork Sun cwl = 8; 107*5614e71bSYork Sun else if (mclk_ps >= 1070) 108*5614e71bSYork Sun cwl = 9; 109*5614e71bSYork Sun else if (mclk_ps >= 935) 110*5614e71bSYork Sun cwl = 10; 111*5614e71bSYork Sun else if (mclk_ps >= 833) 112*5614e71bSYork Sun cwl = 11; 113*5614e71bSYork Sun else if (mclk_ps >= 750) 114*5614e71bSYork Sun cwl = 12; 115*5614e71bSYork Sun else { 116*5614e71bSYork Sun cwl = 12; 117*5614e71bSYork Sun printf("Warning: CWL is out of range\n"); 118*5614e71bSYork Sun } 119*5614e71bSYork Sun return cwl; 120*5614e71bSYork Sun } 121*5614e71bSYork Sun 122*5614e71bSYork Sun /* Chip Select Configuration (CSn_CONFIG) */ 123*5614e71bSYork Sun static void set_csn_config(int dimm_number, int i, fsl_ddr_cfg_regs_t *ddr, 124*5614e71bSYork Sun const memctl_options_t *popts, 125*5614e71bSYork Sun const dimm_params_t *dimm_params) 126*5614e71bSYork Sun { 127*5614e71bSYork Sun unsigned int cs_n_en = 0; /* Chip Select enable */ 128*5614e71bSYork Sun unsigned int intlv_en = 0; /* Memory controller interleave enable */ 129*5614e71bSYork Sun unsigned int intlv_ctl = 0; /* Interleaving control */ 130*5614e71bSYork Sun unsigned int ap_n_en = 0; /* Chip select n auto-precharge enable */ 131*5614e71bSYork Sun unsigned int odt_rd_cfg = 0; /* ODT for reads configuration */ 132*5614e71bSYork Sun unsigned int odt_wr_cfg = 0; /* ODT for writes configuration */ 133*5614e71bSYork Sun unsigned int ba_bits_cs_n = 0; /* Num of bank bits for SDRAM on CSn */ 134*5614e71bSYork Sun unsigned int row_bits_cs_n = 0; /* Num of row bits for SDRAM on CSn */ 135*5614e71bSYork Sun unsigned int col_bits_cs_n = 0; /* Num of ocl bits for SDRAM on CSn */ 136*5614e71bSYork Sun int go_config = 0; 137*5614e71bSYork Sun 138*5614e71bSYork Sun /* Compute CS_CONFIG only for existing ranks of each DIMM. */ 139*5614e71bSYork Sun switch (i) { 140*5614e71bSYork Sun case 0: 141*5614e71bSYork Sun if (dimm_params[dimm_number].n_ranks > 0) { 142*5614e71bSYork Sun go_config = 1; 143*5614e71bSYork Sun /* These fields only available in CS0_CONFIG */ 144*5614e71bSYork Sun if (!popts->memctl_interleaving) 145*5614e71bSYork Sun break; 146*5614e71bSYork Sun switch (popts->memctl_interleaving_mode) { 147*5614e71bSYork Sun case FSL_DDR_CACHE_LINE_INTERLEAVING: 148*5614e71bSYork Sun case FSL_DDR_PAGE_INTERLEAVING: 149*5614e71bSYork Sun case FSL_DDR_BANK_INTERLEAVING: 150*5614e71bSYork Sun case FSL_DDR_SUPERBANK_INTERLEAVING: 151*5614e71bSYork Sun intlv_en = popts->memctl_interleaving; 152*5614e71bSYork Sun intlv_ctl = popts->memctl_interleaving_mode; 153*5614e71bSYork Sun break; 154*5614e71bSYork Sun default: 155*5614e71bSYork Sun break; 156*5614e71bSYork Sun } 157*5614e71bSYork Sun } 158*5614e71bSYork Sun break; 159*5614e71bSYork Sun case 1: 160*5614e71bSYork Sun if ((dimm_number == 0 && dimm_params[0].n_ranks > 1) || \ 161*5614e71bSYork Sun (dimm_number == 1 && dimm_params[1].n_ranks > 0)) 162*5614e71bSYork Sun go_config = 1; 163*5614e71bSYork Sun break; 164*5614e71bSYork Sun case 2: 165*5614e71bSYork Sun if ((dimm_number == 0 && dimm_params[0].n_ranks > 2) || \ 166*5614e71bSYork Sun (dimm_number >= 1 && dimm_params[dimm_number].n_ranks > 0)) 167*5614e71bSYork Sun go_config = 1; 168*5614e71bSYork Sun break; 169*5614e71bSYork Sun case 3: 170*5614e71bSYork Sun if ((dimm_number == 0 && dimm_params[0].n_ranks > 3) || \ 171*5614e71bSYork Sun (dimm_number == 1 && dimm_params[1].n_ranks > 1) || \ 172*5614e71bSYork Sun (dimm_number == 3 && dimm_params[3].n_ranks > 0)) 173*5614e71bSYork Sun go_config = 1; 174*5614e71bSYork Sun break; 175*5614e71bSYork Sun default: 176*5614e71bSYork Sun break; 177*5614e71bSYork Sun } 178*5614e71bSYork Sun if (go_config) { 179*5614e71bSYork Sun unsigned int n_banks_per_sdram_device; 180*5614e71bSYork Sun cs_n_en = 1; 181*5614e71bSYork Sun ap_n_en = popts->cs_local_opts[i].auto_precharge; 182*5614e71bSYork Sun odt_rd_cfg = popts->cs_local_opts[i].odt_rd_cfg; 183*5614e71bSYork Sun odt_wr_cfg = popts->cs_local_opts[i].odt_wr_cfg; 184*5614e71bSYork Sun n_banks_per_sdram_device 185*5614e71bSYork Sun = dimm_params[dimm_number].n_banks_per_sdram_device; 186*5614e71bSYork Sun ba_bits_cs_n = __ilog2(n_banks_per_sdram_device) - 2; 187*5614e71bSYork Sun row_bits_cs_n = dimm_params[dimm_number].n_row_addr - 12; 188*5614e71bSYork Sun col_bits_cs_n = dimm_params[dimm_number].n_col_addr - 8; 189*5614e71bSYork Sun } 190*5614e71bSYork Sun ddr->cs[i].config = (0 191*5614e71bSYork Sun | ((cs_n_en & 0x1) << 31) 192*5614e71bSYork Sun | ((intlv_en & 0x3) << 29) 193*5614e71bSYork Sun | ((intlv_ctl & 0xf) << 24) 194*5614e71bSYork Sun | ((ap_n_en & 0x1) << 23) 195*5614e71bSYork Sun 196*5614e71bSYork Sun /* XXX: some implementation only have 1 bit starting at left */ 197*5614e71bSYork Sun | ((odt_rd_cfg & 0x7) << 20) 198*5614e71bSYork Sun 199*5614e71bSYork Sun /* XXX: Some implementation only have 1 bit starting at left */ 200*5614e71bSYork Sun | ((odt_wr_cfg & 0x7) << 16) 201*5614e71bSYork Sun 202*5614e71bSYork Sun | ((ba_bits_cs_n & 0x3) << 14) 203*5614e71bSYork Sun | ((row_bits_cs_n & 0x7) << 8) 204*5614e71bSYork Sun | ((col_bits_cs_n & 0x7) << 0) 205*5614e71bSYork Sun ); 206*5614e71bSYork Sun debug("FSLDDR: cs[%d]_config = 0x%08x\n", i,ddr->cs[i].config); 207*5614e71bSYork Sun } 208*5614e71bSYork Sun 209*5614e71bSYork Sun /* Chip Select Configuration 2 (CSn_CONFIG_2) */ 210*5614e71bSYork Sun /* FIXME: 8572 */ 211*5614e71bSYork Sun static void set_csn_config_2(int i, fsl_ddr_cfg_regs_t *ddr) 212*5614e71bSYork Sun { 213*5614e71bSYork Sun unsigned int pasr_cfg = 0; /* Partial array self refresh config */ 214*5614e71bSYork Sun 215*5614e71bSYork Sun ddr->cs[i].config_2 = ((pasr_cfg & 7) << 24); 216*5614e71bSYork Sun debug("FSLDDR: cs[%d]_config_2 = 0x%08x\n", i, ddr->cs[i].config_2); 217*5614e71bSYork Sun } 218*5614e71bSYork Sun 219*5614e71bSYork Sun /* -3E = 667 CL5, -25 = CL6 800, -25E = CL5 800 */ 220*5614e71bSYork Sun 221*5614e71bSYork Sun #if !defined(CONFIG_SYS_FSL_DDR1) 222*5614e71bSYork Sun static inline int avoid_odt_overlap(const dimm_params_t *dimm_params) 223*5614e71bSYork Sun { 224*5614e71bSYork Sun #if CONFIG_DIMM_SLOTS_PER_CTLR == 1 225*5614e71bSYork Sun if (dimm_params[0].n_ranks == 4) 226*5614e71bSYork Sun return 1; 227*5614e71bSYork Sun #endif 228*5614e71bSYork Sun 229*5614e71bSYork Sun #if CONFIG_DIMM_SLOTS_PER_CTLR == 2 230*5614e71bSYork Sun if ((dimm_params[0].n_ranks == 2) && 231*5614e71bSYork Sun (dimm_params[1].n_ranks == 2)) 232*5614e71bSYork Sun return 1; 233*5614e71bSYork Sun 234*5614e71bSYork Sun #ifdef CONFIG_FSL_DDR_FIRST_SLOT_QUAD_CAPABLE 235*5614e71bSYork Sun if (dimm_params[0].n_ranks == 4) 236*5614e71bSYork Sun return 1; 237*5614e71bSYork Sun #endif 238*5614e71bSYork Sun #endif 239*5614e71bSYork Sun return 0; 240*5614e71bSYork Sun } 241*5614e71bSYork Sun 242*5614e71bSYork Sun /* 243*5614e71bSYork Sun * DDR SDRAM Timing Configuration 0 (TIMING_CFG_0) 244*5614e71bSYork Sun * 245*5614e71bSYork Sun * Avoid writing for DDR I. The new PQ38 DDR controller 246*5614e71bSYork Sun * dreams up non-zero default values to be backwards compatible. 247*5614e71bSYork Sun */ 248*5614e71bSYork Sun static void set_timing_cfg_0(fsl_ddr_cfg_regs_t *ddr, 249*5614e71bSYork Sun const memctl_options_t *popts, 250*5614e71bSYork Sun const dimm_params_t *dimm_params) 251*5614e71bSYork Sun { 252*5614e71bSYork Sun unsigned char trwt_mclk = 0; /* Read-to-write turnaround */ 253*5614e71bSYork Sun unsigned char twrt_mclk = 0; /* Write-to-read turnaround */ 254*5614e71bSYork Sun /* 7.5 ns on -3E; 0 means WL - CL + BL/2 + 1 */ 255*5614e71bSYork Sun unsigned char trrt_mclk = 0; /* Read-to-read turnaround */ 256*5614e71bSYork Sun unsigned char twwt_mclk = 0; /* Write-to-write turnaround */ 257*5614e71bSYork Sun 258*5614e71bSYork Sun /* Active powerdown exit timing (tXARD and tXARDS). */ 259*5614e71bSYork Sun unsigned char act_pd_exit_mclk; 260*5614e71bSYork Sun /* Precharge powerdown exit timing (tXP). */ 261*5614e71bSYork Sun unsigned char pre_pd_exit_mclk; 262*5614e71bSYork Sun /* ODT powerdown exit timing (tAXPD). */ 263*5614e71bSYork Sun unsigned char taxpd_mclk; 264*5614e71bSYork Sun /* Mode register set cycle time (tMRD). */ 265*5614e71bSYork Sun unsigned char tmrd_mclk; 266*5614e71bSYork Sun 267*5614e71bSYork Sun #ifdef CONFIG_SYS_FSL_DDR3 268*5614e71bSYork Sun /* 269*5614e71bSYork Sun * (tXARD and tXARDS). Empirical? 270*5614e71bSYork Sun * The DDR3 spec has not tXARD, 271*5614e71bSYork Sun * we use the tXP instead of it. 272*5614e71bSYork Sun * tXP=max(3nCK, 7.5ns) for DDR3. 273*5614e71bSYork Sun * spec has not the tAXPD, we use 274*5614e71bSYork Sun * tAXPD=1, need design to confirm. 275*5614e71bSYork Sun */ 276*5614e71bSYork Sun int tXP = max((get_memory_clk_period_ps() * 3), 7500); /* unit=ps */ 277*5614e71bSYork Sun unsigned int data_rate = get_ddr_freq(0); 278*5614e71bSYork Sun tmrd_mclk = 4; 279*5614e71bSYork Sun /* set the turnaround time */ 280*5614e71bSYork Sun 281*5614e71bSYork Sun /* 282*5614e71bSYork Sun * for single quad-rank DIMM and two dual-rank DIMMs 283*5614e71bSYork Sun * to avoid ODT overlap 284*5614e71bSYork Sun */ 285*5614e71bSYork Sun if (avoid_odt_overlap(dimm_params)) { 286*5614e71bSYork Sun twwt_mclk = 2; 287*5614e71bSYork Sun trrt_mclk = 1; 288*5614e71bSYork Sun } 289*5614e71bSYork Sun /* for faster clock, need more time for data setup */ 290*5614e71bSYork Sun trwt_mclk = (data_rate/1000000 > 1800) ? 2 : 1; 291*5614e71bSYork Sun 292*5614e71bSYork Sun if ((data_rate/1000000 > 1150) || (popts->memctl_interleaving)) 293*5614e71bSYork Sun twrt_mclk = 1; 294*5614e71bSYork Sun 295*5614e71bSYork Sun if (popts->dynamic_power == 0) { /* powerdown is not used */ 296*5614e71bSYork Sun act_pd_exit_mclk = 1; 297*5614e71bSYork Sun pre_pd_exit_mclk = 1; 298*5614e71bSYork Sun taxpd_mclk = 1; 299*5614e71bSYork Sun } else { 300*5614e71bSYork Sun /* act_pd_exit_mclk = tXARD, see above */ 301*5614e71bSYork Sun act_pd_exit_mclk = picos_to_mclk(tXP); 302*5614e71bSYork Sun /* Mode register MR0[A12] is '1' - fast exit */ 303*5614e71bSYork Sun pre_pd_exit_mclk = act_pd_exit_mclk; 304*5614e71bSYork Sun taxpd_mclk = 1; 305*5614e71bSYork Sun } 306*5614e71bSYork Sun #else /* CONFIG_SYS_FSL_DDR2 */ 307*5614e71bSYork Sun /* 308*5614e71bSYork Sun * (tXARD and tXARDS). Empirical? 309*5614e71bSYork Sun * tXARD = 2 for DDR2 310*5614e71bSYork Sun * tXP=2 311*5614e71bSYork Sun * tAXPD=8 312*5614e71bSYork Sun */ 313*5614e71bSYork Sun act_pd_exit_mclk = 2; 314*5614e71bSYork Sun pre_pd_exit_mclk = 2; 315*5614e71bSYork Sun taxpd_mclk = 8; 316*5614e71bSYork Sun tmrd_mclk = 2; 317*5614e71bSYork Sun #endif 318*5614e71bSYork Sun 319*5614e71bSYork Sun if (popts->trwt_override) 320*5614e71bSYork Sun trwt_mclk = popts->trwt; 321*5614e71bSYork Sun 322*5614e71bSYork Sun ddr->timing_cfg_0 = (0 323*5614e71bSYork Sun | ((trwt_mclk & 0x3) << 30) /* RWT */ 324*5614e71bSYork Sun | ((twrt_mclk & 0x3) << 28) /* WRT */ 325*5614e71bSYork Sun | ((trrt_mclk & 0x3) << 26) /* RRT */ 326*5614e71bSYork Sun | ((twwt_mclk & 0x3) << 24) /* WWT */ 327*5614e71bSYork Sun | ((act_pd_exit_mclk & 0x7) << 20) /* ACT_PD_EXIT */ 328*5614e71bSYork Sun | ((pre_pd_exit_mclk & 0xF) << 16) /* PRE_PD_EXIT */ 329*5614e71bSYork Sun | ((taxpd_mclk & 0xf) << 8) /* ODT_PD_EXIT */ 330*5614e71bSYork Sun | ((tmrd_mclk & 0xf) << 0) /* MRS_CYC */ 331*5614e71bSYork Sun ); 332*5614e71bSYork Sun debug("FSLDDR: timing_cfg_0 = 0x%08x\n", ddr->timing_cfg_0); 333*5614e71bSYork Sun } 334*5614e71bSYork Sun #endif /* defined(CONFIG_SYS_FSL_DDR2) */ 335*5614e71bSYork Sun 336*5614e71bSYork Sun /* DDR SDRAM Timing Configuration 3 (TIMING_CFG_3) */ 337*5614e71bSYork Sun static void set_timing_cfg_3(fsl_ddr_cfg_regs_t *ddr, 338*5614e71bSYork Sun const memctl_options_t *popts, 339*5614e71bSYork Sun const common_timing_params_t *common_dimm, 340*5614e71bSYork Sun unsigned int cas_latency) 341*5614e71bSYork Sun { 342*5614e71bSYork Sun /* Extended precharge to activate interval (tRP) */ 343*5614e71bSYork Sun unsigned int ext_pretoact = 0; 344*5614e71bSYork Sun /* Extended Activate to precharge interval (tRAS) */ 345*5614e71bSYork Sun unsigned int ext_acttopre = 0; 346*5614e71bSYork Sun /* Extended activate to read/write interval (tRCD) */ 347*5614e71bSYork Sun unsigned int ext_acttorw = 0; 348*5614e71bSYork Sun /* Extended refresh recovery time (tRFC) */ 349*5614e71bSYork Sun unsigned int ext_refrec; 350*5614e71bSYork Sun /* Extended MCAS latency from READ cmd */ 351*5614e71bSYork Sun unsigned int ext_caslat = 0; 352*5614e71bSYork Sun /* Extended last data to precharge interval (tWR) */ 353*5614e71bSYork Sun unsigned int ext_wrrec = 0; 354*5614e71bSYork Sun /* Control Adjust */ 355*5614e71bSYork Sun unsigned int cntl_adj = 0; 356*5614e71bSYork Sun 357*5614e71bSYork Sun ext_pretoact = picos_to_mclk(common_dimm->trp_ps) >> 4; 358*5614e71bSYork Sun ext_acttopre = picos_to_mclk(common_dimm->tras_ps) >> 4; 359*5614e71bSYork Sun ext_acttorw = picos_to_mclk(common_dimm->trcd_ps) >> 4; 360*5614e71bSYork Sun ext_caslat = (2 * cas_latency - 1) >> 4; 361*5614e71bSYork Sun ext_refrec = (picos_to_mclk(common_dimm->trfc_ps) - 8) >> 4; 362*5614e71bSYork Sun /* ext_wrrec only deals with 16 clock and above, or 14 with OTF */ 363*5614e71bSYork Sun ext_wrrec = (picos_to_mclk(common_dimm->twr_ps) + 364*5614e71bSYork Sun (popts->otf_burst_chop_en ? 2 : 0)) >> 4; 365*5614e71bSYork Sun 366*5614e71bSYork Sun ddr->timing_cfg_3 = (0 367*5614e71bSYork Sun | ((ext_pretoact & 0x1) << 28) 368*5614e71bSYork Sun | ((ext_acttopre & 0x3) << 24) 369*5614e71bSYork Sun | ((ext_acttorw & 0x1) << 22) 370*5614e71bSYork Sun | ((ext_refrec & 0x1F) << 16) 371*5614e71bSYork Sun | ((ext_caslat & 0x3) << 12) 372*5614e71bSYork Sun | ((ext_wrrec & 0x1) << 8) 373*5614e71bSYork Sun | ((cntl_adj & 0x7) << 0) 374*5614e71bSYork Sun ); 375*5614e71bSYork Sun debug("FSLDDR: timing_cfg_3 = 0x%08x\n", ddr->timing_cfg_3); 376*5614e71bSYork Sun } 377*5614e71bSYork Sun 378*5614e71bSYork Sun /* DDR SDRAM Timing Configuration 1 (TIMING_CFG_1) */ 379*5614e71bSYork Sun static void set_timing_cfg_1(fsl_ddr_cfg_regs_t *ddr, 380*5614e71bSYork Sun const memctl_options_t *popts, 381*5614e71bSYork Sun const common_timing_params_t *common_dimm, 382*5614e71bSYork Sun unsigned int cas_latency) 383*5614e71bSYork Sun { 384*5614e71bSYork Sun /* Precharge-to-activate interval (tRP) */ 385*5614e71bSYork Sun unsigned char pretoact_mclk; 386*5614e71bSYork Sun /* Activate to precharge interval (tRAS) */ 387*5614e71bSYork Sun unsigned char acttopre_mclk; 388*5614e71bSYork Sun /* Activate to read/write interval (tRCD) */ 389*5614e71bSYork Sun unsigned char acttorw_mclk; 390*5614e71bSYork Sun /* CASLAT */ 391*5614e71bSYork Sun unsigned char caslat_ctrl; 392*5614e71bSYork Sun /* Refresh recovery time (tRFC) ; trfc_low */ 393*5614e71bSYork Sun unsigned char refrec_ctrl; 394*5614e71bSYork Sun /* Last data to precharge minimum interval (tWR) */ 395*5614e71bSYork Sun unsigned char wrrec_mclk; 396*5614e71bSYork Sun /* Activate-to-activate interval (tRRD) */ 397*5614e71bSYork Sun unsigned char acttoact_mclk; 398*5614e71bSYork Sun /* Last write data pair to read command issue interval (tWTR) */ 399*5614e71bSYork Sun unsigned char wrtord_mclk; 400*5614e71bSYork Sun /* DDR_SDRAM_MODE doesn't support 9,11,13,15 */ 401*5614e71bSYork Sun static const u8 wrrec_table[] = { 402*5614e71bSYork Sun 1, 2, 3, 4, 5, 6, 7, 8, 10, 10, 12, 12, 14, 14, 0, 0}; 403*5614e71bSYork Sun 404*5614e71bSYork Sun pretoact_mclk = picos_to_mclk(common_dimm->trp_ps); 405*5614e71bSYork Sun acttopre_mclk = picos_to_mclk(common_dimm->tras_ps); 406*5614e71bSYork Sun acttorw_mclk = picos_to_mclk(common_dimm->trcd_ps); 407*5614e71bSYork Sun 408*5614e71bSYork Sun /* 409*5614e71bSYork Sun * Translate CAS Latency to a DDR controller field value: 410*5614e71bSYork Sun * 411*5614e71bSYork Sun * CAS Lat DDR I DDR II Ctrl 412*5614e71bSYork Sun * Clocks SPD Bit SPD Bit Value 413*5614e71bSYork Sun * ------- ------- ------- ----- 414*5614e71bSYork Sun * 1.0 0 0001 415*5614e71bSYork Sun * 1.5 1 0010 416*5614e71bSYork Sun * 2.0 2 2 0011 417*5614e71bSYork Sun * 2.5 3 0100 418*5614e71bSYork Sun * 3.0 4 3 0101 419*5614e71bSYork Sun * 3.5 5 0110 420*5614e71bSYork Sun * 4.0 4 0111 421*5614e71bSYork Sun * 4.5 1000 422*5614e71bSYork Sun * 5.0 5 1001 423*5614e71bSYork Sun */ 424*5614e71bSYork Sun #if defined(CONFIG_SYS_FSL_DDR1) 425*5614e71bSYork Sun caslat_ctrl = (cas_latency + 1) & 0x07; 426*5614e71bSYork Sun #elif defined(CONFIG_SYS_FSL_DDR2) 427*5614e71bSYork Sun caslat_ctrl = 2 * cas_latency - 1; 428*5614e71bSYork Sun #else 429*5614e71bSYork Sun /* 430*5614e71bSYork Sun * if the CAS latency more than 8 cycle, 431*5614e71bSYork Sun * we need set extend bit for it at 432*5614e71bSYork Sun * TIMING_CFG_3[EXT_CASLAT] 433*5614e71bSYork Sun */ 434*5614e71bSYork Sun caslat_ctrl = 2 * cas_latency - 1; 435*5614e71bSYork Sun #endif 436*5614e71bSYork Sun 437*5614e71bSYork Sun refrec_ctrl = picos_to_mclk(common_dimm->trfc_ps) - 8; 438*5614e71bSYork Sun wrrec_mclk = picos_to_mclk(common_dimm->twr_ps); 439*5614e71bSYork Sun 440*5614e71bSYork Sun if (wrrec_mclk > 16) 441*5614e71bSYork Sun printf("Error: WRREC doesn't support more than 16 clocks\n"); 442*5614e71bSYork Sun else 443*5614e71bSYork Sun wrrec_mclk = wrrec_table[wrrec_mclk - 1]; 444*5614e71bSYork Sun if (popts->otf_burst_chop_en) 445*5614e71bSYork Sun wrrec_mclk += 2; 446*5614e71bSYork Sun 447*5614e71bSYork Sun acttoact_mclk = picos_to_mclk(common_dimm->trrd_ps); 448*5614e71bSYork Sun /* 449*5614e71bSYork Sun * JEDEC has min requirement for tRRD 450*5614e71bSYork Sun */ 451*5614e71bSYork Sun #if defined(CONFIG_SYS_FSL_DDR3) 452*5614e71bSYork Sun if (acttoact_mclk < 4) 453*5614e71bSYork Sun acttoact_mclk = 4; 454*5614e71bSYork Sun #endif 455*5614e71bSYork Sun wrtord_mclk = picos_to_mclk(common_dimm->twtr_ps); 456*5614e71bSYork Sun /* 457*5614e71bSYork Sun * JEDEC has some min requirements for tWTR 458*5614e71bSYork Sun */ 459*5614e71bSYork Sun #if defined(CONFIG_SYS_FSL_DDR2) 460*5614e71bSYork Sun if (wrtord_mclk < 2) 461*5614e71bSYork Sun wrtord_mclk = 2; 462*5614e71bSYork Sun #elif defined(CONFIG_SYS_FSL_DDR3) 463*5614e71bSYork Sun if (wrtord_mclk < 4) 464*5614e71bSYork Sun wrtord_mclk = 4; 465*5614e71bSYork Sun #endif 466*5614e71bSYork Sun if (popts->otf_burst_chop_en) 467*5614e71bSYork Sun wrtord_mclk += 2; 468*5614e71bSYork Sun 469*5614e71bSYork Sun ddr->timing_cfg_1 = (0 470*5614e71bSYork Sun | ((pretoact_mclk & 0x0F) << 28) 471*5614e71bSYork Sun | ((acttopre_mclk & 0x0F) << 24) 472*5614e71bSYork Sun | ((acttorw_mclk & 0xF) << 20) 473*5614e71bSYork Sun | ((caslat_ctrl & 0xF) << 16) 474*5614e71bSYork Sun | ((refrec_ctrl & 0xF) << 12) 475*5614e71bSYork Sun | ((wrrec_mclk & 0x0F) << 8) 476*5614e71bSYork Sun | ((acttoact_mclk & 0x0F) << 4) 477*5614e71bSYork Sun | ((wrtord_mclk & 0x0F) << 0) 478*5614e71bSYork Sun ); 479*5614e71bSYork Sun debug("FSLDDR: timing_cfg_1 = 0x%08x\n", ddr->timing_cfg_1); 480*5614e71bSYork Sun } 481*5614e71bSYork Sun 482*5614e71bSYork Sun /* DDR SDRAM Timing Configuration 2 (TIMING_CFG_2) */ 483*5614e71bSYork Sun static void set_timing_cfg_2(fsl_ddr_cfg_regs_t *ddr, 484*5614e71bSYork Sun const memctl_options_t *popts, 485*5614e71bSYork Sun const common_timing_params_t *common_dimm, 486*5614e71bSYork Sun unsigned int cas_latency, 487*5614e71bSYork Sun unsigned int additive_latency) 488*5614e71bSYork Sun { 489*5614e71bSYork Sun /* Additive latency */ 490*5614e71bSYork Sun unsigned char add_lat_mclk; 491*5614e71bSYork Sun /* CAS-to-preamble override */ 492*5614e71bSYork Sun unsigned short cpo; 493*5614e71bSYork Sun /* Write latency */ 494*5614e71bSYork Sun unsigned char wr_lat; 495*5614e71bSYork Sun /* Read to precharge (tRTP) */ 496*5614e71bSYork Sun unsigned char rd_to_pre; 497*5614e71bSYork Sun /* Write command to write data strobe timing adjustment */ 498*5614e71bSYork Sun unsigned char wr_data_delay; 499*5614e71bSYork Sun /* Minimum CKE pulse width (tCKE) */ 500*5614e71bSYork Sun unsigned char cke_pls; 501*5614e71bSYork Sun /* Window for four activates (tFAW) */ 502*5614e71bSYork Sun unsigned short four_act; 503*5614e71bSYork Sun 504*5614e71bSYork Sun /* FIXME add check that this must be less than acttorw_mclk */ 505*5614e71bSYork Sun add_lat_mclk = additive_latency; 506*5614e71bSYork Sun cpo = popts->cpo_override; 507*5614e71bSYork Sun 508*5614e71bSYork Sun #if defined(CONFIG_SYS_FSL_DDR1) 509*5614e71bSYork Sun /* 510*5614e71bSYork Sun * This is a lie. It should really be 1, but if it is 511*5614e71bSYork Sun * set to 1, bits overlap into the old controller's 512*5614e71bSYork Sun * otherwise unused ACSM field. If we leave it 0, then 513*5614e71bSYork Sun * the HW will magically treat it as 1 for DDR 1. Oh Yea. 514*5614e71bSYork Sun */ 515*5614e71bSYork Sun wr_lat = 0; 516*5614e71bSYork Sun #elif defined(CONFIG_SYS_FSL_DDR2) 517*5614e71bSYork Sun wr_lat = cas_latency - 1; 518*5614e71bSYork Sun #else 519*5614e71bSYork Sun wr_lat = compute_cas_write_latency(); 520*5614e71bSYork Sun #endif 521*5614e71bSYork Sun 522*5614e71bSYork Sun rd_to_pre = picos_to_mclk(common_dimm->trtp_ps); 523*5614e71bSYork Sun /* 524*5614e71bSYork Sun * JEDEC has some min requirements for tRTP 525*5614e71bSYork Sun */ 526*5614e71bSYork Sun #if defined(CONFIG_SYS_FSL_DDR2) 527*5614e71bSYork Sun if (rd_to_pre < 2) 528*5614e71bSYork Sun rd_to_pre = 2; 529*5614e71bSYork Sun #elif defined(CONFIG_SYS_FSL_DDR3) 530*5614e71bSYork Sun if (rd_to_pre < 4) 531*5614e71bSYork Sun rd_to_pre = 4; 532*5614e71bSYork Sun #endif 533*5614e71bSYork Sun if (additive_latency) 534*5614e71bSYork Sun rd_to_pre += additive_latency; 535*5614e71bSYork Sun if (popts->otf_burst_chop_en) 536*5614e71bSYork Sun rd_to_pre += 2; /* according to UM */ 537*5614e71bSYork Sun 538*5614e71bSYork Sun wr_data_delay = popts->write_data_delay; 539*5614e71bSYork Sun cke_pls = picos_to_mclk(popts->tcke_clock_pulse_width_ps); 540*5614e71bSYork Sun four_act = picos_to_mclk(popts->tfaw_window_four_activates_ps); 541*5614e71bSYork Sun 542*5614e71bSYork Sun ddr->timing_cfg_2 = (0 543*5614e71bSYork Sun | ((add_lat_mclk & 0xf) << 28) 544*5614e71bSYork Sun | ((cpo & 0x1f) << 23) 545*5614e71bSYork Sun | ((wr_lat & 0xf) << 19) 546*5614e71bSYork Sun | ((rd_to_pre & RD_TO_PRE_MASK) << RD_TO_PRE_SHIFT) 547*5614e71bSYork Sun | ((wr_data_delay & WR_DATA_DELAY_MASK) << WR_DATA_DELAY_SHIFT) 548*5614e71bSYork Sun | ((cke_pls & 0x7) << 6) 549*5614e71bSYork Sun | ((four_act & 0x3f) << 0) 550*5614e71bSYork Sun ); 551*5614e71bSYork Sun debug("FSLDDR: timing_cfg_2 = 0x%08x\n", ddr->timing_cfg_2); 552*5614e71bSYork Sun } 553*5614e71bSYork Sun 554*5614e71bSYork Sun /* DDR SDRAM Register Control Word */ 555*5614e71bSYork Sun static void set_ddr_sdram_rcw(fsl_ddr_cfg_regs_t *ddr, 556*5614e71bSYork Sun const memctl_options_t *popts, 557*5614e71bSYork Sun const common_timing_params_t *common_dimm) 558*5614e71bSYork Sun { 559*5614e71bSYork Sun if (common_dimm->all_dimms_registered && 560*5614e71bSYork Sun !common_dimm->all_dimms_unbuffered) { 561*5614e71bSYork Sun if (popts->rcw_override) { 562*5614e71bSYork Sun ddr->ddr_sdram_rcw_1 = popts->rcw_1; 563*5614e71bSYork Sun ddr->ddr_sdram_rcw_2 = popts->rcw_2; 564*5614e71bSYork Sun } else { 565*5614e71bSYork Sun ddr->ddr_sdram_rcw_1 = 566*5614e71bSYork Sun common_dimm->rcw[0] << 28 | \ 567*5614e71bSYork Sun common_dimm->rcw[1] << 24 | \ 568*5614e71bSYork Sun common_dimm->rcw[2] << 20 | \ 569*5614e71bSYork Sun common_dimm->rcw[3] << 16 | \ 570*5614e71bSYork Sun common_dimm->rcw[4] << 12 | \ 571*5614e71bSYork Sun common_dimm->rcw[5] << 8 | \ 572*5614e71bSYork Sun common_dimm->rcw[6] << 4 | \ 573*5614e71bSYork Sun common_dimm->rcw[7]; 574*5614e71bSYork Sun ddr->ddr_sdram_rcw_2 = 575*5614e71bSYork Sun common_dimm->rcw[8] << 28 | \ 576*5614e71bSYork Sun common_dimm->rcw[9] << 24 | \ 577*5614e71bSYork Sun common_dimm->rcw[10] << 20 | \ 578*5614e71bSYork Sun common_dimm->rcw[11] << 16 | \ 579*5614e71bSYork Sun common_dimm->rcw[12] << 12 | \ 580*5614e71bSYork Sun common_dimm->rcw[13] << 8 | \ 581*5614e71bSYork Sun common_dimm->rcw[14] << 4 | \ 582*5614e71bSYork Sun common_dimm->rcw[15]; 583*5614e71bSYork Sun } 584*5614e71bSYork Sun debug("FSLDDR: ddr_sdram_rcw_1 = 0x%08x\n", ddr->ddr_sdram_rcw_1); 585*5614e71bSYork Sun debug("FSLDDR: ddr_sdram_rcw_2 = 0x%08x\n", ddr->ddr_sdram_rcw_2); 586*5614e71bSYork Sun } 587*5614e71bSYork Sun } 588*5614e71bSYork Sun 589*5614e71bSYork Sun /* DDR SDRAM control configuration (DDR_SDRAM_CFG) */ 590*5614e71bSYork Sun static void set_ddr_sdram_cfg(fsl_ddr_cfg_regs_t *ddr, 591*5614e71bSYork Sun const memctl_options_t *popts, 592*5614e71bSYork Sun const common_timing_params_t *common_dimm) 593*5614e71bSYork Sun { 594*5614e71bSYork Sun unsigned int mem_en; /* DDR SDRAM interface logic enable */ 595*5614e71bSYork Sun unsigned int sren; /* Self refresh enable (during sleep) */ 596*5614e71bSYork Sun unsigned int ecc_en; /* ECC enable. */ 597*5614e71bSYork Sun unsigned int rd_en; /* Registered DIMM enable */ 598*5614e71bSYork Sun unsigned int sdram_type; /* Type of SDRAM */ 599*5614e71bSYork Sun unsigned int dyn_pwr; /* Dynamic power management mode */ 600*5614e71bSYork Sun unsigned int dbw; /* DRAM dta bus width */ 601*5614e71bSYork Sun unsigned int eight_be = 0; /* 8-beat burst enable, DDR2 is zero */ 602*5614e71bSYork Sun unsigned int ncap = 0; /* Non-concurrent auto-precharge */ 603*5614e71bSYork Sun unsigned int threet_en; /* Enable 3T timing */ 604*5614e71bSYork Sun unsigned int twot_en; /* Enable 2T timing */ 605*5614e71bSYork Sun unsigned int ba_intlv_ctl; /* Bank (CS) interleaving control */ 606*5614e71bSYork Sun unsigned int x32_en = 0; /* x32 enable */ 607*5614e71bSYork Sun unsigned int pchb8 = 0; /* precharge bit 8 enable */ 608*5614e71bSYork Sun unsigned int hse; /* Global half strength override */ 609*5614e71bSYork Sun unsigned int mem_halt = 0; /* memory controller halt */ 610*5614e71bSYork Sun unsigned int bi = 0; /* Bypass initialization */ 611*5614e71bSYork Sun 612*5614e71bSYork Sun mem_en = 1; 613*5614e71bSYork Sun sren = popts->self_refresh_in_sleep; 614*5614e71bSYork Sun if (common_dimm->all_dimms_ecc_capable) { 615*5614e71bSYork Sun /* Allow setting of ECC only if all DIMMs are ECC. */ 616*5614e71bSYork Sun ecc_en = popts->ecc_mode; 617*5614e71bSYork Sun } else { 618*5614e71bSYork Sun ecc_en = 0; 619*5614e71bSYork Sun } 620*5614e71bSYork Sun 621*5614e71bSYork Sun if (common_dimm->all_dimms_registered && 622*5614e71bSYork Sun !common_dimm->all_dimms_unbuffered) { 623*5614e71bSYork Sun rd_en = 1; 624*5614e71bSYork Sun twot_en = 0; 625*5614e71bSYork Sun } else { 626*5614e71bSYork Sun rd_en = 0; 627*5614e71bSYork Sun twot_en = popts->twot_en; 628*5614e71bSYork Sun } 629*5614e71bSYork Sun 630*5614e71bSYork Sun sdram_type = CONFIG_FSL_SDRAM_TYPE; 631*5614e71bSYork Sun 632*5614e71bSYork Sun dyn_pwr = popts->dynamic_power; 633*5614e71bSYork Sun dbw = popts->data_bus_width; 634*5614e71bSYork Sun /* 8-beat burst enable DDR-III case 635*5614e71bSYork Sun * we must clear it when use the on-the-fly mode, 636*5614e71bSYork Sun * must set it when use the 32-bits bus mode. 637*5614e71bSYork Sun */ 638*5614e71bSYork Sun if (sdram_type == SDRAM_TYPE_DDR3) { 639*5614e71bSYork Sun if (popts->burst_length == DDR_BL8) 640*5614e71bSYork Sun eight_be = 1; 641*5614e71bSYork Sun if (popts->burst_length == DDR_OTF) 642*5614e71bSYork Sun eight_be = 0; 643*5614e71bSYork Sun if (dbw == 0x1) 644*5614e71bSYork Sun eight_be = 1; 645*5614e71bSYork Sun } 646*5614e71bSYork Sun 647*5614e71bSYork Sun threet_en = popts->threet_en; 648*5614e71bSYork Sun ba_intlv_ctl = popts->ba_intlv_ctl; 649*5614e71bSYork Sun hse = popts->half_strength_driver_enable; 650*5614e71bSYork Sun 651*5614e71bSYork Sun ddr->ddr_sdram_cfg = (0 652*5614e71bSYork Sun | ((mem_en & 0x1) << 31) 653*5614e71bSYork Sun | ((sren & 0x1) << 30) 654*5614e71bSYork Sun | ((ecc_en & 0x1) << 29) 655*5614e71bSYork Sun | ((rd_en & 0x1) << 28) 656*5614e71bSYork Sun | ((sdram_type & 0x7) << 24) 657*5614e71bSYork Sun | ((dyn_pwr & 0x1) << 21) 658*5614e71bSYork Sun | ((dbw & 0x3) << 19) 659*5614e71bSYork Sun | ((eight_be & 0x1) << 18) 660*5614e71bSYork Sun | ((ncap & 0x1) << 17) 661*5614e71bSYork Sun | ((threet_en & 0x1) << 16) 662*5614e71bSYork Sun | ((twot_en & 0x1) << 15) 663*5614e71bSYork Sun | ((ba_intlv_ctl & 0x7F) << 8) 664*5614e71bSYork Sun | ((x32_en & 0x1) << 5) 665*5614e71bSYork Sun | ((pchb8 & 0x1) << 4) 666*5614e71bSYork Sun | ((hse & 0x1) << 3) 667*5614e71bSYork Sun | ((mem_halt & 0x1) << 1) 668*5614e71bSYork Sun | ((bi & 0x1) << 0) 669*5614e71bSYork Sun ); 670*5614e71bSYork Sun debug("FSLDDR: ddr_sdram_cfg = 0x%08x\n", ddr->ddr_sdram_cfg); 671*5614e71bSYork Sun } 672*5614e71bSYork Sun 673*5614e71bSYork Sun /* DDR SDRAM control configuration 2 (DDR_SDRAM_CFG_2) */ 674*5614e71bSYork Sun static void set_ddr_sdram_cfg_2(fsl_ddr_cfg_regs_t *ddr, 675*5614e71bSYork Sun const memctl_options_t *popts, 676*5614e71bSYork Sun const unsigned int unq_mrs_en) 677*5614e71bSYork Sun { 678*5614e71bSYork Sun unsigned int frc_sr = 0; /* Force self refresh */ 679*5614e71bSYork Sun unsigned int sr_ie = 0; /* Self-refresh interrupt enable */ 680*5614e71bSYork Sun unsigned int dll_rst_dis; /* DLL reset disable */ 681*5614e71bSYork Sun unsigned int dqs_cfg; /* DQS configuration */ 682*5614e71bSYork Sun unsigned int odt_cfg = 0; /* ODT configuration */ 683*5614e71bSYork Sun unsigned int num_pr; /* Number of posted refreshes */ 684*5614e71bSYork Sun unsigned int slow = 0; /* DDR will be run less than 1250 */ 685*5614e71bSYork Sun unsigned int x4_en = 0; /* x4 DRAM enable */ 686*5614e71bSYork Sun unsigned int obc_cfg; /* On-The-Fly Burst Chop Cfg */ 687*5614e71bSYork Sun unsigned int ap_en; /* Address Parity Enable */ 688*5614e71bSYork Sun unsigned int d_init; /* DRAM data initialization */ 689*5614e71bSYork Sun unsigned int rcw_en = 0; /* Register Control Word Enable */ 690*5614e71bSYork Sun unsigned int md_en = 0; /* Mirrored DIMM Enable */ 691*5614e71bSYork Sun unsigned int qd_en = 0; /* quad-rank DIMM Enable */ 692*5614e71bSYork Sun int i; 693*5614e71bSYork Sun 694*5614e71bSYork Sun dll_rst_dis = 1; /* Make this configurable */ 695*5614e71bSYork Sun dqs_cfg = popts->dqs_config; 696*5614e71bSYork Sun for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) { 697*5614e71bSYork Sun if (popts->cs_local_opts[i].odt_rd_cfg 698*5614e71bSYork Sun || popts->cs_local_opts[i].odt_wr_cfg) { 699*5614e71bSYork Sun odt_cfg = SDRAM_CFG2_ODT_ONLY_READ; 700*5614e71bSYork Sun break; 701*5614e71bSYork Sun } 702*5614e71bSYork Sun } 703*5614e71bSYork Sun 704*5614e71bSYork Sun num_pr = 1; /* Make this configurable */ 705*5614e71bSYork Sun 706*5614e71bSYork Sun /* 707*5614e71bSYork Sun * 8572 manual says 708*5614e71bSYork Sun * {TIMING_CFG_1[PRETOACT] 709*5614e71bSYork Sun * + [DDR_SDRAM_CFG_2[NUM_PR] 710*5614e71bSYork Sun * * ({EXT_REFREC || REFREC} + 8 + 2)]} 711*5614e71bSYork Sun * << DDR_SDRAM_INTERVAL[REFINT] 712*5614e71bSYork Sun */ 713*5614e71bSYork Sun #if defined(CONFIG_SYS_FSL_DDR3) 714*5614e71bSYork Sun obc_cfg = popts->otf_burst_chop_en; 715*5614e71bSYork Sun #else 716*5614e71bSYork Sun obc_cfg = 0; 717*5614e71bSYork Sun #endif 718*5614e71bSYork Sun 719*5614e71bSYork Sun #if (CONFIG_SYS_FSL_DDR_VER >= FSL_DDR_VER_4_7) 720*5614e71bSYork Sun slow = get_ddr_freq(0) < 1249000000; 721*5614e71bSYork Sun #endif 722*5614e71bSYork Sun 723*5614e71bSYork Sun if (popts->registered_dimm_en) { 724*5614e71bSYork Sun rcw_en = 1; 725*5614e71bSYork Sun ap_en = popts->ap_en; 726*5614e71bSYork Sun } else { 727*5614e71bSYork Sun ap_en = 0; 728*5614e71bSYork Sun } 729*5614e71bSYork Sun 730*5614e71bSYork Sun x4_en = popts->x4_en ? 1 : 0; 731*5614e71bSYork Sun 732*5614e71bSYork Sun #if defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) 733*5614e71bSYork Sun /* Use the DDR controller to auto initialize memory. */ 734*5614e71bSYork Sun d_init = popts->ecc_init_using_memctl; 735*5614e71bSYork Sun ddr->ddr_data_init = CONFIG_MEM_INIT_VALUE; 736*5614e71bSYork Sun debug("DDR: ddr_data_init = 0x%08x\n", ddr->ddr_data_init); 737*5614e71bSYork Sun #else 738*5614e71bSYork Sun /* Memory will be initialized via DMA, or not at all. */ 739*5614e71bSYork Sun d_init = 0; 740*5614e71bSYork Sun #endif 741*5614e71bSYork Sun 742*5614e71bSYork Sun #if defined(CONFIG_SYS_FSL_DDR3) 743*5614e71bSYork Sun md_en = popts->mirrored_dimm; 744*5614e71bSYork Sun #endif 745*5614e71bSYork Sun qd_en = popts->quad_rank_present ? 1 : 0; 746*5614e71bSYork Sun ddr->ddr_sdram_cfg_2 = (0 747*5614e71bSYork Sun | ((frc_sr & 0x1) << 31) 748*5614e71bSYork Sun | ((sr_ie & 0x1) << 30) 749*5614e71bSYork Sun | ((dll_rst_dis & 0x1) << 29) 750*5614e71bSYork Sun | ((dqs_cfg & 0x3) << 26) 751*5614e71bSYork Sun | ((odt_cfg & 0x3) << 21) 752*5614e71bSYork Sun | ((num_pr & 0xf) << 12) 753*5614e71bSYork Sun | ((slow & 1) << 11) 754*5614e71bSYork Sun | (x4_en << 10) 755*5614e71bSYork Sun | (qd_en << 9) 756*5614e71bSYork Sun | (unq_mrs_en << 8) 757*5614e71bSYork Sun | ((obc_cfg & 0x1) << 6) 758*5614e71bSYork Sun | ((ap_en & 0x1) << 5) 759*5614e71bSYork Sun | ((d_init & 0x1) << 4) 760*5614e71bSYork Sun | ((rcw_en & 0x1) << 2) 761*5614e71bSYork Sun | ((md_en & 0x1) << 0) 762*5614e71bSYork Sun ); 763*5614e71bSYork Sun debug("FSLDDR: ddr_sdram_cfg_2 = 0x%08x\n", ddr->ddr_sdram_cfg_2); 764*5614e71bSYork Sun } 765*5614e71bSYork Sun 766*5614e71bSYork Sun /* DDR SDRAM Mode configuration 2 (DDR_SDRAM_MODE_2) */ 767*5614e71bSYork Sun static void set_ddr_sdram_mode_2(fsl_ddr_cfg_regs_t *ddr, 768*5614e71bSYork Sun const memctl_options_t *popts, 769*5614e71bSYork Sun const common_timing_params_t *common_dimm, 770*5614e71bSYork Sun const unsigned int unq_mrs_en) 771*5614e71bSYork Sun { 772*5614e71bSYork Sun unsigned short esdmode2 = 0; /* Extended SDRAM mode 2 */ 773*5614e71bSYork Sun unsigned short esdmode3 = 0; /* Extended SDRAM mode 3 */ 774*5614e71bSYork Sun 775*5614e71bSYork Sun #if defined(CONFIG_SYS_FSL_DDR3) 776*5614e71bSYork Sun int i; 777*5614e71bSYork Sun unsigned int rtt_wr = 0; /* Rtt_WR - dynamic ODT off */ 778*5614e71bSYork Sun unsigned int srt = 0; /* self-refresh temerature, normal range */ 779*5614e71bSYork Sun unsigned int asr = 0; /* auto self-refresh disable */ 780*5614e71bSYork Sun unsigned int cwl = compute_cas_write_latency() - 5; 781*5614e71bSYork Sun unsigned int pasr = 0; /* partial array self refresh disable */ 782*5614e71bSYork Sun 783*5614e71bSYork Sun if (popts->rtt_override) 784*5614e71bSYork Sun rtt_wr = popts->rtt_wr_override_value; 785*5614e71bSYork Sun else 786*5614e71bSYork Sun rtt_wr = popts->cs_local_opts[0].odt_rtt_wr; 787*5614e71bSYork Sun 788*5614e71bSYork Sun if (common_dimm->extended_op_srt) 789*5614e71bSYork Sun srt = common_dimm->extended_op_srt; 790*5614e71bSYork Sun 791*5614e71bSYork Sun esdmode2 = (0 792*5614e71bSYork Sun | ((rtt_wr & 0x3) << 9) 793*5614e71bSYork Sun | ((srt & 0x1) << 7) 794*5614e71bSYork Sun | ((asr & 0x1) << 6) 795*5614e71bSYork Sun | ((cwl & 0x7) << 3) 796*5614e71bSYork Sun | ((pasr & 0x7) << 0)); 797*5614e71bSYork Sun #endif 798*5614e71bSYork Sun ddr->ddr_sdram_mode_2 = (0 799*5614e71bSYork Sun | ((esdmode2 & 0xFFFF) << 16) 800*5614e71bSYork Sun | ((esdmode3 & 0xFFFF) << 0) 801*5614e71bSYork Sun ); 802*5614e71bSYork Sun debug("FSLDDR: ddr_sdram_mode_2 = 0x%08x\n", ddr->ddr_sdram_mode_2); 803*5614e71bSYork Sun 804*5614e71bSYork Sun #ifdef CONFIG_SYS_FSL_DDR3 805*5614e71bSYork Sun if (unq_mrs_en) { /* unique mode registers are supported */ 806*5614e71bSYork Sun for (i = 1; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) { 807*5614e71bSYork Sun if (popts->rtt_override) 808*5614e71bSYork Sun rtt_wr = popts->rtt_wr_override_value; 809*5614e71bSYork Sun else 810*5614e71bSYork Sun rtt_wr = popts->cs_local_opts[i].odt_rtt_wr; 811*5614e71bSYork Sun 812*5614e71bSYork Sun esdmode2 &= 0xF9FF; /* clear bit 10, 9 */ 813*5614e71bSYork Sun esdmode2 |= (rtt_wr & 0x3) << 9; 814*5614e71bSYork Sun switch (i) { 815*5614e71bSYork Sun case 1: 816*5614e71bSYork Sun ddr->ddr_sdram_mode_4 = (0 817*5614e71bSYork Sun | ((esdmode2 & 0xFFFF) << 16) 818*5614e71bSYork Sun | ((esdmode3 & 0xFFFF) << 0) 819*5614e71bSYork Sun ); 820*5614e71bSYork Sun break; 821*5614e71bSYork Sun case 2: 822*5614e71bSYork Sun ddr->ddr_sdram_mode_6 = (0 823*5614e71bSYork Sun | ((esdmode2 & 0xFFFF) << 16) 824*5614e71bSYork Sun | ((esdmode3 & 0xFFFF) << 0) 825*5614e71bSYork Sun ); 826*5614e71bSYork Sun break; 827*5614e71bSYork Sun case 3: 828*5614e71bSYork Sun ddr->ddr_sdram_mode_8 = (0 829*5614e71bSYork Sun | ((esdmode2 & 0xFFFF) << 16) 830*5614e71bSYork Sun | ((esdmode3 & 0xFFFF) << 0) 831*5614e71bSYork Sun ); 832*5614e71bSYork Sun break; 833*5614e71bSYork Sun } 834*5614e71bSYork Sun } 835*5614e71bSYork Sun debug("FSLDDR: ddr_sdram_mode_4 = 0x%08x\n", 836*5614e71bSYork Sun ddr->ddr_sdram_mode_4); 837*5614e71bSYork Sun debug("FSLDDR: ddr_sdram_mode_6 = 0x%08x\n", 838*5614e71bSYork Sun ddr->ddr_sdram_mode_6); 839*5614e71bSYork Sun debug("FSLDDR: ddr_sdram_mode_8 = 0x%08x\n", 840*5614e71bSYork Sun ddr->ddr_sdram_mode_8); 841*5614e71bSYork Sun } 842*5614e71bSYork Sun #endif 843*5614e71bSYork Sun } 844*5614e71bSYork Sun 845*5614e71bSYork Sun /* DDR SDRAM Interval Configuration (DDR_SDRAM_INTERVAL) */ 846*5614e71bSYork Sun static void set_ddr_sdram_interval(fsl_ddr_cfg_regs_t *ddr, 847*5614e71bSYork Sun const memctl_options_t *popts, 848*5614e71bSYork Sun const common_timing_params_t *common_dimm) 849*5614e71bSYork Sun { 850*5614e71bSYork Sun unsigned int refint; /* Refresh interval */ 851*5614e71bSYork Sun unsigned int bstopre; /* Precharge interval */ 852*5614e71bSYork Sun 853*5614e71bSYork Sun refint = picos_to_mclk(common_dimm->refresh_rate_ps); 854*5614e71bSYork Sun 855*5614e71bSYork Sun bstopre = popts->bstopre; 856*5614e71bSYork Sun 857*5614e71bSYork Sun /* refint field used 0x3FFF in earlier controllers */ 858*5614e71bSYork Sun ddr->ddr_sdram_interval = (0 859*5614e71bSYork Sun | ((refint & 0xFFFF) << 16) 860*5614e71bSYork Sun | ((bstopre & 0x3FFF) << 0) 861*5614e71bSYork Sun ); 862*5614e71bSYork Sun debug("FSLDDR: ddr_sdram_interval = 0x%08x\n", ddr->ddr_sdram_interval); 863*5614e71bSYork Sun } 864*5614e71bSYork Sun 865*5614e71bSYork Sun #if defined(CONFIG_SYS_FSL_DDR3) 866*5614e71bSYork Sun /* DDR SDRAM Mode configuration set (DDR_SDRAM_MODE) */ 867*5614e71bSYork Sun static void set_ddr_sdram_mode(fsl_ddr_cfg_regs_t *ddr, 868*5614e71bSYork Sun const memctl_options_t *popts, 869*5614e71bSYork Sun const common_timing_params_t *common_dimm, 870*5614e71bSYork Sun unsigned int cas_latency, 871*5614e71bSYork Sun unsigned int additive_latency, 872*5614e71bSYork Sun const unsigned int unq_mrs_en) 873*5614e71bSYork Sun { 874*5614e71bSYork Sun unsigned short esdmode; /* Extended SDRAM mode */ 875*5614e71bSYork Sun unsigned short sdmode; /* SDRAM mode */ 876*5614e71bSYork Sun 877*5614e71bSYork Sun /* Mode Register - MR1 */ 878*5614e71bSYork Sun unsigned int qoff = 0; /* Output buffer enable 0=yes, 1=no */ 879*5614e71bSYork Sun unsigned int tdqs_en = 0; /* TDQS Enable: 0=no, 1=yes */ 880*5614e71bSYork Sun unsigned int rtt; 881*5614e71bSYork Sun unsigned int wrlvl_en = 0; /* Write level enable: 0=no, 1=yes */ 882*5614e71bSYork Sun unsigned int al = 0; /* Posted CAS# additive latency (AL) */ 883*5614e71bSYork Sun unsigned int dic = 0; /* Output driver impedance, 40ohm */ 884*5614e71bSYork Sun unsigned int dll_en = 0; /* DLL Enable 0=Enable (Normal), 885*5614e71bSYork Sun 1=Disable (Test/Debug) */ 886*5614e71bSYork Sun 887*5614e71bSYork Sun /* Mode Register - MR0 */ 888*5614e71bSYork Sun unsigned int dll_on; /* DLL control for precharge PD, 0=off, 1=on */ 889*5614e71bSYork Sun unsigned int wr = 0; /* Write Recovery */ 890*5614e71bSYork Sun unsigned int dll_rst; /* DLL Reset */ 891*5614e71bSYork Sun unsigned int mode; /* Normal=0 or Test=1 */ 892*5614e71bSYork Sun unsigned int caslat = 4;/* CAS# latency, default set as 6 cycles */ 893*5614e71bSYork Sun /* BT: Burst Type (0=Nibble Sequential, 1=Interleaved) */ 894*5614e71bSYork Sun unsigned int bt; 895*5614e71bSYork Sun unsigned int bl; /* BL: Burst Length */ 896*5614e71bSYork Sun 897*5614e71bSYork Sun unsigned int wr_mclk; 898*5614e71bSYork Sun /* 899*5614e71bSYork Sun * DDR_SDRAM_MODE doesn't support 9,11,13,15 900*5614e71bSYork Sun * Please refer JEDEC Standard No. 79-3E for Mode Register MR0 901*5614e71bSYork Sun * for this table 902*5614e71bSYork Sun */ 903*5614e71bSYork Sun static const u8 wr_table[] = {1, 2, 3, 4, 5, 5, 6, 6, 7, 7, 0, 0}; 904*5614e71bSYork Sun 905*5614e71bSYork Sun const unsigned int mclk_ps = get_memory_clk_period_ps(); 906*5614e71bSYork Sun int i; 907*5614e71bSYork Sun 908*5614e71bSYork Sun if (popts->rtt_override) 909*5614e71bSYork Sun rtt = popts->rtt_override_value; 910*5614e71bSYork Sun else 911*5614e71bSYork Sun rtt = popts->cs_local_opts[0].odt_rtt_norm; 912*5614e71bSYork Sun 913*5614e71bSYork Sun if (additive_latency == (cas_latency - 1)) 914*5614e71bSYork Sun al = 1; 915*5614e71bSYork Sun if (additive_latency == (cas_latency - 2)) 916*5614e71bSYork Sun al = 2; 917*5614e71bSYork Sun 918*5614e71bSYork Sun if (popts->quad_rank_present) 919*5614e71bSYork Sun dic = 1; /* output driver impedance 240/7 ohm */ 920*5614e71bSYork Sun 921*5614e71bSYork Sun /* 922*5614e71bSYork Sun * The esdmode value will also be used for writing 923*5614e71bSYork Sun * MR1 during write leveling for DDR3, although the 924*5614e71bSYork Sun * bits specifically related to the write leveling 925*5614e71bSYork Sun * scheme will be handled automatically by the DDR 926*5614e71bSYork Sun * controller. so we set the wrlvl_en = 0 here. 927*5614e71bSYork Sun */ 928*5614e71bSYork Sun esdmode = (0 929*5614e71bSYork Sun | ((qoff & 0x1) << 12) 930*5614e71bSYork Sun | ((tdqs_en & 0x1) << 11) 931*5614e71bSYork Sun | ((rtt & 0x4) << 7) /* rtt field is split */ 932*5614e71bSYork Sun | ((wrlvl_en & 0x1) << 7) 933*5614e71bSYork Sun | ((rtt & 0x2) << 5) /* rtt field is split */ 934*5614e71bSYork Sun | ((dic & 0x2) << 4) /* DIC field is split */ 935*5614e71bSYork Sun | ((al & 0x3) << 3) 936*5614e71bSYork Sun | ((rtt & 0x1) << 2) /* rtt field is split */ 937*5614e71bSYork Sun | ((dic & 0x1) << 1) /* DIC field is split */ 938*5614e71bSYork Sun | ((dll_en & 0x1) << 0) 939*5614e71bSYork Sun ); 940*5614e71bSYork Sun 941*5614e71bSYork Sun /* 942*5614e71bSYork Sun * DLL control for precharge PD 943*5614e71bSYork Sun * 0=slow exit DLL off (tXPDLL) 944*5614e71bSYork Sun * 1=fast exit DLL on (tXP) 945*5614e71bSYork Sun */ 946*5614e71bSYork Sun dll_on = 1; 947*5614e71bSYork Sun 948*5614e71bSYork Sun wr_mclk = (common_dimm->twr_ps + mclk_ps - 1) / mclk_ps; 949*5614e71bSYork Sun if (wr_mclk <= 16) { 950*5614e71bSYork Sun wr = wr_table[wr_mclk - 5]; 951*5614e71bSYork Sun } else { 952*5614e71bSYork Sun printf("Error: unsupported write recovery for mode register " 953*5614e71bSYork Sun "wr_mclk = %d\n", wr_mclk); 954*5614e71bSYork Sun } 955*5614e71bSYork Sun 956*5614e71bSYork Sun dll_rst = 0; /* dll no reset */ 957*5614e71bSYork Sun mode = 0; /* normal mode */ 958*5614e71bSYork Sun 959*5614e71bSYork Sun /* look up table to get the cas latency bits */ 960*5614e71bSYork Sun if (cas_latency >= 5 && cas_latency <= 16) { 961*5614e71bSYork Sun unsigned char cas_latency_table[] = { 962*5614e71bSYork Sun 0x2, /* 5 clocks */ 963*5614e71bSYork Sun 0x4, /* 6 clocks */ 964*5614e71bSYork Sun 0x6, /* 7 clocks */ 965*5614e71bSYork Sun 0x8, /* 8 clocks */ 966*5614e71bSYork Sun 0xa, /* 9 clocks */ 967*5614e71bSYork Sun 0xc, /* 10 clocks */ 968*5614e71bSYork Sun 0xe, /* 11 clocks */ 969*5614e71bSYork Sun 0x1, /* 12 clocks */ 970*5614e71bSYork Sun 0x3, /* 13 clocks */ 971*5614e71bSYork Sun 0x5, /* 14 clocks */ 972*5614e71bSYork Sun 0x7, /* 15 clocks */ 973*5614e71bSYork Sun 0x9, /* 16 clocks */ 974*5614e71bSYork Sun }; 975*5614e71bSYork Sun caslat = cas_latency_table[cas_latency - 5]; 976*5614e71bSYork Sun } else { 977*5614e71bSYork Sun printf("Error: unsupported cas latency for mode register\n"); 978*5614e71bSYork Sun } 979*5614e71bSYork Sun 980*5614e71bSYork Sun bt = 0; /* Nibble sequential */ 981*5614e71bSYork Sun 982*5614e71bSYork Sun switch (popts->burst_length) { 983*5614e71bSYork Sun case DDR_BL8: 984*5614e71bSYork Sun bl = 0; 985*5614e71bSYork Sun break; 986*5614e71bSYork Sun case DDR_OTF: 987*5614e71bSYork Sun bl = 1; 988*5614e71bSYork Sun break; 989*5614e71bSYork Sun case DDR_BC4: 990*5614e71bSYork Sun bl = 2; 991*5614e71bSYork Sun break; 992*5614e71bSYork Sun default: 993*5614e71bSYork Sun printf("Error: invalid burst length of %u specified. " 994*5614e71bSYork Sun " Defaulting to on-the-fly BC4 or BL8 beats.\n", 995*5614e71bSYork Sun popts->burst_length); 996*5614e71bSYork Sun bl = 1; 997*5614e71bSYork Sun break; 998*5614e71bSYork Sun } 999*5614e71bSYork Sun 1000*5614e71bSYork Sun sdmode = (0 1001*5614e71bSYork Sun | ((dll_on & 0x1) << 12) 1002*5614e71bSYork Sun | ((wr & 0x7) << 9) 1003*5614e71bSYork Sun | ((dll_rst & 0x1) << 8) 1004*5614e71bSYork Sun | ((mode & 0x1) << 7) 1005*5614e71bSYork Sun | (((caslat >> 1) & 0x7) << 4) 1006*5614e71bSYork Sun | ((bt & 0x1) << 3) 1007*5614e71bSYork Sun | ((caslat & 1) << 2) 1008*5614e71bSYork Sun | ((bl & 0x3) << 0) 1009*5614e71bSYork Sun ); 1010*5614e71bSYork Sun 1011*5614e71bSYork Sun ddr->ddr_sdram_mode = (0 1012*5614e71bSYork Sun | ((esdmode & 0xFFFF) << 16) 1013*5614e71bSYork Sun | ((sdmode & 0xFFFF) << 0) 1014*5614e71bSYork Sun ); 1015*5614e71bSYork Sun 1016*5614e71bSYork Sun debug("FSLDDR: ddr_sdram_mode = 0x%08x\n", ddr->ddr_sdram_mode); 1017*5614e71bSYork Sun 1018*5614e71bSYork Sun if (unq_mrs_en) { /* unique mode registers are supported */ 1019*5614e71bSYork Sun for (i = 1; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) { 1020*5614e71bSYork Sun if (popts->rtt_override) 1021*5614e71bSYork Sun rtt = popts->rtt_override_value; 1022*5614e71bSYork Sun else 1023*5614e71bSYork Sun rtt = popts->cs_local_opts[i].odt_rtt_norm; 1024*5614e71bSYork Sun 1025*5614e71bSYork Sun esdmode &= 0xFDBB; /* clear bit 9,6,2 */ 1026*5614e71bSYork Sun esdmode |= (0 1027*5614e71bSYork Sun | ((rtt & 0x4) << 7) /* rtt field is split */ 1028*5614e71bSYork Sun | ((rtt & 0x2) << 5) /* rtt field is split */ 1029*5614e71bSYork Sun | ((rtt & 0x1) << 2) /* rtt field is split */ 1030*5614e71bSYork Sun ); 1031*5614e71bSYork Sun switch (i) { 1032*5614e71bSYork Sun case 1: 1033*5614e71bSYork Sun ddr->ddr_sdram_mode_3 = (0 1034*5614e71bSYork Sun | ((esdmode & 0xFFFF) << 16) 1035*5614e71bSYork Sun | ((sdmode & 0xFFFF) << 0) 1036*5614e71bSYork Sun ); 1037*5614e71bSYork Sun break; 1038*5614e71bSYork Sun case 2: 1039*5614e71bSYork Sun ddr->ddr_sdram_mode_5 = (0 1040*5614e71bSYork Sun | ((esdmode & 0xFFFF) << 16) 1041*5614e71bSYork Sun | ((sdmode & 0xFFFF) << 0) 1042*5614e71bSYork Sun ); 1043*5614e71bSYork Sun break; 1044*5614e71bSYork Sun case 3: 1045*5614e71bSYork Sun ddr->ddr_sdram_mode_7 = (0 1046*5614e71bSYork Sun | ((esdmode & 0xFFFF) << 16) 1047*5614e71bSYork Sun | ((sdmode & 0xFFFF) << 0) 1048*5614e71bSYork Sun ); 1049*5614e71bSYork Sun break; 1050*5614e71bSYork Sun } 1051*5614e71bSYork Sun } 1052*5614e71bSYork Sun debug("FSLDDR: ddr_sdram_mode_3 = 0x%08x\n", 1053*5614e71bSYork Sun ddr->ddr_sdram_mode_3); 1054*5614e71bSYork Sun debug("FSLDDR: ddr_sdram_mode_5 = 0x%08x\n", 1055*5614e71bSYork Sun ddr->ddr_sdram_mode_5); 1056*5614e71bSYork Sun debug("FSLDDR: ddr_sdram_mode_5 = 0x%08x\n", 1057*5614e71bSYork Sun ddr->ddr_sdram_mode_5); 1058*5614e71bSYork Sun } 1059*5614e71bSYork Sun } 1060*5614e71bSYork Sun 1061*5614e71bSYork Sun #else /* !CONFIG_SYS_FSL_DDR3 */ 1062*5614e71bSYork Sun 1063*5614e71bSYork Sun /* DDR SDRAM Mode configuration set (DDR_SDRAM_MODE) */ 1064*5614e71bSYork Sun static void set_ddr_sdram_mode(fsl_ddr_cfg_regs_t *ddr, 1065*5614e71bSYork Sun const memctl_options_t *popts, 1066*5614e71bSYork Sun const common_timing_params_t *common_dimm, 1067*5614e71bSYork Sun unsigned int cas_latency, 1068*5614e71bSYork Sun unsigned int additive_latency, 1069*5614e71bSYork Sun const unsigned int unq_mrs_en) 1070*5614e71bSYork Sun { 1071*5614e71bSYork Sun unsigned short esdmode; /* Extended SDRAM mode */ 1072*5614e71bSYork Sun unsigned short sdmode; /* SDRAM mode */ 1073*5614e71bSYork Sun 1074*5614e71bSYork Sun /* 1075*5614e71bSYork Sun * FIXME: This ought to be pre-calculated in a 1076*5614e71bSYork Sun * technology-specific routine, 1077*5614e71bSYork Sun * e.g. compute_DDR2_mode_register(), and then the 1078*5614e71bSYork Sun * sdmode and esdmode passed in as part of common_dimm. 1079*5614e71bSYork Sun */ 1080*5614e71bSYork Sun 1081*5614e71bSYork Sun /* Extended Mode Register */ 1082*5614e71bSYork Sun unsigned int mrs = 0; /* Mode Register Set */ 1083*5614e71bSYork Sun unsigned int outputs = 0; /* 0=Enabled, 1=Disabled */ 1084*5614e71bSYork Sun unsigned int rdqs_en = 0; /* RDQS Enable: 0=no, 1=yes */ 1085*5614e71bSYork Sun unsigned int dqs_en = 0; /* DQS# Enable: 0=enable, 1=disable */ 1086*5614e71bSYork Sun unsigned int ocd = 0; /* 0x0=OCD not supported, 1087*5614e71bSYork Sun 0x7=OCD default state */ 1088*5614e71bSYork Sun unsigned int rtt; 1089*5614e71bSYork Sun unsigned int al; /* Posted CAS# additive latency (AL) */ 1090*5614e71bSYork Sun unsigned int ods = 0; /* Output Drive Strength: 1091*5614e71bSYork Sun 0 = Full strength (18ohm) 1092*5614e71bSYork Sun 1 = Reduced strength (4ohm) */ 1093*5614e71bSYork Sun unsigned int dll_en = 0; /* DLL Enable 0=Enable (Normal), 1094*5614e71bSYork Sun 1=Disable (Test/Debug) */ 1095*5614e71bSYork Sun 1096*5614e71bSYork Sun /* Mode Register (MR) */ 1097*5614e71bSYork Sun unsigned int mr; /* Mode Register Definition */ 1098*5614e71bSYork Sun unsigned int pd; /* Power-Down Mode */ 1099*5614e71bSYork Sun unsigned int wr; /* Write Recovery */ 1100*5614e71bSYork Sun unsigned int dll_res; /* DLL Reset */ 1101*5614e71bSYork Sun unsigned int mode; /* Normal=0 or Test=1 */ 1102*5614e71bSYork Sun unsigned int caslat = 0;/* CAS# latency */ 1103*5614e71bSYork Sun /* BT: Burst Type (0=Sequential, 1=Interleaved) */ 1104*5614e71bSYork Sun unsigned int bt; 1105*5614e71bSYork Sun unsigned int bl; /* BL: Burst Length */ 1106*5614e71bSYork Sun 1107*5614e71bSYork Sun #if defined(CONFIG_SYS_FSL_DDR2) 1108*5614e71bSYork Sun const unsigned int mclk_ps = get_memory_clk_period_ps(); 1109*5614e71bSYork Sun #endif 1110*5614e71bSYork Sun dqs_en = !popts->dqs_config; 1111*5614e71bSYork Sun rtt = fsl_ddr_get_rtt(); 1112*5614e71bSYork Sun 1113*5614e71bSYork Sun al = additive_latency; 1114*5614e71bSYork Sun 1115*5614e71bSYork Sun esdmode = (0 1116*5614e71bSYork Sun | ((mrs & 0x3) << 14) 1117*5614e71bSYork Sun | ((outputs & 0x1) << 12) 1118*5614e71bSYork Sun | ((rdqs_en & 0x1) << 11) 1119*5614e71bSYork Sun | ((dqs_en & 0x1) << 10) 1120*5614e71bSYork Sun | ((ocd & 0x7) << 7) 1121*5614e71bSYork Sun | ((rtt & 0x2) << 5) /* rtt field is split */ 1122*5614e71bSYork Sun | ((al & 0x7) << 3) 1123*5614e71bSYork Sun | ((rtt & 0x1) << 2) /* rtt field is split */ 1124*5614e71bSYork Sun | ((ods & 0x1) << 1) 1125*5614e71bSYork Sun | ((dll_en & 0x1) << 0) 1126*5614e71bSYork Sun ); 1127*5614e71bSYork Sun 1128*5614e71bSYork Sun mr = 0; /* FIXME: CHECKME */ 1129*5614e71bSYork Sun 1130*5614e71bSYork Sun /* 1131*5614e71bSYork Sun * 0 = Fast Exit (Normal) 1132*5614e71bSYork Sun * 1 = Slow Exit (Low Power) 1133*5614e71bSYork Sun */ 1134*5614e71bSYork Sun pd = 0; 1135*5614e71bSYork Sun 1136*5614e71bSYork Sun #if defined(CONFIG_SYS_FSL_DDR1) 1137*5614e71bSYork Sun wr = 0; /* Historical */ 1138*5614e71bSYork Sun #elif defined(CONFIG_SYS_FSL_DDR2) 1139*5614e71bSYork Sun wr = (common_dimm->twr_ps + mclk_ps - 1) / mclk_ps - 1; 1140*5614e71bSYork Sun #endif 1141*5614e71bSYork Sun dll_res = 0; 1142*5614e71bSYork Sun mode = 0; 1143*5614e71bSYork Sun 1144*5614e71bSYork Sun #if defined(CONFIG_SYS_FSL_DDR1) 1145*5614e71bSYork Sun if (1 <= cas_latency && cas_latency <= 4) { 1146*5614e71bSYork Sun unsigned char mode_caslat_table[4] = { 1147*5614e71bSYork Sun 0x5, /* 1.5 clocks */ 1148*5614e71bSYork Sun 0x2, /* 2.0 clocks */ 1149*5614e71bSYork Sun 0x6, /* 2.5 clocks */ 1150*5614e71bSYork Sun 0x3 /* 3.0 clocks */ 1151*5614e71bSYork Sun }; 1152*5614e71bSYork Sun caslat = mode_caslat_table[cas_latency - 1]; 1153*5614e71bSYork Sun } else { 1154*5614e71bSYork Sun printf("Warning: unknown cas_latency %d\n", cas_latency); 1155*5614e71bSYork Sun } 1156*5614e71bSYork Sun #elif defined(CONFIG_SYS_FSL_DDR2) 1157*5614e71bSYork Sun caslat = cas_latency; 1158*5614e71bSYork Sun #endif 1159*5614e71bSYork Sun bt = 0; 1160*5614e71bSYork Sun 1161*5614e71bSYork Sun switch (popts->burst_length) { 1162*5614e71bSYork Sun case DDR_BL4: 1163*5614e71bSYork Sun bl = 2; 1164*5614e71bSYork Sun break; 1165*5614e71bSYork Sun case DDR_BL8: 1166*5614e71bSYork Sun bl = 3; 1167*5614e71bSYork Sun break; 1168*5614e71bSYork Sun default: 1169*5614e71bSYork Sun printf("Error: invalid burst length of %u specified. " 1170*5614e71bSYork Sun " Defaulting to 4 beats.\n", 1171*5614e71bSYork Sun popts->burst_length); 1172*5614e71bSYork Sun bl = 2; 1173*5614e71bSYork Sun break; 1174*5614e71bSYork Sun } 1175*5614e71bSYork Sun 1176*5614e71bSYork Sun sdmode = (0 1177*5614e71bSYork Sun | ((mr & 0x3) << 14) 1178*5614e71bSYork Sun | ((pd & 0x1) << 12) 1179*5614e71bSYork Sun | ((wr & 0x7) << 9) 1180*5614e71bSYork Sun | ((dll_res & 0x1) << 8) 1181*5614e71bSYork Sun | ((mode & 0x1) << 7) 1182*5614e71bSYork Sun | ((caslat & 0x7) << 4) 1183*5614e71bSYork Sun | ((bt & 0x1) << 3) 1184*5614e71bSYork Sun | ((bl & 0x7) << 0) 1185*5614e71bSYork Sun ); 1186*5614e71bSYork Sun 1187*5614e71bSYork Sun ddr->ddr_sdram_mode = (0 1188*5614e71bSYork Sun | ((esdmode & 0xFFFF) << 16) 1189*5614e71bSYork Sun | ((sdmode & 0xFFFF) << 0) 1190*5614e71bSYork Sun ); 1191*5614e71bSYork Sun debug("FSLDDR: ddr_sdram_mode = 0x%08x\n", ddr->ddr_sdram_mode); 1192*5614e71bSYork Sun } 1193*5614e71bSYork Sun #endif 1194*5614e71bSYork Sun 1195*5614e71bSYork Sun /* DDR SDRAM Data Initialization (DDR_DATA_INIT) */ 1196*5614e71bSYork Sun static void set_ddr_data_init(fsl_ddr_cfg_regs_t *ddr) 1197*5614e71bSYork Sun { 1198*5614e71bSYork Sun unsigned int init_value; /* Initialization value */ 1199*5614e71bSYork Sun 1200*5614e71bSYork Sun #ifdef CONFIG_MEM_INIT_VALUE 1201*5614e71bSYork Sun init_value = CONFIG_MEM_INIT_VALUE; 1202*5614e71bSYork Sun #else 1203*5614e71bSYork Sun init_value = 0xDEADBEEF; 1204*5614e71bSYork Sun #endif 1205*5614e71bSYork Sun ddr->ddr_data_init = init_value; 1206*5614e71bSYork Sun } 1207*5614e71bSYork Sun 1208*5614e71bSYork Sun /* 1209*5614e71bSYork Sun * DDR SDRAM Clock Control (DDR_SDRAM_CLK_CNTL) 1210*5614e71bSYork Sun * The old controller on the 8540/60 doesn't have this register. 1211*5614e71bSYork Sun * Hope it's OK to set it (to 0) anyway. 1212*5614e71bSYork Sun */ 1213*5614e71bSYork Sun static void set_ddr_sdram_clk_cntl(fsl_ddr_cfg_regs_t *ddr, 1214*5614e71bSYork Sun const memctl_options_t *popts) 1215*5614e71bSYork Sun { 1216*5614e71bSYork Sun unsigned int clk_adjust; /* Clock adjust */ 1217*5614e71bSYork Sun 1218*5614e71bSYork Sun clk_adjust = popts->clk_adjust; 1219*5614e71bSYork Sun ddr->ddr_sdram_clk_cntl = (clk_adjust & 0xF) << 23; 1220*5614e71bSYork Sun debug("FSLDDR: clk_cntl = 0x%08x\n", ddr->ddr_sdram_clk_cntl); 1221*5614e71bSYork Sun } 1222*5614e71bSYork Sun 1223*5614e71bSYork Sun /* DDR Initialization Address (DDR_INIT_ADDR) */ 1224*5614e71bSYork Sun static void set_ddr_init_addr(fsl_ddr_cfg_regs_t *ddr) 1225*5614e71bSYork Sun { 1226*5614e71bSYork Sun unsigned int init_addr = 0; /* Initialization address */ 1227*5614e71bSYork Sun 1228*5614e71bSYork Sun ddr->ddr_init_addr = init_addr; 1229*5614e71bSYork Sun } 1230*5614e71bSYork Sun 1231*5614e71bSYork Sun /* DDR Initialization Address (DDR_INIT_EXT_ADDR) */ 1232*5614e71bSYork Sun static void set_ddr_init_ext_addr(fsl_ddr_cfg_regs_t *ddr) 1233*5614e71bSYork Sun { 1234*5614e71bSYork Sun unsigned int uia = 0; /* Use initialization address */ 1235*5614e71bSYork Sun unsigned int init_ext_addr = 0; /* Initialization address */ 1236*5614e71bSYork Sun 1237*5614e71bSYork Sun ddr->ddr_init_ext_addr = (0 1238*5614e71bSYork Sun | ((uia & 0x1) << 31) 1239*5614e71bSYork Sun | (init_ext_addr & 0xF) 1240*5614e71bSYork Sun ); 1241*5614e71bSYork Sun } 1242*5614e71bSYork Sun 1243*5614e71bSYork Sun /* DDR SDRAM Timing Configuration 4 (TIMING_CFG_4) */ 1244*5614e71bSYork Sun static void set_timing_cfg_4(fsl_ddr_cfg_regs_t *ddr, 1245*5614e71bSYork Sun const memctl_options_t *popts) 1246*5614e71bSYork Sun { 1247*5614e71bSYork Sun unsigned int rwt = 0; /* Read-to-write turnaround for same CS */ 1248*5614e71bSYork Sun unsigned int wrt = 0; /* Write-to-read turnaround for same CS */ 1249*5614e71bSYork Sun unsigned int rrt = 0; /* Read-to-read turnaround for same CS */ 1250*5614e71bSYork Sun unsigned int wwt = 0; /* Write-to-write turnaround for same CS */ 1251*5614e71bSYork Sun unsigned int dll_lock = 0; /* DDR SDRAM DLL Lock Time */ 1252*5614e71bSYork Sun 1253*5614e71bSYork Sun #if defined(CONFIG_SYS_FSL_DDR3) 1254*5614e71bSYork Sun if (popts->burst_length == DDR_BL8) { 1255*5614e71bSYork Sun /* We set BL/2 for fixed BL8 */ 1256*5614e71bSYork Sun rrt = 0; /* BL/2 clocks */ 1257*5614e71bSYork Sun wwt = 0; /* BL/2 clocks */ 1258*5614e71bSYork Sun } else { 1259*5614e71bSYork Sun /* We need to set BL/2 + 2 to BC4 and OTF */ 1260*5614e71bSYork Sun rrt = 2; /* BL/2 + 2 clocks */ 1261*5614e71bSYork Sun wwt = 2; /* BL/2 + 2 clocks */ 1262*5614e71bSYork Sun } 1263*5614e71bSYork Sun dll_lock = 1; /* tDLLK = 512 clocks from spec */ 1264*5614e71bSYork Sun #endif 1265*5614e71bSYork Sun ddr->timing_cfg_4 = (0 1266*5614e71bSYork Sun | ((rwt & 0xf) << 28) 1267*5614e71bSYork Sun | ((wrt & 0xf) << 24) 1268*5614e71bSYork Sun | ((rrt & 0xf) << 20) 1269*5614e71bSYork Sun | ((wwt & 0xf) << 16) 1270*5614e71bSYork Sun | (dll_lock & 0x3) 1271*5614e71bSYork Sun ); 1272*5614e71bSYork Sun debug("FSLDDR: timing_cfg_4 = 0x%08x\n", ddr->timing_cfg_4); 1273*5614e71bSYork Sun } 1274*5614e71bSYork Sun 1275*5614e71bSYork Sun /* DDR SDRAM Timing Configuration 5 (TIMING_CFG_5) */ 1276*5614e71bSYork Sun static void set_timing_cfg_5(fsl_ddr_cfg_regs_t *ddr, unsigned int cas_latency) 1277*5614e71bSYork Sun { 1278*5614e71bSYork Sun unsigned int rodt_on = 0; /* Read to ODT on */ 1279*5614e71bSYork Sun unsigned int rodt_off = 0; /* Read to ODT off */ 1280*5614e71bSYork Sun unsigned int wodt_on = 0; /* Write to ODT on */ 1281*5614e71bSYork Sun unsigned int wodt_off = 0; /* Write to ODT off */ 1282*5614e71bSYork Sun 1283*5614e71bSYork Sun #if defined(CONFIG_SYS_FSL_DDR3) 1284*5614e71bSYork Sun /* rodt_on = timing_cfg_1[caslat] - timing_cfg_2[wrlat] + 1 */ 1285*5614e71bSYork Sun rodt_on = cas_latency - ((ddr->timing_cfg_2 & 0x00780000) >> 19) + 1; 1286*5614e71bSYork Sun rodt_off = 4; /* 4 clocks */ 1287*5614e71bSYork Sun wodt_on = 1; /* 1 clocks */ 1288*5614e71bSYork Sun wodt_off = 4; /* 4 clocks */ 1289*5614e71bSYork Sun #endif 1290*5614e71bSYork Sun 1291*5614e71bSYork Sun ddr->timing_cfg_5 = (0 1292*5614e71bSYork Sun | ((rodt_on & 0x1f) << 24) 1293*5614e71bSYork Sun | ((rodt_off & 0x7) << 20) 1294*5614e71bSYork Sun | ((wodt_on & 0x1f) << 12) 1295*5614e71bSYork Sun | ((wodt_off & 0x7) << 8) 1296*5614e71bSYork Sun ); 1297*5614e71bSYork Sun debug("FSLDDR: timing_cfg_5 = 0x%08x\n", ddr->timing_cfg_5); 1298*5614e71bSYork Sun } 1299*5614e71bSYork Sun 1300*5614e71bSYork Sun /* DDR ZQ Calibration Control (DDR_ZQ_CNTL) */ 1301*5614e71bSYork Sun static void set_ddr_zq_cntl(fsl_ddr_cfg_regs_t *ddr, unsigned int zq_en) 1302*5614e71bSYork Sun { 1303*5614e71bSYork Sun unsigned int zqinit = 0;/* POR ZQ Calibration Time (tZQinit) */ 1304*5614e71bSYork Sun /* Normal Operation Full Calibration Time (tZQoper) */ 1305*5614e71bSYork Sun unsigned int zqoper = 0; 1306*5614e71bSYork Sun /* Normal Operation Short Calibration Time (tZQCS) */ 1307*5614e71bSYork Sun unsigned int zqcs = 0; 1308*5614e71bSYork Sun 1309*5614e71bSYork Sun if (zq_en) { 1310*5614e71bSYork Sun zqinit = 9; /* 512 clocks */ 1311*5614e71bSYork Sun zqoper = 8; /* 256 clocks */ 1312*5614e71bSYork Sun zqcs = 6; /* 64 clocks */ 1313*5614e71bSYork Sun } 1314*5614e71bSYork Sun 1315*5614e71bSYork Sun ddr->ddr_zq_cntl = (0 1316*5614e71bSYork Sun | ((zq_en & 0x1) << 31) 1317*5614e71bSYork Sun | ((zqinit & 0xF) << 24) 1318*5614e71bSYork Sun | ((zqoper & 0xF) << 16) 1319*5614e71bSYork Sun | ((zqcs & 0xF) << 8) 1320*5614e71bSYork Sun ); 1321*5614e71bSYork Sun debug("FSLDDR: zq_cntl = 0x%08x\n", ddr->ddr_zq_cntl); 1322*5614e71bSYork Sun } 1323*5614e71bSYork Sun 1324*5614e71bSYork Sun /* DDR Write Leveling Control (DDR_WRLVL_CNTL) */ 1325*5614e71bSYork Sun static void set_ddr_wrlvl_cntl(fsl_ddr_cfg_regs_t *ddr, unsigned int wrlvl_en, 1326*5614e71bSYork Sun const memctl_options_t *popts) 1327*5614e71bSYork Sun { 1328*5614e71bSYork Sun /* 1329*5614e71bSYork Sun * First DQS pulse rising edge after margining mode 1330*5614e71bSYork Sun * is programmed (tWL_MRD) 1331*5614e71bSYork Sun */ 1332*5614e71bSYork Sun unsigned int wrlvl_mrd = 0; 1333*5614e71bSYork Sun /* ODT delay after margining mode is programmed (tWL_ODTEN) */ 1334*5614e71bSYork Sun unsigned int wrlvl_odten = 0; 1335*5614e71bSYork Sun /* DQS/DQS_ delay after margining mode is programmed (tWL_DQSEN) */ 1336*5614e71bSYork Sun unsigned int wrlvl_dqsen = 0; 1337*5614e71bSYork Sun /* WRLVL_SMPL: Write leveling sample time */ 1338*5614e71bSYork Sun unsigned int wrlvl_smpl = 0; 1339*5614e71bSYork Sun /* WRLVL_WLR: Write leveling repeition time */ 1340*5614e71bSYork Sun unsigned int wrlvl_wlr = 0; 1341*5614e71bSYork Sun /* WRLVL_START: Write leveling start time */ 1342*5614e71bSYork Sun unsigned int wrlvl_start = 0; 1343*5614e71bSYork Sun 1344*5614e71bSYork Sun /* suggest enable write leveling for DDR3 due to fly-by topology */ 1345*5614e71bSYork Sun if (wrlvl_en) { 1346*5614e71bSYork Sun /* tWL_MRD min = 40 nCK, we set it 64 */ 1347*5614e71bSYork Sun wrlvl_mrd = 0x6; 1348*5614e71bSYork Sun /* tWL_ODTEN 128 */ 1349*5614e71bSYork Sun wrlvl_odten = 0x7; 1350*5614e71bSYork Sun /* tWL_DQSEN min = 25 nCK, we set it 32 */ 1351*5614e71bSYork Sun wrlvl_dqsen = 0x5; 1352*5614e71bSYork Sun /* 1353*5614e71bSYork Sun * Write leveling sample time at least need 6 clocks 1354*5614e71bSYork Sun * higher than tWLO to allow enough time for progagation 1355*5614e71bSYork Sun * delay and sampling the prime data bits. 1356*5614e71bSYork Sun */ 1357*5614e71bSYork Sun wrlvl_smpl = 0xf; 1358*5614e71bSYork Sun /* 1359*5614e71bSYork Sun * Write leveling repetition time 1360*5614e71bSYork Sun * at least tWLO + 6 clocks clocks 1361*5614e71bSYork Sun * we set it 64 1362*5614e71bSYork Sun */ 1363*5614e71bSYork Sun wrlvl_wlr = 0x6; 1364*5614e71bSYork Sun /* 1365*5614e71bSYork Sun * Write leveling start time 1366*5614e71bSYork Sun * The value use for the DQS_ADJUST for the first sample 1367*5614e71bSYork Sun * when write leveling is enabled. It probably needs to be 1368*5614e71bSYork Sun * overriden per platform. 1369*5614e71bSYork Sun */ 1370*5614e71bSYork Sun wrlvl_start = 0x8; 1371*5614e71bSYork Sun /* 1372*5614e71bSYork Sun * Override the write leveling sample and start time 1373*5614e71bSYork Sun * according to specific board 1374*5614e71bSYork Sun */ 1375*5614e71bSYork Sun if (popts->wrlvl_override) { 1376*5614e71bSYork Sun wrlvl_smpl = popts->wrlvl_sample; 1377*5614e71bSYork Sun wrlvl_start = popts->wrlvl_start; 1378*5614e71bSYork Sun } 1379*5614e71bSYork Sun } 1380*5614e71bSYork Sun 1381*5614e71bSYork Sun ddr->ddr_wrlvl_cntl = (0 1382*5614e71bSYork Sun | ((wrlvl_en & 0x1) << 31) 1383*5614e71bSYork Sun | ((wrlvl_mrd & 0x7) << 24) 1384*5614e71bSYork Sun | ((wrlvl_odten & 0x7) << 20) 1385*5614e71bSYork Sun | ((wrlvl_dqsen & 0x7) << 16) 1386*5614e71bSYork Sun | ((wrlvl_smpl & 0xf) << 12) 1387*5614e71bSYork Sun | ((wrlvl_wlr & 0x7) << 8) 1388*5614e71bSYork Sun | ((wrlvl_start & 0x1F) << 0) 1389*5614e71bSYork Sun ); 1390*5614e71bSYork Sun debug("FSLDDR: wrlvl_cntl = 0x%08x\n", ddr->ddr_wrlvl_cntl); 1391*5614e71bSYork Sun ddr->ddr_wrlvl_cntl_2 = popts->wrlvl_ctl_2; 1392*5614e71bSYork Sun debug("FSLDDR: wrlvl_cntl_2 = 0x%08x\n", ddr->ddr_wrlvl_cntl_2); 1393*5614e71bSYork Sun ddr->ddr_wrlvl_cntl_3 = popts->wrlvl_ctl_3; 1394*5614e71bSYork Sun debug("FSLDDR: wrlvl_cntl_3 = 0x%08x\n", ddr->ddr_wrlvl_cntl_3); 1395*5614e71bSYork Sun 1396*5614e71bSYork Sun } 1397*5614e71bSYork Sun 1398*5614e71bSYork Sun /* DDR Self Refresh Counter (DDR_SR_CNTR) */ 1399*5614e71bSYork Sun static void set_ddr_sr_cntr(fsl_ddr_cfg_regs_t *ddr, unsigned int sr_it) 1400*5614e71bSYork Sun { 1401*5614e71bSYork Sun /* Self Refresh Idle Threshold */ 1402*5614e71bSYork Sun ddr->ddr_sr_cntr = (sr_it & 0xF) << 16; 1403*5614e71bSYork Sun } 1404*5614e71bSYork Sun 1405*5614e71bSYork Sun static void set_ddr_eor(fsl_ddr_cfg_regs_t *ddr, const memctl_options_t *popts) 1406*5614e71bSYork Sun { 1407*5614e71bSYork Sun if (popts->addr_hash) { 1408*5614e71bSYork Sun ddr->ddr_eor = 0x40000000; /* address hash enable */ 1409*5614e71bSYork Sun puts("Address hashing enabled.\n"); 1410*5614e71bSYork Sun } 1411*5614e71bSYork Sun } 1412*5614e71bSYork Sun 1413*5614e71bSYork Sun static void set_ddr_cdr1(fsl_ddr_cfg_regs_t *ddr, const memctl_options_t *popts) 1414*5614e71bSYork Sun { 1415*5614e71bSYork Sun ddr->ddr_cdr1 = popts->ddr_cdr1; 1416*5614e71bSYork Sun debug("FSLDDR: ddr_cdr1 = 0x%08x\n", ddr->ddr_cdr1); 1417*5614e71bSYork Sun } 1418*5614e71bSYork Sun 1419*5614e71bSYork Sun static void set_ddr_cdr2(fsl_ddr_cfg_regs_t *ddr, const memctl_options_t *popts) 1420*5614e71bSYork Sun { 1421*5614e71bSYork Sun ddr->ddr_cdr2 = popts->ddr_cdr2; 1422*5614e71bSYork Sun debug("FSLDDR: ddr_cdr2 = 0x%08x\n", ddr->ddr_cdr2); 1423*5614e71bSYork Sun } 1424*5614e71bSYork Sun 1425*5614e71bSYork Sun unsigned int 1426*5614e71bSYork Sun check_fsl_memctl_config_regs(const fsl_ddr_cfg_regs_t *ddr) 1427*5614e71bSYork Sun { 1428*5614e71bSYork Sun unsigned int res = 0; 1429*5614e71bSYork Sun 1430*5614e71bSYork Sun /* 1431*5614e71bSYork Sun * Check that DDR_SDRAM_CFG[RD_EN] and DDR_SDRAM_CFG[2T_EN] are 1432*5614e71bSYork Sun * not set at the same time. 1433*5614e71bSYork Sun */ 1434*5614e71bSYork Sun if (ddr->ddr_sdram_cfg & 0x10000000 1435*5614e71bSYork Sun && ddr->ddr_sdram_cfg & 0x00008000) { 1436*5614e71bSYork Sun printf("Error: DDR_SDRAM_CFG[RD_EN] and DDR_SDRAM_CFG[2T_EN] " 1437*5614e71bSYork Sun " should not be set at the same time.\n"); 1438*5614e71bSYork Sun res++; 1439*5614e71bSYork Sun } 1440*5614e71bSYork Sun 1441*5614e71bSYork Sun return res; 1442*5614e71bSYork Sun } 1443*5614e71bSYork Sun 1444*5614e71bSYork Sun unsigned int 1445*5614e71bSYork Sun compute_fsl_memctl_config_regs(const memctl_options_t *popts, 1446*5614e71bSYork Sun fsl_ddr_cfg_regs_t *ddr, 1447*5614e71bSYork Sun const common_timing_params_t *common_dimm, 1448*5614e71bSYork Sun const dimm_params_t *dimm_params, 1449*5614e71bSYork Sun unsigned int dbw_cap_adj, 1450*5614e71bSYork Sun unsigned int size_only) 1451*5614e71bSYork Sun { 1452*5614e71bSYork Sun unsigned int i; 1453*5614e71bSYork Sun unsigned int cas_latency; 1454*5614e71bSYork Sun unsigned int additive_latency; 1455*5614e71bSYork Sun unsigned int sr_it; 1456*5614e71bSYork Sun unsigned int zq_en; 1457*5614e71bSYork Sun unsigned int wrlvl_en; 1458*5614e71bSYork Sun unsigned int ip_rev = 0; 1459*5614e71bSYork Sun unsigned int unq_mrs_en = 0; 1460*5614e71bSYork Sun int cs_en = 1; 1461*5614e71bSYork Sun 1462*5614e71bSYork Sun memset(ddr, 0, sizeof(fsl_ddr_cfg_regs_t)); 1463*5614e71bSYork Sun 1464*5614e71bSYork Sun if (common_dimm == NULL) { 1465*5614e71bSYork Sun printf("Error: subset DIMM params struct null pointer\n"); 1466*5614e71bSYork Sun return 1; 1467*5614e71bSYork Sun } 1468*5614e71bSYork Sun 1469*5614e71bSYork Sun /* 1470*5614e71bSYork Sun * Process overrides first. 1471*5614e71bSYork Sun * 1472*5614e71bSYork Sun * FIXME: somehow add dereated caslat to this 1473*5614e71bSYork Sun */ 1474*5614e71bSYork Sun cas_latency = (popts->cas_latency_override) 1475*5614e71bSYork Sun ? popts->cas_latency_override_value 1476*5614e71bSYork Sun : common_dimm->lowest_common_SPD_caslat; 1477*5614e71bSYork Sun 1478*5614e71bSYork Sun additive_latency = (popts->additive_latency_override) 1479*5614e71bSYork Sun ? popts->additive_latency_override_value 1480*5614e71bSYork Sun : common_dimm->additive_latency; 1481*5614e71bSYork Sun 1482*5614e71bSYork Sun sr_it = (popts->auto_self_refresh_en) 1483*5614e71bSYork Sun ? popts->sr_it 1484*5614e71bSYork Sun : 0; 1485*5614e71bSYork Sun /* ZQ calibration */ 1486*5614e71bSYork Sun zq_en = (popts->zq_en) ? 1 : 0; 1487*5614e71bSYork Sun /* write leveling */ 1488*5614e71bSYork Sun wrlvl_en = (popts->wrlvl_en) ? 1 : 0; 1489*5614e71bSYork Sun 1490*5614e71bSYork Sun /* Chip Select Memory Bounds (CSn_BNDS) */ 1491*5614e71bSYork Sun for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) { 1492*5614e71bSYork Sun unsigned long long ea, sa; 1493*5614e71bSYork Sun unsigned int cs_per_dimm 1494*5614e71bSYork Sun = CONFIG_CHIP_SELECTS_PER_CTRL / CONFIG_DIMM_SLOTS_PER_CTLR; 1495*5614e71bSYork Sun unsigned int dimm_number 1496*5614e71bSYork Sun = i / cs_per_dimm; 1497*5614e71bSYork Sun unsigned long long rank_density 1498*5614e71bSYork Sun = dimm_params[dimm_number].rank_density >> dbw_cap_adj; 1499*5614e71bSYork Sun 1500*5614e71bSYork Sun if (dimm_params[dimm_number].n_ranks == 0) { 1501*5614e71bSYork Sun debug("Skipping setup of CS%u " 1502*5614e71bSYork Sun "because n_ranks on DIMM %u is 0\n", i, dimm_number); 1503*5614e71bSYork Sun continue; 1504*5614e71bSYork Sun } 1505*5614e71bSYork Sun if (popts->memctl_interleaving) { 1506*5614e71bSYork Sun switch (popts->ba_intlv_ctl & FSL_DDR_CS0_CS1_CS2_CS3) { 1507*5614e71bSYork Sun case FSL_DDR_CS0_CS1_CS2_CS3: 1508*5614e71bSYork Sun break; 1509*5614e71bSYork Sun case FSL_DDR_CS0_CS1: 1510*5614e71bSYork Sun case FSL_DDR_CS0_CS1_AND_CS2_CS3: 1511*5614e71bSYork Sun if (i > 1) 1512*5614e71bSYork Sun cs_en = 0; 1513*5614e71bSYork Sun break; 1514*5614e71bSYork Sun case FSL_DDR_CS2_CS3: 1515*5614e71bSYork Sun default: 1516*5614e71bSYork Sun if (i > 0) 1517*5614e71bSYork Sun cs_en = 0; 1518*5614e71bSYork Sun break; 1519*5614e71bSYork Sun } 1520*5614e71bSYork Sun sa = common_dimm->base_address; 1521*5614e71bSYork Sun ea = sa + common_dimm->total_mem - 1; 1522*5614e71bSYork Sun } else if (!popts->memctl_interleaving) { 1523*5614e71bSYork Sun /* 1524*5614e71bSYork Sun * If memory interleaving between controllers is NOT 1525*5614e71bSYork Sun * enabled, the starting address for each memory 1526*5614e71bSYork Sun * controller is distinct. However, because rank 1527*5614e71bSYork Sun * interleaving is enabled, the starting and ending 1528*5614e71bSYork Sun * addresses of the total memory on that memory 1529*5614e71bSYork Sun * controller needs to be programmed into its 1530*5614e71bSYork Sun * respective CS0_BNDS. 1531*5614e71bSYork Sun */ 1532*5614e71bSYork Sun switch (popts->ba_intlv_ctl & FSL_DDR_CS0_CS1_CS2_CS3) { 1533*5614e71bSYork Sun case FSL_DDR_CS0_CS1_CS2_CS3: 1534*5614e71bSYork Sun sa = common_dimm->base_address; 1535*5614e71bSYork Sun ea = sa + common_dimm->total_mem - 1; 1536*5614e71bSYork Sun break; 1537*5614e71bSYork Sun case FSL_DDR_CS0_CS1_AND_CS2_CS3: 1538*5614e71bSYork Sun if ((i >= 2) && (dimm_number == 0)) { 1539*5614e71bSYork Sun sa = dimm_params[dimm_number].base_address + 1540*5614e71bSYork Sun 2 * rank_density; 1541*5614e71bSYork Sun ea = sa + 2 * rank_density - 1; 1542*5614e71bSYork Sun } else { 1543*5614e71bSYork Sun sa = dimm_params[dimm_number].base_address; 1544*5614e71bSYork Sun ea = sa + 2 * rank_density - 1; 1545*5614e71bSYork Sun } 1546*5614e71bSYork Sun break; 1547*5614e71bSYork Sun case FSL_DDR_CS0_CS1: 1548*5614e71bSYork Sun if (dimm_params[dimm_number].n_ranks > (i % cs_per_dimm)) { 1549*5614e71bSYork Sun sa = dimm_params[dimm_number].base_address; 1550*5614e71bSYork Sun ea = sa + rank_density - 1; 1551*5614e71bSYork Sun if (i != 1) 1552*5614e71bSYork Sun sa += (i % cs_per_dimm) * rank_density; 1553*5614e71bSYork Sun ea += (i % cs_per_dimm) * rank_density; 1554*5614e71bSYork Sun } else { 1555*5614e71bSYork Sun sa = 0; 1556*5614e71bSYork Sun ea = 0; 1557*5614e71bSYork Sun } 1558*5614e71bSYork Sun if (i == 0) 1559*5614e71bSYork Sun ea += rank_density; 1560*5614e71bSYork Sun break; 1561*5614e71bSYork Sun case FSL_DDR_CS2_CS3: 1562*5614e71bSYork Sun if (dimm_params[dimm_number].n_ranks > (i % cs_per_dimm)) { 1563*5614e71bSYork Sun sa = dimm_params[dimm_number].base_address; 1564*5614e71bSYork Sun ea = sa + rank_density - 1; 1565*5614e71bSYork Sun if (i != 3) 1566*5614e71bSYork Sun sa += (i % cs_per_dimm) * rank_density; 1567*5614e71bSYork Sun ea += (i % cs_per_dimm) * rank_density; 1568*5614e71bSYork Sun } else { 1569*5614e71bSYork Sun sa = 0; 1570*5614e71bSYork Sun ea = 0; 1571*5614e71bSYork Sun } 1572*5614e71bSYork Sun if (i == 2) 1573*5614e71bSYork Sun ea += (rank_density >> dbw_cap_adj); 1574*5614e71bSYork Sun break; 1575*5614e71bSYork Sun default: /* No bank(chip-select) interleaving */ 1576*5614e71bSYork Sun sa = dimm_params[dimm_number].base_address; 1577*5614e71bSYork Sun ea = sa + rank_density - 1; 1578*5614e71bSYork Sun if (dimm_params[dimm_number].n_ranks > (i % cs_per_dimm)) { 1579*5614e71bSYork Sun sa += (i % cs_per_dimm) * rank_density; 1580*5614e71bSYork Sun ea += (i % cs_per_dimm) * rank_density; 1581*5614e71bSYork Sun } else { 1582*5614e71bSYork Sun sa = 0; 1583*5614e71bSYork Sun ea = 0; 1584*5614e71bSYork Sun } 1585*5614e71bSYork Sun break; 1586*5614e71bSYork Sun } 1587*5614e71bSYork Sun } 1588*5614e71bSYork Sun 1589*5614e71bSYork Sun sa >>= 24; 1590*5614e71bSYork Sun ea >>= 24; 1591*5614e71bSYork Sun 1592*5614e71bSYork Sun if (cs_en) { 1593*5614e71bSYork Sun ddr->cs[i].bnds = (0 1594*5614e71bSYork Sun | ((sa & 0xFFF) << 16)/* starting address MSB */ 1595*5614e71bSYork Sun | ((ea & 0xFFF) << 0) /* ending address MSB */ 1596*5614e71bSYork Sun ); 1597*5614e71bSYork Sun } else { 1598*5614e71bSYork Sun /* setting bnds to 0xffffffff for inactive CS */ 1599*5614e71bSYork Sun ddr->cs[i].bnds = 0xffffffff; 1600*5614e71bSYork Sun } 1601*5614e71bSYork Sun 1602*5614e71bSYork Sun debug("FSLDDR: cs[%d]_bnds = 0x%08x\n", i, ddr->cs[i].bnds); 1603*5614e71bSYork Sun set_csn_config(dimm_number, i, ddr, popts, dimm_params); 1604*5614e71bSYork Sun set_csn_config_2(i, ddr); 1605*5614e71bSYork Sun } 1606*5614e71bSYork Sun 1607*5614e71bSYork Sun /* 1608*5614e71bSYork Sun * In the case we only need to compute the ddr sdram size, we only need 1609*5614e71bSYork Sun * to set csn registers, so return from here. 1610*5614e71bSYork Sun */ 1611*5614e71bSYork Sun if (size_only) 1612*5614e71bSYork Sun return 0; 1613*5614e71bSYork Sun 1614*5614e71bSYork Sun set_ddr_eor(ddr, popts); 1615*5614e71bSYork Sun 1616*5614e71bSYork Sun #if !defined(CONFIG_SYS_FSL_DDR1) 1617*5614e71bSYork Sun set_timing_cfg_0(ddr, popts, dimm_params); 1618*5614e71bSYork Sun #endif 1619*5614e71bSYork Sun 1620*5614e71bSYork Sun set_timing_cfg_3(ddr, popts, common_dimm, cas_latency); 1621*5614e71bSYork Sun set_timing_cfg_1(ddr, popts, common_dimm, cas_latency); 1622*5614e71bSYork Sun set_timing_cfg_2(ddr, popts, common_dimm, 1623*5614e71bSYork Sun cas_latency, additive_latency); 1624*5614e71bSYork Sun 1625*5614e71bSYork Sun set_ddr_cdr1(ddr, popts); 1626*5614e71bSYork Sun set_ddr_cdr2(ddr, popts); 1627*5614e71bSYork Sun set_ddr_sdram_cfg(ddr, popts, common_dimm); 1628*5614e71bSYork Sun ip_rev = fsl_ddr_get_version(); 1629*5614e71bSYork Sun if (ip_rev > 0x40400) 1630*5614e71bSYork Sun unq_mrs_en = 1; 1631*5614e71bSYork Sun 1632*5614e71bSYork Sun set_ddr_sdram_cfg_2(ddr, popts, unq_mrs_en); 1633*5614e71bSYork Sun set_ddr_sdram_mode(ddr, popts, common_dimm, 1634*5614e71bSYork Sun cas_latency, additive_latency, unq_mrs_en); 1635*5614e71bSYork Sun set_ddr_sdram_mode_2(ddr, popts, common_dimm, unq_mrs_en); 1636*5614e71bSYork Sun set_ddr_sdram_interval(ddr, popts, common_dimm); 1637*5614e71bSYork Sun set_ddr_data_init(ddr); 1638*5614e71bSYork Sun set_ddr_sdram_clk_cntl(ddr, popts); 1639*5614e71bSYork Sun set_ddr_init_addr(ddr); 1640*5614e71bSYork Sun set_ddr_init_ext_addr(ddr); 1641*5614e71bSYork Sun set_timing_cfg_4(ddr, popts); 1642*5614e71bSYork Sun set_timing_cfg_5(ddr, cas_latency); 1643*5614e71bSYork Sun 1644*5614e71bSYork Sun set_ddr_zq_cntl(ddr, zq_en); 1645*5614e71bSYork Sun set_ddr_wrlvl_cntl(ddr, wrlvl_en, popts); 1646*5614e71bSYork Sun 1647*5614e71bSYork Sun set_ddr_sr_cntr(ddr, sr_it); 1648*5614e71bSYork Sun 1649*5614e71bSYork Sun set_ddr_sdram_rcw(ddr, popts, common_dimm); 1650*5614e71bSYork Sun 1651*5614e71bSYork Sun #ifdef CONFIG_SYS_FSL_DDR_EMU 1652*5614e71bSYork Sun /* disble DDR training for emulator */ 1653*5614e71bSYork Sun ddr->debug[2] = 0x00000400; 1654*5614e71bSYork Sun ddr->debug[4] = 0xff800000; 1655*5614e71bSYork Sun #endif 1656*5614e71bSYork Sun return check_fsl_memctl_config_regs(ddr); 1657*5614e71bSYork Sun } 1658