Commit bd64818d authored by Chris Wilson's avatar Chris Wilson

drm/i915: Only apply the jump to the "efficient RPS" frequency on startup

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: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/20170210150348.22146-3-chris@chris-wilson.co.ukReviewed-by: default avatarRadoslaw Szwichtenberg <radoslaw.szwichtenberg@intel.com>
parent 17136d54
...@@ -1173,14 +1173,6 @@ static void gen6_pm_rps_work(struct work_struct *work) ...@@ -1173,14 +1173,6 @@ static void gen6_pm_rps_work(struct work_struct *work)
if (new_delay >= dev_priv->rps.max_freq_softlimit) if (new_delay >= dev_priv->rps.max_freq_softlimit)
adj = 0; 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)) { } else if (client_boost || any_waiters(dev_priv)) {
adj = 0; adj = 0;
} else if (pm_iir & GEN6_PM_RP_DOWN_TIMEOUT) { } else if (pm_iir & GEN6_PM_RP_DOWN_TIMEOUT) {
......
...@@ -5019,6 +5019,8 @@ void gen6_rps_busy(struct drm_i915_private *dev_priv) ...@@ -5019,6 +5019,8 @@ void gen6_rps_busy(struct drm_i915_private *dev_priv)
{ {
mutex_lock(&dev_priv->rps.hw_lock); mutex_lock(&dev_priv->rps.hw_lock);
if (dev_priv->rps.enabled) { 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)) if (dev_priv->pm_rps_events & (GEN6_PM_RP_DOWN_EI_EXPIRED | GEN6_PM_RP_UP_EI_EXPIRED))
gen6_rps_reset_ei(dev_priv); gen6_rps_reset_ei(dev_priv);
I915_WRITE(GEN6_PMINTRMSK, I915_WRITE(GEN6_PMINTRMSK,
...@@ -5026,9 +5028,14 @@ void gen6_rps_busy(struct drm_i915_private *dev_priv) ...@@ -5026,9 +5028,14 @@ void gen6_rps_busy(struct drm_i915_private *dev_priv)
gen6_enable_rps_interrupts(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, if (intel_set_rps(dev_priv,
clamp(dev_priv->rps.cur_freq, clamp(freq,
dev_priv->rps.min_freq_softlimit, dev_priv->rps.min_freq_softlimit,
dev_priv->rps.max_freq_softlimit))) dev_priv->rps.max_freq_softlimit)))
DRM_DEBUG_DRIVER("Failed to set idle frequency\n"); DRM_DEBUG_DRIVER("Failed to set idle frequency\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment