Commit c9a5f601 authored by Imre Deak's avatar Imre Deak

drm/i915/dp: Send a link training modeset-retry uevent to all MST connectors

Send a modeset-retry uevent to all connectors in the same MST topology
after a link training failure and reduction of the link parameters. This
matches the way the same uevent is sent after a DP tunnel BW allocation
failure.

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: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240610164933.2947366-11-imre.deak@intel.com
parent 182c6be0
...@@ -2801,7 +2801,7 @@ intel_dp_audio_compute_config(struct intel_encoder *encoder, ...@@ -2801,7 +2801,7 @@ intel_dp_audio_compute_config(struct intel_encoder *encoder,
intel_dp_is_uhbr(pipe_config); intel_dp_is_uhbr(pipe_config);
} }
void intel_dp_queue_modeset_retry_work(struct intel_connector *connector) static void intel_dp_queue_modeset_retry_work(struct intel_connector *connector)
{ {
struct drm_i915_private *i915 = to_i915(connector->base.dev); struct drm_i915_private *i915 = to_i915(connector->base.dev);
...@@ -2810,6 +2810,7 @@ void intel_dp_queue_modeset_retry_work(struct intel_connector *connector) ...@@ -2810,6 +2810,7 @@ void intel_dp_queue_modeset_retry_work(struct intel_connector *connector)
drm_connector_put(&connector->base); drm_connector_put(&connector->base);
} }
/* NOTE: @state is only valid for MST links and can be %NULL for SST. */
void void
intel_dp_queue_modeset_retry_for_link(struct intel_atomic_state *state, intel_dp_queue_modeset_retry_for_link(struct intel_atomic_state *state,
struct intel_encoder *encoder, struct intel_encoder *encoder,
...@@ -2818,6 +2819,7 @@ intel_dp_queue_modeset_retry_for_link(struct intel_atomic_state *state, ...@@ -2818,6 +2819,7 @@ intel_dp_queue_modeset_retry_for_link(struct intel_atomic_state *state,
struct intel_connector *connector; struct intel_connector *connector;
struct intel_digital_connector_state *conn_state; struct intel_digital_connector_state *conn_state;
struct intel_dp *intel_dp = enc_to_intel_dp(encoder); struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
int i; int i;
if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST)) { if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST)) {
...@@ -2826,6 +2828,9 @@ intel_dp_queue_modeset_retry_for_link(struct intel_atomic_state *state, ...@@ -2826,6 +2828,9 @@ intel_dp_queue_modeset_retry_for_link(struct intel_atomic_state *state,
return; return;
} }
if (drm_WARN_ON(&i915->drm, !state))
return;
for_each_new_intel_connector_in_state(state, connector, conn_state, i) { for_each_new_intel_connector_in_state(state, connector, conn_state, i) {
if (!conn_state->base.crtc) if (!conn_state->base.crtc)
continue; continue;
......
...@@ -44,7 +44,6 @@ bool intel_dp_limited_color_range(const struct intel_crtc_state *crtc_state, ...@@ -44,7 +44,6 @@ bool intel_dp_limited_color_range(const struct intel_crtc_state *crtc_state,
const struct drm_connector_state *conn_state); const struct drm_connector_state *conn_state);
int intel_dp_min_bpp(enum intel_output_format output_format); int intel_dp_min_bpp(enum intel_output_format output_format);
void intel_dp_init_modeset_retry_work(struct intel_connector *connector); void intel_dp_init_modeset_retry_work(struct intel_connector *connector);
void intel_dp_queue_modeset_retry_work(struct intel_connector *connector);
void void
intel_dp_queue_modeset_retry_for_link(struct intel_atomic_state *state, intel_dp_queue_modeset_retry_for_link(struct intel_atomic_state *state,
struct intel_encoder *encoder, struct intel_encoder *encoder,
......
...@@ -1187,10 +1187,13 @@ static int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp, ...@@ -1187,10 +1187,13 @@ static int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
return 0; return 0;
} }
static void intel_dp_schedule_fallback_link_training(struct intel_dp *intel_dp, /* NOTE: @state is only valid for MST links and can be %NULL for SST. */
static void intel_dp_schedule_fallback_link_training(struct intel_atomic_state *state,
struct intel_dp *intel_dp,
const struct intel_crtc_state *crtc_state) const struct intel_crtc_state *crtc_state)
{ {
struct intel_connector *intel_connector = intel_dp->attached_connector; struct drm_i915_private *i915 = dp_to_i915(intel_dp);
struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
if (!intel_digital_port_connected(&dp_to_dig_port(intel_dp)->base)) { if (!intel_digital_port_connected(&dp_to_dig_port(intel_dp)->base)) {
lt_dbg(intel_dp, DP_PHY_DPRX, "Link Training failed on disconnected sink.\n"); lt_dbg(intel_dp, DP_PHY_DPRX, "Link Training failed on disconnected sink.\n");
...@@ -1205,8 +1208,13 @@ static void intel_dp_schedule_fallback_link_training(struct intel_dp *intel_dp, ...@@ -1205,8 +1208,13 @@ static void intel_dp_schedule_fallback_link_training(struct intel_dp *intel_dp,
return; return;
} }
if (drm_WARN_ON(&i915->drm,
intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST) &&
!state))
return;
/* Schedule a Hotplug Uevent to userspace to start modeset */ /* Schedule a Hotplug Uevent to userspace to start modeset */
intel_dp_queue_modeset_retry_work(intel_connector); intel_dp_queue_modeset_retry_for_link(state, encoder, crtc_state);
} }
/* Perform the link training on all LTTPRs and the DPRX on a link. */ /* Perform the link training on all LTTPRs and the DPRX on a link. */
...@@ -1525,7 +1533,7 @@ void intel_dp_start_link_train(struct intel_atomic_state *state, ...@@ -1525,7 +1533,7 @@ void intel_dp_start_link_train(struct intel_atomic_state *state,
return; return;
} }
intel_dp_schedule_fallback_link_training(intel_dp, crtc_state); intel_dp_schedule_fallback_link_training(state, intel_dp, crtc_state);
} }
void intel_dp_128b132b_sdp_crc16(struct intel_dp *intel_dp, void intel_dp_128b132b_sdp_crc16(struct intel_dp *intel_dp,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment