aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2017-11-08 08:35:55 -0500
committerJani Nikula <jani.nikula@intel.com>2017-11-09 09:18:35 -0500
commit6ac43272768ca901daac4076a66c2c4e3c7b9321 (patch)
tree863abd88d542fa5fc9862df6317feaabf8e3c5f6
parent398c13b9632027d044a0ab41538743214284c2a2 (diff)
drm/i915: Move init_clock_gating() back to where it was
Apparently setting up a bunch of GT registers before we've properly initialized the rest of the GT hardware leads to these setting being lost. So looks like I broke HSW with commit b7048ea12fbb ("drm/i915: Do .init_clock_gating() earlier to avoid it clobbering watermarks") by doing init_clock_gating() too early. This should actually affect other platforms as well, but apparently not to such a great degree. What I was ultimately after in that commit was to move the ilk_init_lp_watermarks() call earlier. So let's undo the damage and move init_clock_gating() back to where it was, and call ilk_init_lp_watermarks() just before the watermark state readout. This highlights how fragile and messed up our init order really is. I wonder why we even initialize the display before gem. The opposite order would make much more sense to me... v2: Keep WaRsPkgCStateDisplayPMReq:hsw early as it really must be done before all planes might get disabled. Cc: stable@vger.kernel.org Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Mark Janes <mark.a.janes@intel.com> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Oscar Mateo <oscar.mateo@intel.com> Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com> Reported-by: Mark Janes <mark.a.janes@intel.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103549 Fixes: b7048ea12fbb ("drm/i915: Do .init_clock_gating() earlier to avoid it clobbering watermarks") References: https://lists.freedesktop.org/archives/intel-gfx/2017-November/145432.html Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20171108133555.14091-1-ville.syrjala@linux.intel.com Tested-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> (cherry picked from commit f72b84c677d61f201b869223a8d6e389c7bb7d3d) Signed-off-by: Jani Nikula <jani.nikula@intel.com>
-rw-r--r--drivers/gpu/drm/i915/intel_display.c14
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c44
2 files changed, 30 insertions, 28 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index e2ac976844d8..f4a9a182868f 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -3676,6 +3676,7 @@ void intel_finish_reset(struct drm_i915_private *dev_priv)
3676 3676
3677 intel_pps_unlock_regs_wa(dev_priv); 3677 intel_pps_unlock_regs_wa(dev_priv);
3678 intel_modeset_init_hw(dev); 3678 intel_modeset_init_hw(dev);
3679 intel_init_clock_gating(dev_priv);
3679 3680
3680 spin_lock_irq(&dev_priv->irq_lock); 3681 spin_lock_irq(&dev_priv->irq_lock);
3681 if (dev_priv->display.hpd_irq_setup) 3682 if (dev_priv->display.hpd_irq_setup)
@@ -14350,8 +14351,6 @@ void intel_modeset_init_hw(struct drm_device *dev)
14350 14351
14351 intel_update_cdclk(dev_priv); 14352 intel_update_cdclk(dev_priv);
14352 dev_priv->cdclk.logical = dev_priv->cdclk.actual = dev_priv->cdclk.hw; 14353 dev_priv->cdclk.logical = dev_priv->cdclk.actual = dev_priv->cdclk.hw;
14353
14354 intel_init_clock_gating(dev_priv);
14355} 14354}
14356 14355
14357/* 14356/*
@@ -15063,6 +15062,15 @@ intel_modeset_setup_hw_state(struct drm_device *dev,
15063 struct intel_encoder *encoder; 15062 struct intel_encoder *encoder;
15064 int i; 15063 int i;
15065 15064
15065 if (IS_HASWELL(dev_priv)) {
15066 /*
15067 * WaRsPkgCStateDisplayPMReq:hsw
15068 * System hang if this isn't done before disabling all planes!
15069 */
15070 I915_WRITE(CHICKEN_PAR1_1,
15071 I915_READ(CHICKEN_PAR1_1) | FORCE_ARB_IDLE_PLANES);
15072 }
15073
15066 intel_modeset_readout_hw_state(dev); 15074 intel_modeset_readout_hw_state(dev);
15067 15075
15068 /* HW state is read out, now we need to sanitize this mess. */ 15076 /* HW state is read out, now we need to sanitize this mess. */
@@ -15160,6 +15168,8 @@ void intel_modeset_gem_init(struct drm_device *dev)
15160 15168
15161 intel_init_gt_powersave(dev_priv); 15169 intel_init_gt_powersave(dev_priv);
15162 15170
15171 intel_init_clock_gating(dev_priv);
15172
15163 intel_setup_overlay(dev_priv); 15173 intel_setup_overlay(dev_priv);
15164} 15174}
15165 15175
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 7d2ecabc5de5..aa12a44e9a76 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -5762,12 +5762,30 @@ void vlv_wm_sanitize(struct drm_i915_private *dev_priv)
5762 mutex_unlock(&dev_priv->wm.wm_mutex); 5762 mutex_unlock(&dev_priv->wm.wm_mutex);
5763} 5763}
5764 5764
5765/*
5766 * FIXME should probably kill this and improve
5767 * the real watermark readout/sanitation instead
5768 */
5769static void ilk_init_lp_watermarks(struct drm_i915_private *dev_priv)
5770{
5771 I915_WRITE(WM3_LP_ILK, I915_READ(WM3_LP_ILK) & ~WM1_LP_SR_EN);
5772 I915_WRITE(WM2_LP_ILK, I915_READ(WM2_LP_ILK) & ~WM1_LP_SR_EN);
5773 I915_WRITE(WM1_LP_ILK, I915_READ(WM1_LP_ILK) & ~WM1_LP_SR_EN);
5774
5775 /*
5776 * Don't touch WM1S_LP_EN here.
5777 * Doing so could cause underruns.
5778 */
5779}
5780
5765void ilk_wm_get_hw_state(struct drm_device *dev) 5781void ilk_wm_get_hw_state(struct drm_device *dev)
5766{ 5782{
5767 struct drm_i915_private *dev_priv = to_i915(dev); 5783 struct drm_i915_private *dev_priv = to_i915(dev);
5768 struct ilk_wm_values *hw = &dev_priv->wm.hw; 5784 struct ilk_wm_values *hw = &dev_priv->wm.hw;
5769 struct drm_crtc *crtc; 5785 struct drm_crtc *crtc;
5770 5786
5787 ilk_init_lp_watermarks(dev_priv);
5788
5771 for_each_crtc(dev, crtc) 5789 for_each_crtc(dev, crtc)
5772 ilk_pipe_wm_get_hw_state(crtc); 5790 ilk_pipe_wm_get_hw_state(crtc);
5773 5791
@@ -8214,18 +8232,6 @@ static void g4x_disable_trickle_feed(struct drm_i915_private *dev_priv)
8214 } 8232 }
8215} 8233}
8216 8234
8217static void ilk_init_lp_watermarks(struct drm_i915_private *dev_priv)
8218{
8219 I915_WRITE(WM3_LP_ILK, I915_READ(WM3_LP_ILK) & ~WM1_LP_SR_EN);
8220 I915_WRITE(WM2_LP_ILK, I915_READ(WM2_LP_ILK) & ~WM1_LP_SR_EN);
8221 I915_WRITE(WM1_LP_ILK, I915_READ(WM1_LP_ILK) & ~WM1_LP_SR_EN);
8222
8223 /*
8224 * Don't touch WM1S_LP_EN here.
8225 * Doing so could cause underruns.
8226 */
8227}
8228
8229static void ilk_init_clock_gating(struct drm_i915_private *dev_priv) 8235static void ilk_init_clock_gating(struct drm_i915_private *dev_priv)
8230{ 8236{
8231 uint32_t dspclk_gate = ILK_VRHUNIT_CLOCK_GATE_DISABLE; 8237 uint32_t dspclk_gate = ILK_VRHUNIT_CLOCK_GATE_DISABLE;
@@ -8259,8 +8265,6 @@ static void ilk_init_clock_gating(struct drm_i915_private *dev_priv)
8259 (I915_READ(DISP_ARB_CTL) | 8265 (I915_READ(DISP_ARB_CTL) |
8260 DISP_FBC_WM_DIS)); 8266 DISP_FBC_WM_DIS));
8261 8267
8262 ilk_init_lp_watermarks(dev_priv);
8263
8264 /* 8268 /*
8265 * Based on the document from hardware guys the following bits 8269 * Based on the document from hardware guys the following bits
8266 * should be set unconditionally in order to enable FBC. 8270 * should be set unconditionally in order to enable FBC.
@@ -8373,8 +8377,6 @@ static void gen6_init_clock_gating(struct drm_i915_private *dev_priv)
8373 I915_WRITE(GEN6_GT_MODE, 8377 I915_WRITE(GEN6_GT_MODE,
8374 _MASKED_FIELD(GEN6_WIZ_HASHING_MASK, GEN6_WIZ_HASHING_16x4)); 8378 _MASKED_FIELD(GEN6_WIZ_HASHING_MASK, GEN6_WIZ_HASHING_16x4));
8375 8379
8376 ilk_init_lp_watermarks(dev_priv);
8377
8378 I915_WRITE(CACHE_MODE_0, 8380 I915_WRITE(CACHE_MODE_0,
8379 _MASKED_BIT_DISABLE(CM0_STC_EVICT_DISABLE_LRA_SNB)); 8381 _MASKED_BIT_DISABLE(CM0_STC_EVICT_DISABLE_LRA_SNB));
8380 8382
@@ -8601,8 +8603,6 @@ static void bdw_init_clock_gating(struct drm_i915_private *dev_priv)
8601 I915_GTT_PAGE_SIZE_2M); 8603 I915_GTT_PAGE_SIZE_2M);
8602 enum pipe pipe; 8604 enum pipe pipe;
8603 8605
8604 ilk_init_lp_watermarks(dev_priv);
8605
8606 /* WaSwitchSolVfFArbitrationPriority:bdw */ 8606 /* WaSwitchSolVfFArbitrationPriority:bdw */
8607 I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL); 8607 I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL);
8608 8608
@@ -8653,8 +8653,6 @@ static void bdw_init_clock_gating(struct drm_i915_private *dev_priv)
8653 8653
8654static void hsw_init_clock_gating(struct drm_i915_private *dev_priv) 8654static void hsw_init_clock_gating(struct drm_i915_private *dev_priv)
8655{ 8655{
8656 ilk_init_lp_watermarks(dev_priv);
8657
8658 /* L3 caching of data atomics doesn't work -- disable it. */ 8656 /* L3 caching of data atomics doesn't work -- disable it. */
8659 I915_WRITE(HSW_SCRATCH1, HSW_SCRATCH1_L3_DATA_ATOMICS_DISABLE); 8657 I915_WRITE(HSW_SCRATCH1, HSW_SCRATCH1_L3_DATA_ATOMICS_DISABLE);
8660 I915_WRITE(HSW_ROW_CHICKEN3, 8658 I915_WRITE(HSW_ROW_CHICKEN3,
@@ -8698,10 +8696,6 @@ static void hsw_init_clock_gating(struct drm_i915_private *dev_priv)
8698 /* WaSwitchSolVfFArbitrationPriority:hsw */ 8696 /* WaSwitchSolVfFArbitrationPriority:hsw */
8699 I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL); 8697 I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL);
8700 8698
8701 /* WaRsPkgCStateDisplayPMReq:hsw */
8702 I915_WRITE(CHICKEN_PAR1_1,
8703 I915_READ(CHICKEN_PAR1_1) | FORCE_ARB_IDLE_PLANES);
8704
8705 lpt_init_clock_gating(dev_priv); 8699 lpt_init_clock_gating(dev_priv);
8706} 8700}
8707 8701
@@ -8709,8 +8703,6 @@ static void ivb_init_clock_gating(struct drm_i915_private *dev_priv)
8709{ 8703{
8710 uint32_t snpcr; 8704 uint32_t snpcr;
8711 8705
8712 ilk_init_lp_watermarks(dev_priv);
8713
8714 I915_WRITE(ILK_DSPCLK_GATE_D, ILK_VRHUNIT_CLOCK_GATE_DISABLE); 8706 I915_WRITE(ILK_DSPCLK_GATE_D, ILK_VRHUNIT_CLOCK_GATE_DISABLE);
8715 8707
8716 /* WaDisableEarlyCull:ivb */ 8708 /* WaDisableEarlyCull:ivb */