drm/i915: Only apply the jump to the "efficient RPS" frequency on startup
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 10 Feb 2017 15:03:48 +0000 (15:03 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 14 Feb 2017 22:35:46 +0000 (22:35 +0000)
Currently we apply the jump to rpe if we are below it and the GPU needs
more power. For some GPUs, the rpe is 75% of the maximum range causing
us to dramatically overshoot low power applications *and* unable to
reach the low frequency that can most efficiently deliver their
workload.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/20170210150348.22146-3-chris@chris-wilson.co.uk
Reviewed-by: Radoslaw Szwichtenberg <radoslaw.szwichtenberg@intel.com>
drivers/gpu/drm/i915/i915_irq.c
drivers/gpu/drm/i915/intel_pm.c

index 86cca37a4e4f38dba167b47f0f8b471ff7663d2d..84fda3fce4b84d62e3e56b198089f7936fd3ec02 100644 (file)
@@ -1173,14 +1173,6 @@ static void gen6_pm_rps_work(struct work_struct *work)
 
                if (new_delay >= dev_priv->rps.max_freq_softlimit)
                        adj = 0;
-               /*
-                * For better performance, jump directly
-                * to RPe if we're below it.
-                */
-               if (new_delay < dev_priv->rps.efficient_freq - adj) {
-                       new_delay = dev_priv->rps.efficient_freq;
-                       adj = 0;
-               }
        } else if (client_boost || any_waiters(dev_priv)) {
                adj = 0;
        } else if (pm_iir & GEN6_PM_RP_DOWN_TIMEOUT) {
index e801b5d26b90fe2a8e5fa87ff621513b6edee15a..3d311e10064306063eec10e60303f8cc4e9793ab 100644 (file)
@@ -5019,6 +5019,8 @@ void gen6_rps_busy(struct drm_i915_private *dev_priv)
 {
        mutex_lock(&dev_priv->rps.hw_lock);
        if (dev_priv->rps.enabled) {
+               u8 freq;
+
                if (dev_priv->pm_rps_events & (GEN6_PM_RP_DOWN_EI_EXPIRED | GEN6_PM_RP_UP_EI_EXPIRED))
                        gen6_rps_reset_ei(dev_priv);
                I915_WRITE(GEN6_PMINTRMSK,
@@ -5026,9 +5028,14 @@ void gen6_rps_busy(struct drm_i915_private *dev_priv)
 
                gen6_enable_rps_interrupts(dev_priv);
 
-               /* Ensure we start at the user's desired frequency */
+               /* Use the user's desired frequency as a guide, but for better
+                * performance, jump directly to RPe as our starting frequency.
+                */
+               freq = max(dev_priv->rps.cur_freq,
+                          dev_priv->rps.efficient_freq);
+
                if (intel_set_rps(dev_priv,
-                                 clamp(dev_priv->rps.cur_freq,
+                                 clamp(freq,
                                        dev_priv->rps.min_freq_softlimit,
                                        dev_priv->rps.max_freq_softlimit)))
                        DRM_DEBUG_DRIVER("Failed to set idle frequency\n");