aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaulo Zanoni <paulo.r.zanoni@intel.com>2013-09-19 16:00:36 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-09-20 04:08:15 -0400
commit6ceeeec04509ac40f91cfc8ffc129e22a136aafe (patch)
tree5ce26309ff0c829d0b03ea17b95c473d46530eea
parent5ffd494b8e88250d922db91037b4df676cb679a2 (diff)
drm/i915: don't disable ERR_INT on the IRQ handler
We currently disable the ERR_INT interrupts while running the IRQ handler because we fear that if we do an unclaimed register access from inside the IRQ handler we'll keep triggering the IRQ handler forever. The problem is that since we always disable the ERR_INT interrupts at the IRQ handler, when we get a FIFO underrun we'll always print both messages: - "uncleared fifo underrun on pipe A" - "Pipe A FIFO underrun" Because the "was_enabled" variable from ivybridge_set_fifo_underrun_reporting will always be false (since we disable ERR int at the IRQ handler!). Instead of actually fixing ivybridge_set_fifo_underrun_reporting, let's just remove the "disable ERR_INT during the IRQ handler" code. As far as we know we shouldn't really be triggering ERR_INT interrupts from the IRQ handler, so if we ever get stuck in the endless loop of interrupts we can git-bisect and revert (and we can even bisect and revert this patch in case I'm just wrong). As a bonus, our IRQ handler is now simpler and a few nanoseconds faster. Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c19
1 files changed, 0 insertions, 19 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index a73e84716939..a9233e2d48af 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1421,7 +1421,6 @@ static irqreturn_t ironlake_irq_handler(int irq, void *arg)
1421 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1421 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1422 u32 de_iir, gt_iir, de_ier, sde_ier = 0; 1422 u32 de_iir, gt_iir, de_ier, sde_ier = 0;
1423 irqreturn_t ret = IRQ_NONE; 1423 irqreturn_t ret = IRQ_NONE;
1424 bool err_int_reenable = false;
1425 1424
1426 atomic_inc(&dev_priv->irq_received); 1425 atomic_inc(&dev_priv->irq_received);
1427 1426
@@ -1445,17 +1444,6 @@ static irqreturn_t ironlake_irq_handler(int irq, void *arg)
1445 POSTING_READ(SDEIER); 1444 POSTING_READ(SDEIER);
1446 } 1445 }
1447 1446
1448 /* On Haswell, also mask ERR_INT because we don't want to risk
1449 * generating "unclaimed register" interrupts from inside the interrupt
1450 * handler. */
1451 if (IS_HASWELL(dev)) {
1452 spin_lock(&dev_priv->irq_lock);
1453 err_int_reenable = ~dev_priv->irq_mask & DE_ERR_INT_IVB;
1454 if (err_int_reenable)
1455 ironlake_disable_display_irq(dev_priv, DE_ERR_INT_IVB);
1456 spin_unlock(&dev_priv->irq_lock);
1457 }
1458
1459 gt_iir = I915_READ(GTIIR); 1447 gt_iir = I915_READ(GTIIR);
1460 if (gt_iir) { 1448 if (gt_iir) {
1461 if (INTEL_INFO(dev)->gen >= 6) 1449 if (INTEL_INFO(dev)->gen >= 6)
@@ -1485,13 +1473,6 @@ static irqreturn_t ironlake_irq_handler(int irq, void *arg)
1485 } 1473 }
1486 } 1474 }
1487 1475
1488 if (err_int_reenable) {
1489 spin_lock(&dev_priv->irq_lock);
1490 if (ivb_can_enable_err_int(dev))
1491 ironlake_enable_display_irq(dev_priv, DE_ERR_INT_IVB);
1492 spin_unlock(&dev_priv->irq_lock);
1493 }
1494
1495 I915_WRITE(DEIER, de_ier); 1476 I915_WRITE(DEIER, de_ier);
1496 POSTING_READ(DEIER); 1477 POSTING_READ(DEIER);
1497 if (!HAS_PCH_NOP(dev)) { 1478 if (!HAS_PCH_NOP(dev)) {