summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_pm.c
diff options
context:
space:
mode:
authorPaulo Zanoni2014-04-02 00:39:49 +0200
committerDaniel Vetter2014-04-02 16:57:19 +0200
commit4b28a1f3ef55a3b0b68dbab1fe6dbaf18e186710 (patch)
treed82f58c720ee0c05c05f1cb0c0b26cf627fe3fa2 /drivers/gpu/drm/i915/intel_pm.c
parentdrm/i915: only check for irqs_disabled when disabling LCPLL (diff)
downloadkernel-qcow2-linux-4b28a1f3ef55a3b0b68dbab1fe6dbaf18e186710.tar.gz
kernel-qcow2-linux-4b28a1f3ef55a3b0b68dbab1fe6dbaf18e186710.tar.xz
kernel-qcow2-linux-4b28a1f3ef55a3b0b68dbab1fe6dbaf18e186710.zip
drm/i915: fix infinite loop at gen6_update_ring_freq
If I boot my Broadwell machine to X on a system with Mesa Gallium llvmpipe instead of i965, then kill X and try to run pm_pc8.c, when we disable PC8 and call gen6_update_ring_freq(), we will get stuck on an infinite loop because the frequencies are zero and the variables are unsigned. This happens because we never ran any batch, so we did not enable RC6, so the variables are zero. If I run gem_exec_nop before running pm_pc8, everything works as expected because gem_exec_nop makes RC6 be enabled. This commit should prevent the infinite loop, which IMHO is already a good reason to be merged, but it is not the proper fix to the "RC6 is not being enabled" problem. Signed-off-by: Paulo Zanoni <paulo.r.zanoni@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.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index cebe0d42a787..0a0685bbd5dc 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -3487,7 +3487,8 @@ void gen6_update_ring_freq(struct drm_device *dev)
* to use for memory access. We do this by specifying the IA frequency
* the PCU should use as a reference to determine the ring frequency.
*/
- for (gpu_freq = dev_priv->rps.max_freq_softlimit; gpu_freq >= dev_priv->rps.min_freq_softlimit;
+ for (gpu_freq = dev_priv->rps.max_freq_softlimit;
+ gpu_freq >= dev_priv->rps.min_freq_softlimit && gpu_freq != 0;
gpu_freq--) {
int diff = dev_priv->rps.max_freq_softlimit - gpu_freq;
unsigned int ia_freq = 0, ring_freq = 0;