drm/i915: Use czclk_freq in vlv c0 residency calculations
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 24 Sep 2015 20:29:20 +0000 (23:29 +0300)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 30 Sep 2015 08:20:39 +0000 (10:20 +0200)
Replace the use of mem_freq/4 with czclk_freq in the vlv c0 residency
calculations.

Also deal with VLV_COUNT_RANGE_HIGH which affects all RCx residency
counters. We have just enough bits to do this without intermediate
divisions.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Imre Deak <imre.deak@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_irq.c

index ff85eae932bcdcd71d27a12c19f4ae8648724b60..76bd40e133919b1d42a52ab215616a93b743c790 100644 (file)
@@ -997,12 +997,16 @@ static bool vlv_c0_above(struct drm_i915_private *dev_priv,
                         int threshold)
 {
        u64 time, c0;
+       unsigned int mul = 100;
 
        if (old->cz_clock == 0)
                return false;
 
+       if (I915_READ(VLV_COUNTER_CONTROL) & VLV_COUNT_RANGE_HIGH)
+               mul <<= 8;
+
        time = now->cz_clock - old->cz_clock;
-       time *= threshold * dev_priv->mem_freq;
+       time *= threshold * dev_priv->czclk_freq;
 
        /* Workload can be split between render + media, e.g. SwapBuffers
         * being blitted in X after being rendered in mesa. To account for
@@ -1010,7 +1014,7 @@ static bool vlv_c0_above(struct drm_i915_private *dev_priv,
         */
        c0 = now->render_c0 - old->render_c0;
        c0 += now->media_c0 - old->media_c0;
-       c0 *= 100 * VLV_CZ_CLOCK_TO_MILLI_SEC * 4 / 1000;
+       c0 *= mul * VLV_CZ_CLOCK_TO_MILLI_SEC;
 
        return c0 >= time;
 }