On Fri, 2016-09-02 at 12:16 +0300, Mika Kahola wrote: > On Thu, 2016-09-01 at 15:08 -0700, Manasi Navare wrote: > > From: Dhinakaran Pandiyan <dhinakaran.pandiyan@xxxxxxxxx> > > > > This function cleans up clock recovery loop in link training > > compliant > > tp Dp Spec 1.2. It tries the clock recovery 5 times for the same > > voltage > > or until max voltage swing is reached and removes the additional non > > compliant retries. This function now returns a boolean values based > > on > > if clock recovery passed or failed. > > > > Signed-off-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@xxxxxxxxx> > > --- > > drivers/gpu/drm/i915/intel_dp_link_training.c | 59 ++++++++++++----- > > ---------- > > 1 file changed, 26 insertions(+), 33 deletions(-) > > > > diff --git a/drivers/gpu/drm/i915/intel_dp_link_training.c > > b/drivers/gpu/drm/i915/intel_dp_link_training.c > > index 9145e5a..13a0341 100644 > > --- a/drivers/gpu/drm/i915/intel_dp_link_training.c > > +++ b/drivers/gpu/drm/i915/intel_dp_link_training.c > > @@ -117,19 +117,19 @@ static bool > > intel_dp_link_max_vswing_reached(struct intel_dp *intel_dp) > > int lane; > > > > for (lane = 0; lane < intel_dp->lane_count; lane++) > > - if (intel_dp->train_set[lane] & > > DP_TRAIN_MAX_SWING_REACHED == 0) > > + if ((intel_dp->train_set[lane] & > > + DP_TRAIN_MAX_SWING_REACHED) == 0) > > return false; > > > This function was defined in the previous patch. Do we need to split > this if(...) line into separate lines in this patch? > Ah! That was not intended, I will re-submit. > > return true; > > } > > > > /* Enable corresponding port and start training pattern 1 */ > > -static void > > +static bool > > intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp) > > { > > - int i; > > uint8_t voltage; > > - int voltage_tries, loop_tries; > > + int voltage_tries, max_vswing_tries; > > uint8_t link_config[2]; > > uint8_t link_bw, rate_select; > > > > @@ -145,6 +145,7 @@ intel_dp_link_training_clock_recovery(struct > > intel_dp *intel_dp) > > if (drm_dp_enhanced_frame_cap(intel_dp->dpcd)) > > link_config[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN; > > drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_BW_SET, > > link_config, 2); > > + > > if (intel_dp->num_sink_rates) > > drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_RATE_SET, > > &rate_select, 1); > > @@ -160,58 +161,50 @@ intel_dp_link_training_clock_recovery(struct > > intel_dp *intel_dp) > > DP_TRAINING_PATTERN_1 | > > DP_LINK_SCRAMBLING_DISABLE)) > > { > > DRM_ERROR("failed to enable link training\n"); > > - return; > > + return false; > > } > > > > - voltage = 0xff; > > - voltage_tries = 0; > > - loop_tries = 0; > > + voltage_tries = 1; > > + max_vswing_tries = 0; > > for (;;) { > > uint8_t link_status[DP_LINK_STATUS_SIZE]; > > > > drm_dp_link_train_clock_recovery_delay(intel_dp- > > >dpcd); > > + > > if (!intel_dp_get_link_status(intel_dp, > > link_status)) { > > DRM_ERROR("failed to get link status\n"); > > - break; > > + return false; > > } > > > > if (drm_dp_clock_recovery_ok(link_status, intel_dp- > > >lane_count)) { > > DRM_DEBUG_KMS("clock recovery OK\n"); > > - break; > > + return true; > > } > > > > - /* Check to see if we've tried the max voltage */ > > - if (intel_dp_link_max_vswing_reached(intel_dp)) { > > - ++loop_tries; > > - if (loop_tries == 5) { > > - DRM_ERROR("too many full retries, > > give up\n"); > > - intel_dp_dump_link_status(link_statu > > s); > > - break; > > - } > > - intel_dp_reset_link_train(intel_dp, > > - DP_TRAINING_PATTER > > N_1 | > > - DP_LINK_SCRAMBLING > > _DISABLE); > > - voltage_tries = 0; > > - continue; > > + if (voltage_tries == 5 || max_vswing_tries == 1) { > > + DRM_DEBUG_KMS("Max. vswing reached or same > > voltage " > > + "tried 5 times\n"); > > + return false; > > } > I think it would be beneficial to know which one we hit if the clock > recovery fails. Therefore, I would split these debug messages so that > there would be separate debug messages when reaching max vswing or > trying out the same voltage for five times. Agreed. Also, I don't think we need the 'max_vswing_tries' local at all. We could just call intel_dp_link_max_vswing_reached() here and remove the call below. > > > > > - /* Check to see if we've tried the same voltage 5 > > times */ > > - if ((intel_dp->train_set[0] & > > DP_TRAIN_VOLTAGE_SWING_MASK) == voltage) { > > - ++voltage_tries; > > - if (voltage_tries == 5) { > > - DRM_ERROR("too many voltage retries, > > give up\n"); > > - break; > > - } > > - } else > > - voltage_tries = 0; > > voltage = intel_dp->train_set[0] & > > DP_TRAIN_VOLTAGE_SWING_MASK; > > > > /* Update training set as requested by target */ > > intel_get_adjust_train(intel_dp, link_status); > > if (!intel_dp_update_link_train(intel_dp)) { > > DRM_ERROR("failed to update link > > training\n"); > > - break; > > + return false; > > } > > + > > + if ((intel_dp->train_set[0] & > > DP_TRAIN_VOLTAGE_SWING_MASK) == > > + voltage) > > + ++voltage_tries; > > + else > > + voltage_tries = 1; > > + > > + if (intel_dp_link_max_vswing_reached(intel_dp)) > > + ++max_vswing_tries; > > + > > } > > } > > _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx