aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEugeni Dodonov <eugeni.dodonov@intel.com>2012-03-23 10:57:18 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-04-01 06:27:50 -0400
commit83b7f9ac9126f0532ca34c14e4f0582c565c6b0d (patch)
tree4c3b9359270a0009150719eae585acd679cc5324
parent7dd4906586274f3945f2aeaaa5a33b451c3b4bba (diff)
drm/i915: allow to select rc6 modes via kernel parameter
This allows to select which rc6 modes are to be used via kernel parameter, via a bitmask parameter. E.g.: - to enable rc6, i915_enable_rc6=1 - to enable rc6 and deep rc6, i915_enable_rc6=3 - to enable rc6 and deepest rc6, use i915_enable_rc6=5 - to enable rc6, deep and deepest rc6, use i915_enable_rc6=7 Please keep in mind that the deepest RC6 state really should NOT be used by default, as it could potentially worsen the issues with deep RC6. So do enable it only when you know what you are doing. However, having it around could help solving possible future rc6-related issues and their debugging on user machines. Note that this changes behavior - previously, value of 1 would enable both RC6 and deep RC6. Now it should only enable RC6 and deep/deepest RC6 stages must be enabled manually. v2: address Chris Wilson comments and clean up the code. References: https://bugs.freedesktop.org/show_bug.cgi?id=42579 Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Ben Widawsky <benjamin.widawsky@intel.com> Signed-off-by: Eugeni Dodonov <eugeni.dodonov@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c6
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h21
-rw-r--r--drivers/gpu/drm/i915/intel_display.c20
3 files changed, 42 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 1a7559b59997..c7d689e4247c 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -66,7 +66,11 @@ MODULE_PARM_DESC(semaphores,
66int i915_enable_rc6 __read_mostly = -1; 66int i915_enable_rc6 __read_mostly = -1;
67module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600); 67module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600);
68MODULE_PARM_DESC(i915_enable_rc6, 68MODULE_PARM_DESC(i915_enable_rc6,
69 "Enable power-saving render C-state 6 (default: -1 (use per-chip default)"); 69 "Enable power-saving render C-state 6. "
70 "Different stages can be selected via bitmask values "
71 "(0 = disable; 1 = enable rc6; 2 = enable deep rc6; 4 = enable deepest rc6). "
72 "For example, 3 would enable rc6 and deep rc6, and 7 would enable everything. "
73 "default: -1 (use per-chip default)");
70 74
71int i915_enable_fbc __read_mostly = -1; 75int i915_enable_fbc __read_mostly = -1;
72module_param_named(i915_enable_fbc, i915_enable_fbc, int, 0600); 76module_param_named(i915_enable_fbc, i915_enable_fbc, int, 0600);
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index c0f19f572004..2c192270cb0d 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1053,6 +1053,27 @@ struct drm_i915_file_private {
1053 1053
1054#include "i915_trace.h" 1054#include "i915_trace.h"
1055 1055
1056/**
1057 * RC6 is a special power stage which allows the GPU to enter an very
1058 * low-voltage mode when idle, using down to 0V while at this stage. This
1059 * stage is entered automatically when the GPU is idle when RC6 support is
1060 * enabled, and as soon as new workload arises GPU wakes up automatically as well.
1061 *
1062 * There are different RC6 modes available in Intel GPU, which differentiate
1063 * among each other with the latency required to enter and leave RC6 and
1064 * voltage consumed by the GPU in different states.
1065 *
1066 * The combination of the following flags define which states GPU is allowed
1067 * to enter, while RC6 is the normal RC6 state, RC6p is the deep RC6, and
1068 * RC6pp is deepest RC6. Their support by hardware varies according to the
1069 * GPU, BIOS, chipset and platform. RC6 is usually the safest one and the one
1070 * which brings the most power savings; deeper states save more power, but
1071 * require higher latency to switch to and wake up.
1072 */
1073#define INTEL_RC6_ENABLE (1<<0)
1074#define INTEL_RC6p_ENABLE (1<<1)
1075#define INTEL_RC6pp_ENABLE (1<<2)
1076
1056extern struct drm_ioctl_desc i915_ioctls[]; 1077extern struct drm_ioctl_desc i915_ioctls[];
1057extern int i915_max_ioctl; 1078extern int i915_max_ioctl;
1058extern unsigned int i915_fbpercrtc __always_unused; 1079extern unsigned int i915_fbpercrtc __always_unused;
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 078477306975..a0a4e3bcbcf6 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -8221,7 +8221,7 @@ void intel_init_emon(struct drm_device *dev)
8221 dev_priv->corr = (lcfuse & LCFUSE_HIV_MASK); 8221 dev_priv->corr = (lcfuse & LCFUSE_HIV_MASK);
8222} 8222}
8223 8223
8224static bool intel_enable_rc6(struct drm_device *dev) 8224static int intel_enable_rc6(struct drm_device *dev)
8225{ 8225{
8226 /* 8226 /*
8227 * Respect the kernel parameter if it is set 8227 * Respect the kernel parameter if it is set
@@ -8253,6 +8253,7 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv)
8253 u32 pcu_mbox, rc6_mask = 0; 8253 u32 pcu_mbox, rc6_mask = 0;
8254 u32 gtfifodbg; 8254 u32 gtfifodbg;
8255 int cur_freq, min_freq, max_freq; 8255 int cur_freq, min_freq, max_freq;
8256 int rc6_mode;
8256 int i; 8257 int i;
8257 8258
8258 /* Here begins a magic sequence of register writes to enable 8259 /* Here begins a magic sequence of register writes to enable
@@ -8290,9 +8291,20 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv)
8290 I915_WRITE(GEN6_RC6p_THRESHOLD, 100000); 8291 I915_WRITE(GEN6_RC6p_THRESHOLD, 100000);
8291 I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */ 8292 I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */
8292 8293
8293 if (intel_enable_rc6(dev_priv->dev)) 8294 rc6_mode = intel_enable_rc6(dev_priv->dev);
8294 rc6_mask = GEN6_RC_CTL_RC6_ENABLE | 8295 if (rc6_mode & INTEL_RC6_ENABLE)
8295 ((IS_GEN7(dev_priv->dev)) ? GEN6_RC_CTL_RC6p_ENABLE : 0); 8296 rc6_mask |= GEN6_RC_CTL_RC6_ENABLE;
8297
8298 if (rc6_mode & INTEL_RC6p_ENABLE)
8299 rc6_mask |= GEN6_RC_CTL_RC6p_ENABLE;
8300
8301 if (rc6_mode & INTEL_RC6pp_ENABLE)
8302 rc6_mask |= GEN6_RC_CTL_RC6pp_ENABLE;
8303
8304 DRM_INFO("Enabling RC6 states: RC6 %s, RC6p %s, RC6pp %s\n",
8305 (rc6_mode & INTEL_RC6_ENABLE) ? "on" : "off",
8306 (rc6_mode & INTEL_RC6p_ENABLE) ? "on" : "off",
8307 (rc6_mode & INTEL_RC6pp_ENABLE) ? "on" : "off");
8296 8308
8297 I915_WRITE(GEN6_RC_CONTROL, 8309 I915_WRITE(GEN6_RC_CONTROL,
8298 rc6_mask | 8310 rc6_mask |