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.nik...@linux.intel.com>
Cc: Daniel Vetter <daniel.vet...@intel.com>
Cc: Ville Syrjala <ville.syrj...@linux.intel.com>
Signed-off-by: Manasi Navare <manasi.d.nav...@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h |  2 ++
 drivers/gpu/drm/i915/intel_dp.c | 12 ++++++++++++
 2 files changed, 14 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index a219a35..9592e64 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -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;
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 4779742..9c1944a 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -5716,6 +5716,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)
@@ -5728,6 +5737,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)))
-- 
1.9.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to