aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_pm.c
diff options
context:
space:
mode:
authorBen Widawsky <ben@bwidawsk.net>2012-09-26 13:34:01 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-10-16 03:23:52 -0400
commit31643d54a739382626c27c0f2a12b3bbc22d1a38 (patch)
tree196ed22098e3f2a3890ff53165c038e264b7f85b /drivers/gpu/drm/i915/intel_pm.c
parent42c0526c930523425ff6edc95b7235ce7ab9308d (diff)
drm/i915: Workaround to bump rc6 voltage to 450
BIOS should be setting the minimum voltage for rc6 to be 450mV. Old or buggy BIOSen may not be doing this, so we correct it for them. Ideally customers should update the BIOS as only it would know the optimal values for the platform, so we leave that fact as a DRM_ERROR for the user to see. Unfortunately this isn't fixing any of the issues it was targeted to fix, but it is documented that we must do it. CC: Jesse Barnes <jbarnes@virtuousgeek.org> CC: Matt Turner <mattst88@gmail.com> Signed-off-by: Ben Widawsky <ben@bwidawsk.net> Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org> [danvet: bikeshedded loglevel of the "your bios is broken message" to debug.] 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.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 0cc7dbf55bee..a56ca428c38e 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -2404,7 +2404,7 @@ static void gen6_enable_rps(struct drm_device *dev)
2404 struct intel_ring_buffer *ring; 2404 struct intel_ring_buffer *ring;
2405 u32 rp_state_cap; 2405 u32 rp_state_cap;
2406 u32 gt_perf_status; 2406 u32 gt_perf_status;
2407 u32 pcu_mbox, rc6_mask = 0; 2407 u32 rc6vids, pcu_mbox, rc6_mask = 0;
2408 u32 gtfifodbg; 2408 u32 gtfifodbg;
2409 int rc6_mode; 2409 int rc6_mode;
2410 int i, ret; 2410 int i, ret;
@@ -2526,6 +2526,20 @@ static void gen6_enable_rps(struct drm_device *dev)
2526 /* enable all PM interrupts */ 2526 /* enable all PM interrupts */
2527 I915_WRITE(GEN6_PMINTRMSK, 0); 2527 I915_WRITE(GEN6_PMINTRMSK, 0);
2528 2528
2529 rc6vids = 0;
2530 ret = sandybridge_pcode_read(dev_priv, GEN6_PCODE_READ_RC6VIDS, &rc6vids);
2531 if (IS_GEN6(dev) && ret) {
2532 DRM_DEBUG_DRIVER("Couldn't check for BIOS workaround\n");
2533 } else if (IS_GEN6(dev) && (GEN6_DECODE_RC6_VID(rc6vids & 0xff) < 450)) {
2534 DRM_DEBUG_DRIVER("You should update your BIOS. Correcting minimum rc6 voltage (%dmV->%dmV)\n",
2535 GEN6_DECODE_RC6_VID(rc6vids & 0xff), 450);
2536 rc6vids &= 0xffff00;
2537 rc6vids |= GEN6_ENCODE_RC6_VID(450);
2538 ret = sandybridge_pcode_write(dev_priv, GEN6_PCODE_WRITE_RC6VIDS, rc6vids);
2539 if (ret)
2540 DRM_ERROR("Couldn't fix incorrect rc6 voltage\n");
2541 }
2542
2529 gen6_gt_force_wake_put(dev_priv); 2543 gen6_gt_force_wake_put(dev_priv);
2530} 2544}
2531 2545