Subversion Repositories Kolibri OS

Rev

Rev 6320 | Rev 6937 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6320 Rev 6935
Line 991... Line 991...
991
	ei->cz_clock = vlv_punit_read(dev_priv, PUNIT_REG_CZ_TIMESTAMP);
991
	ei->cz_clock = vlv_punit_read(dev_priv, PUNIT_REG_CZ_TIMESTAMP);
992
	ei->render_c0 = I915_READ(VLV_RENDER_C0_COUNT);
992
	ei->render_c0 = I915_READ(VLV_RENDER_C0_COUNT);
993
	ei->media_c0 = I915_READ(VLV_MEDIA_C0_COUNT);
993
	ei->media_c0 = I915_READ(VLV_MEDIA_C0_COUNT);
994
}
994
}
Line 995... Line -...
995
 
-
 
996
static bool vlv_c0_above(struct drm_i915_private *dev_priv,
-
 
997
			 const struct intel_rps_ei *old,
-
 
998
			 const struct intel_rps_ei *now,
-
 
999
			 int threshold)
-
 
1000
{
-
 
1001
	u64 time, c0;
-
 
1002
	unsigned int mul = 100;
-
 
1003
 
-
 
1004
	if (old->cz_clock == 0)
-
 
1005
		return false;
-
 
1006
 
-
 
1007
	if (I915_READ(VLV_COUNTER_CONTROL) & VLV_COUNT_RANGE_HIGH)
-
 
1008
		mul <<= 8;
-
 
1009
 
-
 
1010
	time = now->cz_clock - old->cz_clock;
-
 
1011
	time *= threshold * dev_priv->czclk_freq;
-
 
1012
 
-
 
1013
	/* Workload can be split between render + media, e.g. SwapBuffers
-
 
1014
	 * being blitted in X after being rendered in mesa. To account for
-
 
1015
	 * this we need to combine both engines into our activity counter.
-
 
1016
	 */
-
 
1017
	c0 = now->render_c0 - old->render_c0;
-
 
1018
	c0 += now->media_c0 - old->media_c0;
-
 
1019
	c0 *= mul * VLV_CZ_CLOCK_TO_MILLI_SEC;
-
 
1020
 
-
 
1021
	return c0 >= time;
-
 
1022
}
-
 
1023
 
995
 
1024
void gen6_rps_reset_ei(struct drm_i915_private *dev_priv)
996
void gen6_rps_reset_ei(struct drm_i915_private *dev_priv)
1025
{
-
 
1026
	vlv_c0_read(dev_priv, &dev_priv->rps.down_ei);
997
{
1027
	dev_priv->rps.up_ei = dev_priv->rps.down_ei;
998
	memset(&dev_priv->rps.ei, 0, sizeof(dev_priv->rps.ei));
Line 1028... Line 999...
1028
}
999
}
1029
 
1000
 
-
 
1001
static u32 vlv_wa_c0_ei(struct drm_i915_private *dev_priv, u32 pm_iir)
1030
static u32 vlv_wa_c0_ei(struct drm_i915_private *dev_priv, u32 pm_iir)
1002
{
1031
{
1003
	const struct intel_rps_ei *prev = &dev_priv->rps.ei;
Line 1032... Line 1004...
1032
	struct intel_rps_ei now;
1004
	struct intel_rps_ei now;
1033
	u32 events = 0;
1005
	u32 events = 0;
Line 1034... Line 1006...
1034
 
1006
 
1035
	if ((pm_iir & (GEN6_PM_RP_DOWN_EI_EXPIRED | GEN6_PM_RP_UP_EI_EXPIRED)) == 0)
1007
	if ((pm_iir & GEN6_PM_RP_UP_EI_EXPIRED) == 0)
1036
		return 0;
1008
		return 0;
Line -... Line 1009...
-
 
1009
 
-
 
1010
	vlv_c0_read(dev_priv, &now);
-
 
1011
	if (now.cz_clock == 0)
-
 
1012
		return 0;
-
 
1013
 
1037
 
1014
	if (prev->cz_clock) {
-
 
1015
		u64 time, c0;
-
 
1016
		unsigned int mul;
1038
	vlv_c0_read(dev_priv, &now);
1017
 
1039
	if (now.cz_clock == 0)
1018
		mul = VLV_CZ_CLOCK_TO_MILLI_SEC * 100; /* scale to threshold% */
-
 
1019
		if (I915_READ(VLV_COUNTER_CONTROL) & VLV_COUNT_RANGE_HIGH)
1040
		return 0;
1020
			mul <<= 8;
-
 
1021
 
1041
 
1022
		time = now.cz_clock - prev->cz_clock;
1042
	if (pm_iir & GEN6_PM_RP_DOWN_EI_EXPIRED) {
1023
		time *= dev_priv->czclk_freq;
1043
		if (!vlv_c0_above(dev_priv,
1024
 
-
 
1025
		/* Workload can be split between render + media,
-
 
1026
		 * e.g. SwapBuffers being blitted in X after being rendered in
-
 
1027
		 * mesa. To account for this we need to combine both engines
Line 1044... Line 1028...
1044
				  &dev_priv->rps.down_ei, &now,
1028
		 * into our activity counter.
1045
				  dev_priv->rps.down_threshold))
-
 
1046
			events |= GEN6_PM_RP_DOWN_THRESHOLD;
1029
		 */
1047
		dev_priv->rps.down_ei = now;
1030
		c0 = now.render_c0 - prev->render_c0;
1048
	}
1031
		c0 += now.media_c0 - prev->media_c0;
1049
 
-
 
1050
	if (pm_iir & GEN6_PM_RP_UP_EI_EXPIRED) {
1032
		c0 *= mul;
Line -... Line 1033...
-
 
1033
 
1051
		if (vlv_c0_above(dev_priv,
1034
		if (c0 > time * dev_priv->rps.up_threshold)
1052
				 &dev_priv->rps.up_ei, &now,
1035
			events = GEN6_PM_RP_UP_THRESHOLD;
Line 1053... Line 1036...
1053
				 dev_priv->rps.up_threshold))
1036
		else if (c0 < time * dev_priv->rps.down_threshold)
1054
			events |= GEN6_PM_RP_UP_THRESHOLD;
1037
			events = GEN6_PM_RP_DOWN_THRESHOLD;
Line 4340... Line 4323...
4340
	INIT_WORK(&dev_priv->l3_parity.error_work, ivybridge_parity_work);
4323
	INIT_WORK(&dev_priv->l3_parity.error_work, ivybridge_parity_work);
Line 4341... Line 4324...
4341
 
4324
 
4342
	/* Let's track the enabled rps events */
4325
	/* Let's track the enabled rps events */
4343
	if (IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv))
4326
	if (IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv))
4344
		/* WaGsvRC0ResidencyMethod:vlv */
4327
		/* WaGsvRC0ResidencyMethod:vlv */
4345
		dev_priv->pm_rps_events = GEN6_PM_RP_DOWN_EI_EXPIRED | GEN6_PM_RP_UP_EI_EXPIRED;
4328
		dev_priv->pm_rps_events = GEN6_PM_RP_UP_EI_EXPIRED;
4346
	else
4329
	else
Line 4347... Line 4330...
4347
		dev_priv->pm_rps_events = GEN6_PM_RPS_EVENTS;
4330
		dev_priv->pm_rps_events = GEN6_PM_RPS_EVENTS;
4348
 
4331