Some panels generate long HPD events even while connected to
the port. This cause some unexpected CI execution issues. A
new flag is added to track if such spurious long HPDs can be
ignored and are not processed further if the flag is set.

v2: Address patch styling comments (Jani Nikula)

v3: Ignoring the HPD moved to hotplug handler and now applies
    to all types of outputs (Imre Deak)

Signed-off-by: Vinod Govindapillai <vinod.govindapil...@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display_core.h | 11 +++++++++++
 drivers/gpu/drm/i915/display/intel_hotplug.c      |  7 +++++++
 2 files changed, 18 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h 
b/drivers/gpu/drm/i915/display/intel_display_core.h
index fb8670aa2932..251f774bd590 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -182,6 +182,17 @@ struct intel_hotplug {
         * blocked behind the non-DP one.
         */
        struct workqueue_struct *dp_wq;
+
+       /*
+        * Flag to track if long HPDs need not to be processed
+        *
+        * Some panels generate long HPDs while keep connected to the port.
+        * This can cause issues with CI tests results. In CI systems we
+        * don't expect to disconnect the panels and could ignore the long
+        * HPDs generated from the faulty panels. This flag can be used as
+        * cue to ignore the long HPDs and can be set / unset using debugfs.
+        */
+       bool ignore_long_hpd;
 };
 
 struct intel_vbt_data {
diff --git a/drivers/gpu/drm/i915/display/intel_hotplug.c 
b/drivers/gpu/drm/i915/display/intel_hotplug.c
index 907ab7526cb4..f0a2aa648bb8 100644
--- a/drivers/gpu/drm/i915/display/intel_hotplug.c
+++ b/drivers/gpu/drm/i915/display/intel_hotplug.c
@@ -389,6 +389,13 @@ static void i915_hotplug_work_func(struct work_struct 
*work)
 
        spin_unlock_irq(&dev_priv->irq_lock);
 
+       /* Skip calling encode hotplug handlers if ignore long HPD set*/
+       if (dev_priv->display.hotplug.ignore_long_hpd) {
+               drm_dbg_kms(&dev_priv->drm, "Ignore HPD flag on - skip encoder 
hotplug handlers\n");
+               mutex_unlock(&dev_priv->drm.mode_config.mutex);
+               return;
+       }
+
        drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter);
        for_each_intel_connector_iter(connector, &conn_iter) {
                enum hpd_pin pin;
-- 
2.34.1

Reply via email to