aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_pm.c
diff options
context:
space:
mode:
authorDeepak S <deepak.s@linux.intel.com>2015-05-09 08:34:44 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-05-20 05:25:41 -0400
commita7f6e231150c93c4e15f258f0d4b1ffe97da3971 (patch)
treecc9ad0ac41ee2f9b457e46042e5a2b3e3a216b74 /drivers/gpu/drm/i915/intel_pm.c
parentb6e742f652791919ce5c8e05a1d664bcbc5111a6 (diff)
drm/i915/vlv: Remove wait for for punit to updates freq.
When GPU is idle on VLV, Request freq to punit should be good enough to get the voltage back to VNN. Also, make sure gfx clock force applies before requesting the freq fot vlv. v2: Do forcewake before setting idle frequency (ville) Update function comments to match the code (Deepak) v3: Fix get/put across idle frequency Request. (Ville) Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=75244 suggested-by: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: Deepak S <deepak.s@linux.intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.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.c41
1 files changed, 11 insertions, 30 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index f08264ca1d30..d22bba98d83f 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -4097,51 +4097,32 @@ static void valleyview_set_rps(struct drm_device *dev, u8 val)
4097 trace_intel_gpu_freq_change(intel_gpu_freq(dev_priv, val)); 4097 trace_intel_gpu_freq_change(intel_gpu_freq(dev_priv, val));
4098} 4098}
4099 4099
4100/* vlv_set_rps_idle: Set the frequency to Rpn if Gfx clocks are down 4100/* vlv_set_rps_idle: Set the frequency to idle, if Gfx clocks are down
4101 * 4101 *
4102 * * If Gfx is Idle, then 4102 * * If Gfx is Idle, then
4103 * 1. Mask Turbo interrupts 4103 * 1. Forcewake Media well.
4104 * 2. Bring up Gfx clock 4104 * 2. Request idle freq.
4105 * 3. Change the freq to Rpn and wait till P-Unit updates freq 4105 * 3. Release Forcewake of Media well.
4106 * 4. Clear the Force GFX CLK ON bit so that Gfx can down
4107 * 5. Unmask Turbo interrupts
4108*/ 4106*/
4109static void vlv_set_rps_idle(struct drm_i915_private *dev_priv) 4107static void vlv_set_rps_idle(struct drm_i915_private *dev_priv)
4110{ 4108{
4111 struct drm_device *dev = dev_priv->dev; 4109 struct drm_device *dev = dev_priv->dev;
4112 u32 val = dev_priv->rps.idle_freq; 4110 u32 val = dev_priv->rps.idle_freq;
4113 4111
4114 /* CHV and latest VLV don't need to force the gfx clock */ 4112 /* CHV don't need to force the gfx clock */
4115 if (IS_CHERRYVIEW(dev) || dev->pdev->revision >= 0xd) { 4113 if (IS_CHERRYVIEW(dev)) {
4116 valleyview_set_rps(dev_priv->dev, val); 4114 valleyview_set_rps(dev_priv->dev, val);
4117 return; 4115 return;
4118 } 4116 }
4119 4117
4120 /*
4121 * When we are idle. Drop to min voltage state.
4122 */
4123
4124 if (dev_priv->rps.cur_freq <= val) 4118 if (dev_priv->rps.cur_freq <= val)
4125 return; 4119 return;
4126 4120
4127 /* Mask turbo interrupt so that they will not come in between */ 4121 /* Wake up the media well, as that takes a lot less
4128 I915_WRITE(GEN6_PMINTRMSK, 4122 * power than the Render well. */
4129 gen6_sanitize_rps_pm_mask(dev_priv, ~0)); 4123 intel_uncore_forcewake_get(dev_priv, FORCEWAKE_MEDIA);
4130 4124 valleyview_set_rps(dev_priv->dev, val);
4131 vlv_force_gfx_clock(dev_priv, true); 4125 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_MEDIA);
4132
4133 dev_priv->rps.cur_freq = val;
4134
4135 vlv_punit_write(dev_priv, PUNIT_REG_GPU_FREQ_REQ, val);
4136
4137 if (wait_for(((vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS))
4138 & GENFREQSTATUS) == 0, 100))
4139 DRM_ERROR("timed out waiting for Punit\n");
4140
4141 gen6_set_rps_thresholds(dev_priv, val);
4142 vlv_force_gfx_clock(dev_priv, false);
4143
4144 I915_WRITE(GEN6_PMINTRMSK, gen6_rps_pm_mask(dev_priv, val));
4145} 4126}
4146 4127
4147void gen6_rps_busy(struct drm_i915_private *dev_priv) 4128void gen6_rps_busy(struct drm_i915_private *dev_priv)