aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>2016-11-01 14:47:59 -0400
committerJani Nikula <jani.nikula@intel.com>2016-11-07 11:23:41 -0500
commitfbb21c5202ae7f1e71e832b1af59fb047da6383e (patch)
treeb84774ad8bb122f905bc5b993fc44bffadb2a149
parentcdffe3e252bb55e82ee89bbdfe8d2f18b6157c28 (diff)
drm/i915/dp: BDW cdclk fix for DP audio
According to BSpec, cdclk for BDW has to be not less than 432 MHz with DP audio enabled, port width x4, and link rate HBR2 (5.4 GHz). With cdclk less than 432 MHz, enabling audio leads to pipe FIFO underruns and displays cycling on/off. From BSpec: "Display» BDW-SKL» dpr» [Register] DP_TP_CTL [BDW+,EXCLUDE(CHV)] Workaround : Do not use DisplayPort with CDCLK less than 432 MHz, audio enabled, port width x4, and link rate HBR2 (5.4 GHz), or else there may be audio corruption or screen corruption." Since, some DP configurations (e.g., MST) use port width x4 and HBR2 link rate, let's increase the cdclk to >= 432 MHz to enable audio for those cases. v4: Changed commit message v3: Combine BDW pixel rate adjustments into a function (Jani) v2: Restrict fix to BDW Retain the set cdclk across modesets (Ville) Cc: stable@vger.kernel.org Signed-off-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Jani Nikula <jani.nikula@intel.com> Signed-off-by: Jani Nikula <jani.nikula@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1478026080-2925-1-git-send-email-dhinakaran.pandiyan@intel.com (cherry picked from commit b30ce9e0552aa017ac6f2243f3c2d8e36fe52e69) Signed-off-by: Jani Nikula <jani.nikula@intel.com>
-rw-r--r--drivers/gpu/drm/i915/intel_display.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 0ad1879bfd9d..4f57f8c6074e 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -10243,6 +10243,27 @@ static void bxt_modeset_commit_cdclk(struct drm_atomic_state *old_state)
10243 bxt_set_cdclk(to_i915(dev), req_cdclk); 10243 bxt_set_cdclk(to_i915(dev), req_cdclk);
10244} 10244}
10245 10245
10246static int bdw_adjust_min_pipe_pixel_rate(struct intel_crtc_state *crtc_state,
10247 int pixel_rate)
10248{
10249 /* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */
10250 if (crtc_state->ips_enabled)
10251 pixel_rate = DIV_ROUND_UP(pixel_rate * 100, 95);
10252
10253 /* BSpec says "Do not use DisplayPort with CDCLK less than
10254 * 432 MHz, audio enabled, port width x4, and link rate
10255 * HBR2 (5.4 GHz), or else there may be audio corruption or
10256 * screen corruption."
10257 */
10258 if (intel_crtc_has_dp_encoder(crtc_state) &&
10259 crtc_state->has_audio &&
10260 crtc_state->port_clock >= 540000 &&
10261 crtc_state->lane_count == 4)
10262 pixel_rate = max(432000, pixel_rate);
10263
10264 return pixel_rate;
10265}
10266
10246/* compute the max rate for new configuration */ 10267/* compute the max rate for new configuration */
10247static int ilk_max_pixel_rate(struct drm_atomic_state *state) 10268static int ilk_max_pixel_rate(struct drm_atomic_state *state)
10248{ 10269{
@@ -10268,9 +10289,9 @@ static int ilk_max_pixel_rate(struct drm_atomic_state *state)
10268 10289
10269 pixel_rate = ilk_pipe_pixel_rate(crtc_state); 10290 pixel_rate = ilk_pipe_pixel_rate(crtc_state);
10270 10291
10271 /* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */ 10292 if (IS_BROADWELL(dev_priv))
10272 if (IS_BROADWELL(dev_priv) && crtc_state->ips_enabled) 10293 pixel_rate = bdw_adjust_min_pipe_pixel_rate(crtc_state,
10273 pixel_rate = DIV_ROUND_UP(pixel_rate * 100, 95); 10294 pixel_rate);
10274 10295
10275 intel_state->min_pixclk[i] = pixel_rate; 10296 intel_state->min_pixclk[i] = pixel_rate;
10276 } 10297 }