]> git.proxmox.com Git - pve-kernel.git/blobdiff - patches/kernel/0006-drm-i915-Avoid-HPD-poll-detect-triggering-a-new-dete.patch
rebase patches on top of Ubuntu-5.3.0-40.32
[pve-kernel.git] / patches / kernel / 0006-drm-i915-Avoid-HPD-poll-detect-triggering-a-new-dete.patch
diff --git a/patches/kernel/0006-drm-i915-Avoid-HPD-poll-detect-triggering-a-new-dete.patch b/patches/kernel/0006-drm-i915-Avoid-HPD-poll-detect-triggering-a-new-dete.patch
new file mode 100644 (file)
index 0000000..f0ef5f5
--- /dev/null
@@ -0,0 +1,95 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Imre Deak <imre.deak@intel.com>
+Date: Mon, 28 Oct 2019 20:15:17 +0200
+Subject: [PATCH] drm/i915: Avoid HPD poll detect triggering a new detect cycle
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+For the HPD interrupt functionality the HW depends on power wells in the
+display core domain to be on. Accordingly when enabling these power
+wells the HPD polling logic will force an HPD detection cycle to account
+for hotplug events that may have happened when such a power well was
+off.
+
+Thus a detect cycle started by polling could start a new detect cycle if
+a power well in the display core domain gets enabled during detect and
+stays enabled after detect completes. That in turn can lead to a
+detection cycle runaway.
+
+To prevent re-triggering a poll-detect cycle make sure we drop all power
+references we acquired during detect synchronously by the end of detect.
+This will let the poll-detect logic continue with polling (matching the
+off state of the corresponding power wells) instead of scheduling a new
+detection cycle.
+
+Fixes: 6cfe7ec02e85 ("drm/i915: Remove the unneeded AUX power ref from intel_dp_detect()")
+Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=112125
+Reported-and-tested-by: Val Kulkov <val.kulkov@gmail.com>
+Reported-and-tested-by: wangqr <wqr.prg@gmail.com>
+Cc: Val Kulkov <val.kulkov@gmail.com>
+Cc: wangqr <wqr.prg@gmail.com>
+Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
+Signed-off-by: Imre Deak <imre.deak@intel.com>
+Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20191028181517.22602-1-imre.deak@intel.com
+(cherry picked from commit a8ddac7c9f06a12227a4f5febd1cbe0575a33179)
+Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
+---
+ drivers/gpu/drm/i915/display/intel_crt.c  | 7 +++++++
+ drivers/gpu/drm/i915/display/intel_dp.c   | 6 ++++++
+ drivers/gpu/drm/i915/display/intel_hdmi.c | 6 ++++++
+ 3 files changed, 19 insertions(+)
+
+diff --git a/drivers/gpu/drm/i915/display/intel_crt.c b/drivers/gpu/drm/i915/display/intel_crt.c
+index 3fcf2f84bcce..da1d6be46a0c 100644
+--- a/drivers/gpu/drm/i915/display/intel_crt.c
++++ b/drivers/gpu/drm/i915/display/intel_crt.c
+@@ -867,6 +867,13 @@ intel_crt_detect(struct drm_connector *connector,
+ out:
+       intel_display_power_put(dev_priv, intel_encoder->power_domain, wakeref);
++
++      /*
++       * Make sure the refs for power wells enabled during detect are
++       * dropped to avoid a new detect cycle triggered by HPD polling.
++       */
++      intel_display_power_flush_work(dev_priv);
++
+       return status;
+ }
+diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
+index 305abddc274a..dbdd46ba9bfe 100644
+--- a/drivers/gpu/drm/i915/display/intel_dp.c
++++ b/drivers/gpu/drm/i915/display/intel_dp.c
+@@ -5649,6 +5649,12 @@ intel_dp_detect(struct drm_connector *connector,
+       if (status != connector_status_connected && !intel_dp->is_mst)
+               intel_dp_unset_edid(intel_dp);
++      /*
++       * Make sure the refs for power wells enabled during detect are
++       * dropped to avoid a new detect cycle triggered by HPD polling.
++       */
++      intel_display_power_flush_work(dev_priv);
++
+       return status;
+ }
+diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
+index 7ffdfaae7188..5d5453461a6f 100644
+--- a/drivers/gpu/drm/i915/display/intel_hdmi.c
++++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
+@@ -2571,6 +2571,12 @@ intel_hdmi_detect(struct drm_connector *connector, bool force)
+       if (status != connector_status_connected)
+               cec_notifier_phys_addr_invalidate(intel_hdmi->cec_notifier);
++      /*
++       * Make sure the refs for power wells enabled during detect are
++       * dropped to avoid a new detect cycle triggered by HPD polling.
++       */
++      intel_display_power_flush_work(dev_priv);
++
+       return status;
+ }