]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/i915/dp: Send only a single modeset-retry uevent for a commit
authorImre Deak <imre.deak@intel.com>
Mon, 22 Jul 2024 16:54:55 +0000 (19:54 +0300)
committerImre Deak <imre.deak@intel.com>
Wed, 31 Jul 2024 15:45:59 +0000 (18:45 +0300)
There are multiple failure cases a modeset-retry uevent can be sent for
a link (TBT tunnel BW allocation failure, unrecoverable link training
failure), a follow-up patch adding the handling for a new case where the
DP MST payload allocation fails. The uevent is the same in all cases,
sent to all the connectors on the link, so in case of multiple failures
there is no point in sending a separate uevent for each failure; prevent
this, sending only a single modeset-retry uevent for a commit.

Reviewed-by: Arun R Murthy <arun.r.murthy@intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240722165503.2084999-7-imre.deak@intel.com
drivers/gpu/drm/i915/display/intel_display_types.h
drivers/gpu/drm/i915/display/intel_dp.c

index a9d2acdc51a4a87f1c4b950de604faccf2cb408f..3501125c551588e442db49d5a5723c831b8c1fdd 100644 (file)
@@ -1754,6 +1754,7 @@ struct intel_dp {
        u8 lane_count;
        u8 sink_count;
        bool link_trained;
+       bool needs_modeset_retry;
        bool use_max_params;
        u8 dpcd[DP_RECEIVER_CAP_SIZE];
        u8 psr_dpcd[EDP_PSR_RECEIVER_CAP_SIZE];
index 32964e15f3b11a49e0180334690f13b8e085430d..e52c652b26a9c5378826604909147b0c749bebe2 100644 (file)
@@ -2876,6 +2876,11 @@ intel_dp_queue_modeset_retry_for_link(struct intel_atomic_state *state,
        struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
        int i;
 
+       if (intel_dp->needs_modeset_retry)
+               return;
+
+       intel_dp->needs_modeset_retry = true;
+
        if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST)) {
                intel_dp_queue_modeset_retry_work(intel_dp->attached_connector);
 
@@ -3009,6 +3014,7 @@ void intel_dp_set_link_params(struct intel_dp *intel_dp,
 {
        memset(intel_dp->train_set, 0, sizeof(intel_dp->train_set));
        intel_dp->link_trained = false;
+       intel_dp->needs_modeset_retry = false;
        intel_dp->link_rate = link_rate;
        intel_dp->lane_count = lane_count;
 }