Commit 28117632 authored by Chris Wilson's avatar Chris Wilson

drm/i915/gt: Suppress threshold updates on RPS parking

When we park RPS, we set the GPU to run at minimum 'idle' frequency.
However, as the GPU is idle, we also disable the worker and RPS
interrupts - changing the RPS thresholds has no effect, it just incurs
extra changes to restore them when we unpark. So on parking, leave the
thresholds set to the current power level and so we expect them to be
valid for our restart.

References: https://gitlab.freedesktop.org/drm/intel/issues/848Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Andi Shyti <andi.shyti@intel.com>
Reviewed-by: default avatarAndi Shyti <andi.shyti@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191218210545.3975426-2-chris@chris-wilson.co.uk
parent 35cc7f32
...@@ -682,7 +682,7 @@ static int vlv_rps_set(struct intel_rps *rps, u8 val) ...@@ -682,7 +682,7 @@ static int vlv_rps_set(struct intel_rps *rps, u8 val)
return err; return err;
} }
static int rps_set(struct intel_rps *rps, u8 val) static int rps_set(struct intel_rps *rps, u8 val, bool update)
{ {
struct drm_i915_private *i915 = rps_to_i915(rps); struct drm_i915_private *i915 = rps_to_i915(rps);
int err; int err;
...@@ -700,7 +700,8 @@ static int rps_set(struct intel_rps *rps, u8 val) ...@@ -700,7 +700,8 @@ static int rps_set(struct intel_rps *rps, u8 val)
if (err) if (err)
return err; return err;
gen6_rps_set_thresholds(rps, val); if (update)
gen6_rps_set_thresholds(rps, val);
rps->last_freq = val; rps->last_freq = val;
return 0; return 0;
...@@ -760,7 +761,7 @@ void intel_rps_park(struct intel_rps *rps) ...@@ -760,7 +761,7 @@ void intel_rps_park(struct intel_rps *rps)
* power than the render powerwell. * power than the render powerwell.
*/ */
intel_uncore_forcewake_get(rps_to_uncore(rps), FORCEWAKE_MEDIA); intel_uncore_forcewake_get(rps_to_uncore(rps), FORCEWAKE_MEDIA);
rps_set(rps, rps->idle_freq); rps_set(rps, rps->idle_freq, false);
intel_uncore_forcewake_put(rps_to_uncore(rps), FORCEWAKE_MEDIA); intel_uncore_forcewake_put(rps_to_uncore(rps), FORCEWAKE_MEDIA);
} }
...@@ -796,7 +797,7 @@ int intel_rps_set(struct intel_rps *rps, u8 val) ...@@ -796,7 +797,7 @@ int intel_rps_set(struct intel_rps *rps, u8 val)
GEM_BUG_ON(val < rps->min_freq); GEM_BUG_ON(val < rps->min_freq);
if (rps->active) { if (rps->active) {
err = rps_set(rps, val); err = rps_set(rps, val, true);
if (err) if (err)
return err; return err;
...@@ -876,7 +877,7 @@ static bool rps_reset(struct intel_rps *rps) ...@@ -876,7 +877,7 @@ static bool rps_reset(struct intel_rps *rps)
rps->power.mode = -1; rps->power.mode = -1;
rps->last_freq = -1; rps->last_freq = -1;
if (rps_set(rps, rps->min_freq)) { if (rps_set(rps, rps->min_freq, true)) {
DRM_ERROR("Failed to reset RPS to initial values\n"); DRM_ERROR("Failed to reset RPS to initial values\n");
return false; return false;
} }
......
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