|
@@ -61,6 +61,8 @@
|
|
|
#define NUMLOOPS 1 /* configure as you deem approporiate */
|
|
|
#define NUMMEMWORDS 16
|
|
|
|
|
|
+#define SDRAM_RDCC_RDSS_VAL(n) SDRAM_RDCC_RDSS_DECODE(ddr_rdss_opt(n))
|
|
|
+
|
|
|
/* Private Structure Definitions */
|
|
|
|
|
|
struct autocal_regs {
|
|
@@ -147,6 +149,13 @@ ulong __ddr_scan_option(ulong default_val)
|
|
|
}
|
|
|
ulong ddr_scan_option(ulong) __attribute__((weak, alias("__ddr_scan_option")));
|
|
|
|
|
|
+u32 __ddr_rdss_opt(u32 default_val)
|
|
|
+{
|
|
|
+ return default_val;
|
|
|
+}
|
|
|
+u32 ddr_rdss_opt(ulong) __attribute__((weak, alias("__ddr_rdss_opt")));
|
|
|
+
|
|
|
+
|
|
|
static u32 *get_membase(int bxcr_num)
|
|
|
{
|
|
|
ulong bxcf;
|
|
@@ -341,6 +350,7 @@ static int short_mem_test(u32 *base_address)
|
|
|
ppcDcbf((ulong)&(base_address[j]));
|
|
|
}
|
|
|
sync();
|
|
|
+ iobarrier_rw();
|
|
|
for (l = 0; l < NUMLOOPS; l++) {
|
|
|
for (j = 0; j < NUMMEMWORDS; j++) {
|
|
|
if (base_address[j] != test[i][j]) {
|
|
@@ -355,6 +365,7 @@ static int short_mem_test(u32 *base_address)
|
|
|
ppcDcbf((u32)&(base_address[j]));
|
|
|
} /* for (j = 0; j < NUMMEMWORDS; j++) */
|
|
|
sync();
|
|
|
+ iobarrier_rw();
|
|
|
} /* for (l=0; l<NUMLOOPS; l++) */
|
|
|
}
|
|
|
|
|
@@ -447,7 +458,8 @@ static u32 DQS_calibration_methodA(struct ddrautocal *cal)
|
|
|
* Program RDCC register
|
|
|
* Read sample cycle auto-update enable
|
|
|
*/
|
|
|
- mtsdram(SDRAM_RDCC, SDRAM_RDCC_RDSS_T1 | SDRAM_RDCC_RSAE_ENABLE);
|
|
|
+ mtsdram(SDRAM_RDCC,
|
|
|
+ ddr_rdss_opt(SDRAM_RDCC_RDSS_T2) | SDRAM_RDCC_RSAE_ENABLE);
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
mfsdram(SDRAM_RDCC, temp);
|
|
@@ -633,7 +645,8 @@ static u32 program_DQS_calibration_methodB(struct ddrautocal *ddrcal)
|
|
|
* Program RDCC register
|
|
|
* Read sample cycle auto-update enable
|
|
|
*/
|
|
|
- mtsdram(SDRAM_RDCC, SDRAM_RDCC_RDSS_T2 | SDRAM_RDCC_RSAE_ENABLE);
|
|
|
+ mtsdram(SDRAM_RDCC,
|
|
|
+ ddr_rdss_opt(SDRAM_RDCC_RDSS_T2) | SDRAM_RDCC_RSAE_ENABLE);
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
mfsdram(SDRAM_RDCC, temp);
|
|
@@ -1091,32 +1104,36 @@ u32 DQS_autocalibration(void)
|
|
|
* if no passing window was found, or is the
|
|
|
* size of the RFFD passing window.
|
|
|
*/
|
|
|
- if (result != 0) {
|
|
|
- tcal.autocal.flags = 1;
|
|
|
- debug("*** (%d)(%d) result passed window size: 0x%08x, "
|
|
|
- "rqfd = 0x%08x, rffd = 0x%08x, rdcc = 0x%08x\n",
|
|
|
- wdtr, clkp, result, ddrcal.rqfd,
|
|
|
- ddrcal.rffd, ddrcal.rdcc);
|
|
|
- /*
|
|
|
- * Save the SDRAM_WRDTR and SDRAM_CLKTR
|
|
|
- * settings for the largest returned
|
|
|
- * RFFD passing window size.
|
|
|
- */
|
|
|
- if (result > best_result) {
|
|
|
+ /*
|
|
|
+ * want the lowest Read Sample Cycle Select
|
|
|
+ */
|
|
|
+ val = SDRAM_RDCC_RDSS_DECODE(val);
|
|
|
+ debug("*** (%d) (%d) current_rdcc, best_rdcc\n",
|
|
|
+ val, best_rdcc);
|
|
|
+
|
|
|
+ if ((result != 0) &&
|
|
|
+ (val >= SDRAM_RDCC_RDSS_VAL(SDRAM_RDCC_RDSS_T2))) {
|
|
|
+ if (((result == best_result) && (val < best_rdcc)) ||
|
|
|
+ ((result > best_result) && (val <= best_rdcc))) {
|
|
|
+ tcal.autocal.flags = 1;
|
|
|
+ debug("*** (%d)(%d) result passed window "
|
|
|
+ "size: 0x%08x, rqfd = 0x%08x, "
|
|
|
+ "rffd = 0x%08x, rdcc = 0x%08x\n",
|
|
|
+ wdtr, clkp, result, ddrcal.rqfd,
|
|
|
+ ddrcal.rffd, ddrcal.rdcc);
|
|
|
+
|
|
|
/*
|
|
|
- * want the lowest Read Sample Cycle Select
|
|
|
+ * Save the SDRAM_WRDTR and SDRAM_CLKTR
|
|
|
+ * settings for the largest returned
|
|
|
+ * RFFD passing window size.
|
|
|
*/
|
|
|
- val = (val & SDRAM_RDCC_RDSS_MASK) >> 30;
|
|
|
- debug("*** (%d) (%d) current_rdcc, best_rdcc\n",
|
|
|
- val, best_rdcc);
|
|
|
- if (val <= best_rdcc) {
|
|
|
- best_rdcc = val;
|
|
|
- tcal.clocks.wrdtr = wdtr;
|
|
|
- tcal.clocks.clktr = clkp;
|
|
|
- tcal.clocks.rdcc = (val << 30);
|
|
|
- tcal.autocal.rqfd = ddrcal.rqfd;
|
|
|
- tcal.autocal.rffd = ddrcal.rffd;
|
|
|
- best_result = result;
|
|
|
+ best_rdcc = val;
|
|
|
+ tcal.clocks.wrdtr = wdtr;
|
|
|
+ tcal.clocks.clktr = clkp;
|
|
|
+ tcal.clocks.rdcc = SDRAM_RDCC_RDSS_ENCODE(val);
|
|
|
+ tcal.autocal.rqfd = ddrcal.rqfd;
|
|
|
+ tcal.autocal.rffd = ddrcal.rffd;
|
|
|
+ best_result = result;
|
|
|
|
|
|
if (verbose_lvl > 2) {
|
|
|
printf("** (%d)(%d) "
|
|
@@ -1152,9 +1169,8 @@ u32 DQS_autocalibration(void)
|
|
|
"loop FCSR: 0x%08x\n",
|
|
|
wdtr, clkp, val);
|
|
|
}
|
|
|
- } /* if (val <= best_rdcc) */
|
|
|
- } /* if (result >= best_result) */
|
|
|
- } /* if (result != 0) */
|
|
|
+ }
|
|
|
+ } /* if ((result != 0) && (val >= (ddr_rdss_opt()))) */
|
|
|
scan_list++;
|
|
|
} /* while ((scan_list->wrdtr != -1) && (scan_list->clktr != -1)) */
|
|
|
|