]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/i915/dp: Reduce link params only after retrying with unchanged params
authorImre Deak <imre.deak@intel.com>
Mon, 10 Jun 2024 16:49:20 +0000 (19:49 +0300)
committerImre Deak <imre.deak@intel.com>
Thu, 13 Jun 2024 18:26:49 +0000 (21:26 +0300)
Try to maintain the current link parameters by retrying the link
training with unchanged link parameters before reducing these parameters
(sending an uevent to userspace to retrain the link instead).

Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240610164933.2947366-9-imre.deak@intel.com
drivers/gpu/drm/i915/display/intel_display_types.h
drivers/gpu/drm/i915/display/intel_dp.c
drivers/gpu/drm/i915/display/intel_dp_link_training.c

index 1af3d48a7b8652f3a52deda143a09547ecb91c9b..a50310f412dd1977918bd619001e0a6f4e47b4cd 100644 (file)
@@ -1771,6 +1771,8 @@ struct intel_dp {
                int max_lane_count;
                /* Max rate for the current link */
                int max_rate;
+               /* Sequential link training failures after a passing LT */
+               int seq_train_failures;
        } link;
        bool reset_link_params;
        int mso_link_count;
index 0833302baabc5b6ae43a1a089361e04f74d5731c..5f54b0a9f5972ebc8ec81c389aa649c051a6e79a 100644 (file)
@@ -2961,6 +2961,7 @@ static void intel_dp_reset_link_params(struct intel_dp *intel_dp)
 {
        intel_dp->link.max_lane_count = intel_dp_max_common_lane_count(intel_dp);
        intel_dp->link.max_rate = intel_dp_max_common_rate(intel_dp);
+       intel_dp->link.seq_train_failures = 0;
 }
 
 /* Enable backlight PWM and backlight PP control. */
@@ -5075,6 +5076,9 @@ intel_dp_needs_link_retrain(struct intel_dp *intel_dp)
                                        intel_dp->lane_count))
                return false;
 
+       if (intel_dp->link.seq_train_failures)
+               return true;
+
        /* Retrain if link not ok */
        return !intel_dp_link_ok(intel_dp, link_status);
 }
index 1164255cf5f2d46ab4c439e89d50ad420e691fe6..8caf740e642f2765c72715b03b7daba02140bf15 100644 (file)
@@ -1487,10 +1487,13 @@ void intel_dp_start_link_train(struct intel_dp *intel_dp,
                passed = intel_dp_link_train_all_phys(intel_dp, crtc_state, lttpr_count);
 
        if (passed) {
+               intel_dp->link.seq_train_failures = 0;
                intel_encoder_link_check_queue_work(encoder, 2000);
                return;
        }
 
+       intel_dp->link.seq_train_failures++;
+
        /*
         * Ignore the link failure in CI
         *
@@ -1508,6 +1511,11 @@ void intel_dp_start_link_train(struct intel_dp *intel_dp,
                return;
        }
 
+       if (intel_dp->link.seq_train_failures < 2) {
+               intel_encoder_link_check_queue_work(encoder, 0);
+               return;
+       }
+
        intel_dp_schedule_fallback_link_training(intel_dp, crtc_state);
 }