|
@@ -2226,12 +2226,10 @@ static uint32_t rw_mgr_mem_calibrate_vfifo(uint32_t read_group,
|
|
|
/* update info for sims */
|
|
|
reg_file_set_group(read_group);
|
|
|
|
|
|
- grp_calibrated = 0;
|
|
|
-
|
|
|
reg_file_set_sub_stage(CAL_SUBSTAGE_GUARANTEED_READ);
|
|
|
failed_substage = CAL_SUBSTAGE_GUARANTEED_READ;
|
|
|
|
|
|
- for (d = 0; d <= dtaps_per_ptap && grp_calibrated == 0; d += 2) {
|
|
|
+ for (d = 0; d <= dtaps_per_ptap; d += 2) {
|
|
|
/*
|
|
|
* In RLDRAMX we may be messing the delay of pins in
|
|
|
* the same write group but outside of the current read
|
|
@@ -2243,7 +2241,7 @@ static uint32_t rw_mgr_mem_calibrate_vfifo(uint32_t read_group,
|
|
|
write_group, d);
|
|
|
}
|
|
|
|
|
|
- for (p = 0; p <= IO_DQDQS_OUT_PHASE_MAX && grp_calibrated == 0; p++) {
|
|
|
+ for (p = 0; p <= IO_DQDQS_OUT_PHASE_MAX; p++) {
|
|
|
/* set a particular dqdqs phase */
|
|
|
scc_mgr_set_dqdqs_output_phase_all_ranks(read_group, p);
|
|
|
|
|
@@ -2268,49 +2266,52 @@ static uint32_t rw_mgr_mem_calibrate_vfifo(uint32_t read_group,
|
|
|
}
|
|
|
|
|
|
/* case:56390 */
|
|
|
- grp_calibrated = 1;
|
|
|
- if (rw_mgr_mem_calibrate_vfifo_find_dqs_en_phase_sweep_dq_in_delay
|
|
|
+ if (!rw_mgr_mem_calibrate_vfifo_find_dqs_en_phase_sweep_dq_in_delay
|
|
|
(write_group, read_group, test_bgn)) {
|
|
|
- /*
|
|
|
- * USER Read per-bit deskew can be done on a
|
|
|
- * per shadow register basis.
|
|
|
- */
|
|
|
- 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, write_group,
|
|
|
- read_group, test_bgn,
|
|
|
- 1, 0))
|
|
|
- continue;
|
|
|
-
|
|
|
- grp_calibrated = 0;
|
|
|
- failed_substage = CAL_SUBSTAGE_VFIFO_CENTER;
|
|
|
- }
|
|
|
- } else {
|
|
|
- grp_calibrated = 0;
|
|
|
failed_substage = CAL_SUBSTAGE_DQS_EN_PHASE;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * USER 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++) {
|
|
|
+ /*
|
|
|
+ * 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,
|
|
|
+ write_group, read_group,
|
|
|
+ test_bgn, 1, 0))
|
|
|
+
|
|
|
+ continue;
|
|
|
+
|
|
|
+ grp_calibrated = 0;
|
|
|
+ failed_substage = CAL_SUBSTAGE_VFIFO_CENTER;
|
|
|
}
|
|
|
+
|
|
|
+ if (grp_calibrated)
|
|
|
+ goto cal_done_ok;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (grp_calibrated == 0) {
|
|
|
- set_failing_group_stage(write_group, CAL_STAGE_VFIFO,
|
|
|
- failed_substage);
|
|
|
- return 0;
|
|
|
- }
|
|
|
+ /* Calibration Stage 1 failed. */
|
|
|
+ set_failing_group_stage(write_group, CAL_STAGE_VFIFO, failed_substage);
|
|
|
+ return 0;
|
|
|
|
|
|
+ /* Calibration Stage 1 completed OK. */
|
|
|
+cal_done_ok:
|
|
|
/*
|
|
|
* Reset the delay chains back to zero if they have moved > 1
|
|
|
* (check for > 1 because loop will increase d even when pass in
|