drm/i915/dp: Pass atomic state to link training function
authorImre Deak <imre.deak@gmail.com>
Mon, 10 Jun 2024 16:49:21 +0000 (19:49 +0300)
committerImre Deak <imre.deak@intel.com>
Thu, 13 Jun 2024 18:26:49 +0000 (21:26 +0300)
The next patch adds sending a modeset-retry uevent after a link training
failure to all MST connectors on link. This requires the atomic state,
so pass it to intel_dp_start_link_train(). In case of SST where
retraining still happens by calling this function directly instead of a
modeset commit the atomic state is not available and NULL is passed
instead. This is ok, since in this case the encoder's only DP connector
is available from intel_dp->attached_connector not requiring the atomic
state.

v2: Add NOTE that the atomic state may not be valid for SST links and
    assert that it's valid for MST links. (Ville)

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

index 4d279cadf7e2bc4cbdc87d15d9f681ef4c88b81f..a0406a71dbde35c3954e3be2d1ef262ad7a2cd76 100644 (file)
@@ -707,7 +707,7 @@ static void intel_enable_dp(struct intel_atomic_state *state,
        intel_dp_configure_protocol_converter(intel_dp, pipe_config);
        intel_dp_check_frl_training(intel_dp);
        intel_dp_pcon_dsc_configure(intel_dp, pipe_config);
-       intel_dp_start_link_train(intel_dp, pipe_config);
+       intel_dp_start_link_train(state, intel_dp, pipe_config);
        intel_dp_stop_link_train(intel_dp, pipe_config);
 }
 
index 823c66ad8988049f696572382543a93a4f05d5f0..958effb273ffb453775ffb8c8d7d932a5a06b46d 100644 (file)
@@ -2596,7 +2596,7 @@ static void mtl_ddi_pre_enable_dp(struct intel_atomic_state *state,
         *     Pattern, wait for 5 idle patterns (DP_TP_STATUS Min_Idles_Sent)
         *     (timeout after 800 us)
         */
-       intel_dp_start_link_train(intel_dp, crtc_state);
+       intel_dp_start_link_train(state, intel_dp, crtc_state);
 
        /* 6.n Set DP_TP_CTL link training to Normal */
        if (!is_trans_port_sync_mode(crtc_state))
@@ -2738,7 +2738,7 @@ static void tgl_ddi_pre_enable_dp(struct intel_atomic_state *state,
         *     Pattern, wait for 5 idle patterns (DP_TP_STATUS Min_Idles_Sent)
         *     (timeout after 800 us)
         */
-       intel_dp_start_link_train(intel_dp, crtc_state);
+       intel_dp_start_link_train(state, intel_dp, crtc_state);
 
        /* 7.k Set DP_TP_CTL link training to Normal */
        if (!is_trans_port_sync_mode(crtc_state))
@@ -2805,7 +2805,7 @@ static void hsw_ddi_pre_enable_dp(struct intel_atomic_state *state,
                                                   to_intel_connector(conn_state->connector),
                                                   crtc_state);
        intel_dp_sink_set_fec_ready(intel_dp, crtc_state, true);
-       intel_dp_start_link_train(intel_dp, crtc_state);
+       intel_dp_start_link_train(state, intel_dp, crtc_state);
        if ((port != PORT_A || DISPLAY_VER(dev_priv) >= 9) &&
            !is_trans_port_sync_mode(crtc_state))
                intel_dp_stop_link_train(intel_dp, crtc_state);
index 5f54b0a9f5972ebc8ec81c389aa649c051a6e79a..d41c00f720a1a0ea979fbc62ff7d189226dcdee4 100644 (file)
@@ -5233,7 +5233,7 @@ int intel_dp_retrain_link(struct intel_encoder *encoder,
 
                intel_dp_check_frl_training(intel_dp);
                intel_dp_pcon_dsc_configure(intel_dp, crtc_state);
-               intel_dp_start_link_train(intel_dp, crtc_state);
+               intel_dp_start_link_train(NULL, intel_dp, crtc_state);
                intel_dp_stop_link_train(intel_dp, crtc_state);
                break;
        }
index 8caf740e642f2765c72715b03b7daba02140bf15..04629a4341eef91398f9c61845d477ddaca61117 100644 (file)
@@ -1453,6 +1453,7 @@ intel_dp_128b132b_link_train(struct intel_dp *intel_dp,
 
 /**
  * intel_dp_start_link_train - start link training
+ * @state: Atomic state
  * @intel_dp: DP struct
  * @crtc_state: state for CRTC attached to the encoder
  *
@@ -1460,8 +1461,11 @@ intel_dp_128b132b_link_train(struct intel_dp *intel_dp,
  * retraining with reduced link rate/lane parameters if the link training
  * fails.
  * After calling this function intel_dp_stop_link_train() must be called.
+ *
+ * NOTE: @state is only valid for MST links and can be %NULL for SST.
  */
-void intel_dp_start_link_train(struct intel_dp *intel_dp,
+void intel_dp_start_link_train(struct intel_atomic_state *state,
+                              struct intel_dp *intel_dp,
                               const struct intel_crtc_state *crtc_state)
 {
        struct drm_i915_private *i915 = dp_to_i915(intel_dp);
@@ -1475,6 +1479,11 @@ void intel_dp_start_link_train(struct intel_dp *intel_dp,
         */
        int lttpr_count = intel_dp_init_lttpr_and_dprx_caps(intel_dp);
 
+       if (drm_WARN_ON(&i915->drm,
+                       intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST) &&
+                       !state))
+               return;
+
        if (lttpr_count < 0)
                /* Still continue with enabling the port and link training. */
                lttpr_count = 0;
index 19836a8a4f9041c035d23bc120b55b7294c5ddb0..f658230960333cf23a0db2deeeedca551c380efd 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <drm/display/drm_dp_helper.h>
 
+struct intel_atomic_state;
 struct intel_crtc_state;
 struct intel_dp;
 
@@ -25,7 +26,8 @@ void intel_dp_program_link_training_pattern(struct intel_dp *intel_dp,
 void intel_dp_set_signal_levels(struct intel_dp *intel_dp,
                                const struct intel_crtc_state *crtc_state,
                                enum drm_dp_phy dp_phy);
-void intel_dp_start_link_train(struct intel_dp *intel_dp,
+void intel_dp_start_link_train(struct intel_atomic_state *state,
+                              struct intel_dp *intel_dp,
                               const struct intel_crtc_state *crtc_state);
 void intel_dp_stop_link_train(struct intel_dp *intel_dp,
                              const struct intel_crtc_state *crtc_state);