drm/i915/dp_mst: Queue modeset-retry after a failed payload BW allocation
authorImre Deak <imre.deak@intel.com>
Mon, 22 Jul 2024 16:55:00 +0000 (19:55 +0300)
committerImre Deak <imre.deak@intel.com>
Wed, 31 Jul 2024 15:45:59 +0000 (18:45 +0300)
If the MST payload allocation failed, enabling the output also failed
most probably, so send a uevent accordinly requesting the user to retry
the modeset. While at it remove the driver specific debug message, there
is already one printed by drm_dp_add_payload_part1().

Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240722165503.2084999-12-imre.deak@intel.com
drivers/gpu/drm/i915/display/intel_dp_mst.c

index 27ce5c3f5951e5111933d1c994be89dcde1a4042..57f29906fa28f3e62673300ac3745fdaa60e0206 100644 (file)
@@ -1158,8 +1158,7 @@ static void intel_mst_pre_enable_dp(struct intel_atomic_state *state,
        ret = drm_dp_add_payload_part1(&intel_dp->mst_mgr, mst_state,
                                       drm_atomic_get_mst_payload_state(mst_state, connector->port));
        if (ret < 0)
-               drm_dbg_kms(&dev_priv->drm, "Failed to create MST payload for %s: %d\n",
-                           connector->base.name, ret);
+               intel_dp_queue_modeset_retry_for_link(state, &dig_port->base, pipe_config);
 
        /*
         * Before Gen 12 this is not done as part of
@@ -1223,6 +1222,7 @@ static void intel_mst_enable_dp(struct intel_atomic_state *state,
        enum transcoder trans = pipe_config->cpu_transcoder;
        bool first_mst_stream = intel_dp->active_mst_links == 1;
        struct intel_crtc *pipe_crtc;
+       int ret;
 
        drm_WARN_ON(&dev_priv->drm, pipe_config->has_pch_encoder);
 
@@ -1254,8 +1254,11 @@ static void intel_mst_enable_dp(struct intel_atomic_state *state,
        if (first_mst_stream)
                intel_ddi_wait_for_fec_status(encoder, pipe_config, true);
 
-       drm_dp_add_payload_part2(&intel_dp->mst_mgr,
-                                drm_atomic_get_mst_payload_state(mst_state, connector->port));
+       ret = drm_dp_add_payload_part2(&intel_dp->mst_mgr,
+                                      drm_atomic_get_mst_payload_state(mst_state,
+                                                                       connector->port));
+       if (ret < 0)
+               intel_dp_queue_modeset_retry_for_link(state, &dig_port->base, pipe_config);
 
        if (DISPLAY_VER(dev_priv) >= 12)
                intel_de_rmw(dev_priv, hsw_chicken_trans_reg(dev_priv, trans),