aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2016-05-13 16:41:30 -0400
committerVille Syrjälä <ville.syrjala@linux.intel.com>2016-05-23 14:11:14 -0400
commit70c2c184065e642642b563ae36ff3db682a5eee0 (patch)
tree62a9692ae22dd45759cd18555040f0e66c4448b7
parent9f7eb31af2968a194b29f67ec10776685a81afc9 (diff)
drm/i915: Move SKL+ DBUF enable/disable to display core init/uninit
SKL and BXT have the same snippets of code for enabling disabling the DBUF. Extract those into helpers and move the calls from init/unit_cdclk() to the display core init/init since this stuff isn't really about cdclk. Also doing the enable twice shouldn't hurt since you're just setting the request bit again when it was already set. We can also toss in a few WARNs about the register values into skl_get_dpll0_vco() now that we know that things should always be sane there. Flatten skl_init_cdclk() while at it. v2: s/skl/gen9/ in function names (Imre) Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1463172100-24715-12-git-send-email-ville.syrjala@linux.intel.com Reviewed-by: Imre Deak <imre.deak@intel.com>
-rw-r--r--drivers/gpu/drm/i915/intel_display.c58
-rw-r--r--drivers/gpu/drm/i915/intel_runtime_pm.c32
2 files changed, 38 insertions, 52 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 58b8d759eaaa..6b2b965c254d 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -5400,18 +5400,6 @@ static bool broxton_cdclk_is_enabled(struct drm_i915_private *dev_priv)
5400 5400
5401 /* TODO: Check for a valid CDCLK rate */ 5401 /* TODO: Check for a valid CDCLK rate */
5402 5402
5403 if (!(I915_READ(DBUF_CTL) & DBUF_POWER_REQUEST)) {
5404 DRM_DEBUG_DRIVER("CDCLK enabled, but DBUF power not requested\n");
5405
5406 return false;
5407 }
5408
5409 if (!(I915_READ(DBUF_CTL) & DBUF_POWER_STATE)) {
5410 DRM_DEBUG_DRIVER("CDCLK enabled, but DBUF power hasn't settled\n");
5411
5412 return false;
5413 }
5414
5415 return true; 5403 return true;
5416} 5404}
5417 5405
@@ -5438,26 +5426,10 @@ void broxton_init_cdclk(struct drm_i915_private *dev_priv)
5438 * here, it belongs to modeset time 5426 * here, it belongs to modeset time
5439 */ 5427 */
5440 broxton_set_cdclk(dev_priv, 624000); 5428 broxton_set_cdclk(dev_priv, 624000);
5441
5442 I915_WRITE(DBUF_CTL, I915_READ(DBUF_CTL) | DBUF_POWER_REQUEST);
5443 POSTING_READ(DBUF_CTL);
5444
5445 udelay(10);
5446
5447 if (!(I915_READ(DBUF_CTL) & DBUF_POWER_STATE))
5448 DRM_ERROR("DBuf power enable timeout!\n");
5449} 5429}
5450 5430
5451void broxton_uninit_cdclk(struct drm_i915_private *dev_priv) 5431void broxton_uninit_cdclk(struct drm_i915_private *dev_priv)
5452{ 5432{
5453 I915_WRITE(DBUF_CTL, I915_READ(DBUF_CTL) & ~DBUF_POWER_REQUEST);
5454 POSTING_READ(DBUF_CTL);
5455
5456 udelay(10);
5457
5458 if (I915_READ(DBUF_CTL) & DBUF_POWER_STATE)
5459 DRM_ERROR("DBuf power disable timeout!\n");
5460
5461 /* Set minimum (bypass) frequency, in effect turning off the DE PLL */ 5433 /* Set minimum (bypass) frequency, in effect turning off the DE PLL */
5462 broxton_set_cdclk(dev_priv, 19200); 5434 broxton_set_cdclk(dev_priv, 19200);
5463} 5435}
@@ -5679,15 +5651,6 @@ static void skl_sanitize_cdclk(struct drm_i915_private *dev_priv);
5679 5651
5680void skl_uninit_cdclk(struct drm_i915_private *dev_priv) 5652void skl_uninit_cdclk(struct drm_i915_private *dev_priv)
5681{ 5653{
5682 /* disable DBUF power */
5683 I915_WRITE(DBUF_CTL, I915_READ(DBUF_CTL) & ~DBUF_POWER_REQUEST);
5684 POSTING_READ(DBUF_CTL);
5685
5686 udelay(10);
5687
5688 if (I915_READ(DBUF_CTL) & DBUF_POWER_STATE)
5689 DRM_ERROR("DBuf power disable timeout\n");
5690
5691 skl_set_cdclk(dev_priv, 24000, 0); 5654 skl_set_cdclk(dev_priv, 24000, 0);
5692} 5655}
5693 5656
@@ -5705,24 +5668,15 @@ void skl_init_cdclk(struct drm_i915_private *dev_priv)
5705 if (dev_priv->skl_preferred_vco_freq == 0) 5668 if (dev_priv->skl_preferred_vco_freq == 0)
5706 skl_set_preferred_cdclk_vco(dev_priv, 5669 skl_set_preferred_cdclk_vco(dev_priv,
5707 dev_priv->skl_vco_freq); 5670 dev_priv->skl_vco_freq);
5708 } else { 5671 return;
5709 /* set CDCLK to the lowest frequency, Modeset follows */
5710 vco = dev_priv->skl_preferred_vco_freq;
5711 if (vco == 0)
5712 vco = 8100;
5713 cdclk = skl_calc_cdclk(0, vco);
5714
5715 skl_set_cdclk(dev_priv, cdclk, vco);
5716 } 5672 }
5717 5673
5718 /* enable DBUF power */ 5674 vco = dev_priv->skl_preferred_vco_freq;
5719 I915_WRITE(DBUF_CTL, I915_READ(DBUF_CTL) | DBUF_POWER_REQUEST); 5675 if (vco == 0)
5720 POSTING_READ(DBUF_CTL); 5676 vco = 8100;
5721 5677 cdclk = skl_calc_cdclk(0, vco);
5722 udelay(10);
5723 5678
5724 if (!(I915_READ(DBUF_CTL) & DBUF_POWER_STATE)) 5679 skl_set_cdclk(dev_priv, cdclk, vco);
5725 DRM_ERROR("DBuf power enable timeout\n");
5726} 5680}
5727 5681
5728static void skl_sanitize_cdclk(struct drm_i915_private *dev_priv) 5682static void skl_sanitize_cdclk(struct drm_i915_private *dev_priv)
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
index fefe22c3c163..dc74f38d945f 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -2176,6 +2176,28 @@ static void intel_power_domains_sync_hw(struct drm_i915_private *dev_priv)
2176 mutex_unlock(&power_domains->lock); 2176 mutex_unlock(&power_domains->lock);
2177} 2177}
2178 2178
2179static void gen9_dbuf_enable(struct drm_i915_private *dev_priv)
2180{
2181 I915_WRITE(DBUF_CTL, I915_READ(DBUF_CTL) | DBUF_POWER_REQUEST);
2182 POSTING_READ(DBUF_CTL);
2183
2184 udelay(10);
2185
2186 if (!(I915_READ(DBUF_CTL) & DBUF_POWER_STATE))
2187 DRM_ERROR("DBuf power enable timeout\n");
2188}
2189
2190static void gen9_dbuf_disable(struct drm_i915_private *dev_priv)
2191{
2192 I915_WRITE(DBUF_CTL, I915_READ(DBUF_CTL) & ~DBUF_POWER_REQUEST);
2193 POSTING_READ(DBUF_CTL);
2194
2195 udelay(10);
2196
2197 if (I915_READ(DBUF_CTL) & DBUF_POWER_STATE)
2198 DRM_ERROR("DBuf power disable timeout!\n");
2199}
2200
2179static void skl_display_core_init(struct drm_i915_private *dev_priv, 2201static void skl_display_core_init(struct drm_i915_private *dev_priv,
2180 bool resume) 2202 bool resume)
2181{ 2203{
@@ -2202,6 +2224,8 @@ static void skl_display_core_init(struct drm_i915_private *dev_priv,
2202 2224
2203 skl_init_cdclk(dev_priv); 2225 skl_init_cdclk(dev_priv);
2204 2226
2227 gen9_dbuf_enable(dev_priv);
2228
2205 if (resume && dev_priv->csr.dmc_payload) 2229 if (resume && dev_priv->csr.dmc_payload)
2206 intel_csr_load_program(dev_priv); 2230 intel_csr_load_program(dev_priv);
2207} 2231}
@@ -2213,6 +2237,8 @@ static void skl_display_core_uninit(struct drm_i915_private *dev_priv)
2213 2237
2214 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE); 2238 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
2215 2239
2240 gen9_dbuf_disable(dev_priv);
2241
2216 skl_uninit_cdclk(dev_priv); 2242 skl_uninit_cdclk(dev_priv);
2217 2243
2218 /* The spec doesn't call for removing the reset handshake flag */ 2244 /* The spec doesn't call for removing the reset handshake flag */
@@ -2257,6 +2283,9 @@ void bxt_display_core_init(struct drm_i915_private *dev_priv,
2257 mutex_unlock(&power_domains->lock); 2283 mutex_unlock(&power_domains->lock);
2258 2284
2259 broxton_init_cdclk(dev_priv); 2285 broxton_init_cdclk(dev_priv);
2286
2287 gen9_dbuf_enable(dev_priv);
2288
2260 broxton_ddi_phy_init(dev_priv); 2289 broxton_ddi_phy_init(dev_priv);
2261 2290
2262 broxton_cdclk_verify_state(dev_priv); 2291 broxton_cdclk_verify_state(dev_priv);
@@ -2274,6 +2303,9 @@ void bxt_display_core_uninit(struct drm_i915_private *dev_priv)
2274 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE); 2303 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
2275 2304
2276 broxton_ddi_phy_uninit(dev_priv); 2305 broxton_ddi_phy_uninit(dev_priv);
2306
2307 gen9_dbuf_disable(dev_priv);
2308
2277 broxton_uninit_cdclk(dev_priv); 2309 broxton_uninit_cdclk(dev_priv);
2278 2310
2279 /* The spec doesn't call for removing the reset handshake flag */ 2311 /* The spec doesn't call for removing the reset handshake flag */