aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorJesse Barnes <jbarnes@virtuousgeek.org>2011-01-18 18:49:25 -0500
committerChris Wilson <chris@chris-wilson.co.uk>2011-01-19 07:57:56 -0500
commitccab5c82759e2ace74b2e84f82d1e0eedd932571 (patch)
tree5c22ecdd165a432f8024c99df7581901676f1649 /drivers/gpu/drm
parent311bd68e024f9006db66cbadc3bd9f62fd663f4b (diff)
drm/i915: tune Sandy Bridge DRPS constants
These make us increase our frequency much more readily, and decrease them only after significant idle time, resulting in a 20% performance increase for nexuiz. Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c27
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h17
-rw-r--r--drivers/gpu/drm/i915/intel_display.c10
3 files changed, 46 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index c31e818f8b08..5825a586015e 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -862,19 +862,44 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused)
862 u32 gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS); 862 u32 gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS);
863 u32 rp_state_limits = I915_READ(GEN6_RP_STATE_LIMITS); 863 u32 rp_state_limits = I915_READ(GEN6_RP_STATE_LIMITS);
864 u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP); 864 u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
865 u32 rpstat;
866 u32 rpupei, rpcurup, rpprevup;
867 u32 rpdownei, rpcurdown, rpprevdown;
865 int max_freq; 868 int max_freq;
866 869
867 /* RPSTAT1 is in the GT power well */ 870 /* RPSTAT1 is in the GT power well */
868 __gen6_force_wake_get(dev_priv); 871 __gen6_force_wake_get(dev_priv);
869 872
873 rpstat = I915_READ(GEN6_RPSTAT1);
874 rpupei = I915_READ(GEN6_RP_CUR_UP_EI);
875 rpcurup = I915_READ(GEN6_RP_CUR_UP);
876 rpprevup = I915_READ(GEN6_RP_PREV_UP);
877 rpdownei = I915_READ(GEN6_RP_CUR_DOWN_EI);
878 rpcurdown = I915_READ(GEN6_RP_CUR_DOWN);
879 rpprevdown = I915_READ(GEN6_RP_PREV_DOWN);
880
870 seq_printf(m, "GT_PERF_STATUS: 0x%08x\n", gt_perf_status); 881 seq_printf(m, "GT_PERF_STATUS: 0x%08x\n", gt_perf_status);
871 seq_printf(m, "RPSTAT1: 0x%08x\n", I915_READ(GEN6_RPSTAT1)); 882 seq_printf(m, "RPSTAT1: 0x%08x\n", rpstat);
872 seq_printf(m, "Render p-state ratio: %d\n", 883 seq_printf(m, "Render p-state ratio: %d\n",
873 (gt_perf_status & 0xff00) >> 8); 884 (gt_perf_status & 0xff00) >> 8);
874 seq_printf(m, "Render p-state VID: %d\n", 885 seq_printf(m, "Render p-state VID: %d\n",
875 gt_perf_status & 0xff); 886 gt_perf_status & 0xff);
876 seq_printf(m, "Render p-state limit: %d\n", 887 seq_printf(m, "Render p-state limit: %d\n",
877 rp_state_limits & 0xff); 888 rp_state_limits & 0xff);
889 seq_printf(m, "CAGF: %dMHz\n", ((rpstat & GEN6_CAGF_MASK) >>
890 GEN6_CAGF_SHIFT) * 100);
891 seq_printf(m, "RP CUR UP EI: %dus\n", rpupei &
892 GEN6_CURICONT_MASK);
893 seq_printf(m, "RP CUR UP: %dus\n", rpcurup &
894 GEN6_CURBSYTAVG_MASK);
895 seq_printf(m, "RP PREV UP: %dus\n", rpprevup &
896 GEN6_CURBSYTAVG_MASK);
897 seq_printf(m, "RP CUR DOWN EI: %dus\n", rpdownei &
898 GEN6_CURIAVG_MASK);
899 seq_printf(m, "RP CUR DOWN: %dus\n", rpcurdown &
900 GEN6_CURBSYTAVG_MASK);
901 seq_printf(m, "RP PREV DOWN: %dus\n", rpprevdown &
902 GEN6_CURBSYTAVG_MASK);
878 903
879 max_freq = (rp_state_cap & 0xff0000) >> 16; 904 max_freq = (rp_state_cap & 0xff0000) >> 16;
880 seq_printf(m, "Lowest (RPN) frequency: %dMHz\n", 905 seq_printf(m, "Lowest (RPN) frequency: %dMHz\n",
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index e6b106bb87b6..810cfa866413 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -3283,15 +3283,28 @@
3283#define GEN6_RP_DOWN_TIMEOUT 0xA010 3283#define GEN6_RP_DOWN_TIMEOUT 0xA010
3284#define GEN6_RP_INTERRUPT_LIMITS 0xA014 3284#define GEN6_RP_INTERRUPT_LIMITS 0xA014
3285#define GEN6_RPSTAT1 0xA01C 3285#define GEN6_RPSTAT1 0xA01C
3286#define GEN6_CAGF_SHIFT 8
3287#define GEN6_CAGF_MASK (0x7f << GEN6_CAGF_SHIFT)
3286#define GEN6_RP_CONTROL 0xA024 3288#define GEN6_RP_CONTROL 0xA024
3287#define GEN6_RP_MEDIA_TURBO (1<<11) 3289#define GEN6_RP_MEDIA_TURBO (1<<11)
3288#define GEN6_RP_USE_NORMAL_FREQ (1<<9) 3290#define GEN6_RP_USE_NORMAL_FREQ (1<<9)
3289#define GEN6_RP_MEDIA_IS_GFX (1<<8) 3291#define GEN6_RP_MEDIA_IS_GFX (1<<8)
3290#define GEN6_RP_ENABLE (1<<7) 3292#define GEN6_RP_ENABLE (1<<7)
3291#define GEN6_RP_UP_BUSY_MAX (0x2<<3) 3293#define GEN6_RP_UP_IDLE_MIN (0x1<<3)
3292#define GEN6_RP_DOWN_BUSY_MIN (0x2<<0) 3294#define GEN6_RP_UP_BUSY_AVG (0x2<<3)
3295#define GEN6_RP_UP_BUSY_CONT (0x4<<3)
3296#define GEN6_RP_DOWN_IDLE_CONT (0x1<<0)
3293#define GEN6_RP_UP_THRESHOLD 0xA02C 3297#define GEN6_RP_UP_THRESHOLD 0xA02C
3294#define GEN6_RP_DOWN_THRESHOLD 0xA030 3298#define GEN6_RP_DOWN_THRESHOLD 0xA030
3299#define GEN6_RP_CUR_UP_EI 0xA050
3300#define GEN6_CURICONT_MASK 0xffffff
3301#define GEN6_RP_CUR_UP 0xA054
3302#define GEN6_CURBSYTAVG_MASK 0xffffff
3303#define GEN6_RP_PREV_UP 0xA058
3304#define GEN6_RP_CUR_DOWN_EI 0xA05C
3305#define GEN6_CURIAVG_MASK 0xffffff
3306#define GEN6_RP_CUR_DOWN 0xA060
3307#define GEN6_RP_PREV_DOWN 0xA064
3295#define GEN6_RP_UP_EI 0xA068 3308#define GEN6_RP_UP_EI 0xA068
3296#define GEN6_RP_DOWN_EI 0xA06C 3309#define GEN6_RP_DOWN_EI 0xA06C
3297#define GEN6_RP_IDLE_HYSTERSIS 0xA070 3310#define GEN6_RP_IDLE_HYSTERSIS 0xA070
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index cb9d547aa42b..a90d65dad811 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -6630,18 +6630,18 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv)
6630 I915_WRITE(GEN6_RP_INTERRUPT_LIMITS, 6630 I915_WRITE(GEN6_RP_INTERRUPT_LIMITS,
6631 18 << 24 | 6631 18 << 24 |
6632 6 << 16); 6632 6 << 16);
6633 I915_WRITE(GEN6_RP_UP_THRESHOLD, 90000); 6633 I915_WRITE(GEN6_RP_UP_THRESHOLD, 10000);
6634 I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 100000); 6634 I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 1000000);
6635 I915_WRITE(GEN6_RP_UP_EI, 100000); 6635 I915_WRITE(GEN6_RP_UP_EI, 100000);
6636 I915_WRITE(GEN6_RP_DOWN_EI, 300000); 6636 I915_WRITE(GEN6_RP_DOWN_EI, 5000000);
6637 I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10); 6637 I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10);
6638 I915_WRITE(GEN6_RP_CONTROL, 6638 I915_WRITE(GEN6_RP_CONTROL,
6639 GEN6_RP_MEDIA_TURBO | 6639 GEN6_RP_MEDIA_TURBO |
6640 GEN6_RP_USE_NORMAL_FREQ | 6640 GEN6_RP_USE_NORMAL_FREQ |
6641 GEN6_RP_MEDIA_IS_GFX | 6641 GEN6_RP_MEDIA_IS_GFX |
6642 GEN6_RP_ENABLE | 6642 GEN6_RP_ENABLE |
6643 GEN6_RP_UP_BUSY_MAX | 6643 GEN6_RP_UP_BUSY_AVG |
6644 GEN6_RP_DOWN_BUSY_MIN); 6644 GEN6_RP_DOWN_IDLE_CONT);
6645 6645
6646 if (wait_for((I915_READ(GEN6_PCODE_MAILBOX) & GEN6_PCODE_READY) == 0, 6646 if (wait_for((I915_READ(GEN6_PCODE_MAILBOX) & GEN6_PCODE_READY) == 0,
6647 500)) 6647 500))