aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Widawsky <benjamin.widawsky@intel.com>2013-11-11 17:46:28 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-11-14 03:33:12 -0500
commit596cc11e7a4a89bf6c45f955402d0bd0c7d51f13 (patch)
tree172fe238de946a2f8d6f2f09bce5db622decf33f
parent3a2ffb65eec6dbda2fd8151894f51c18b42c8d41 (diff)
drm/i915/bdw: PIPE_[BC] I[ME]R moved to powerwell
The pipe B and pipe C interrupt mask and enable registers are now part of the pipe, so disabling the pipe power wells will lost the contests of the registers. Art totally debugged this one! v2: Use the irq_lock to clarify code, and prevent future bugs (Daniel) Cc: Art Runyan <arthur.j.runyan@intel.com> Cc: Paulo Zanoni <paulo.r.zanoni@intel.com> Signed-off-by: Ben Widawsky <ben@bwidawsk.net> [danvet: Make sparse happy.] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 0a07d7c9cafc..33a8dbe64039 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -5684,6 +5684,7 @@ static void __intel_set_power_well(struct drm_device *dev, bool enable)
5684{ 5684{
5685 struct drm_i915_private *dev_priv = dev->dev_private; 5685 struct drm_i915_private *dev_priv = dev->dev_private;
5686 bool is_enabled, enable_requested; 5686 bool is_enabled, enable_requested;
5687 unsigned long irqflags;
5687 uint32_t tmp; 5688 uint32_t tmp;
5688 5689
5689 tmp = I915_READ(HSW_PWR_WELL_DRIVER); 5690 tmp = I915_READ(HSW_PWR_WELL_DRIVER);
@@ -5701,9 +5702,24 @@ static void __intel_set_power_well(struct drm_device *dev, bool enable)
5701 HSW_PWR_WELL_STATE_ENABLED), 20)) 5702 HSW_PWR_WELL_STATE_ENABLED), 20))
5702 DRM_ERROR("Timeout enabling power well\n"); 5703 DRM_ERROR("Timeout enabling power well\n");
5703 } 5704 }
5705
5706 if (IS_BROADWELL(dev)) {
5707 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
5708 I915_WRITE(GEN8_DE_PIPE_IMR(PIPE_B),
5709 dev_priv->de_irq_mask[PIPE_B]);
5710 I915_WRITE(GEN8_DE_PIPE_IER(PIPE_B),
5711 ~dev_priv->de_irq_mask[PIPE_B] |
5712 GEN8_PIPE_VBLANK);
5713 I915_WRITE(GEN8_DE_PIPE_IMR(PIPE_C),
5714 dev_priv->de_irq_mask[PIPE_C]);
5715 I915_WRITE(GEN8_DE_PIPE_IER(PIPE_C),
5716 ~dev_priv->de_irq_mask[PIPE_C] |
5717 GEN8_PIPE_VBLANK);
5718 POSTING_READ(GEN8_DE_PIPE_IER(PIPE_C));
5719 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
5720 }
5704 } else { 5721 } else {
5705 if (enable_requested) { 5722 if (enable_requested) {
5706 unsigned long irqflags;
5707 enum pipe p; 5723 enum pipe p;
5708 5724
5709 I915_WRITE(HSW_PWR_WELL_DRIVER, 0); 5725 I915_WRITE(HSW_PWR_WELL_DRIVER, 0);