From e958b3d3a341abd19a2947608cc72431b7e81876 Mon Sep 17 00:00:00 2001 From: Imre Deak Date: Mon, 1 Jun 2026 12:38:16 +0300 Subject: [PATCH] drm/i915/dp_link_training: Flush commits in debugfs entries Flush pending connector commits before accessing the link training state from debugfs. Access to connector state - like the link training state - that may be updated from an asynchronous commit tail must hold the connection mutex and wait for the tail to complete. The commit tail cannot hold the connection mutex, so all other accessors must wait for it explicitly. Reviewed-by: Mika Kahola Signed-off-by: Imre Deak Link: https://patch.msgid.link/20260601093836.3057345-4-imre.deak@intel.com --- .../drm/i915/display/intel_dp_link_training.c | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c index eb75819a85c0..eea75a744b5b 100644 --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c @@ -1882,8 +1882,11 @@ static int i915_dp_force_link_rate_show(struct seq_file *m, void *data) if (err) return err; + intel_dp_flush_connector_commits(connector); + if (intel_dp->link.active) current_rate = intel_dp->link_rate; + force_rate = intel_dp->link.force_rate; drm_modeset_unlock(&display->drm->mode_config.connection_mutex); @@ -1955,6 +1958,8 @@ static ssize_t i915_dp_force_link_rate_write(struct file *file, if (err) return err; + intel_dp_flush_connector_commits(connector); + intel_dp_reset_link_params(intel_dp); intel_dp->link.force_rate = rate; @@ -1980,6 +1985,8 @@ static int i915_dp_force_lane_count_show(struct seq_file *m, void *data) if (err) return err; + intel_dp_flush_connector_commits(connector); + if (intel_dp->link.active) current_lane_count = intel_dp->lane_count; force_lane_count = intel_dp->link.force_lane_count; @@ -2057,6 +2064,8 @@ static ssize_t i915_dp_force_lane_count_write(struct file *file, if (err) return err; + intel_dp_flush_connector_commits(connector); + intel_dp_reset_link_params(intel_dp); intel_dp->link.force_lane_count = lane_count; @@ -2079,6 +2088,8 @@ static int i915_dp_max_link_rate_show(void *data, u64 *val) if (err) return err; + intel_dp_flush_connector_commits(connector); + *val = intel_dp->link.max_rate; drm_modeset_unlock(&display->drm->mode_config.connection_mutex); @@ -2098,6 +2109,8 @@ static int i915_dp_max_lane_count_show(void *data, u64 *val) if (err) return err; + intel_dp_flush_connector_commits(connector); + *val = intel_dp->link.max_lane_count; drm_modeset_unlock(&display->drm->mode_config.connection_mutex); @@ -2117,6 +2130,8 @@ static int i915_dp_force_link_training_failure_show(void *data, u64 *val) if (err) return err; + intel_dp_flush_connector_commits(connector); + *val = intel_dp->link.force_train_failure; drm_modeset_unlock(&display->drm->mode_config.connection_mutex); @@ -2138,6 +2153,8 @@ static int i915_dp_force_link_training_failure_write(void *data, u64 val) if (err) return err; + intel_dp_flush_connector_commits(connector); + intel_dp->link.force_train_failure = val; drm_modeset_unlock(&display->drm->mode_config.connection_mutex); @@ -2159,6 +2176,8 @@ static int i915_dp_force_link_retrain_show(void *data, u64 *val) if (err) return err; + intel_dp_flush_connector_commits(connector); + *val = intel_dp->link.force_retrain; drm_modeset_unlock(&display->drm->mode_config.connection_mutex); @@ -2177,6 +2196,8 @@ static int i915_dp_force_link_retrain_write(void *data, u64 val) if (err) return err; + intel_dp_flush_connector_commits(connector); + intel_dp->link.force_retrain = val; drm_modeset_unlock(&display->drm->mode_config.connection_mutex); @@ -2200,6 +2221,8 @@ static int i915_dp_link_retrain_disabled_show(struct seq_file *m, void *data) if (err) return err; + intel_dp_flush_connector_commits(connector); + seq_printf(m, "%s\n", str_yes_no(intel_dp->link.retrain_disabled)); drm_modeset_unlock(&display->drm->mode_config.connection_mutex);