@@ -1962,6 +1962,8 @@ struct drm_i915_private {
struct drm_i915_gem_object *vlv_pctx;
+ struct work_struct i915_modeset_retry_work;
+
#ifdef CONFIG_DRM_FBDEV_EMULATION
/* list of fbdev register on this device */
struct intel_fbdev *fbdev;
@@ -5691,6 +5691,15 @@ out_vdd_off:
return false;
}
+static void intel_dp_modeset_retry_work_fn(struct work_struct *work)
+{
+ struct drm_i915_private *dev_priv;
+
+ dev_priv = container_of(work, typeof(*dev_priv), i915_modeset_retry_work);
+ DRM_DEBUG_KMS("\nManasi: Sending Uevent");
+ drm_kms_helper_hotplug_event(&dev_priv->drm);
+}
+
bool
intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
struct intel_connector *intel_connector)
@@ -5703,6 +5712,9 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
enum port port = intel_dig_port->port;
int type;
+ /* Initialize the work for modeset in case of link train failure */
+ INIT_WORK(&dev_priv->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)))
We create a work queue for sending a hotplug uevent. This gets scheduled on link training failure and gets executed after modeset is finished and all locks are released. This was required to avoid deadlock. 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/i915_drv.h | 2 ++ drivers/gpu/drm/i915/intel_dp.c | 12 ++++++++++++ 2 files changed, 14 insertions(+)