drm/i915/chv: Make CHV irq handler loop until all interrupts are consumed
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 9 Apr 2014 10:28:50 +0000 (13:28 +0300)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 20 May 2014 13:30:07 +0000 (15:30 +0200)
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Antti Koskipää <antti.koskipaa@linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_irq.c

index 4811908ee5510b1ee12c0c76789353217f1f3560..787ad93c5fa516d669a802853922152fc0b5d536 100644 (file)
@@ -1787,30 +1787,29 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
        u32 master_ctl, iir;
        irqreturn_t ret = IRQ_NONE;
 
-       master_ctl = I915_READ(GEN8_MASTER_IRQ) & ~DE_MASTER_IRQ_CONTROL;
-       iir = I915_READ(VLV_IIR);
+       for (;;) {
+               master_ctl = I915_READ(GEN8_MASTER_IRQ) & ~GEN8_MASTER_IRQ_CONTROL;
+               iir = I915_READ(VLV_IIR);
 
-       if (master_ctl == 0 && iir == 0)
-               return IRQ_NONE;
+               if (master_ctl == 0 && iir == 0)
+                       break;
 
-       I915_WRITE(GEN8_MASTER_IRQ, 0);
+               I915_WRITE(GEN8_MASTER_IRQ, 0);
 
-       gen8_gt_irq_handler(dev, dev_priv, master_ctl);
+               gen8_gt_irq_handler(dev, dev_priv, master_ctl);
 
-       valleyview_pipestat_irq_handler(dev, iir);
+               valleyview_pipestat_irq_handler(dev, iir);
 
-       /* Consume port.  Then clear IIR or we'll miss events */
-       if (iir & I915_DISPLAY_PORT_INTERRUPT) {
+               /* Consume port.  Then clear IIR or we'll miss events */
                i9xx_hpd_irq_handler(dev);
-               ret = IRQ_HANDLED;
-       }
 
-       I915_WRITE(VLV_IIR, iir);
+               I915_WRITE(VLV_IIR, iir);
 
-       I915_WRITE(GEN8_MASTER_IRQ, DE_MASTER_IRQ_CONTROL);
-       POSTING_READ(GEN8_MASTER_IRQ);
+               I915_WRITE(GEN8_MASTER_IRQ, DE_MASTER_IRQ_CONTROL);
+               POSTING_READ(GEN8_MASTER_IRQ);
 
-       ret = IRQ_HANDLED;
+               ret = IRQ_HANDLED;
+       }
 
        return ret;
 }