Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1674724 > unrolled thread

[PATCH] drm/i915: Synchronize connectors states when switching from poll to irq

Started byPaul Kocialkowski <paul.kocialkowski@linux.intel.com>
First post2017-06-26 14:40 +0200
Last post2017-06-26 14:40 +0200
Articles 1 — 1 participant

Back to article view | Back to linux.kernel


Contents

  [PATCH] drm/i915: Synchronize connectors states when switching from poll to irq Paul Kocialkowski <paul.kocialkowski@linux.intel.com> - 2017-06-26 14:40 +0200

#1674724 — [PATCH] drm/i915: Synchronize connectors states when switching from poll to irq

FromPaul Kocialkowski <paul.kocialkowski@linux.intel.com>
Date2017-06-26 14:40 +0200
Subject[PATCH] drm/i915: Synchronize connectors states when switching from poll to irq
Message-ID<tWBt8-2mb-15@gated-at.bofh.it>
After detecting an IRQ storm, hotplug detection will switch from
irq-based detection to poll-based detection. After a short delay or
when resetting storm detection from debugfs, detection will switch
back to being irq-based.

However, it may occur that polling does not have enough time to detect
the current connector state when that second switch takes place. Thus,
this sets the appropriate hotplug event bits for the concerned
connectors and schedules the hotplug work, that will ensure the
connectors states are in sync when switching back to irq.

Without this, no irq will be triggered and the hpd change will be lost.

Signed-off-by: Paul Kocialkowski <paul.kocialkowski@linux.intel.com>
---
 drivers/gpu/drm/i915/intel_hotplug.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/intel_hotplug.c b/drivers/gpu/drm/i915/intel_hotplug.c
index f1200272a699..29f55480b0bb 100644
--- a/drivers/gpu/drm/i915/intel_hotplug.c
+++ b/drivers/gpu/drm/i915/intel_hotplug.c
@@ -218,9 +218,13 @@ static void intel_hpd_irq_storm_reenable_work(struct work_struct *work)
 			struct intel_connector *intel_connector = to_intel_connector(connector);
 
 			if (intel_connector->encoder->hpd_pin == i) {
-				if (connector->polled != intel_connector->polled)
+				if (connector->polled != intel_connector->polled) {
 					DRM_DEBUG_DRIVER("Reenabling HPD on connector %s\n",
 							 connector->name);
+
+					dev_priv->hotplug.event_bits |= (1 << i);
+				}
+
 				connector->polled = intel_connector->polled;
 				if (!connector->polled)
 					connector->polled = DRM_CONNECTOR_POLL_HPD;
@@ -232,6 +236,8 @@ static void intel_hpd_irq_storm_reenable_work(struct work_struct *work)
 		dev_priv->display.hpd_irq_setup(dev_priv);
 	spin_unlock_irq(&dev_priv->irq_lock);
 
+	schedule_work(&dev_priv->hotplug.hotplug_work);
+
 	intel_runtime_pm_put(dev_priv);
 }
 
-- 
2.13.1

[toc] | [standalone]


Back to top | Article view | linux.kernel


csiph-web