diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2016-06-09 12:39:07 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2016-06-09 12:48:08 -0400 |
commit | 8c07eb68330f3ed9a735023a0f0e7f4e873e0c63 (patch) | |
tree | ba8ae1aed63cf0922c9e7d6ac7ef44954df02cc7 /drivers/gpu/drm/i915/intel_display.c | |
parent | d1b4eefdea6d63aa15321f539feec298d8aefdc1 (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.c | 49 |
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); |