diff options
author | Jesse Barnes <jbarnes@virtuousgeek.org> | 2010-01-29 14:27:07 -0500 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2010-02-22 11:46:54 -0500 |
commit | f97108d1d0facc7902134ebc453b226bbd4d1cdb (patch) | |
tree | 563d14cb7c65b80e16df9246da25cade22f22fdd /drivers/gpu/drm/i915/i915_suspend.c | |
parent | ee980b8003a25fbfed50c3367f2b426c870eaf90 (diff) |
drm/i915: add dynamic performance control support for Ironlake
Ironlake (and 965GM, which this patch doesn't support) supports a
hardware performance and power management feature that allows it to
adjust to changes in GPU load over time with software help. The goal
if this is to maximize performance/power for a given workload.
This patch enables that feature, which is also a requirement for
supporting Intelligent Power Sharing, a feature which allows for
dynamic budgeting of power between the CPU and GPU in Arrandale
platforms.
Tested-by: ykzhao <yakui.zhao@intel.com>
[anholt: Resolved against the irq handler loop removal]
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_suspend.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_suspend.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index a3b90c9561dc..2c346645acfa 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c | |||
@@ -682,6 +682,7 @@ void i915_restore_display(struct drm_device *dev) | |||
682 | I915_WRITE(PCH_PP_OFF_DELAYS, dev_priv->savePP_OFF_DELAYS); | 682 | I915_WRITE(PCH_PP_OFF_DELAYS, dev_priv->savePP_OFF_DELAYS); |
683 | I915_WRITE(PCH_PP_DIVISOR, dev_priv->savePP_DIVISOR); | 683 | I915_WRITE(PCH_PP_DIVISOR, dev_priv->savePP_DIVISOR); |
684 | I915_WRITE(PCH_PP_CONTROL, dev_priv->savePP_CONTROL); | 684 | I915_WRITE(PCH_PP_CONTROL, dev_priv->savePP_CONTROL); |
685 | I915_WRITE(RSTDBYCTL, dev_priv->saveRSTDBYCTL); | ||
685 | } else { | 686 | } else { |
686 | I915_WRITE(PFIT_PGM_RATIOS, dev_priv->savePFIT_PGM_RATIOS); | 687 | I915_WRITE(PFIT_PGM_RATIOS, dev_priv->savePFIT_PGM_RATIOS); |
687 | I915_WRITE(BLC_PWM_CTL, dev_priv->saveBLC_PWM_CTL); | 688 | I915_WRITE(BLC_PWM_CTL, dev_priv->saveBLC_PWM_CTL); |
@@ -745,11 +746,15 @@ int i915_save_state(struct drm_device *dev) | |||
745 | dev_priv->saveGTIMR = I915_READ(GTIMR); | 746 | dev_priv->saveGTIMR = I915_READ(GTIMR); |
746 | dev_priv->saveFDI_RXA_IMR = I915_READ(FDI_RXA_IMR); | 747 | dev_priv->saveFDI_RXA_IMR = I915_READ(FDI_RXA_IMR); |
747 | dev_priv->saveFDI_RXB_IMR = I915_READ(FDI_RXB_IMR); | 748 | dev_priv->saveFDI_RXB_IMR = I915_READ(FDI_RXB_IMR); |
749 | dev_priv->saveRSTDBYCTL = I915_READ(RSTDBYCTL); | ||
748 | } else { | 750 | } else { |
749 | dev_priv->saveIER = I915_READ(IER); | 751 | dev_priv->saveIER = I915_READ(IER); |
750 | dev_priv->saveIMR = I915_READ(IMR); | 752 | dev_priv->saveIMR = I915_READ(IMR); |
751 | } | 753 | } |
752 | 754 | ||
755 | if (IS_IRONLAKE_M(dev)) | ||
756 | ironlake_disable_drps(dev); | ||
757 | |||
753 | /* Cache mode state */ | 758 | /* Cache mode state */ |
754 | dev_priv->saveCACHE_MODE_0 = I915_READ(CACHE_MODE_0); | 759 | dev_priv->saveCACHE_MODE_0 = I915_READ(CACHE_MODE_0); |
755 | 760 | ||
@@ -820,6 +825,9 @@ int i915_restore_state(struct drm_device *dev) | |||
820 | /* Clock gating state */ | 825 | /* Clock gating state */ |
821 | intel_init_clock_gating(dev); | 826 | intel_init_clock_gating(dev); |
822 | 827 | ||
828 | if (IS_IRONLAKE_M(dev)) | ||
829 | ironlake_enable_drps(dev); | ||
830 | |||
823 | /* Cache mode state */ | 831 | /* Cache mode state */ |
824 | I915_WRITE (CACHE_MODE_0, dev_priv->saveCACHE_MODE_0 | 0xffff0000); | 832 | I915_WRITE (CACHE_MODE_0, dev_priv->saveCACHE_MODE_0 | 0xffff0000); |
825 | 833 | ||