1*14aa71e6SLi Yang /* 2*14aa71e6SLi Yang * Copyright 2010-2011 Freescale Semiconductor, Inc. 3*14aa71e6SLi Yang * 4*14aa71e6SLi Yang * This program is free software; you can redistribute it and/or 5*14aa71e6SLi Yang * modify it under the terms of the GNU General Public License 6*14aa71e6SLi Yang * Version 2 as published by the Free Software Foundation. 7*14aa71e6SLi Yang */ 8*14aa71e6SLi Yang 9*14aa71e6SLi Yang #include <common.h> 10*14aa71e6SLi Yang #include <asm/mmu.h> 11*14aa71e6SLi Yang #include <asm/immap_85xx.h> 12*14aa71e6SLi Yang #include <asm/processor.h> 13*14aa71e6SLi Yang #include <asm/fsl_ddr_sdram.h> 14*14aa71e6SLi Yang #include <asm/fsl_ddr_dimm_params.h> 15*14aa71e6SLi Yang #include <asm/io.h> 16*14aa71e6SLi Yang #include <asm/fsl_law.h> 17*14aa71e6SLi Yang 18*14aa71e6SLi Yang #ifdef CONFIG_DDR_RAW_TIMING 19*14aa71e6SLi Yang #if defined(CONFIG_P1020RDB_PROTO) || \ 20*14aa71e6SLi Yang defined(CONFIG_P1021RDB) || \ 21*14aa71e6SLi Yang defined(CONFIG_P1020UTM) 22*14aa71e6SLi Yang /* Micron MT41J256M8_187E */ 23*14aa71e6SLi Yang dimm_params_t ddr_raw_timing = { 24*14aa71e6SLi Yang .n_ranks = 1, 25*14aa71e6SLi Yang .rank_density = 1073741824u, 26*14aa71e6SLi Yang .capacity = 1073741824u, 27*14aa71e6SLi Yang .primary_sdram_width = 32, 28*14aa71e6SLi Yang .ec_sdram_width = 0, 29*14aa71e6SLi Yang .registered_dimm = 0, 30*14aa71e6SLi Yang .mirrored_dimm = 0, 31*14aa71e6SLi Yang .n_row_addr = 15, 32*14aa71e6SLi Yang .n_col_addr = 10, 33*14aa71e6SLi Yang .n_banks_per_sdram_device = 8, 34*14aa71e6SLi Yang .edc_config = 0, 35*14aa71e6SLi Yang .burst_lengths_bitmask = 0x0c, 36*14aa71e6SLi Yang 37*14aa71e6SLi Yang .tCKmin_X_ps = 1870, 38*14aa71e6SLi Yang .caslat_X = 0x1e << 4, /* 5,6,7,8 */ 39*14aa71e6SLi Yang .tAA_ps = 13125, 40*14aa71e6SLi Yang .tWR_ps = 15000, 41*14aa71e6SLi Yang .tRCD_ps = 13125, 42*14aa71e6SLi Yang .tRRD_ps = 7500, 43*14aa71e6SLi Yang .tRP_ps = 13125, 44*14aa71e6SLi Yang .tRAS_ps = 37500, 45*14aa71e6SLi Yang .tRC_ps = 50625, 46*14aa71e6SLi Yang .tRFC_ps = 160000, 47*14aa71e6SLi Yang .tWTR_ps = 7500, 48*14aa71e6SLi Yang .tRTP_ps = 7500, 49*14aa71e6SLi Yang .refresh_rate_ps = 7800000, 50*14aa71e6SLi Yang .tFAW_ps = 37500, 51*14aa71e6SLi Yang }; 52*14aa71e6SLi Yang #elif defined(CONFIG_P2020RDB) 53*14aa71e6SLi Yang /* Micron MT41J128M16_15E */ 54*14aa71e6SLi Yang dimm_params_t ddr_raw_timing = { 55*14aa71e6SLi Yang .n_ranks = 1, 56*14aa71e6SLi Yang .rank_density = 1073741824u, 57*14aa71e6SLi Yang .capacity = 1073741824u, 58*14aa71e6SLi Yang .primary_sdram_width = 64, 59*14aa71e6SLi Yang .ec_sdram_width = 0, 60*14aa71e6SLi Yang .registered_dimm = 0, 61*14aa71e6SLi Yang .mirrored_dimm = 0, 62*14aa71e6SLi Yang .n_row_addr = 14, 63*14aa71e6SLi Yang .n_col_addr = 10, 64*14aa71e6SLi Yang .n_banks_per_sdram_device = 8, 65*14aa71e6SLi Yang .edc_config = 0, 66*14aa71e6SLi Yang .burst_lengths_bitmask = 0x0c, 67*14aa71e6SLi Yang 68*14aa71e6SLi Yang .tCKmin_X_ps = 1500, 69*14aa71e6SLi Yang .caslat_X = 0x7e << 4, /* 5,6,7,8,9,10 */ 70*14aa71e6SLi Yang .tAA_ps = 13500, 71*14aa71e6SLi Yang .tWR_ps = 15000, 72*14aa71e6SLi Yang .tRCD_ps = 13500, 73*14aa71e6SLi Yang .tRRD_ps = 6000, 74*14aa71e6SLi Yang .tRP_ps = 13500, 75*14aa71e6SLi Yang .tRAS_ps = 36000, 76*14aa71e6SLi Yang .tRC_ps = 49500, 77*14aa71e6SLi Yang .tRFC_ps = 160000, 78*14aa71e6SLi Yang .tWTR_ps = 7500, 79*14aa71e6SLi Yang .tRTP_ps = 7500, 80*14aa71e6SLi Yang .refresh_rate_ps = 7800000, 81*14aa71e6SLi Yang .tFAW_ps = 30000, 82*14aa71e6SLi Yang }; 83*14aa71e6SLi Yang #elif defined(CONFIG_P1020MBG) 84*14aa71e6SLi Yang /* Micron MT41J512M8_187E */ 85*14aa71e6SLi Yang dimm_params_t ddr_raw_timing = { 86*14aa71e6SLi Yang .n_ranks = 2, 87*14aa71e6SLi Yang .rank_density = 1073741824u, 88*14aa71e6SLi Yang .capacity = 2147483648u, 89*14aa71e6SLi Yang .primary_sdram_width = 32, 90*14aa71e6SLi Yang .ec_sdram_width = 0, 91*14aa71e6SLi Yang .registered_dimm = 0, 92*14aa71e6SLi Yang .mirrored_dimm = 0, 93*14aa71e6SLi Yang .n_row_addr = 15, 94*14aa71e6SLi Yang .n_col_addr = 10, 95*14aa71e6SLi Yang .n_banks_per_sdram_device = 8, 96*14aa71e6SLi Yang .edc_config = 0, 97*14aa71e6SLi Yang .burst_lengths_bitmask = 0x0c, 98*14aa71e6SLi Yang 99*14aa71e6SLi Yang .tCKmin_X_ps = 1870, 100*14aa71e6SLi Yang .caslat_X = 0x1e << 4, /* 5,6,7,8 */ 101*14aa71e6SLi Yang .tAA_ps = 13125, 102*14aa71e6SLi Yang .tWR_ps = 15000, 103*14aa71e6SLi Yang .tRCD_ps = 13125, 104*14aa71e6SLi Yang .tRRD_ps = 7500, 105*14aa71e6SLi Yang .tRP_ps = 13125, 106*14aa71e6SLi Yang .tRAS_ps = 37500, 107*14aa71e6SLi Yang .tRC_ps = 50625, 108*14aa71e6SLi Yang .tRFC_ps = 160000, 109*14aa71e6SLi Yang .tWTR_ps = 7500, 110*14aa71e6SLi Yang .tRTP_ps = 7500, 111*14aa71e6SLi Yang .refresh_rate_ps = 7800000, 112*14aa71e6SLi Yang .tFAW_ps = 37500, 113*14aa71e6SLi Yang }; 114*14aa71e6SLi Yang #elif defined(CONFIG_P1020RDB) 115*14aa71e6SLi Yang /* 116*14aa71e6SLi Yang * Samsung K4B2G0846C-HCF8 117*14aa71e6SLi Yang * The following timing are for "downshift" 118*14aa71e6SLi Yang * i.e. to use CL9 part as CL7 119*14aa71e6SLi Yang * otherwise, tAA, tRCD, tRP will be 13500ps 120*14aa71e6SLi Yang * and tRC will be 49500ps 121*14aa71e6SLi Yang */ 122*14aa71e6SLi Yang dimm_params_t ddr_raw_timing = { 123*14aa71e6SLi Yang .n_ranks = 1, 124*14aa71e6SLi Yang .rank_density = 1073741824u, 125*14aa71e6SLi Yang .capacity = 1073741824u, 126*14aa71e6SLi Yang .primary_sdram_width = 32, 127*14aa71e6SLi Yang .ec_sdram_width = 0, 128*14aa71e6SLi Yang .registered_dimm = 0, 129*14aa71e6SLi Yang .mirrored_dimm = 0, 130*14aa71e6SLi Yang .n_row_addr = 15, 131*14aa71e6SLi Yang .n_col_addr = 10, 132*14aa71e6SLi Yang .n_banks_per_sdram_device = 8, 133*14aa71e6SLi Yang .edc_config = 0, 134*14aa71e6SLi Yang .burst_lengths_bitmask = 0x0c, 135*14aa71e6SLi Yang 136*14aa71e6SLi Yang .tCKmin_X_ps = 1875, 137*14aa71e6SLi Yang .caslat_X = 0x1e << 4, /* 5,6,7,8 */ 138*14aa71e6SLi Yang .tAA_ps = 13125, 139*14aa71e6SLi Yang .tWR_ps = 15000, 140*14aa71e6SLi Yang .tRCD_ps = 13125, 141*14aa71e6SLi Yang .tRRD_ps = 7500, 142*14aa71e6SLi Yang .tRP_ps = 13125, 143*14aa71e6SLi Yang .tRAS_ps = 37500, 144*14aa71e6SLi Yang .tRC_ps = 50625, 145*14aa71e6SLi Yang .tRFC_ps = 160000, 146*14aa71e6SLi Yang .tWTR_ps = 7500, 147*14aa71e6SLi Yang .tRTP_ps = 7500, 148*14aa71e6SLi Yang .refresh_rate_ps = 7800000, 149*14aa71e6SLi Yang .tFAW_ps = 37500, 150*14aa71e6SLi Yang }; 151*14aa71e6SLi Yang #elif defined(CONFIG_P1024RDB) || \ 152*14aa71e6SLi Yang defined(CONFIG_P1025RDB) 153*14aa71e6SLi Yang /* 154*14aa71e6SLi Yang * Samsung K4B2G0846C-HCH9 155*14aa71e6SLi Yang * The following timing are for "downshift" 156*14aa71e6SLi Yang * i.e. to use CL9 part as CL7 157*14aa71e6SLi Yang * otherwise, tAA, tRCD, tRP will be 13500ps 158*14aa71e6SLi Yang * and tRC will be 49500ps 159*14aa71e6SLi Yang */ 160*14aa71e6SLi Yang dimm_params_t ddr_raw_timing = { 161*14aa71e6SLi Yang .n_ranks = 1, 162*14aa71e6SLi Yang .rank_density = 1073741824u, 163*14aa71e6SLi Yang .capacity = 1073741824u, 164*14aa71e6SLi Yang .primary_sdram_width = 32, 165*14aa71e6SLi Yang .ec_sdram_width = 0, 166*14aa71e6SLi Yang .registered_dimm = 0, 167*14aa71e6SLi Yang .mirrored_dimm = 0, 168*14aa71e6SLi Yang .n_row_addr = 15, 169*14aa71e6SLi Yang .n_col_addr = 10, 170*14aa71e6SLi Yang .n_banks_per_sdram_device = 8, 171*14aa71e6SLi Yang .edc_config = 0, 172*14aa71e6SLi Yang .burst_lengths_bitmask = 0x0c, 173*14aa71e6SLi Yang 174*14aa71e6SLi Yang .tCKmin_X_ps = 1500, 175*14aa71e6SLi Yang .caslat_X = 0x3e << 4, /* 5,6,7,8,9 */ 176*14aa71e6SLi Yang .tAA_ps = 13125, 177*14aa71e6SLi Yang .tWR_ps = 15000, 178*14aa71e6SLi Yang .tRCD_ps = 13125, 179*14aa71e6SLi Yang .tRRD_ps = 6000, 180*14aa71e6SLi Yang .tRP_ps = 13125, 181*14aa71e6SLi Yang .tRAS_ps = 36000, 182*14aa71e6SLi Yang .tRC_ps = 49125, 183*14aa71e6SLi Yang .tRFC_ps = 160000, 184*14aa71e6SLi Yang .tWTR_ps = 7500, 185*14aa71e6SLi Yang .tRTP_ps = 7500, 186*14aa71e6SLi Yang .refresh_rate_ps = 7800000, 187*14aa71e6SLi Yang .tFAW_ps = 30000, 188*14aa71e6SLi Yang }; 189*14aa71e6SLi Yang #else 190*14aa71e6SLi Yang #error Missing raw timing data for this board 191*14aa71e6SLi Yang #endif 192*14aa71e6SLi Yang 193*14aa71e6SLi Yang int fsl_ddr_get_dimm_params(dimm_params_t *pdimm, 194*14aa71e6SLi Yang unsigned int controller_number, 195*14aa71e6SLi Yang unsigned int dimm_number) 196*14aa71e6SLi Yang { 197*14aa71e6SLi Yang const char dimm_model[] = "Fixed DDR on board"; 198*14aa71e6SLi Yang 199*14aa71e6SLi Yang if ((controller_number == 0) && (dimm_number == 0)) { 200*14aa71e6SLi Yang memcpy(pdimm, &ddr_raw_timing, sizeof(dimm_params_t)); 201*14aa71e6SLi Yang memset(pdimm->mpart, 0, sizeof(pdimm->mpart)); 202*14aa71e6SLi Yang memcpy(pdimm->mpart, dimm_model, sizeof(dimm_model) - 1); 203*14aa71e6SLi Yang } 204*14aa71e6SLi Yang 205*14aa71e6SLi Yang return 0; 206*14aa71e6SLi Yang } 207*14aa71e6SLi Yang #endif /* CONFIG_DDR_RAW_TIMING */ 208*14aa71e6SLi Yang 209*14aa71e6SLi Yang /* Fixed sdram init -- doesn't use serial presence detect. */ 210*14aa71e6SLi Yang phys_size_t fixed_sdram(void) 211*14aa71e6SLi Yang { 212*14aa71e6SLi Yang sys_info_t sysinfo; 213*14aa71e6SLi Yang char buf[32]; 214*14aa71e6SLi Yang size_t ddr_size; 215*14aa71e6SLi Yang fsl_ddr_cfg_regs_t ddr_cfg_regs = { 216*14aa71e6SLi Yang .cs[0].bnds = CONFIG_SYS_DDR_CS0_BNDS, 217*14aa71e6SLi Yang .cs[0].config = CONFIG_SYS_DDR_CS0_CONFIG, 218*14aa71e6SLi Yang .cs[0].config_2 = CONFIG_SYS_DDR_CS0_CONFIG_2, 219*14aa71e6SLi Yang #if CONFIG_CHIP_SELECTS_PER_CTRL > 1 220*14aa71e6SLi Yang .cs[1].bnds = CONFIG_SYS_DDR_CS1_BNDS, 221*14aa71e6SLi Yang .cs[1].config = CONFIG_SYS_DDR_CS1_CONFIG, 222*14aa71e6SLi Yang .cs[1].config_2 = CONFIG_SYS_DDR_CS1_CONFIG_2, 223*14aa71e6SLi Yang #endif 224*14aa71e6SLi Yang .timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3, 225*14aa71e6SLi Yang .timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0, 226*14aa71e6SLi Yang .timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1, 227*14aa71e6SLi Yang .timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2, 228*14aa71e6SLi Yang .ddr_sdram_cfg = CONFIG_SYS_DDR_CONTROL, 229*14aa71e6SLi Yang .ddr_sdram_cfg_2 = CONFIG_SYS_DDR_CONTROL_2, 230*14aa71e6SLi Yang .ddr_sdram_mode = CONFIG_SYS_DDR_MODE_1, 231*14aa71e6SLi Yang .ddr_sdram_mode_2 = CONFIG_SYS_DDR_MODE_2, 232*14aa71e6SLi Yang .ddr_sdram_md_cntl = CONFIG_SYS_DDR_MODE_CONTROL, 233*14aa71e6SLi Yang .ddr_sdram_interval = CONFIG_SYS_DDR_INTERVAL, 234*14aa71e6SLi Yang .ddr_data_init = CONFIG_SYS_DDR_DATA_INIT, 235*14aa71e6SLi Yang .ddr_sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CTRL, 236*14aa71e6SLi Yang .ddr_init_addr = CONFIG_SYS_DDR_INIT_ADDR, 237*14aa71e6SLi Yang .ddr_init_ext_addr = CONFIG_SYS_DDR_INIT_EXT_ADDR, 238*14aa71e6SLi Yang .timing_cfg_4 = CONFIG_SYS_DDR_TIMING_4, 239*14aa71e6SLi Yang .timing_cfg_5 = CONFIG_SYS_DDR_TIMING_5, 240*14aa71e6SLi Yang .ddr_zq_cntl = CONFIG_SYS_DDR_ZQ_CONTROL, 241*14aa71e6SLi Yang .ddr_wrlvl_cntl = CONFIG_SYS_DDR_WRLVL_CONTROL, 242*14aa71e6SLi Yang .ddr_sr_cntr = CONFIG_SYS_DDR_SR_CNTR, 243*14aa71e6SLi Yang .ddr_sdram_rcw_1 = CONFIG_SYS_DDR_RCW_1, 244*14aa71e6SLi Yang .ddr_sdram_rcw_2 = CONFIG_SYS_DDR_RCW_2 245*14aa71e6SLi Yang }; 246*14aa71e6SLi Yang 247*14aa71e6SLi Yang get_sys_info(&sysinfo); 248*14aa71e6SLi Yang printf("Configuring DDR for %s MT/s data rate\n", 249*14aa71e6SLi Yang strmhz(buf, sysinfo.freqDDRBus)); 250*14aa71e6SLi Yang 251*14aa71e6SLi Yang ddr_size = CONFIG_SYS_SDRAM_SIZE * 1024 * 1024; 252*14aa71e6SLi Yang 253*14aa71e6SLi Yang fsl_ddr_set_memctl_regs(&ddr_cfg_regs, 0); 254*14aa71e6SLi Yang 255*14aa71e6SLi Yang if (set_ddr_laws(CONFIG_SYS_DDR_SDRAM_BASE, 256*14aa71e6SLi Yang ddr_size, LAW_TRGT_IF_DDR_1) < 0) { 257*14aa71e6SLi Yang printf("ERROR setting Local Access Windows for DDR\n"); 258*14aa71e6SLi Yang return 0; 259*14aa71e6SLi Yang }; 260*14aa71e6SLi Yang 261*14aa71e6SLi Yang return ddr_size; 262*14aa71e6SLi Yang } 263*14aa71e6SLi Yang 264*14aa71e6SLi Yang void fsl_ddr_board_options(memctl_options_t *popts, 265*14aa71e6SLi Yang dimm_params_t *pdimm, 266*14aa71e6SLi Yang unsigned int ctrl_num) 267*14aa71e6SLi Yang { 268*14aa71e6SLi Yang int i; 269*14aa71e6SLi Yang popts->clk_adjust = 6; 270*14aa71e6SLi Yang popts->cpo_override = 0x1f; 271*14aa71e6SLi Yang popts->write_data_delay = 2; 272*14aa71e6SLi Yang popts->half_strength_driver_enable = 1; 273*14aa71e6SLi Yang /* Write leveling override */ 274*14aa71e6SLi Yang popts->wrlvl_en = 1; 275*14aa71e6SLi Yang popts->wrlvl_override = 1; 276*14aa71e6SLi Yang popts->wrlvl_sample = 0xf; 277*14aa71e6SLi Yang popts->wrlvl_start = 0x8; 278*14aa71e6SLi Yang popts->trwt_override = 1; 279*14aa71e6SLi Yang popts->trwt = 0; 280*14aa71e6SLi Yang 281*14aa71e6SLi Yang if (pdimm->primary_sdram_width == 64) 282*14aa71e6SLi Yang popts->data_bus_width = 0; 283*14aa71e6SLi Yang else if (pdimm->primary_sdram_width == 32) 284*14aa71e6SLi Yang popts->data_bus_width = 1; 285*14aa71e6SLi Yang else 286*14aa71e6SLi Yang printf("Error in DDR bus width configuration!\n"); 287*14aa71e6SLi Yang 288*14aa71e6SLi Yang for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) { 289*14aa71e6SLi Yang popts->cs_local_opts[i].odt_rd_cfg = FSL_DDR_ODT_NEVER; 290*14aa71e6SLi Yang popts->cs_local_opts[i].odt_wr_cfg = FSL_DDR_ODT_CS; 291*14aa71e6SLi Yang } 292*14aa71e6SLi Yang } 293