On Tue, Jan 25, 2022 at 07:03:43PM +0200, Jani Nikula wrote:
<snip>
> +static bool
> +intel_dp_128b132b_lane_cds(struct intel_dp *intel_dp,
> +                        const struct intel_crtc_state *crtc_state,
> +                        int lttpr_count)
> +{
> +     struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
> +     struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> +     u8 link_status[DP_LINK_STATUS_SIZE];
> +     unsigned long deadline;
> +
> +     if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TRAINING_PATTERN_SET,
> +                            DP_TRAINING_PATTERN_2_CDS) != 1) {
> +             drm_err(&i915->drm,
> +                     "[ENCODER:%d:%s] Failed to start 128b/132b TPS2 CDS\n",
> +                     encoder->base.base.id, encoder->base.name);
> +             return false;
> +     }
> +
> +     deadline = jiffies + msecs_to_jiffies((lttpr_count + 1) * 20);
> +     for (;;) {
> +             usleep_range(2000, 3000);
> +
> +             if (drm_dp_dpcd_read_link_status(&intel_dp->aux, link_status) < 
> 0) {
> +                     drm_err(&i915->drm,
> +                             "[ENCODER:%d:%s] Failed to read link status\n",
> +                             encoder->base.base.id, encoder->base.name);
> +                     return false;
> +             }
> +
> +             if (drm_dp_128b132b_cds_interlane_align_done(link_status) &&
> +                 drm_dp_128b132b_lane_symbol_locked(link_status, 
> crtc_state->lane_count)) {

I'm thinkin we want to check for both eq done and symbol locked here,
just like we do with 8b10b.

> +                     drm_dbg_kms(&i915->drm,
> +                                 "[ENCODER:%d:%s] CDS interlane align 
> done\n",
> +                                 encoder->base.base.id, encoder->base.name);
> +                     break;
> +             }
> +
> +             if (drm_dp_128b132b_link_training_failed(link_status)) {
> +                     intel_dp_dump_link_status(intel_dp, DP_PHY_DPRX, 
> link_status);
> +                     drm_err(&i915->drm,
> +                             "[ENCODER:%d:%s] Downstream link training 
> failure\n",
> +                             encoder->base.base.id, encoder->base.name);
> +                     return false;
> +             }
> +
> +             if (time_after(jiffies, deadline)) {
> +                     intel_dp_dump_link_status(intel_dp, DP_PHY_DPRX, 
> link_status);
> +                     drm_err(&i915->drm,
> +                             "[ENCODER:%d:%s] CDS timeout\n",
> +                             encoder->base.base.id, encoder->base.name);
> +                     return false;
> +             }
> +     }
> +
> +     /* FIXME: Should DP_TRAINING_PATTERN_DISABLE be written first? */
> +     if (intel_dp->set_idle_link_train)
> +             intel_dp->set_idle_link_train(intel_dp, crtc_state);
> +
> +     return true;
> +}

-- 
Ville Syrjälä
Intel

Reply via email to