drm/i915: vlv: clamp minimum RPS frequency to what Punit allows
authorImre Deak <imre.deak@intel.com>
Thu, 4 Dec 2014 16:39:35 +0000 (18:39 +0200)
committerImre Deak <imre.deak@intel.com>
Tue, 8 Dec 2015 18:51:45 +0000 (20:51 +0200)
As described in the code comment, I couldn't set the minimum RPS
frequency on my BYT-M B0 to the minimum allowed as reported by Punit.
Fix this by clamping the minimum value to the first one that was
accepted on my machine.

Atm this issue doesn't cause any test failures, since in igt/pm_rps we
only check the cached version of the current frequency which is the same
what has been set. In the future we'll add checks for the actual
frequency too, and for that to pass this fix is necessary.

Signed-off-by: Imre Deak <imre.deak@intel.com>
Acked-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1417711175-13271-1-git-send-email-imre.deak@intel.com
drivers/gpu/drm/i915/intel_pm.c

index 85984567afdf4ed5f96c4b2821fd82f1dd0a72f8..9968c6623020236220d397c211161f80af9987f8 100644 (file)
@@ -5100,7 +5100,17 @@ static int valleyview_rps_rpe_freq(struct drm_i915_private *dev_priv)
 
 static int valleyview_rps_min_freq(struct drm_i915_private *dev_priv)
 {
-       return vlv_punit_read(dev_priv, PUNIT_REG_GPU_LFM) & 0xff;
+       u32 val;
+
+       val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_LFM) & 0xff;
+       /*
+        * According to the BYT Punit GPU turbo HAS 1.1.6.3 the minimum value
+        * for the minimum frequency in GPLL mode is 0xc1. Contrary to this on
+        * a BYT-M B0 the above register contains 0xbf. Moreover when setting
+        * a frequency Punit will not allow values below 0xc0. Clamp it 0xc0
+        * to make sure it matches what Punit accepts.
+        */
+       return max_t(u32, val, 0xc0);
 }
 
 /* Check that the pctx buffer wasn't move under us. */