diff options
author | Akash Goel <akash.goel@intel.com> | 2015-03-06 00:37:18 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2015-03-17 17:30:23 -0400 |
commit | 8a5864377b12b7c0a7a8e20cb33ef7ccc679d657 (patch) | |
tree | 317c2bfe1bbf9fa148cd7dde3b3ad443257ac11f /drivers/gpu/drm/i915/intel_pm.c | |
parent | 5704195c3f3c04a00c16334a033b180f16db1f94 (diff) |
drm/i915/skl: Restructured the gen6_set_rps_thresholds function
Prior to SKL, the time period programmed in Up/Down EI & Up/Down
threshold registers was in units of 1.28 micro seconds. But for
SKL, the units have changed (1.333 micro seconds).
Have generalized the implementation of gen6_set_rps_thresholds function,
by removing the hard coding done in it as per 1.28 micro seconds.
v2: Renamed the local variables & removed superfluous comments (Chris)
Signed-off-by: Akash Goel <akash.goel@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 68 |
1 files changed, 32 insertions, 36 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 1f5583dc7e6f..564fb3033f7c 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -3826,6 +3826,8 @@ static u32 gen6_rps_limits(struct drm_i915_private *dev_priv, u8 val) | |||
3826 | static void gen6_set_rps_thresholds(struct drm_i915_private *dev_priv, u8 val) | 3826 | static void gen6_set_rps_thresholds(struct drm_i915_private *dev_priv, u8 val) |
3827 | { | 3827 | { |
3828 | int new_power; | 3828 | int new_power; |
3829 | u32 threshold_up = 0, threshold_down = 0; /* in % */ | ||
3830 | u32 ei_up = 0, ei_down = 0; | ||
3829 | 3831 | ||
3830 | new_power = dev_priv->rps.power; | 3832 | new_power = dev_priv->rps.power; |
3831 | switch (dev_priv->rps.power) { | 3833 | switch (dev_priv->rps.power) { |
@@ -3858,59 +3860,53 @@ static void gen6_set_rps_thresholds(struct drm_i915_private *dev_priv, u8 val) | |||
3858 | switch (new_power) { | 3860 | switch (new_power) { |
3859 | case LOW_POWER: | 3861 | case LOW_POWER: |
3860 | /* Upclock if more than 95% busy over 16ms */ | 3862 | /* Upclock if more than 95% busy over 16ms */ |
3861 | I915_WRITE(GEN6_RP_UP_EI, 12500); | 3863 | ei_up = 16000; |
3862 | I915_WRITE(GEN6_RP_UP_THRESHOLD, 11800); | 3864 | threshold_up = 95; |
3863 | 3865 | ||
3864 | /* Downclock if less than 85% busy over 32ms */ | 3866 | /* Downclock if less than 85% busy over 32ms */ |
3865 | I915_WRITE(GEN6_RP_DOWN_EI, 25000); | 3867 | ei_down = 32000; |
3866 | I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 21250); | 3868 | threshold_down = 85; |
3867 | |||
3868 | I915_WRITE(GEN6_RP_CONTROL, | ||
3869 | GEN6_RP_MEDIA_TURBO | | ||
3870 | GEN6_RP_MEDIA_HW_NORMAL_MODE | | ||
3871 | GEN6_RP_MEDIA_IS_GFX | | ||
3872 | GEN6_RP_ENABLE | | ||
3873 | GEN6_RP_UP_BUSY_AVG | | ||
3874 | GEN6_RP_DOWN_IDLE_AVG); | ||
3875 | break; | 3869 | break; |
3876 | 3870 | ||
3877 | case BETWEEN: | 3871 | case BETWEEN: |
3878 | /* Upclock if more than 90% busy over 13ms */ | 3872 | /* Upclock if more than 90% busy over 13ms */ |
3879 | I915_WRITE(GEN6_RP_UP_EI, 10250); | 3873 | ei_up = 13000; |
3880 | I915_WRITE(GEN6_RP_UP_THRESHOLD, 9225); | 3874 | threshold_up = 90; |
3881 | 3875 | ||
3882 | /* Downclock if less than 75% busy over 32ms */ | 3876 | /* Downclock if less than 75% busy over 32ms */ |
3883 | I915_WRITE(GEN6_RP_DOWN_EI, 25000); | 3877 | ei_down = 32000; |
3884 | I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 18750); | 3878 | threshold_down = 75; |
3885 | |||
3886 | I915_WRITE(GEN6_RP_CONTROL, | ||
3887 | GEN6_RP_MEDIA_TURBO | | ||
3888 | GEN6_RP_MEDIA_HW_NORMAL_MODE | | ||
3889 | GEN6_RP_MEDIA_IS_GFX | | ||
3890 | GEN6_RP_ENABLE | | ||
3891 | GEN6_RP_UP_BUSY_AVG | | ||
3892 | GEN6_RP_DOWN_IDLE_AVG); | ||
3893 | break; | 3879 | break; |
3894 | 3880 | ||
3895 | case HIGH_POWER: | 3881 | case HIGH_POWER: |
3896 | /* Upclock if more than 85% busy over 10ms */ | 3882 | /* Upclock if more than 85% busy over 10ms */ |
3897 | I915_WRITE(GEN6_RP_UP_EI, 8000); | 3883 | ei_up = 10000; |
3898 | I915_WRITE(GEN6_RP_UP_THRESHOLD, 6800); | 3884 | threshold_up = 85; |
3899 | 3885 | ||
3900 | /* Downclock if less than 60% busy over 32ms */ | 3886 | /* Downclock if less than 60% busy over 32ms */ |
3901 | I915_WRITE(GEN6_RP_DOWN_EI, 25000); | 3887 | ei_down = 32000; |
3902 | I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 15000); | 3888 | threshold_down = 60; |
3903 | |||
3904 | I915_WRITE(GEN6_RP_CONTROL, | ||
3905 | GEN6_RP_MEDIA_TURBO | | ||
3906 | GEN6_RP_MEDIA_HW_NORMAL_MODE | | ||
3907 | GEN6_RP_MEDIA_IS_GFX | | ||
3908 | GEN6_RP_ENABLE | | ||
3909 | GEN6_RP_UP_BUSY_AVG | | ||
3910 | GEN6_RP_DOWN_IDLE_AVG); | ||
3911 | break; | 3889 | break; |
3912 | } | 3890 | } |
3913 | 3891 | ||
3892 | I915_WRITE(GEN6_RP_UP_EI, | ||
3893 | GT_INTERVAL_FROM_US(dev_priv, ei_up)); | ||
3894 | I915_WRITE(GEN6_RP_UP_THRESHOLD, | ||
3895 | GT_INTERVAL_FROM_US(dev_priv, (ei_up * threshold_up / 100))); | ||
3896 | |||
3897 | I915_WRITE(GEN6_RP_DOWN_EI, | ||
3898 | GT_INTERVAL_FROM_US(dev_priv, ei_down)); | ||
3899 | I915_WRITE(GEN6_RP_DOWN_THRESHOLD, | ||
3900 | GT_INTERVAL_FROM_US(dev_priv, (ei_down * threshold_down / 100))); | ||
3901 | |||
3902 | I915_WRITE(GEN6_RP_CONTROL, | ||
3903 | GEN6_RP_MEDIA_TURBO | | ||
3904 | GEN6_RP_MEDIA_HW_NORMAL_MODE | | ||
3905 | GEN6_RP_MEDIA_IS_GFX | | ||
3906 | GEN6_RP_ENABLE | | ||
3907 | GEN6_RP_UP_BUSY_AVG | | ||
3908 | GEN6_RP_DOWN_IDLE_AVG); | ||
3909 | |||
3914 | dev_priv->rps.power = new_power; | 3910 | dev_priv->rps.power = new_power; |
3915 | dev_priv->rps.last_adj = 0; | 3911 | dev_priv->rps.last_adj = 0; |
3916 | } | 3912 | } |