|
@@ -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);
|
|
|
|
|
@@ -1914,8 +1931,8 @@ static void set_timing_cfg_8(fsl_ddr_cfg_regs_t *ddr,
|
|
|
wwt_bg = tccdl - 4;
|
|
|
}
|
|
|
|
|
|
- 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
|