[Intel-gfx] [PATCH] drm/i915/chv: calculate rc6 residency correctly

Daniel Vetter daniel at ffwll.ch
Sat Jul 12 11:14:27 CEST 2014


On Wed, Jul 09, 2014 at 02:55:56PM +0300, Mika Kuoppala wrote:
> The register to read cz count is different from vlv. Also
> the counts returned from CCK_CTL1 for BSW are (ticks in 30ns - 1).
> czcount_30ns of value 1 is a special case for 320Mhz.
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=80703
> Suggested-by: Deepak S <deepak.s at linux.intel.com>
> Cc: Jesse Barnes <jbarnes at virtuousgeek.org>
> Signed-off-by: Mika Kuoppala <mika.kuoppala at intel.com>
> Tested-by: Guo Jinxian <jinxianx.guo at intel.com>
> Reviewed-by: Deepak S <deepak.s at linux.intel.com>

Queued for -next, thanks for the patch.
-Daniel
> ---
>  drivers/gpu/drm/i915/i915_reg.h   |    2 +-
>  drivers/gpu/drm/i915/i915_sysfs.c |   39 +++++++++++++++++++++++++++++--------
>  2 files changed, 32 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 190d4bb..5a7be63 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -2281,7 +2281,7 @@ enum punit_power_well {
>  /* Same as Haswell, but 72064 bytes now. */
>  #define GEN8_CXT_TOTAL_SIZE		(18 * PAGE_SIZE)
>  
> -
> +#define CHV_CLK_CTL1			0x101100
>  #define VLV_CLK_CTL2			0x101104
>  #define   CLK_CTL2_CZCOUNT_30NS_SHIFT	28
>  
> diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c
> index 86ce39a..a1d8940 100644
> --- a/drivers/gpu/drm/i915/i915_sysfs.c
> +++ b/drivers/gpu/drm/i915/i915_sysfs.c
> @@ -47,22 +47,45 @@ static u32 calc_residency(struct drm_device *dev, const u32 reg)
>  
>  	intel_runtime_pm_get(dev_priv);
>  
> -	/* On VLV, residency time is in CZ units rather than 1.28us */
> +	/* On VLV and CHV, residency time is in CZ units rather than 1.28us */
>  	if (IS_VALLEYVIEW(dev)) {
> -		u32 clkctl2;
> +		u32 reg, czcount_30ns;
>  
> -		clkctl2 = I915_READ(VLV_CLK_CTL2) >>
> -			CLK_CTL2_CZCOUNT_30NS_SHIFT;
> -		if (!clkctl2) {
> -			WARN(!clkctl2, "bogus CZ count value");
> +		if (IS_CHERRYVIEW(dev))
> +			reg = CHV_CLK_CTL1;
> +		else
> +			reg = VLV_CLK_CTL2;
> +
> +		czcount_30ns = I915_READ(reg) >> CLK_CTL2_CZCOUNT_30NS_SHIFT;
> +
> +		if (!czcount_30ns) {
> +			WARN(!czcount_30ns, "bogus CZ count value");
>  			ret = 0;
>  			goto out;
>  		}
> -		units = DIV_ROUND_UP_ULL(30ULL * bias, (u64)clkctl2);
> +
> +		units = 0;
> +		div = 1000000ULL;
> +
> +		if (IS_CHERRYVIEW(dev)) {
> +			/* Special case for 320Mhz */
> +			if (czcount_30ns == 1) {
> +				div = 10000000ULL;
> +				units = 3125ULL;
> +			} else {
> +				/* chv counts are one less */
> +				czcount_30ns += 1;
> +			}
> +		}
> +
> +		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;
>  
> -		div = 1000000ULL * bias;
> +		div = div * bias;
>  	}
>  
>  	raw_time = I915_READ(reg) * units;
> -- 
> 1.7.9.5
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch



More information about the Intel-gfx mailing list