We already have a vfunc for this (and other parts of the hpd storm
handling code already use it).

v2: Rebase on top of the i965g/gm sdvo hpd fix.

Cc: Egbert Eich <e...@suse.de>
Reviewed-by: Egbert Eich <e...@suse.de>
Reviewed-by: Paulo Zanoni <paulo.r.zan...@intel.com>
Signed-off-by: Daniel Vetter <daniel.vet...@ffwll.ch>
---
 drivers/gpu/drm/i915/i915_irq.c | 29 +++++++++++------------------
 1 file changed, 11 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 2d0d786..b9e6628 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -79,9 +79,6 @@ static const u32 hpd_status_i915[] = { /* i915 and valleyview 
are the same */
        [HPD_PORT_D] = PORTD_HOTPLUG_INT_STATUS
 };
 
-static void ibx_hpd_irq_setup(struct drm_device *dev);
-static void i915_hpd_irq_setup(struct drm_device *dev);
-
 /* For display hotplug interrupt */
 static void
 ironlake_enable_display_irq(drm_i915_private_t *dev_priv, u32 mask)
@@ -879,14 +876,14 @@ static void gen6_queue_rps_work(struct drm_i915_private 
*dev_priv,
 #define HPD_STORM_DETECT_PERIOD 1000
 #define HPD_STORM_THRESHOLD 5
 
-static inline bool intel_hpd_irq_handler(struct drm_device *dev,
+static inline void intel_hpd_irq_handler(struct drm_device *dev,
                                         u32 hotplug_trigger,
                                         const u32 *hpd)
 {
        drm_i915_private_t *dev_priv = dev->dev_private;
        unsigned long irqflags;
        int i;
-       bool ret = false;
+       bool storm_detected = false;
 
        spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
 
@@ -906,7 +903,7 @@ static inline bool intel_hpd_irq_handler(struct drm_device 
*dev,
                        dev_priv->hpd_stats[i].hpd_mark = HPD_MARK_DISABLED;
                        dev_priv->hpd_event_bits &= ~(1 << i);
                        DRM_DEBUG_KMS("HPD interrupt storm detected on PIN 
%d\n", i);
-                       ret = true;
+                       storm_detected = true;
                } else {
                        dev_priv->hpd_stats[i].hpd_cnt++;
                }
@@ -914,7 +911,8 @@ static inline bool intel_hpd_irq_handler(struct drm_device 
*dev,
 
        spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
 
-       return ret;
+       if (storm_detected)
+               dev_priv->display.hpd_irq_setup(dev);
 }
 
 static void gmbus_irq_handler(struct drm_device *dev)
@@ -1022,8 +1020,7 @@ static irqreturn_t valleyview_irq_handler(int irq, void 
*arg)
                        DRM_DEBUG_DRIVER("hotplug event received, stat 
0x%08x\n",
                                         hotplug_status);
                        if (hotplug_trigger) {
-                               if (intel_hpd_irq_handler(dev, hotplug_trigger, 
hpd_status_i915))
-                                       i915_hpd_irq_setup(dev);
+                               intel_hpd_irq_handler(dev, hotplug_trigger, 
hpd_status_i915);
                                queue_work(dev_priv->wq,
                                           &dev_priv->hotplug_work);
                        }
@@ -1053,8 +1050,7 @@ static void ibx_irq_handler(struct drm_device *dev, u32 
pch_iir)
        u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK;
 
        if (hotplug_trigger) {
-               if (intel_hpd_irq_handler(dev, hotplug_trigger, hpd_ibx))
-                       ibx_hpd_irq_setup(dev);
+               intel_hpd_irq_handler(dev, hotplug_trigger, hpd_ibx);
                queue_work(dev_priv->wq, &dev_priv->hotplug_work);
        }
        if (pch_iir & SDE_AUDIO_POWER_MASK) {
@@ -1158,8 +1154,7 @@ static void cpt_irq_handler(struct drm_device *dev, u32 
pch_iir)
        u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_CPT;
 
        if (hotplug_trigger) {
-               if (intel_hpd_irq_handler(dev, hotplug_trigger, hpd_cpt))
-                       ibx_hpd_irq_setup(dev);
+               intel_hpd_irq_handler(dev, hotplug_trigger, hpd_cpt);
                queue_work(dev_priv->wq, &dev_priv->hotplug_work);
        }
        if (pch_iir & SDE_AUDIO_POWER_MASK_CPT) {
@@ -3242,8 +3237,7 @@ static irqreturn_t i915_irq_handler(int irq, void *arg)
                        DRM_DEBUG_DRIVER("hotplug event received, stat 
0x%08x\n",
                                  hotplug_status);
                        if (hotplug_trigger) {
-                               if (intel_hpd_irq_handler(dev, hotplug_trigger, 
hpd_status_i915))
-                                       i915_hpd_irq_setup(dev);
+                               intel_hpd_irq_handler(dev, hotplug_trigger, 
hpd_status_i915);
                                queue_work(dev_priv->wq,
                                           &dev_priv->hotplug_work);
                        }
@@ -3488,9 +3482,8 @@ static irqreturn_t i965_irq_handler(int irq, void *arg)
                        DRM_DEBUG_DRIVER("hotplug event received, stat 
0x%08x\n",
                                  hotplug_status);
                        if (hotplug_trigger) {
-                               if (intel_hpd_irq_handler(dev, hotplug_trigger,
-                                                           IS_G4X(dev) ? 
hpd_status_gen4 : hpd_status_i915))
-                                       i915_hpd_irq_setup(dev);
+                               intel_hpd_irq_handler(dev, hotplug_trigger,
+                                                     IS_G4X(dev) ? 
hpd_status_gen4 : hpd_status_i915);
                                queue_work(dev_priv->wq,
                                           &dev_priv->hotplug_work);
                        }
-- 
1.8.1.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to