drm/i915/display: ignore long HPDs based on a flag
authorVinod Govindapillai <vinod.govindapillai@intel.com>
Wed, 15 Feb 2023 08:38:31 +0000 (10:38 +0200)
committerImre Deak <imre.deak@intel.com>
Thu, 16 Mar 2023 14:47:11 +0000 (16:47 +0200)
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.
Debugfs entry is added to control the ignore long hpd flag.

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)

v4: use debugfs_create_bool and squash patches (Jani Nikula)

Signed-off-by: Vinod Govindapillai <vinod.govindapillai@intel.com>
Reviewed-by: Imre Deak <imre.deak@intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230215083832.287519-2-vinod.govindapillai@intel.com
drivers/gpu/drm/i915/display/intel_display_core.h
drivers/gpu/drm/i915/display/intel_hotplug.c

index fdab7bb..b218e05 100644 (file)
@@ -183,6 +183,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 {
index 907ab75..b129004 100644 (file)
@@ -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;
@@ -940,4 +947,6 @@ void intel_hpd_debugfs_register(struct drm_i915_private *i915)
                            i915, &i915_hpd_storm_ctl_fops);
        debugfs_create_file("i915_hpd_short_storm_ctl", 0644, minor->debugfs_root,
                            i915, &i915_hpd_short_storm_ctl_fops);
+       debugfs_create_bool("i915_ignore_long_hpd", 0644, minor->debugfs_root,
+                           &i915->display.hotplug.ignore_long_hpd);
 }