return 0;
}
+/**
+ * rw_mgr_mem_calibrate_dq_dqs_centering() - Centering DQ/DQS
+ * @rw_group: Read/Write Group
+ * @test_bgn: Rank at which the test begins
+ * @use_read_test: Perform a read test
+ * @update_fom: Update FOM
+ *
+ * The centerin DQ/DQS stage attempts to align DQ and DQS signals on reads
+ * within a group.
+ */
+static int
+rw_mgr_mem_calibrate_dq_dqs_centering(const u32 rw_group, const u32 test_bgn,
+ const int use_read_test,
+ const int update_fom)
+
+{
+ int ret, grp_calibrated;
+ u32 rank_bgn, sr;
+
+ /*
+ * Altera EMI_RM 2015.05.04 :: Figure 1-28
+ * Read per-bit deskew can be done on a per shadow register basis.
+ */
+ grp_calibrated = 1;
+ for (rank_bgn = 0, sr = 0;
+ rank_bgn < RW_MGR_MEM_NUMBER_OF_RANKS;
+ rank_bgn += NUM_RANKS_PER_SHADOW_REG, sr++) {
+ /* Check if this set of ranks should be skipped entirely. */
+ if (param->skip_shadow_regs[sr])
+ continue;
+
+ ret = rw_mgr_mem_calibrate_vfifo_center(rank_bgn, rw_group,
+ rw_group, test_bgn,
+ use_read_test,
+ update_fom);
+ if (ret)
+ continue;
+
+ grp_calibrated = 0;
+ }
+
+ if (!grp_calibrated)
+ return -EIO;
+
+ return 0;
+}
+
/**
* rw_mgr_mem_calibrate_vfifo() - Calibrate the read valid prediction FIFO
* @rw_group: Read/Write Group
*/
static int rw_mgr_mem_calibrate_vfifo(const u32 rw_group, const u32 test_bgn)
{
- uint32_t p, d, rank_bgn, sr;
+ uint32_t p, d;
uint32_t dtaps_per_ptap;
- uint32_t grp_calibrated;
uint32_t failed_substage;
int ret;
continue;
}
+ /* 3) Centering DQ/DQS */
/*
- * USER Read per-bit deskew can be done on a
- * per shadow register basis.
+ * If doing read after write calibration, do not update
+ * FOM now. Do it then.
*/
- grp_calibrated = 1;
- for (rank_bgn = 0, sr = 0;
- rank_bgn < RW_MGR_MEM_NUMBER_OF_RANKS;
- rank_bgn += NUM_RANKS_PER_SHADOW_REG, sr++) {
- /*
- * Determine if this set of ranks
- * should be skipped entirely.
- */
- if (param->skip_shadow_regs[sr])
- continue;
- /*
- * If doing read after write
- * calibration, do not update
- * FOM, now - do it then.
- */
- if (rw_mgr_mem_calibrate_vfifo_center(rank_bgn,
- rw_group, rw_group,
- test_bgn, 1, 0))
- continue;
-
- grp_calibrated = 0;
+ ret = rw_mgr_mem_calibrate_dq_dqs_centering(rw_group,
+ test_bgn, 1, 0);
+ if (ret) {
failed_substage = CAL_SUBSTAGE_VFIFO_CENTER;
+ continue;
}
- if (grp_calibrated)
- goto cal_done_ok;
+ /* All done. */
+ goto cal_done_ok;
}
}