diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2017-11-08 08:35:55 -0500 |
---|---|---|
committer | Jani Nikula <jani.nikula@intel.com> | 2017-11-09 09:18:35 -0500 |
commit | 6ac43272768ca901daac4076a66c2c4e3c7b9321 (patch) | |
tree | 863abd88d542fa5fc9862df6317feaabf8e3c5f6 | |
parent | 398c13b9632027d044a0ab41538743214284c2a2 (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.c | 14 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 44 |
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 | */ | ||
5769 | static 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 | |||
5765 | void ilk_wm_get_hw_state(struct drm_device *dev) | 5781 | void 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 | ||
8217 | static 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 | |||
8229 | static void ilk_init_clock_gating(struct drm_i915_private *dev_priv) | 8235 | static 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 | ||
8654 | static void hsw_init_clock_gating(struct drm_i915_private *dev_priv) | 8654 | static 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 */ |