diff options
author | Paulo Zanoni <paulo.r.zanoni@intel.com> | 2013-12-11 15:50:09 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-12-12 07:28:22 -0500 |
commit | d5e8fdc8c10bdff9b8af9cc8b25607ae71e26d3b (patch) | |
tree | 71885ee02fba664e8e278afdeed9843131b63a58 /drivers/gpu/drm/i915/intel_pm.c | |
parent | b664607480ace4c13c946dee6a1c0e72a2d0d48e (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.c | 75 |
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 | ||
5684 | static 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 | |||
5706 | static 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 | |||
5684 | static void hsw_set_power_well(struct drm_device *dev, | 5726 | static 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 | } |