diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2015-03-18 05:48:23 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2015-03-20 06:48:14 -0400 |
commit | 6f4b12f89c78fd0030aa51ead17eaf234108f60d (patch) | |
tree | cde9fd2950f08a7a9c164923797be738cb7ef1d0 /drivers/gpu/drm | |
parent | 43cf3bf084ba097463d67e756ff821505bdaa69d (diff) |
drm/i915: Use down ei for manual Baytrail RPS calculations
Use both up/down manual ei calcuations for symmetry and greater
flexibility for reclocking, instead of faking the down interrupt based
on a fixed integer number of up interrupts.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Deepak S<deepak.s@linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 5 |
4 files changed, 4 insertions, 19 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index a06536cfce6d..b156bc30c9c9 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -1031,8 +1031,6 @@ struct intel_gen6_power_mgmt { | |||
1031 | u8 rp0_freq; /* Non-overclocked max frequency. */ | 1031 | u8 rp0_freq; /* Non-overclocked max frequency. */ |
1032 | u32 cz_freq; | 1032 | u32 cz_freq; |
1033 | 1033 | ||
1034 | u32 ei_interrupt_count; | ||
1035 | |||
1036 | int last_adj; | 1034 | int last_adj; |
1037 | enum { LOW_POWER, BETWEEN, HIGH_POWER } power; | 1035 | enum { LOW_POWER, BETWEEN, HIGH_POWER } power; |
1038 | 1036 | ||
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 8d8d33d068dd..6d8340d5a111 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -1033,7 +1033,6 @@ void gen6_rps_reset_ei(struct drm_i915_private *dev_priv) | |||
1033 | { | 1033 | { |
1034 | vlv_c0_read(dev_priv, &dev_priv->rps.down_ei); | 1034 | vlv_c0_read(dev_priv, &dev_priv->rps.down_ei); |
1035 | dev_priv->rps.up_ei = dev_priv->rps.down_ei; | 1035 | dev_priv->rps.up_ei = dev_priv->rps.down_ei; |
1036 | dev_priv->rps.ei_interrupt_count = 0; | ||
1037 | } | 1036 | } |
1038 | 1037 | ||
1039 | static u32 vlv_wa_c0_ei(struct drm_i915_private *dev_priv, u32 pm_iir) | 1038 | static u32 vlv_wa_c0_ei(struct drm_i915_private *dev_priv, u32 pm_iir) |
@@ -1041,23 +1040,13 @@ static u32 vlv_wa_c0_ei(struct drm_i915_private *dev_priv, u32 pm_iir) | |||
1041 | struct intel_rps_ei now; | 1040 | struct intel_rps_ei now; |
1042 | u32 events = 0; | 1041 | u32 events = 0; |
1043 | 1042 | ||
1044 | if ((pm_iir & GEN6_PM_RP_UP_EI_EXPIRED) == 0) | 1043 | if ((pm_iir & (GEN6_PM_RP_DOWN_EI_EXPIRED | GEN6_PM_RP_UP_EI_EXPIRED)) == 0) |
1045 | return 0; | 1044 | return 0; |
1046 | 1045 | ||
1047 | vlv_c0_read(dev_priv, &now); | 1046 | vlv_c0_read(dev_priv, &now); |
1048 | if (now.cz_clock == 0) | 1047 | if (now.cz_clock == 0) |
1049 | return 0; | 1048 | return 0; |
1050 | 1049 | ||
1051 | /* | ||
1052 | * To down throttle, C0 residency should be less than down threshold | ||
1053 | * for continous EI intervals. So calculate down EI counters | ||
1054 | * once in VLV_INT_COUNT_FOR_DOWN_EI | ||
1055 | */ | ||
1056 | if (++dev_priv->rps.ei_interrupt_count >= VLV_INT_COUNT_FOR_DOWN_EI) { | ||
1057 | pm_iir |= GEN6_PM_RP_DOWN_EI_EXPIRED; | ||
1058 | dev_priv->rps.ei_interrupt_count = 0; | ||
1059 | } | ||
1060 | |||
1061 | if (pm_iir & GEN6_PM_RP_DOWN_EI_EXPIRED) { | 1050 | if (pm_iir & GEN6_PM_RP_DOWN_EI_EXPIRED) { |
1062 | if (!vlv_c0_above(dev_priv, | 1051 | if (!vlv_c0_above(dev_priv, |
1063 | &dev_priv->rps.down_ei, &now, | 1052 | &dev_priv->rps.down_ei, &now, |
@@ -4254,7 +4243,7 @@ void intel_irq_init(struct drm_i915_private *dev_priv) | |||
4254 | /* Let's track the enabled rps events */ | 4243 | /* Let's track the enabled rps events */ |
4255 | if (IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv)) | 4244 | if (IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv)) |
4256 | /* WaGsvRC0ResidencyMethod:vlv */ | 4245 | /* WaGsvRC0ResidencyMethod:vlv */ |
4257 | dev_priv->pm_rps_events = GEN6_PM_RP_UP_EI_EXPIRED; | 4246 | dev_priv->pm_rps_events = GEN6_PM_RP_DOWN_EI_EXPIRED | GEN6_PM_RP_UP_EI_EXPIRED; |
4258 | else | 4247 | else |
4259 | dev_priv->pm_rps_events = GEN6_PM_RPS_EVENTS; | 4248 | dev_priv->pm_rps_events = GEN6_PM_RPS_EVENTS; |
4260 | 4249 | ||
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 2d76c566d843..5b84ee686f99 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -673,7 +673,6 @@ enum skl_disp_power_wells { | |||
673 | #define VLV_CZ_CLOCK_TO_MILLI_SEC 100000 | 673 | #define VLV_CZ_CLOCK_TO_MILLI_SEC 100000 |
674 | #define VLV_RP_UP_EI_THRESHOLD 90 | 674 | #define VLV_RP_UP_EI_THRESHOLD 90 |
675 | #define VLV_RP_DOWN_EI_THRESHOLD 70 | 675 | #define VLV_RP_DOWN_EI_THRESHOLD 70 |
676 | #define VLV_INT_COUNT_FOR_DOWN_EI 5 | ||
677 | 676 | ||
678 | /* vlv2 north clock has */ | 677 | /* vlv2 north clock has */ |
679 | #define CCK_FUSE_REG 0x8 | 678 | #define CCK_FUSE_REG 0x8 |
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 68c9cc252d36..e18f0fd22cf2 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -3922,11 +3922,10 @@ static u32 gen6_rps_pm_mask(struct drm_i915_private *dev_priv, u8 val) | |||
3922 | u32 mask = 0; | 3922 | u32 mask = 0; |
3923 | 3923 | ||
3924 | if (val > dev_priv->rps.min_freq_softlimit) | 3924 | if (val > dev_priv->rps.min_freq_softlimit) |
3925 | mask |= GEN6_PM_RP_DOWN_THRESHOLD | GEN6_PM_RP_DOWN_TIMEOUT; | 3925 | mask |= GEN6_PM_RP_DOWN_EI_EXPIRED | GEN6_PM_RP_DOWN_THRESHOLD | GEN6_PM_RP_DOWN_TIMEOUT; |
3926 | if (val < dev_priv->rps.max_freq_softlimit) | 3926 | if (val < dev_priv->rps.max_freq_softlimit) |
3927 | mask |= GEN6_PM_RP_UP_THRESHOLD; | 3927 | mask |= GEN6_PM_RP_UP_EI_EXPIRED | GEN6_PM_RP_UP_THRESHOLD; |
3928 | 3928 | ||
3929 | mask |= dev_priv->pm_rps_events & (GEN6_PM_RP_DOWN_EI_EXPIRED | GEN6_PM_RP_UP_EI_EXPIRED); | ||
3930 | mask &= dev_priv->pm_rps_events; | 3929 | mask &= dev_priv->pm_rps_events; |
3931 | 3930 | ||
3932 | return gen6_sanitize_rps_pm_mask(dev_priv, ~mask); | 3931 | return gen6_sanitize_rps_pm_mask(dev_priv, ~mask); |