aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_pm.c
diff options
context:
space:
mode:
authorPaulo Zanoni <paulo.r.zanoni@intel.com>2013-12-11 15:50:09 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-12-12 07:28:22 -0500
commitd5e8fdc8c10bdff9b8af9cc8b25607ae71e26d3b (patch)
tree71885ee02fba664e8e278afdeed9843131b63a58 /drivers/gpu/drm/i915/intel_pm.c
parentb664607480ace4c13c946dee6a1c0e72a2d0d48e (diff)
drm/i915: extract hsw_power_well_post_{enable, disable}
I want to add more code to the post_enable function. Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Reviewed-by: Damien Lespiau <damien.lespiau@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c75
1 files changed, 44 insertions, 31 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 2590a5c90725..d8fb00a2b565 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -5681,12 +5681,53 @@ bool intel_display_power_enabled(struct drm_device *dev,
5681 return is_enabled; 5681 return is_enabled;
5682} 5682}
5683 5683
5684static void hsw_power_well_post_enable(struct drm_i915_private *dev_priv)
5685{
5686 struct drm_device *dev = dev_priv->dev;
5687 unsigned long irqflags;
5688
5689 if (IS_BROADWELL(dev)) {
5690 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
5691 I915_WRITE(GEN8_DE_PIPE_IMR(PIPE_B),
5692 dev_priv->de_irq_mask[PIPE_B]);
5693 I915_WRITE(GEN8_DE_PIPE_IER(PIPE_B),
5694 ~dev_priv->de_irq_mask[PIPE_B] |
5695 GEN8_PIPE_VBLANK);
5696 I915_WRITE(GEN8_DE_PIPE_IMR(PIPE_C),
5697 dev_priv->de_irq_mask[PIPE_C]);
5698 I915_WRITE(GEN8_DE_PIPE_IER(PIPE_C),
5699 ~dev_priv->de_irq_mask[PIPE_C] |
5700 GEN8_PIPE_VBLANK);
5701 POSTING_READ(GEN8_DE_PIPE_IER(PIPE_C));
5702 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
5703 }
5704}
5705
5706static void hsw_power_well_post_disable(struct drm_i915_private *dev_priv)
5707{
5708 struct drm_device *dev = dev_priv->dev;
5709 enum pipe p;
5710 unsigned long irqflags;
5711
5712 /*
5713 * After this, the registers on the pipes that are part of the power
5714 * well will become zero, so we have to adjust our counters according to
5715 * that.
5716 *
5717 * FIXME: Should we do this in general in drm_vblank_post_modeset?
5718 */
5719 spin_lock_irqsave(&dev->vbl_lock, irqflags);
5720 for_each_pipe(p)
5721 if (p != PIPE_A)
5722 dev->vblank[p].last = 0;
5723 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
5724}
5725
5684static void hsw_set_power_well(struct drm_device *dev, 5726static void hsw_set_power_well(struct drm_device *dev,
5685 struct i915_power_well *power_well, bool enable) 5727 struct i915_power_well *power_well, bool enable)
5686{ 5728{
5687 struct drm_i915_private *dev_priv = dev->dev_private; 5729 struct drm_i915_private *dev_priv = dev->dev_private;
5688 bool is_enabled, enable_requested; 5730 bool is_enabled, enable_requested;
5689 unsigned long irqflags;
5690 uint32_t tmp; 5731 uint32_t tmp;
5691 5732
5692 WARN_ON(dev_priv->pc8.enabled); 5733 WARN_ON(dev_priv->pc8.enabled);
@@ -5707,42 +5748,14 @@ static void hsw_set_power_well(struct drm_device *dev,
5707 DRM_ERROR("Timeout enabling power well\n"); 5748 DRM_ERROR("Timeout enabling power well\n");
5708 } 5749 }
5709 5750
5710 if (IS_BROADWELL(dev)) { 5751 hsw_power_well_post_enable(dev_priv);
5711 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
5712 I915_WRITE(GEN8_DE_PIPE_IMR(PIPE_B),
5713 dev_priv->de_irq_mask[PIPE_B]);
5714 I915_WRITE(GEN8_DE_PIPE_IER(PIPE_B),
5715 ~dev_priv->de_irq_mask[PIPE_B] |
5716 GEN8_PIPE_VBLANK);
5717 I915_WRITE(GEN8_DE_PIPE_IMR(PIPE_C),
5718 dev_priv->de_irq_mask[PIPE_C]);
5719 I915_WRITE(GEN8_DE_PIPE_IER(PIPE_C),
5720 ~dev_priv->de_irq_mask[PIPE_C] |
5721 GEN8_PIPE_VBLANK);
5722 POSTING_READ(GEN8_DE_PIPE_IER(PIPE_C));
5723 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
5724 }
5725 } else { 5752 } else {
5726 if (enable_requested) { 5753 if (enable_requested) {
5727 enum pipe p;
5728
5729 I915_WRITE(HSW_PWR_WELL_DRIVER, 0); 5754 I915_WRITE(HSW_PWR_WELL_DRIVER, 0);
5730 POSTING_READ(HSW_PWR_WELL_DRIVER); 5755 POSTING_READ(HSW_PWR_WELL_DRIVER);
5731 DRM_DEBUG_KMS("Requesting to disable the power well\n"); 5756 DRM_DEBUG_KMS("Requesting to disable the power well\n");
5732 5757
5733 /* 5758 hsw_power_well_post_disable(dev_priv);
5734 * After this, the registers on the pipes that are part
5735 * of the power well will become zero, so we have to
5736 * adjust our counters according to that.
5737 *
5738 * FIXME: Should we do this in general in
5739 * drm_vblank_post_modeset?
5740 */
5741 spin_lock_irqsave(&dev->vbl_lock, irqflags);
5742 for_each_pipe(p)
5743 if (p != PIPE_A)
5744 dev->vblank[p].last = 0;
5745 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
5746 } 5759 }
5747 } 5760 }
5748} 5761}