This work function gets scheduled on link training failure during the atomic commit of modeset. It should get executed after the current modeset is completed and send a hotplug uevent to notify the usersapce about change in the connector link property requesting link_train_retry
Cc: Jani Nikula jani.nikula@linux.intel.com Cc: Daniel Vetter daniel.vetter@intel.com Cc: Ville Syrjala ville.syrjala@linux.intel.com Signed-off-by: Manasi Navare manasi.d.navare@intel.com --- drivers/gpu/drm/i915/intel_dp.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index a60bef8..aae7f82 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -5675,6 +5675,22 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, return false; }
+static void intel_dp_modeset_retry_work_fn(struct work_struct *work) +{ + struct drm_connector *connector; + + connector = container_of(work, typeof(*connector), + i915_modeset_retry_work); + + /* Grab the locks before changing connector property*/ + mutex_lock(&connector->dev->mode_config.mutex); + DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", connector->base.id, + connector->name); + connector->link_train_retry = true; + mutex_unlock(&connector->dev->mode_config.mutex); + drm_kms_helper_hotplug_event(connector->dev); +} + bool intel_dp_init_connector(struct intel_digital_port *intel_dig_port, struct intel_connector *intel_connector) @@ -5687,6 +5703,10 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, enum port port = intel_dig_port->port; int type;
+ /* Initialize the work for modeset in case of link train failure */ + INIT_WORK(&connector->i915_modeset_retry_work, + intel_dp_modeset_retry_work_fn); + if (WARN(intel_dig_port->max_lanes < 1, "Not enough lanes (%d) for DP on port %c\n", intel_dig_port->max_lanes, port_name(port)))