aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEugeni Dodonov <eugeni.dodonov@intel.com>2012-07-02 10:51:09 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-07-05 03:56:03 -0400
commitcad2a2d7761238c0b9ff62eecc89215e6bd61831 (patch)
treef23708b2289dc9e6dbe0e68e36ec81c8756db33f
parent885094845067dd3791b0f6c3497d51bca76e393a (diff)
drm/i915: introduce haswell_init_clock_gating
This is based on Ivy Bridge clock gating for now, but is subject to changes in the future. Note: Compared to the ivb clock gating this drops the the IDICOS medium uncore sharing tuned in commit 208482232de3590cee4757dfabe5d8cee8c6e626 Author: Ben Widawsky <ben@bwidawsk.net> Date: Fri May 4 18:58:59 2012 -0700 drm/i915: set IDICOS to medium uncore resources Eugeni wants to benchmark the effect of this first. Signed-off-by: Eugeni Dodonov <eugeni.dodonov@intel.com> [danvet: added note] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c54
1 files changed, 53 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index c06785ed3f43..3c2724e42975 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -3417,6 +3417,58 @@ static void gen7_setup_fixed_func_scheduler(struct drm_i915_private *dev_priv)
3417 I915_WRITE(GEN7_FF_THREAD_MODE, reg); 3417 I915_WRITE(GEN7_FF_THREAD_MODE, reg);
3418} 3418}
3419 3419
3420static void haswell_init_clock_gating(struct drm_device *dev)
3421{
3422 struct drm_i915_private *dev_priv = dev->dev_private;
3423 int pipe;
3424 uint32_t dspclk_gate = VRHUNIT_CLOCK_GATE_DISABLE;
3425
3426 I915_WRITE(PCH_DSPCLK_GATE_D, dspclk_gate);
3427
3428 I915_WRITE(WM3_LP_ILK, 0);
3429 I915_WRITE(WM2_LP_ILK, 0);
3430 I915_WRITE(WM1_LP_ILK, 0);
3431
3432 /* According to the spec, bit 13 (RCZUNIT) must be set on IVB.
3433 * This implements the WaDisableRCZUnitClockGating workaround.
3434 */
3435 I915_WRITE(GEN6_UCGCTL2, GEN6_RCZUNIT_CLOCK_GATE_DISABLE);
3436
3437 I915_WRITE(ILK_DSPCLK_GATE, IVB_VRHUNIT_CLK_GATE);
3438
3439 I915_WRITE(IVB_CHICKEN3,
3440 CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE |
3441 CHICKEN3_DGMG_DONE_FIX_DISABLE);
3442
3443 /* Apply the WaDisableRHWOOptimizationForRenderHang workaround. */
3444 I915_WRITE(GEN7_COMMON_SLICE_CHICKEN1,
3445 GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC);
3446
3447 /* WaApplyL3ControlAndL3ChickenMode requires those two on Ivy Bridge */
3448 I915_WRITE(GEN7_L3CNTLREG1,
3449 GEN7_WA_FOR_GEN7_L3_CONTROL);
3450 I915_WRITE(GEN7_L3_CHICKEN_MODE_REGISTER,
3451 GEN7_WA_L3_CHICKEN_MODE);
3452
3453 /* This is required by WaCatErrorRejectionIssue */
3454 I915_WRITE(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG,
3455 I915_READ(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) |
3456 GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB);
3457
3458 for_each_pipe(pipe) {
3459 I915_WRITE(DSPCNTR(pipe),
3460 I915_READ(DSPCNTR(pipe)) |
3461 DISPPLANE_TRICKLE_FEED_DISABLE);
3462 intel_flush_display_plane(dev_priv, pipe);
3463 }
3464
3465 gen7_setup_fixed_func_scheduler(dev_priv);
3466
3467 /* WaDisable4x2SubspanOptimization */
3468 I915_WRITE(CACHE_MODE_1,
3469 _MASKED_BIT_ENABLE(PIXEL_SUBSPAN_COLLECT_OPT_DISABLE));
3470}
3471
3420static void ivybridge_init_clock_gating(struct drm_device *dev) 3472static void ivybridge_init_clock_gating(struct drm_device *dev)
3421{ 3473{
3422 struct drm_i915_private *dev_priv = dev->dev_private; 3474 struct drm_i915_private *dev_priv = dev->dev_private;
@@ -3826,7 +3878,7 @@ void intel_init_pm(struct drm_device *dev)
3826 "Disable CxSR\n"); 3878 "Disable CxSR\n");
3827 dev_priv->display.update_wm = NULL; 3879 dev_priv->display.update_wm = NULL;
3828 } 3880 }
3829 dev_priv->display.init_clock_gating = ivybridge_init_clock_gating; 3881 dev_priv->display.init_clock_gating = haswell_init_clock_gating;
3830 dev_priv->display.sanitize_pm = gen6_sanitize_pm; 3882 dev_priv->display.sanitize_pm = gen6_sanitize_pm;
3831 } else 3883 } else
3832 dev_priv->display.update_wm = NULL; 3884 dev_priv->display.update_wm = NULL;