|
|
|
@ -17,8 +17,6 @@ |
|
|
|
|
#include <fsl_immap.h> |
|
|
|
|
#include <asm/io.h> |
|
|
|
|
|
|
|
|
|
unsigned int picos_to_mclk(unsigned int picos); |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Determine Rtt value. |
|
|
|
|
* |
|
|
|
@ -78,10 +76,11 @@ static inline int fsl_ddr_get_rtt(void) |
|
|
|
|
* 16 for <= 2933MT/s |
|
|
|
|
* 18 for higher |
|
|
|
|
*/ |
|
|
|
|
static inline unsigned int compute_cas_write_latency(void) |
|
|
|
|
static inline unsigned int compute_cas_write_latency( |
|
|
|
|
const unsigned int ctrl_num) |
|
|
|
|
{ |
|
|
|
|
unsigned int cwl; |
|
|
|
|
const unsigned int mclk_ps = get_memory_clk_period_ps(); |
|
|
|
|
const unsigned int mclk_ps = get_memory_clk_period_ps(ctrl_num); |
|
|
|
|
if (mclk_ps >= 1250) |
|
|
|
|
cwl = 9; |
|
|
|
|
else if (mclk_ps >= 1070) |
|
|
|
@ -111,10 +110,11 @@ static inline unsigned int compute_cas_write_latency(void) |
|
|
|
|
* 11 if 0.935ns > tCK >= 0.833ns |
|
|
|
|
* 12 if 0.833ns > tCK >= 0.75ns |
|
|
|
|
*/ |
|
|
|
|
static inline unsigned int compute_cas_write_latency(void) |
|
|
|
|
static inline unsigned int compute_cas_write_latency( |
|
|
|
|
const unsigned int ctrl_num) |
|
|
|
|
{ |
|
|
|
|
unsigned int cwl; |
|
|
|
|
const unsigned int mclk_ps = get_memory_clk_period_ps(); |
|
|
|
|
const unsigned int mclk_ps = get_memory_clk_period_ps(ctrl_num); |
|
|
|
|
|
|
|
|
|
if (mclk_ps >= 2500) |
|
|
|
|
cwl = 5; |
|
|
|
@ -287,7 +287,8 @@ static inline int avoid_odt_overlap(const dimm_params_t *dimm_params) |
|
|
|
|
* Avoid writing for DDR I. The new PQ38 DDR controller |
|
|
|
|
* dreams up non-zero default values to be backwards compatible. |
|
|
|
|
*/ |
|
|
|
|
static void set_timing_cfg_0(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
static void set_timing_cfg_0(const unsigned int ctrl_num, |
|
|
|
|
fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const memctl_options_t *popts, |
|
|
|
|
const dimm_params_t *dimm_params) |
|
|
|
|
{ |
|
|
|
@ -306,7 +307,7 @@ static void set_timing_cfg_0(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
/* Mode register set cycle time (tMRD). */ |
|
|
|
|
unsigned char tmrd_mclk; |
|
|
|
|
#if defined(CONFIG_SYS_FSL_DDR4) || defined(CONFIG_SYS_FSL_DDR3) |
|
|
|
|
const unsigned int mclk_ps = get_memory_clk_period_ps(); |
|
|
|
|
const unsigned int mclk_ps = get_memory_clk_period_ps(ctrl_num); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_SYS_FSL_DDR4 |
|
|
|
@ -314,15 +315,15 @@ static void set_timing_cfg_0(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
int txp = max((int)mclk_ps * 4, 6000); /* unit=ps */ |
|
|
|
|
trwt_mclk = 2; |
|
|
|
|
twrt_mclk = 1; |
|
|
|
|
act_pd_exit_mclk = picos_to_mclk(txp); |
|
|
|
|
act_pd_exit_mclk = picos_to_mclk(ctrl_num, txp); |
|
|
|
|
pre_pd_exit_mclk = act_pd_exit_mclk; |
|
|
|
|
/*
|
|
|
|
|
* MRS_CYC = max(tMRD, tMOD) |
|
|
|
|
* tMRD = 8nCK, tMOD = max(24nCK, 15ns) |
|
|
|
|
*/ |
|
|
|
|
tmrd_mclk = max(24U, picos_to_mclk(15000)); |
|
|
|
|
tmrd_mclk = max(24U, picos_to_mclk(ctrl_num, 15000)); |
|
|
|
|
#elif defined(CONFIG_SYS_FSL_DDR3) |
|
|
|
|
unsigned int data_rate = get_ddr_freq(0); |
|
|
|
|
unsigned int data_rate = get_ddr_freq(ctrl_num); |
|
|
|
|
int txp; |
|
|
|
|
unsigned int ip_rev; |
|
|
|
|
int odt_overlap; |
|
|
|
@ -344,7 +345,8 @@ static void set_timing_cfg_0(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
* tMRD = 4nCK (8nCK for RDIMM) |
|
|
|
|
* tMOD = max(12nCK, 15ns) |
|
|
|
|
*/ |
|
|
|
|
tmrd_mclk = max((unsigned int)12, picos_to_mclk(15000)); |
|
|
|
|
tmrd_mclk = max((unsigned int)12, |
|
|
|
|
picos_to_mclk(ctrl_num, 15000)); |
|
|
|
|
} else { |
|
|
|
|
/*
|
|
|
|
|
* MRS_CYC = tMRD |
|
|
|
@ -388,7 +390,7 @@ static void set_timing_cfg_0(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
taxpd_mclk = 1; |
|
|
|
|
} else { |
|
|
|
|
/* act_pd_exit_mclk = tXARD, see above */ |
|
|
|
|
act_pd_exit_mclk = picos_to_mclk(txp); |
|
|
|
|
act_pd_exit_mclk = picos_to_mclk(ctrl_num, txp); |
|
|
|
|
/* Mode register MR0[A12] is '1' - fast exit */ |
|
|
|
|
pre_pd_exit_mclk = act_pd_exit_mclk; |
|
|
|
|
taxpd_mclk = 1; |
|
|
|
@ -424,11 +426,12 @@ static void set_timing_cfg_0(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
#endif /* !defined(CONFIG_SYS_FSL_DDR1) */ |
|
|
|
|
|
|
|
|
|
/* DDR SDRAM Timing Configuration 3 (TIMING_CFG_3) */ |
|
|
|
|
static void set_timing_cfg_3(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const memctl_options_t *popts, |
|
|
|
|
const common_timing_params_t *common_dimm, |
|
|
|
|
unsigned int cas_latency, |
|
|
|
|
unsigned int additive_latency) |
|
|
|
|
static void set_timing_cfg_3(const unsigned int ctrl_num, |
|
|
|
|
fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const memctl_options_t *popts, |
|
|
|
|
const common_timing_params_t *common_dimm, |
|
|
|
|
unsigned int cas_latency, |
|
|
|
|
unsigned int additive_latency) |
|
|
|
|
{ |
|
|
|
|
/* Extended precharge to activate interval (tRP) */ |
|
|
|
|
unsigned int ext_pretoact = 0; |
|
|
|
@ -447,18 +450,18 @@ static void set_timing_cfg_3(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
/* Control Adjust */ |
|
|
|
|
unsigned int cntl_adj = 0; |
|
|
|
|
|
|
|
|
|
ext_pretoact = picos_to_mclk(common_dimm->trp_ps) >> 4; |
|
|
|
|
ext_acttopre = picos_to_mclk(common_dimm->tras_ps) >> 4; |
|
|
|
|
ext_acttorw = picos_to_mclk(common_dimm->trcd_ps) >> 4; |
|
|
|
|
ext_pretoact = picos_to_mclk(ctrl_num, common_dimm->trp_ps) >> 4; |
|
|
|
|
ext_acttopre = picos_to_mclk(ctrl_num, common_dimm->tras_ps) >> 4; |
|
|
|
|
ext_acttorw = picos_to_mclk(ctrl_num, common_dimm->trcd_ps) >> 4; |
|
|
|
|
ext_caslat = (2 * cas_latency - 1) >> 4; |
|
|
|
|
ext_add_lat = additive_latency >> 4; |
|
|
|
|
#ifdef CONFIG_SYS_FSL_DDR4 |
|
|
|
|
ext_refrec = (picos_to_mclk(common_dimm->trfc1_ps) - 8) >> 4; |
|
|
|
|
ext_refrec = (picos_to_mclk(ctrl_num, common_dimm->trfc1_ps) - 8) >> 4; |
|
|
|
|
#else |
|
|
|
|
ext_refrec = (picos_to_mclk(common_dimm->trfc_ps) - 8) >> 4; |
|
|
|
|
ext_refrec = (picos_to_mclk(ctrl_num, common_dimm->trfc_ps) - 8) >> 4; |
|
|
|
|
/* ext_wrrec only deals with 16 clock and above, or 14 with OTF */ |
|
|
|
|
#endif |
|
|
|
|
ext_wrrec = (picos_to_mclk(common_dimm->twr_ps) + |
|
|
|
|
ext_wrrec = (picos_to_mclk(ctrl_num, common_dimm->twr_ps) + |
|
|
|
|
(popts->otf_burst_chop_en ? 2 : 0)) >> 4; |
|
|
|
|
|
|
|
|
|
ddr->timing_cfg_3 = (0 |
|
|
|
@ -475,10 +478,11 @@ static void set_timing_cfg_3(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* DDR SDRAM Timing Configuration 1 (TIMING_CFG_1) */ |
|
|
|
|
static void set_timing_cfg_1(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const memctl_options_t *popts, |
|
|
|
|
const common_timing_params_t *common_dimm, |
|
|
|
|
unsigned int cas_latency) |
|
|
|
|
static void set_timing_cfg_1(const unsigned int ctrl_num, |
|
|
|
|
fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const memctl_options_t *popts, |
|
|
|
|
const common_timing_params_t *common_dimm, |
|
|
|
|
unsigned int cas_latency) |
|
|
|
|
{ |
|
|
|
|
/* Precharge-to-activate interval (tRP) */ |
|
|
|
|
unsigned char pretoact_mclk; |
|
|
|
@ -510,9 +514,9 @@ static void set_timing_cfg_1(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
1, 2, 3, 4, 5, 6, 7, 8, 10, 10, 12, 12, 14, 14, 0, 0}; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
pretoact_mclk = picos_to_mclk(common_dimm->trp_ps); |
|
|
|
|
acttopre_mclk = picos_to_mclk(common_dimm->tras_ps); |
|
|
|
|
acttorw_mclk = picos_to_mclk(common_dimm->trcd_ps); |
|
|
|
|
pretoact_mclk = picos_to_mclk(ctrl_num, common_dimm->trp_ps); |
|
|
|
|
acttopre_mclk = picos_to_mclk(ctrl_num, common_dimm->tras_ps); |
|
|
|
|
acttorw_mclk = picos_to_mclk(ctrl_num, common_dimm->trcd_ps); |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Translate CAS Latency to a DDR controller field value: |
|
|
|
@ -547,19 +551,19 @@ static void set_timing_cfg_1(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_SYS_FSL_DDR4 |
|
|
|
|
refrec_ctrl = picos_to_mclk(common_dimm->trfc1_ps) - 8; |
|
|
|
|
wrrec_mclk = picos_to_mclk(common_dimm->twr_ps); |
|
|
|
|
acttoact_mclk = max(picos_to_mclk(common_dimm->trrds_ps), 4U); |
|
|
|
|
wrtord_mclk = max(2U, picos_to_mclk(2500)); |
|
|
|
|
refrec_ctrl = picos_to_mclk(ctrl_num, common_dimm->trfc1_ps) - 8; |
|
|
|
|
wrrec_mclk = picos_to_mclk(ctrl_num, common_dimm->twr_ps); |
|
|
|
|
acttoact_mclk = max(picos_to_mclk(ctrl_num, common_dimm->trrds_ps), 4U); |
|
|
|
|
wrtord_mclk = max(2U, picos_to_mclk(ctrl_num, 2500)); |
|
|
|
|
if ((wrrec_mclk < 1) || (wrrec_mclk > 24)) |
|
|
|
|
printf("Error: WRREC doesn't support %d clocks\n", wrrec_mclk); |
|
|
|
|
else |
|
|
|
|
wrrec_mclk = wrrec_table[wrrec_mclk - 1]; |
|
|
|
|
#else |
|
|
|
|
refrec_ctrl = picos_to_mclk(common_dimm->trfc_ps) - 8; |
|
|
|
|
wrrec_mclk = picos_to_mclk(common_dimm->twr_ps); |
|
|
|
|
acttoact_mclk = picos_to_mclk(common_dimm->trrd_ps); |
|
|
|
|
wrtord_mclk = picos_to_mclk(common_dimm->twtr_ps); |
|
|
|
|
refrec_ctrl = picos_to_mclk(ctrl_num, common_dimm->trfc_ps) - 8; |
|
|
|
|
wrrec_mclk = picos_to_mclk(ctrl_num, common_dimm->twr_ps); |
|
|
|
|
acttoact_mclk = picos_to_mclk(ctrl_num, common_dimm->trrd_ps); |
|
|
|
|
wrtord_mclk = picos_to_mclk(ctrl_num, common_dimm->twtr_ps); |
|
|
|
|
if ((wrrec_mclk < 1) || (wrrec_mclk > 16)) |
|
|
|
|
printf("Error: WRREC doesn't support %d clocks\n", wrrec_mclk); |
|
|
|
|
else |
|
|
|
@ -602,11 +606,12 @@ static void set_timing_cfg_1(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* DDR SDRAM Timing Configuration 2 (TIMING_CFG_2) */ |
|
|
|
|
static void set_timing_cfg_2(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const memctl_options_t *popts, |
|
|
|
|
const common_timing_params_t *common_dimm, |
|
|
|
|
unsigned int cas_latency, |
|
|
|
|
unsigned int additive_latency) |
|
|
|
|
static void set_timing_cfg_2(const unsigned int ctrl_num, |
|
|
|
|
fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const memctl_options_t *popts, |
|
|
|
|
const common_timing_params_t *common_dimm, |
|
|
|
|
unsigned int cas_latency, |
|
|
|
|
unsigned int additive_latency) |
|
|
|
|
{ |
|
|
|
|
/* Additive latency */ |
|
|
|
|
unsigned char add_lat_mclk; |
|
|
|
@ -623,7 +628,7 @@ static void set_timing_cfg_2(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
/* Window for four activates (tFAW) */ |
|
|
|
|
unsigned short four_act; |
|
|
|
|
#ifdef CONFIG_SYS_FSL_DDR3 |
|
|
|
|
const unsigned int mclk_ps = get_memory_clk_period_ps(); |
|
|
|
|
const unsigned int mclk_ps = get_memory_clk_period_ps(ctrl_num); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/* FIXME add check that this must be less than acttorw_mclk */ |
|
|
|
@ -641,13 +646,13 @@ static void set_timing_cfg_2(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
#elif defined(CONFIG_SYS_FSL_DDR2) |
|
|
|
|
wr_lat = cas_latency - 1; |
|
|
|
|
#else |
|
|
|
|
wr_lat = compute_cas_write_latency(); |
|
|
|
|
wr_lat = compute_cas_write_latency(ctrl_num); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_SYS_FSL_DDR4 |
|
|
|
|
rd_to_pre = picos_to_mclk(7500); |
|
|
|
|
rd_to_pre = picos_to_mclk(ctrl_num, 7500); |
|
|
|
|
#else |
|
|
|
|
rd_to_pre = picos_to_mclk(common_dimm->trtp_ps); |
|
|
|
|
rd_to_pre = picos_to_mclk(ctrl_num, common_dimm->trtp_ps); |
|
|
|
|
#endif |
|
|
|
|
/*
|
|
|
|
|
* JEDEC has some min requirements for tRTP |
|
|
|
@ -665,19 +670,20 @@ static void set_timing_cfg_2(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
wr_data_delay = popts->write_data_delay; |
|
|
|
|
#ifdef CONFIG_SYS_FSL_DDR4 |
|
|
|
|
cpo = 0; |
|
|
|
|
cke_pls = max(3U, picos_to_mclk(5000)); |
|
|
|
|
cke_pls = max(3U, picos_to_mclk(ctrl_num, 5000)); |
|
|
|
|
#elif defined(CONFIG_SYS_FSL_DDR3) |
|
|
|
|
/*
|
|
|
|
|
* cke pulse = max(3nCK, 7.5ns) for DDR3-800 |
|
|
|
|
* max(3nCK, 5.625ns) for DDR3-1066, 1333 |
|
|
|
|
* max(3nCK, 5ns) for DDR3-1600, 1866, 2133 |
|
|
|
|
*/ |
|
|
|
|
cke_pls = max(3U, picos_to_mclk(mclk_ps > 1870 ? 7500 : |
|
|
|
|
(mclk_ps > 1245 ? 5625 : 5000))); |
|
|
|
|
cke_pls = max(3U, picos_to_mclk(ctrl_num, mclk_ps > 1870 ? 7500 : |
|
|
|
|
(mclk_ps > 1245 ? 5625 : 5000))); |
|
|
|
|
#else |
|
|
|
|
cke_pls = FSL_DDR_MIN_TCKE_PULSE_WIDTH_DDR; |
|
|
|
|
#endif |
|
|
|
|
four_act = picos_to_mclk(popts->tfaw_window_four_activates_ps); |
|
|
|
|
four_act = picos_to_mclk(ctrl_num, |
|
|
|
|
popts->tfaw_window_four_activates_ps); |
|
|
|
|
|
|
|
|
|
ddr->timing_cfg_2 = (0 |
|
|
|
|
| ((add_lat_mclk & 0xf) << 28) |
|
|
|
@ -818,7 +824,8 @@ static void set_ddr_sdram_cfg(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* DDR SDRAM control configuration 2 (DDR_SDRAM_CFG_2) */ |
|
|
|
|
static void set_ddr_sdram_cfg_2(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
static void set_ddr_sdram_cfg_2(const unsigned int ctrl_num, |
|
|
|
|
fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const memctl_options_t *popts, |
|
|
|
|
const unsigned int unq_mrs_en) |
|
|
|
|
{ |
|
|
|
@ -865,7 +872,7 @@ static void set_ddr_sdram_cfg_2(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#if (CONFIG_SYS_FSL_DDR_VER >= FSL_DDR_VER_4_7) |
|
|
|
|
slow = get_ddr_freq(0) < 1249000000; |
|
|
|
|
slow = get_ddr_freq(ctrl_num) < 1249000000; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
if (popts->registered_dimm_en) { |
|
|
|
@ -915,7 +922,8 @@ static void set_ddr_sdram_cfg_2(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_SYS_FSL_DDR4 |
|
|
|
|
/* DDR SDRAM Mode configuration 2 (DDR_SDRAM_MODE_2) */ |
|
|
|
|
static void set_ddr_sdram_mode_2(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
static void set_ddr_sdram_mode_2(const unsigned int ctrl_num, |
|
|
|
|
fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const memctl_options_t *popts, |
|
|
|
|
const common_timing_params_t *common_dimm, |
|
|
|
|
const unsigned int unq_mrs_en) |
|
|
|
@ -926,10 +934,10 @@ static void set_ddr_sdram_mode_2(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
unsigned int wr_crc = 0; /* Disable */ |
|
|
|
|
unsigned int rtt_wr = 0; /* Rtt_WR - dynamic ODT off */ |
|
|
|
|
unsigned int srt = 0; /* self-refresh temerature, normal range */ |
|
|
|
|
unsigned int cwl = compute_cas_write_latency() - 9; |
|
|
|
|
unsigned int cwl = compute_cas_write_latency(ctrl_num) - 9; |
|
|
|
|
unsigned int mpr = 0; /* serial */ |
|
|
|
|
unsigned int wc_lat; |
|
|
|
|
const unsigned int mclk_ps = get_memory_clk_period_ps(); |
|
|
|
|
const unsigned int mclk_ps = get_memory_clk_period_ps(ctrl_num); |
|
|
|
|
|
|
|
|
|
if (popts->rtt_override) |
|
|
|
|
rtt_wr = popts->rtt_wr_override_value; |
|
|
|
@ -1002,7 +1010,8 @@ static void set_ddr_sdram_mode_2(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
} |
|
|
|
|
#elif defined(CONFIG_SYS_FSL_DDR3) |
|
|
|
|
/* DDR SDRAM Mode configuration 2 (DDR_SDRAM_MODE_2) */ |
|
|
|
|
static void set_ddr_sdram_mode_2(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
static void set_ddr_sdram_mode_2(const unsigned int ctrl_num, |
|
|
|
|
fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const memctl_options_t *popts, |
|
|
|
|
const common_timing_params_t *common_dimm, |
|
|
|
|
const unsigned int unq_mrs_en) |
|
|
|
@ -1013,7 +1022,7 @@ static void set_ddr_sdram_mode_2(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
unsigned int rtt_wr = 0; /* Rtt_WR - dynamic ODT off */ |
|
|
|
|
unsigned int srt = 0; /* self-refresh temerature, normal range */ |
|
|
|
|
unsigned int asr = 0; /* auto self-refresh disable */ |
|
|
|
|
unsigned int cwl = compute_cas_write_latency() - 5; |
|
|
|
|
unsigned int cwl = compute_cas_write_latency(ctrl_num) - 5; |
|
|
|
|
unsigned int pasr = 0; /* partial array self refresh disable */ |
|
|
|
|
|
|
|
|
|
if (popts->rtt_override) |
|
|
|
@ -1077,7 +1086,8 @@ static void set_ddr_sdram_mode_2(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
|
|
|
|
|
#else /* for DDR2 and DDR1 */ |
|
|
|
|
/* DDR SDRAM Mode configuration 2 (DDR_SDRAM_MODE_2) */ |
|
|
|
|
static void set_ddr_sdram_mode_2(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
static void set_ddr_sdram_mode_2(const unsigned int ctrl_num, |
|
|
|
|
fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const memctl_options_t *popts, |
|
|
|
|
const common_timing_params_t *common_dimm, |
|
|
|
|
const unsigned int unq_mrs_en) |
|
|
|
@ -1144,7 +1154,8 @@ static void set_ddr_sdram_mode_9(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* DDR SDRAM Mode configuration 10 (DDR_SDRAM_MODE_10) */ |
|
|
|
|
static void set_ddr_sdram_mode_10(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
static void set_ddr_sdram_mode_10(const unsigned int ctrl_num, |
|
|
|
|
fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const memctl_options_t *popts, |
|
|
|
|
const common_timing_params_t *common_dimm, |
|
|
|
|
const unsigned int unq_mrs_en) |
|
|
|
@ -1152,7 +1163,7 @@ static void set_ddr_sdram_mode_10(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
int i; |
|
|
|
|
unsigned short esdmode6 = 0; /* Extended SDRAM mode 6 */ |
|
|
|
|
unsigned short esdmode7 = 0; /* Extended SDRAM mode 7 */ |
|
|
|
|
unsigned int tccdl_min = picos_to_mclk(common_dimm->tccdl_ps); |
|
|
|
|
unsigned int tccdl_min = picos_to_mclk(ctrl_num, common_dimm->tccdl_ps); |
|
|
|
|
|
|
|
|
|
esdmode6 = ((tccdl_min - 4) & 0x7) << 10; |
|
|
|
|
|
|
|
|
@ -1196,14 +1207,15 @@ static void set_ddr_sdram_mode_10(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/* DDR SDRAM Interval Configuration (DDR_SDRAM_INTERVAL) */ |
|
|
|
|
static void set_ddr_sdram_interval(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const memctl_options_t *popts, |
|
|
|
|
const common_timing_params_t *common_dimm) |
|
|
|
|
static void set_ddr_sdram_interval(const unsigned int ctrl_num, |
|
|
|
|
fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const memctl_options_t *popts, |
|
|
|
|
const common_timing_params_t *common_dimm) |
|
|
|
|
{ |
|
|
|
|
unsigned int refint; /* Refresh interval */ |
|
|
|
|
unsigned int bstopre; /* Precharge interval */ |
|
|
|
|
|
|
|
|
|
refint = picos_to_mclk(common_dimm->refresh_rate_ps); |
|
|
|
|
refint = picos_to_mclk(ctrl_num, common_dimm->refresh_rate_ps); |
|
|
|
|
|
|
|
|
|
bstopre = popts->bstopre; |
|
|
|
|
|
|
|
|
@ -1217,7 +1229,8 @@ static void set_ddr_sdram_interval(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_SYS_FSL_DDR4 |
|
|
|
|
/* DDR SDRAM Mode configuration set (DDR_SDRAM_MODE) */ |
|
|
|
|
static void set_ddr_sdram_mode(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
static void set_ddr_sdram_mode(const unsigned int ctrl_num, |
|
|
|
|
fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const memctl_options_t *popts, |
|
|
|
|
const common_timing_params_t *common_dimm, |
|
|
|
|
unsigned int cas_latency, |
|
|
|
@ -1292,7 +1305,7 @@ static void set_ddr_sdram_mode(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
* 1=fast exit DLL on (tXP) |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
wr_mclk = picos_to_mclk(common_dimm->twr_ps); |
|
|
|
|
wr_mclk = picos_to_mclk(ctrl_num, common_dimm->twr_ps); |
|
|
|
|
if (wr_mclk <= 24) { |
|
|
|
|
wr = wr_table[wr_mclk - 10]; |
|
|
|
|
} else { |
|
|
|
@ -1387,7 +1400,8 @@ static void set_ddr_sdram_mode(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
|
|
|
|
|
#elif defined(CONFIG_SYS_FSL_DDR3) |
|
|
|
|
/* DDR SDRAM Mode configuration set (DDR_SDRAM_MODE) */ |
|
|
|
|
static void set_ddr_sdram_mode(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
static void set_ddr_sdram_mode(const unsigned int ctrl_num, |
|
|
|
|
fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const memctl_options_t *popts, |
|
|
|
|
const common_timing_params_t *common_dimm, |
|
|
|
|
unsigned int cas_latency, |
|
|
|
@ -1466,7 +1480,7 @@ static void set_ddr_sdram_mode(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
*/ |
|
|
|
|
dll_on = 1; |
|
|
|
|
|
|
|
|
|
wr_mclk = picos_to_mclk(common_dimm->twr_ps); |
|
|
|
|
wr_mclk = picos_to_mclk(ctrl_num, common_dimm->twr_ps); |
|
|
|
|
if (wr_mclk <= 16) { |
|
|
|
|
wr = wr_table[wr_mclk - 5]; |
|
|
|
|
} else { |
|
|
|
@ -1582,7 +1596,8 @@ static void set_ddr_sdram_mode(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
#else /* !CONFIG_SYS_FSL_DDR3 */ |
|
|
|
|
|
|
|
|
|
/* DDR SDRAM Mode configuration set (DDR_SDRAM_MODE) */ |
|
|
|
|
static void set_ddr_sdram_mode(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
static void set_ddr_sdram_mode(const unsigned int ctrl_num, |
|
|
|
|
fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const memctl_options_t *popts, |
|
|
|
|
const common_timing_params_t *common_dimm, |
|
|
|
|
unsigned int cas_latency, |
|
|
|
@ -1654,7 +1669,7 @@ static void set_ddr_sdram_mode(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
#if defined(CONFIG_SYS_FSL_DDR1) |
|
|
|
|
wr = 0; /* Historical */ |
|
|
|
|
#elif defined(CONFIG_SYS_FSL_DDR2) |
|
|
|
|
wr = picos_to_mclk(common_dimm->twr_ps); |
|
|
|
|
wr = picos_to_mclk(ctrl_num, common_dimm->twr_ps); |
|
|
|
|
#endif |
|
|
|
|
dll_res = 0; |
|
|
|
|
mode = 0; |
|
|
|
@ -1842,15 +1857,16 @@ static void set_timing_cfg_6(fsl_ddr_cfg_regs_t *ddr) |
|
|
|
|
debug("FSLDDR: timing_cfg_6 = 0x%08x\n", ddr->timing_cfg_6); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void set_timing_cfg_7(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const common_timing_params_t *common_dimm) |
|
|
|
|
static void set_timing_cfg_7(const unsigned int ctrl_num, |
|
|
|
|
fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const common_timing_params_t *common_dimm) |
|
|
|
|
{ |
|
|
|
|
unsigned int txpr, tcksre, tcksrx; |
|
|
|
|
unsigned int cke_rst, cksre, cksrx, par_lat, cs_to_cmd; |
|
|
|
|
|
|
|
|
|
txpr = max(5U, picos_to_mclk(common_dimm->trfc1_ps + 10000)); |
|
|
|
|
tcksre = max(5U, picos_to_mclk(10000)); |
|
|
|
|
tcksrx = max(5U, picos_to_mclk(10000)); |
|
|
|
|
txpr = max(5U, picos_to_mclk(ctrl_num, common_dimm->trfc1_ps + 10000)); |
|
|
|
|
tcksre = max(5U, picos_to_mclk(ctrl_num, 10000)); |
|
|
|
|
tcksrx = max(5U, picos_to_mclk(ctrl_num, 10000)); |
|
|
|
|
par_lat = 0; |
|
|
|
|
cs_to_cmd = 0; |
|
|
|
|
|
|
|
|
@ -1883,14 +1899,15 @@ static void set_timing_cfg_7(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
debug("FSLDDR: timing_cfg_7 = 0x%08x\n", ddr->timing_cfg_7); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void set_timing_cfg_8(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
static void set_timing_cfg_8(const unsigned int ctrl_num, |
|
|
|
|
fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const memctl_options_t *popts, |
|
|
|
|
const common_timing_params_t *common_dimm, |
|
|
|
|
unsigned int cas_latency) |
|
|
|
|
{ |
|
|
|
|
unsigned int rwt_bg, wrt_bg, rrt_bg, wwt_bg; |
|
|
|
|
unsigned int acttoact_bg, wrtord_bg, pre_all_rec; |
|
|
|
|
unsigned int tccdl = picos_to_mclk(common_dimm->tccdl_ps); |
|
|
|
|
unsigned int tccdl = picos_to_mclk(ctrl_num, common_dimm->tccdl_ps); |
|
|
|
|
unsigned int wr_lat = ((ddr->timing_cfg_2 & 0x00780000) >> 19) + |
|
|
|
|
((ddr->timing_cfg_2 & 0x00040000) >> 14); |
|
|
|
|
|
|
|
|
@ -1911,11 +1928,11 @@ static void set_timing_cfg_8(fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
wwt_bg = tccdl - 4; |
|
|
|
|
} else { |
|
|
|
|
rrt_bg = tccdl - 2; |
|
|
|
|
wwt_bg = tccdl - 4; |
|
|
|
|
wwt_bg = tccdl - 2; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
acttoact_bg = picos_to_mclk(common_dimm->trrdl_ps); |
|
|
|
|
wrtord_bg = max(4U, picos_to_mclk(7500)); |
|
|
|
|
acttoact_bg = picos_to_mclk(ctrl_num, common_dimm->trrdl_ps); |
|
|
|
|
wrtord_bg = max(4U, picos_to_mclk(ctrl_num, 7500)); |
|
|
|
|
if (popts->otf_burst_chop_en) |
|
|
|
|
wrtord_bg += 2; |
|
|
|
|
|
|
|
|
@ -2147,7 +2164,8 @@ check_fsl_memctl_config_regs(const fsl_ddr_cfg_regs_t *ddr) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
unsigned int |
|
|
|
|
compute_fsl_memctl_config_regs(const memctl_options_t *popts, |
|
|
|
|
compute_fsl_memctl_config_regs(const unsigned int ctrl_num, |
|
|
|
|
const memctl_options_t *popts, |
|
|
|
|
fsl_ddr_cfg_regs_t *ddr, |
|
|
|
|
const common_timing_params_t *common_dimm, |
|
|
|
|
const dimm_params_t *dimm_params, |
|
|
|
@ -2319,14 +2337,14 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts, |
|
|
|
|
set_ddr_eor(ddr, popts); |
|
|
|
|
|
|
|
|
|
#if !defined(CONFIG_SYS_FSL_DDR1) |
|
|
|
|
set_timing_cfg_0(ddr, popts, dimm_params); |
|
|
|
|
set_timing_cfg_0(ctrl_num, ddr, popts, dimm_params); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
set_timing_cfg_3(ddr, popts, common_dimm, cas_latency, |
|
|
|
|
set_timing_cfg_3(ctrl_num, ddr, popts, common_dimm, cas_latency, |
|
|
|
|
additive_latency); |
|
|
|
|
set_timing_cfg_1(ddr, popts, common_dimm, cas_latency); |
|
|
|
|
set_timing_cfg_2(ddr, popts, common_dimm, |
|
|
|
|
cas_latency, additive_latency); |
|
|
|
|
set_timing_cfg_1(ctrl_num, ddr, popts, common_dimm, cas_latency); |
|
|
|
|
set_timing_cfg_2(ctrl_num, ddr, popts, common_dimm, |
|
|
|
|
cas_latency, additive_latency); |
|
|
|
|
|
|
|
|
|
set_ddr_cdr1(ddr, popts); |
|
|
|
|
set_ddr_cdr2(ddr, popts); |
|
|
|
@ -2338,15 +2356,15 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts, |
|
|
|
|
if ((ip_rev > 0x40700) && (popts->cswl_override != 0)) |
|
|
|
|
ddr->debug[18] = popts->cswl_override; |
|
|
|
|
|
|
|
|
|
set_ddr_sdram_cfg_2(ddr, popts, unq_mrs_en); |
|
|
|
|
set_ddr_sdram_mode(ddr, popts, common_dimm, |
|
|
|
|
cas_latency, additive_latency, unq_mrs_en); |
|
|
|
|
set_ddr_sdram_mode_2(ddr, popts, common_dimm, unq_mrs_en); |
|
|
|
|
set_ddr_sdram_cfg_2(ctrl_num, ddr, popts, unq_mrs_en); |
|
|
|
|
set_ddr_sdram_mode(ctrl_num, ddr, popts, common_dimm, |
|
|
|
|
cas_latency, additive_latency, unq_mrs_en); |
|
|
|
|
set_ddr_sdram_mode_2(ctrl_num, ddr, popts, common_dimm, unq_mrs_en); |
|
|
|
|
#ifdef CONFIG_SYS_FSL_DDR4 |
|
|
|
|
set_ddr_sdram_mode_9(ddr, popts, common_dimm, unq_mrs_en); |
|
|
|
|
set_ddr_sdram_mode_10(ddr, popts, common_dimm, unq_mrs_en); |
|
|
|
|
set_ddr_sdram_mode_10(ctrl_num, ddr, popts, common_dimm, unq_mrs_en); |
|
|
|
|
#endif |
|
|
|
|
set_ddr_sdram_interval(ddr, popts, common_dimm); |
|
|
|
|
set_ddr_sdram_interval(ctrl_num, ddr, popts, common_dimm); |
|
|
|
|
set_ddr_data_init(ddr); |
|
|
|
|
set_ddr_sdram_clk_cntl(ddr, popts); |
|
|
|
|
set_ddr_init_addr(ddr); |
|
|
|
@ -2356,8 +2374,8 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts, |
|
|
|
|
#ifdef CONFIG_SYS_FSL_DDR4 |
|
|
|
|
set_ddr_sdram_cfg_3(ddr, popts); |
|
|
|
|
set_timing_cfg_6(ddr); |
|
|
|
|
set_timing_cfg_7(ddr, common_dimm); |
|
|
|
|
set_timing_cfg_8(ddr, popts, common_dimm, cas_latency); |
|
|
|
|
set_timing_cfg_7(ctrl_num, ddr, common_dimm); |
|
|
|
|
set_timing_cfg_8(ctrl_num, ddr, popts, common_dimm, cas_latency); |
|
|
|
|
set_timing_cfg_9(ddr); |
|
|
|
|
set_ddr_dq_mapping(ddr, dimm_params); |
|
|
|
|
#endif |
|
|
|
@ -2372,7 +2390,11 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts, |
|
|
|
|
#ifdef CONFIG_SYS_FSL_DDR_EMU |
|
|
|
|
/* disble DDR training for emulator */ |
|
|
|
|
ddr->debug[2] = 0x00000400; |
|
|
|
|
ddr->debug[4] = 0xff800000; |
|
|
|
|
ddr->debug[4] = 0xff800800; |
|
|
|
|
ddr->debug[5] = 0x08000800; |
|
|
|
|
ddr->debug[6] = 0x08000800; |
|
|
|
|
ddr->debug[7] = 0x08000800; |
|
|
|
|
ddr->debug[8] = 0x08000800; |
|
|
|
|
#endif |
|
|
|
|
#ifdef CONFIG_SYS_FSL_ERRATUM_A004508 |
|
|
|
|
if ((ip_rev >= 0x40000) && (ip_rev < 0x40400)) |
|
|
|
|