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 |