diff options
| author | Ben Widawsky <benjamin.widawsky@intel.com> | 2013-11-11 17:46:28 -0500 |
|---|---|---|
| committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-11-14 03:33:12 -0500 |
| commit | 596cc11e7a4a89bf6c45f955402d0bd0c7d51f13 (patch) | |
| tree | 172fe238de946a2f8d6f2f09bce5db622decf33f | |
| parent | 3a2ffb65eec6dbda2fd8151894f51c18b42c8d41 (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.c | 18 |
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); |
