diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-05-09 16:45:43 -0400 |
---|---|---|
committer | Luis Henriques <luis.henriques@canonical.com> | 2012-06-12 05:59:15 -0400 |
commit | 3172ebe1d27b354f7b9c7c9e877f8233d90031a7 (patch) | |
tree | bbe32d862f4cc2bcb447d9ce62b8652f42af172b /drivers | |
parent | 2dfabd0d3606dc3c0f3e017032fef17ed5f79715 (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.c | 9 |
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 | ||
425 | static void pch_irq_handler(struct drm_device *dev) | 425 | static 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) { |