aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_display.c
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2016-06-09 12:39:07 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2016-06-09 12:48:08 -0400
commit8c07eb68330f3ed9a735023a0f0e7f4e873e0c63 (patch)
treeba8ae1aed63cf0922c9e7d6ac7ef44954df02cc7 /drivers/gpu/drm/i915/intel_display.c
parentd1b4eefdea6d63aa15321f539feec298d8aefdc1 (diff)
Revert "drm/i915/ilk: Don't disable SSC source if it's in use"
This reverts commit f165d2834ceb3d5c29bebadadc27629bebf402ac. It breaks one of our CI systems. Quoting from Ville: [ 13.100979] [drm:ironlake_init_pch_refclk] has_panel 1 has_lvds 1 has_ck505 0 using_ssc_source 1 [ 13.101413] ------------[ cut here ]------------ [ 13.101429] kernel BUG at drivers/gpu/drm/i915/intel_display.c:8528! "which is the 'BUG_ON(val != final)' at the end of ironlake_init_pch_refclk()." Cc: stable@vger.kernel.org Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Lyude <cpaul@redhat.com> Cc: marius.c.vlad@intel.com References: https://www.spinics.net/lists/dri-devel/msg109557.html Acked-by: Lyude <cpaul@redhat.com> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c49
1 files changed, 13 insertions, 36 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 12ff79594bc1..473c8fdb38b9 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -8361,14 +8361,12 @@ static void ironlake_init_pch_refclk(struct drm_device *dev)
8361{ 8361{
8362 struct drm_i915_private *dev_priv = dev->dev_private; 8362 struct drm_i915_private *dev_priv = dev->dev_private;
8363 struct intel_encoder *encoder; 8363 struct intel_encoder *encoder;
8364 int i;
8365 u32 val, final; 8364 u32 val, final;
8366 bool has_lvds = false; 8365 bool has_lvds = false;
8367 bool has_cpu_edp = false; 8366 bool has_cpu_edp = false;
8368 bool has_panel = false; 8367 bool has_panel = false;
8369 bool has_ck505 = false; 8368 bool has_ck505 = false;
8370 bool can_ssc = false; 8369 bool can_ssc = false;
8371 bool using_ssc_source = false;
8372 8370
8373 /* We need to take the global config into account */ 8371 /* We need to take the global config into account */
8374 for_each_intel_encoder(dev, encoder) { 8372 for_each_intel_encoder(dev, encoder) {
@@ -8395,22 +8393,8 @@ static void ironlake_init_pch_refclk(struct drm_device *dev)
8395 can_ssc = true; 8393 can_ssc = true;
8396 } 8394 }
8397 8395
8398 /* Check if any DPLLs are using the SSC source */ 8396 DRM_DEBUG_KMS("has_panel %d has_lvds %d has_ck505 %d\n",
8399 for (i = 0; i < dev_priv->num_shared_dpll; i++) { 8397 has_panel, has_lvds, has_ck505);
8400 u32 temp = I915_READ(PCH_DPLL(i));
8401
8402 if (!(temp & DPLL_VCO_ENABLE))
8403 continue;
8404
8405 if ((temp & PLL_REF_INPUT_MASK) ==
8406 PLLB_REF_INPUT_SPREADSPECTRUMIN) {
8407 using_ssc_source = true;
8408 break;
8409 }
8410 }
8411
8412 DRM_DEBUG_KMS("has_panel %d has_lvds %d has_ck505 %d using_ssc_source %d\n",
8413 has_panel, has_lvds, has_ck505, using_ssc_source);
8414 8398
8415 /* Ironlake: try to setup display ref clock before DPLL 8399 /* Ironlake: try to setup display ref clock before DPLL
8416 * enabling. This is only under driver's control after 8400 * enabling. This is only under driver's control after
@@ -8430,12 +8414,9 @@ static void ironlake_init_pch_refclk(struct drm_device *dev)
8430 else 8414 else
8431 final |= DREF_NONSPREAD_SOURCE_ENABLE; 8415 final |= DREF_NONSPREAD_SOURCE_ENABLE;
8432 8416
8417 final &= ~DREF_SSC_SOURCE_MASK;
8433 final &= ~DREF_CPU_SOURCE_OUTPUT_MASK; 8418 final &= ~DREF_CPU_SOURCE_OUTPUT_MASK;
8434 8419 final &= ~DREF_SSC1_ENABLE;
8435 if (!using_ssc_source) {
8436 final &= ~DREF_SSC_SOURCE_MASK;
8437 final &= ~DREF_SSC1_ENABLE;
8438 }
8439 8420
8440 if (has_panel) { 8421 if (has_panel) {
8441 final |= DREF_SSC_SOURCE_ENABLE; 8422 final |= DREF_SSC_SOURCE_ENABLE;
@@ -8498,7 +8479,7 @@ static void ironlake_init_pch_refclk(struct drm_device *dev)
8498 POSTING_READ(PCH_DREF_CONTROL); 8479 POSTING_READ(PCH_DREF_CONTROL);
8499 udelay(200); 8480 udelay(200);
8500 } else { 8481 } else {
8501 DRM_DEBUG_KMS("Disabling CPU source output\n"); 8482 DRM_DEBUG_KMS("Disabling SSC entirely\n");
8502 8483
8503 val &= ~DREF_CPU_SOURCE_OUTPUT_MASK; 8484 val &= ~DREF_CPU_SOURCE_OUTPUT_MASK;
8504 8485
@@ -8509,20 +8490,16 @@ static void ironlake_init_pch_refclk(struct drm_device *dev)
8509 POSTING_READ(PCH_DREF_CONTROL); 8490 POSTING_READ(PCH_DREF_CONTROL);
8510 udelay(200); 8491 udelay(200);
8511 8492
8512 if (!using_ssc_source) { 8493 /* Turn off the SSC source */
8513 DRM_DEBUG_KMS("Disabling SSC source\n"); 8494 val &= ~DREF_SSC_SOURCE_MASK;
8514 8495 val |= DREF_SSC_SOURCE_DISABLE;
8515 /* Turn off the SSC source */
8516 val &= ~DREF_SSC_SOURCE_MASK;
8517 val |= DREF_SSC_SOURCE_DISABLE;
8518 8496
8519 /* Turn off SSC1 */ 8497 /* Turn off SSC1 */
8520 val &= ~DREF_SSC1_ENABLE; 8498 val &= ~DREF_SSC1_ENABLE;
8521 8499
8522 I915_WRITE(PCH_DREF_CONTROL, val); 8500 I915_WRITE(PCH_DREF_CONTROL, val);
8523 POSTING_READ(PCH_DREF_CONTROL); 8501 POSTING_READ(PCH_DREF_CONTROL);
8524 udelay(200); 8502 udelay(200);
8525 }
8526 } 8503 }
8527 8504
8528 BUG_ON(val != final); 8505 BUG_ON(val != final);