mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-30 20:30:32 -04:00
drm/i915/dp: Use check link state work in the hotplug handler
Simplify things by retraining a DP link if a bad link is detected in the hotplug handler from the encoder's check link state work, similarly to how this is done after a modeset link training failure. Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240610164933.2947366-12-imre.deak@intel.com
This commit is contained in:
@@ -1160,9 +1160,7 @@ intel_dp_hotplug(struct intel_encoder *encoder,
|
||||
struct intel_connector *connector)
|
||||
{
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
struct drm_modeset_acquire_ctx ctx;
|
||||
enum intel_hotplug_state state;
|
||||
int ret;
|
||||
|
||||
if (intel_dp->compliance.test_active &&
|
||||
intel_dp->compliance.test_type == DP_TEST_LINK_PHY_TEST_PATTERN) {
|
||||
@@ -1173,23 +1171,7 @@ intel_dp_hotplug(struct intel_encoder *encoder,
|
||||
|
||||
state = intel_encoder_hotplug(encoder, connector);
|
||||
|
||||
drm_modeset_acquire_init(&ctx, 0);
|
||||
|
||||
for (;;) {
|
||||
ret = intel_dp_retrain_link(encoder, &ctx);
|
||||
|
||||
if (ret == -EDEADLK) {
|
||||
drm_modeset_backoff(&ctx);
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
drm_modeset_drop_locks(&ctx);
|
||||
drm_modeset_acquire_fini(&ctx);
|
||||
drm_WARN(encoder->base.dev, ret,
|
||||
"Acquiring modeset locks failed with %i\n", ret);
|
||||
intel_dp_check_link_state(intel_dp);
|
||||
|
||||
/*
|
||||
* Keeping it consistent with intel_ddi_hotplug() and
|
||||
|
||||
@@ -4558,14 +4558,13 @@ intel_ddi_hotplug(struct intel_encoder *encoder,
|
||||
state = intel_encoder_hotplug(encoder, connector);
|
||||
|
||||
if (!intel_tc_port_link_reset(dig_port)) {
|
||||
intel_modeset_lock_ctx_retry(&ctx, NULL, 0, ret) {
|
||||
if (connector->base.connector_type == DRM_MODE_CONNECTOR_HDMIA)
|
||||
if (connector->base.connector_type == DRM_MODE_CONNECTOR_HDMIA) {
|
||||
intel_modeset_lock_ctx_retry(&ctx, NULL, 0, ret)
|
||||
ret = intel_hdmi_reset_link(encoder, &ctx);
|
||||
else
|
||||
ret = intel_dp_retrain_link(encoder, &ctx);
|
||||
drm_WARN_ON(encoder->base.dev, ret);
|
||||
} else {
|
||||
intel_dp_check_link_state(intel_dp);
|
||||
}
|
||||
|
||||
drm_WARN_ON(encoder->base.dev, ret);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -5271,6 +5271,20 @@ void intel_dp_link_check(struct intel_encoder *encoder)
|
||||
drm_WARN_ON(&i915->drm, ret);
|
||||
}
|
||||
|
||||
void intel_dp_check_link_state(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
|
||||
struct intel_encoder *encoder = &dig_port->base;
|
||||
|
||||
if (!intel_dp_is_connected(intel_dp))
|
||||
return;
|
||||
|
||||
if (!intel_dp_needs_link_retrain(intel_dp))
|
||||
return;
|
||||
|
||||
intel_encoder_link_check_queue_work(encoder, 0);
|
||||
}
|
||||
|
||||
static int intel_dp_prep_phy_test(struct intel_dp *intel_dp,
|
||||
struct drm_modeset_acquire_ctx *ctx,
|
||||
u8 *pipe_mask)
|
||||
|
||||
@@ -60,6 +60,7 @@ int intel_dp_get_active_pipes(struct intel_dp *intel_dp,
|
||||
int intel_dp_retrain_link(struct intel_encoder *encoder,
|
||||
struct drm_modeset_acquire_ctx *ctx);
|
||||
void intel_dp_link_check(struct intel_encoder *encoder);
|
||||
void intel_dp_check_link_state(struct intel_dp *intel_dp);
|
||||
void intel_dp_set_power(struct intel_dp *intel_dp, u8 mode);
|
||||
void intel_dp_configure_protocol_converter(struct intel_dp *intel_dp,
|
||||
const struct intel_crtc_state *crtc_state);
|
||||
|
||||
Reference in New Issue
Block a user