From 34fce89fd4e9601e4d651a0396927c774c817cc8 Mon Sep 17 00:00:00 2001 From: Thomas Lamprecht Date: Thu, 23 Jan 2020 13:04:17 +0100 Subject: [PATCH] fix #2549: backport: drm/i915: Avoid HPD poll detect triggering a new detect cycle Signed-off-by: Thomas Lamprecht --- ...PD-poll-detect-triggering-a-new-dete.patch | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 patches/kernel/0007-drm-i915-Avoid-HPD-poll-detect-triggering-a-new-dete.patch diff --git a/patches/kernel/0007-drm-i915-Avoid-HPD-poll-detect-triggering-a-new-dete.patch b/patches/kernel/0007-drm-i915-Avoid-HPD-poll-detect-triggering-a-new-dete.patch new file mode 100644 index 0000000..bd46161 --- /dev/null +++ b/patches/kernel/0007-drm-i915-Avoid-HPD-poll-detect-triggering-a-new-dete.patch @@ -0,0 +1,95 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Imre Deak +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 +Reported-and-tested-by: wangqr +Cc: Val Kulkov +Cc: wangqr +Cc: Ville Syrjälä +Signed-off-by: Imre Deak +Reviewed-by: Ville Syrjälä +Link: https://patchwork.freedesktop.org/patch/msgid/20191028181517.22602-1-imre.deak@intel.com +(cherry picked from commit a8ddac7c9f06a12227a4f5febd1cbe0575a33179) +Signed-off-by: Thomas Lamprecht +--- + 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 4b4d516b15e0..106b666a2cc3 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; + } +