diff options
author | Imre Deak <imre.deak@intel.com> | 2014-04-14 13:24:41 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2014-05-05 03:09:11 -0400 |
commit | 4e80519e31b76cb6bd9d62eee95d6555bce1bc10 (patch) | |
tree | 9895cba1b877de49d57f380b60ac2f456d170675 | |
parent | 9486db611ca69ea67b6f4285fbb8afeb34585571 (diff) |
drm/i915: vlv: setup RPS min/max frequencies once during init time
When enabling runtime PM on VLV, GT power save enabling becomes relatively
frequent, so optimize it a bit.
Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 66 |
1 files changed, 41 insertions, 25 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index ee6c568bcd14..2b200434897d 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -3701,6 +3701,45 @@ static void valleyview_cleanup_pctx(struct drm_device *dev) | |||
3701 | dev_priv->vlv_pctx = NULL; | 3701 | dev_priv->vlv_pctx = NULL; |
3702 | } | 3702 | } |
3703 | 3703 | ||
3704 | static void valleyview_init_gt_powersave(struct drm_device *dev) | ||
3705 | { | ||
3706 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
3707 | |||
3708 | valleyview_setup_pctx(dev); | ||
3709 | |||
3710 | mutex_lock(&dev_priv->rps.hw_lock); | ||
3711 | |||
3712 | dev_priv->rps.max_freq = valleyview_rps_max_freq(dev_priv); | ||
3713 | dev_priv->rps.rp0_freq = dev_priv->rps.max_freq; | ||
3714 | DRM_DEBUG_DRIVER("max GPU freq: %d MHz (%u)\n", | ||
3715 | vlv_gpu_freq(dev_priv, dev_priv->rps.max_freq), | ||
3716 | dev_priv->rps.max_freq); | ||
3717 | |||
3718 | dev_priv->rps.efficient_freq = valleyview_rps_rpe_freq(dev_priv); | ||
3719 | DRM_DEBUG_DRIVER("RPe GPU freq: %d MHz (%u)\n", | ||
3720 | vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq), | ||
3721 | dev_priv->rps.efficient_freq); | ||
3722 | |||
3723 | dev_priv->rps.min_freq = valleyview_rps_min_freq(dev_priv); | ||
3724 | DRM_DEBUG_DRIVER("min GPU freq: %d MHz (%u)\n", | ||
3725 | vlv_gpu_freq(dev_priv, dev_priv->rps.min_freq), | ||
3726 | dev_priv->rps.min_freq); | ||
3727 | |||
3728 | /* Preserve min/max settings in case of re-init */ | ||
3729 | if (dev_priv->rps.max_freq_softlimit == 0) | ||
3730 | dev_priv->rps.max_freq_softlimit = dev_priv->rps.max_freq; | ||
3731 | |||
3732 | if (dev_priv->rps.min_freq_softlimit == 0) | ||
3733 | dev_priv->rps.min_freq_softlimit = dev_priv->rps.min_freq; | ||
3734 | |||
3735 | mutex_unlock(&dev_priv->rps.hw_lock); | ||
3736 | } | ||
3737 | |||
3738 | static void valleyview_cleanup_gt_powersave(struct drm_device *dev) | ||
3739 | { | ||
3740 | valleyview_cleanup_pctx(dev); | ||
3741 | } | ||
3742 | |||
3704 | static void valleyview_enable_rps(struct drm_device *dev) | 3743 | static void valleyview_enable_rps(struct drm_device *dev) |
3705 | { | 3744 | { |
3706 | struct drm_i915_private *dev_priv = dev->dev_private; | 3745 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -3767,29 +3806,6 @@ static void valleyview_enable_rps(struct drm_device *dev) | |||
3767 | vlv_gpu_freq(dev_priv, dev_priv->rps.cur_freq), | 3806 | vlv_gpu_freq(dev_priv, dev_priv->rps.cur_freq), |
3768 | dev_priv->rps.cur_freq); | 3807 | dev_priv->rps.cur_freq); |
3769 | 3808 | ||
3770 | dev_priv->rps.max_freq = valleyview_rps_max_freq(dev_priv); | ||
3771 | dev_priv->rps.rp0_freq = dev_priv->rps.max_freq; | ||
3772 | DRM_DEBUG_DRIVER("max GPU freq: %d MHz (%u)\n", | ||
3773 | vlv_gpu_freq(dev_priv, dev_priv->rps.max_freq), | ||
3774 | dev_priv->rps.max_freq); | ||
3775 | |||
3776 | dev_priv->rps.efficient_freq = valleyview_rps_rpe_freq(dev_priv); | ||
3777 | DRM_DEBUG_DRIVER("RPe GPU freq: %d MHz (%u)\n", | ||
3778 | vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq), | ||
3779 | dev_priv->rps.efficient_freq); | ||
3780 | |||
3781 | dev_priv->rps.min_freq = valleyview_rps_min_freq(dev_priv); | ||
3782 | DRM_DEBUG_DRIVER("min GPU freq: %d MHz (%u)\n", | ||
3783 | vlv_gpu_freq(dev_priv, dev_priv->rps.min_freq), | ||
3784 | dev_priv->rps.min_freq); | ||
3785 | |||
3786 | /* Preserve min/max settings in case of re-init */ | ||
3787 | if (dev_priv->rps.max_freq_softlimit == 0) | ||
3788 | dev_priv->rps.max_freq_softlimit = dev_priv->rps.max_freq; | ||
3789 | |||
3790 | if (dev_priv->rps.min_freq_softlimit == 0) | ||
3791 | dev_priv->rps.min_freq_softlimit = dev_priv->rps.min_freq; | ||
3792 | |||
3793 | DRM_DEBUG_DRIVER("setting GPU freq to %d MHz (%u)\n", | 3809 | DRM_DEBUG_DRIVER("setting GPU freq to %d MHz (%u)\n", |
3794 | vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq), | 3810 | vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq), |
3795 | dev_priv->rps.efficient_freq); | 3811 | dev_priv->rps.efficient_freq); |
@@ -4533,13 +4549,13 @@ void intel_init_gt_powersave(struct drm_device *dev) | |||
4533 | i915.enable_rc6 = sanitize_rc6_option(dev, i915.enable_rc6); | 4549 | i915.enable_rc6 = sanitize_rc6_option(dev, i915.enable_rc6); |
4534 | 4550 | ||
4535 | if (IS_VALLEYVIEW(dev)) | 4551 | if (IS_VALLEYVIEW(dev)) |
4536 | valleyview_setup_pctx(dev); | 4552 | valleyview_init_gt_powersave(dev); |
4537 | } | 4553 | } |
4538 | 4554 | ||
4539 | void intel_cleanup_gt_powersave(struct drm_device *dev) | 4555 | void intel_cleanup_gt_powersave(struct drm_device *dev) |
4540 | { | 4556 | { |
4541 | if (IS_VALLEYVIEW(dev)) | 4557 | if (IS_VALLEYVIEW(dev)) |
4542 | valleyview_cleanup_pctx(dev); | 4558 | valleyview_cleanup_gt_powersave(dev); |
4543 | } | 4559 | } |
4544 | 4560 | ||
4545 | void intel_disable_gt_powersave(struct drm_device *dev) | 4561 | void intel_disable_gt_powersave(struct drm_device *dev) |