aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-05-09 16:45:43 -0400
committerLuis Henriques <luis.henriques@canonical.com>2012-06-12 05:59:15 -0400
commit3172ebe1d27b354f7b9c7c9e877f8233d90031a7 (patch)
treebbe32d862f4cc2bcb447d9ce62b8652f42af172b /drivers
parent2dfabd0d3606dc3c0f3e017032fef17ed5f79715 (diff)
drm/i915: Avoid a double-read of PCH_IIR during interrupt handling
BugLink: http://bugs.launchpad.net/bugs/1008697 commit 9adab8b5a7fde248504f484e197589f3e3c922e2 upstream. Currently the code re-reads PCH_IIR during the hotplug interrupt processing. Not only is this a wasted read, but introduces a potential for handling a spurious interrupt as we then may not clear all the interrupts processed (since the re-read IIR may contains more interrupts asserted than we clear using the result of the original read). Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c9
1 files changed, 3 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 997db7fab21..d05f03c6284 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -422,14 +422,11 @@ static void gen6_pm_rps_work(struct work_struct *work)
422 mutex_unlock(&dev_priv->dev->struct_mutex); 422 mutex_unlock(&dev_priv->dev->struct_mutex);
423} 423}
424 424
425static void pch_irq_handler(struct drm_device *dev) 425static void pch_irq_handler(struct drm_device *dev, u32 pch_iir)
426{ 426{
427 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 427 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
428 u32 pch_iir;
429 int pipe; 428 int pipe;
430 429
431 pch_iir = I915_READ(SDEIIR);
432
433 if (pch_iir & SDE_AUDIO_POWER_MASK) 430 if (pch_iir & SDE_AUDIO_POWER_MASK)
434 DRM_DEBUG_DRIVER("PCH audio power change on port %d\n", 431 DRM_DEBUG_DRIVER("PCH audio power change on port %d\n",
435 (pch_iir & SDE_AUDIO_POWER_MASK) >> 432 (pch_iir & SDE_AUDIO_POWER_MASK) >>
@@ -527,7 +524,7 @@ static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS)
527 if (de_iir & DE_PCH_EVENT_IVB) { 524 if (de_iir & DE_PCH_EVENT_IVB) {
528 if (pch_iir & SDE_HOTPLUG_MASK_CPT) 525 if (pch_iir & SDE_HOTPLUG_MASK_CPT)
529 queue_work(dev_priv->wq, &dev_priv->hotplug_work); 526 queue_work(dev_priv->wq, &dev_priv->hotplug_work);
530 pch_irq_handler(dev); 527 pch_irq_handler(dev, pch_iir);
531 } 528 }
532 529
533 if (pm_iir & GEN6_PM_DEFERRED_EVENTS) { 530 if (pm_iir & GEN6_PM_DEFERRED_EVENTS) {
@@ -626,7 +623,7 @@ static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS)
626 if (de_iir & DE_PCH_EVENT) { 623 if (de_iir & DE_PCH_EVENT) {
627 if (pch_iir & hotplug_mask) 624 if (pch_iir & hotplug_mask)
628 queue_work(dev_priv->wq, &dev_priv->hotplug_work); 625 queue_work(dev_priv->wq, &dev_priv->hotplug_work);
629 pch_irq_handler(dev); 626 pch_irq_handler(dev, pch_iir);
630 } 627 }
631 628
632 if (de_iir & DE_PCU_EVENT) { 629 if (de_iir & DE_PCU_EVENT) {