diff options
author | Paulo Zanoni <paulo.r.zanoni@intel.com> | 2013-08-06 17:57:16 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-08-23 08:52:28 -0400 |
commit | 333a820416ccb0e24974b6ebe7d447c0c28c7b76 (patch) | |
tree | 01b1d97d806e61d766f70db274716754a27d1ed9 | |
parent | 605cd25b1ffa09a2f86b5c4bd120086dd5ea10a7 (diff) |
drm/i915: don't disable/reenable IVB error interrupts when not needed
If the error interrupts are already disabled, don't disable and
reenable them. This is going to be needed when we're in PC8+, where
all the interrupts are disabled so we won't risk re-enabling
DE_ERR_INT_IVB.
v2: Use dev_priv->irq_mask (Chris)
Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 8872e1955c45..976113af1859 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -1373,6 +1373,7 @@ static irqreturn_t ironlake_irq_handler(int irq, void *arg) | |||
1373 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1373 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
1374 | u32 de_iir, gt_iir, de_ier, sde_ier = 0; | 1374 | u32 de_iir, gt_iir, de_ier, sde_ier = 0; |
1375 | irqreturn_t ret = IRQ_NONE; | 1375 | irqreturn_t ret = IRQ_NONE; |
1376 | bool err_int_reenable = false; | ||
1376 | 1377 | ||
1377 | atomic_inc(&dev_priv->irq_received); | 1378 | atomic_inc(&dev_priv->irq_received); |
1378 | 1379 | ||
@@ -1401,7 +1402,9 @@ static irqreturn_t ironlake_irq_handler(int irq, void *arg) | |||
1401 | * handler. */ | 1402 | * handler. */ |
1402 | if (IS_HASWELL(dev)) { | 1403 | if (IS_HASWELL(dev)) { |
1403 | spin_lock(&dev_priv->irq_lock); | 1404 | spin_lock(&dev_priv->irq_lock); |
1404 | ironlake_disable_display_irq(dev_priv, DE_ERR_INT_IVB); | 1405 | err_int_reenable = ~dev_priv->irq_mask & DE_ERR_INT_IVB; |
1406 | if (err_int_reenable) | ||
1407 | ironlake_disable_display_irq(dev_priv, DE_ERR_INT_IVB); | ||
1405 | spin_unlock(&dev_priv->irq_lock); | 1408 | spin_unlock(&dev_priv->irq_lock); |
1406 | } | 1409 | } |
1407 | 1410 | ||
@@ -1437,7 +1440,7 @@ static irqreturn_t ironlake_irq_handler(int irq, void *arg) | |||
1437 | } | 1440 | } |
1438 | } | 1441 | } |
1439 | 1442 | ||
1440 | if (IS_HASWELL(dev)) { | 1443 | if (err_int_reenable) { |
1441 | spin_lock(&dev_priv->irq_lock); | 1444 | spin_lock(&dev_priv->irq_lock); |
1442 | if (ivb_can_enable_err_int(dev)) | 1445 | if (ivb_can_enable_err_int(dev)) |
1443 | ironlake_enable_display_irq(dev_priv, DE_ERR_INT_IVB); | 1446 | ironlake_enable_display_irq(dev_priv, DE_ERR_INT_IVB); |