aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_pm.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2015-03-18 05:48:22 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-03-20 06:48:14 -0400
commit43cf3bf084ba097463d67e756ff821505bdaa69d (patch)
tree54529985290904a480f7830763f632db9e9b7d6e /drivers/gpu/drm/i915/intel_pm.c
parentaed242ff7ebb697e4dff912bd4dc7ec7192f7581 (diff)
drm/i915: Improved w/a for rps on Baytrail
Rewrite commit 31685c258e0b0ad6aa486c5ec001382cf8a64212 Author: Deepak S <deepak.s@linux.intel.com> Date: Thu Jul 3 17:33:01 2014 -0400 drm/i915/vlv: WA for Turbo and RC6 to work together. Other than code clarity, the major improvement is to disable the extra interrupts generated when idle. However, the reclocking remains rather slow under the new manual regime, in particular it fails to downclock as quickly as desired. The second major improvement is that for certain workloads, like games, we need to combine render+media activity counters as the work of displaying the frame is split across the engines and both need to be taken into account when deciding the global GPU frequency as memory cycles are shared. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Deepak S <deepak.s@linux.intel.com> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Reviewed-by: Deepak S<deepak.s@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.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index beab305e320d..68c9cc252d36 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -4041,6 +4041,18 @@ static void vlv_set_rps_idle(struct drm_i915_private *dev_priv)
4041 I915_WRITE(GEN6_PMINTRMSK, gen6_rps_pm_mask(dev_priv, val)); 4041 I915_WRITE(GEN6_PMINTRMSK, gen6_rps_pm_mask(dev_priv, val));
4042} 4042}
4043 4043
4044void gen6_rps_busy(struct drm_i915_private *dev_priv)
4045{
4046 mutex_lock(&dev_priv->rps.hw_lock);
4047 if (dev_priv->rps.enabled) {
4048 if (dev_priv->pm_rps_events & (GEN6_PM_RP_DOWN_EI_EXPIRED | GEN6_PM_RP_UP_EI_EXPIRED))
4049 gen6_rps_reset_ei(dev_priv);
4050 I915_WRITE(GEN6_PMINTRMSK,
4051 gen6_rps_pm_mask(dev_priv, dev_priv->rps.cur_freq));
4052 }
4053 mutex_unlock(&dev_priv->rps.hw_lock);
4054}
4055
4044void gen6_rps_idle(struct drm_i915_private *dev_priv) 4056void gen6_rps_idle(struct drm_i915_private *dev_priv)
4045{ 4057{
4046 struct drm_device *dev = dev_priv->dev; 4058 struct drm_device *dev = dev_priv->dev;
@@ -4052,15 +4064,21 @@ void gen6_rps_idle(struct drm_i915_private *dev_priv)
4052 else 4064 else
4053 gen6_set_rps(dev_priv->dev, dev_priv->rps.idle_freq); 4065 gen6_set_rps(dev_priv->dev, dev_priv->rps.idle_freq);
4054 dev_priv->rps.last_adj = 0; 4066 dev_priv->rps.last_adj = 0;
4067 I915_WRITE(GEN6_PMINTRMSK, 0xffffffff);
4055 } 4068 }
4056 mutex_unlock(&dev_priv->rps.hw_lock); 4069 mutex_unlock(&dev_priv->rps.hw_lock);
4057} 4070}
4058 4071
4059void gen6_rps_boost(struct drm_i915_private *dev_priv) 4072void gen6_rps_boost(struct drm_i915_private *dev_priv)
4060{ 4073{
4074 u32 val;
4075
4061 mutex_lock(&dev_priv->rps.hw_lock); 4076 mutex_lock(&dev_priv->rps.hw_lock);
4062 if (dev_priv->rps.enabled) { 4077 val = dev_priv->rps.max_freq_softlimit;
4063 intel_set_rps(dev_priv->dev, dev_priv->rps.max_freq_softlimit); 4078 if (dev_priv->rps.enabled &&
4079 dev_priv->mm.busy &&
4080 dev_priv->rps.cur_freq < val) {
4081 intel_set_rps(dev_priv->dev, val);
4064 dev_priv->rps.last_adj = 0; 4082 dev_priv->rps.last_adj = 0;
4065 } 4083 }
4066 mutex_unlock(&dev_priv->rps.hw_lock); 4084 mutex_unlock(&dev_priv->rps.hw_lock);