drm/i915/vlv: fix RC6 residency time calculation
authorImre Deak <imre.deak@intel.com>
Mon, 1 Jun 2015 07:32:01 +0000 (10:32 +0300)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 15 Jun 2015 09:56:37 +0000 (11:56 +0200)
The divider value to convert from CZ clock rate to ms needs a +1
adjustment on VLV just like on CHV. This matches both the spec and
the accuracy test by pm_rc6_residency.

v2:
- simplify logic checking for the CHV 320MHz special case (Rodrigo)

Testcase: igt/pm_rc6_residency
Signed-off-by: Imre Deak <imre.deak@intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=76877
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_sysfs.c

index 247626885f49d22cfb94f6f89b1a459c4b0500a8..55bd04c6b9390d1d5cd21a26dea49861cbcff44e 100644 (file)
@@ -64,24 +64,16 @@ static u32 calc_residency(struct drm_device *dev, const u32 reg)
                        goto out;
                }
 
-               units = 0;
-               div = 1000000ULL;
-
-               if (IS_CHERRYVIEW(dev)) {
+               if (IS_CHERRYVIEW(dev) && czcount_30ns == 1) {
                        /* Special case for 320Mhz */
-                       if (czcount_30ns == 1) {
-                               div = 10000000ULL;
-                               units = 3125ULL;
-                       } else {
-                               /* chv counts are one less */
-                               czcount_30ns += 1;
-                       }
+                       div = 10000000ULL;
+                       units = 3125ULL;
+               } else {
+                       czcount_30ns += 1;
+                       div = 1000000ULL;
+                       units = DIV_ROUND_UP_ULL(30ULL * bias, czcount_30ns);
                }
 
-               if (units == 0)
-                       units = DIV_ROUND_UP_ULL(30ULL * bias,
-                                                (u64)czcount_30ns);
-
                if (I915_READ(VLV_COUNTER_CONTROL) & VLV_COUNT_RANGE_HIGH)
                        units <<= 8;