| From fbb21c5202ae7f1e71e832b1af59fb047da6383e Mon Sep 17 00:00:00 2001 |
| From: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com> |
| Date: Tue, 1 Nov 2016 11:47:59 -0700 |
| Subject: drm/i915/dp: BDW cdclk fix for DP audio |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com> |
| |
| commit fbb21c5202ae7f1e71e832b1af59fb047da6383e upstream. |
| |
| 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) |
| 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 |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| (cherry picked from commit b30ce9e0552aa017ac6f2243f3c2d8e36fe52e69) |
| Signed-off-by: Jani Nikula <jani.nikula@intel.com> |
| |
| --- |
| drivers/gpu/drm/i915/intel_display.c | 27 ++++++++++++++++++++++++--- |
| 1 file changed, 24 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/gpu/drm/i915/intel_display.c |
| +++ b/drivers/gpu/drm/i915/intel_display.c |
| @@ -9737,6 +9737,27 @@ static void bxt_modeset_commit_cdclk(str |
| bxt_set_cdclk(to_i915(dev), req_cdclk); |
| } |
| |
| +static int bdw_adjust_min_pipe_pixel_rate(struct intel_crtc_state *crtc_state, |
| + int pixel_rate) |
| +{ |
| + /* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */ |
| + if (crtc_state->ips_enabled) |
| + pixel_rate = DIV_ROUND_UP(pixel_rate * 100, 95); |
| + |
| + /* BSpec says "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." |
| + */ |
| + if (intel_crtc_has_dp_encoder(crtc_state) && |
| + crtc_state->has_audio && |
| + crtc_state->port_clock >= 540000 && |
| + crtc_state->lane_count == 4) |
| + pixel_rate = max(432000, pixel_rate); |
| + |
| + return pixel_rate; |
| +} |
| + |
| /* compute the max rate for new configuration */ |
| static int ilk_max_pixel_rate(struct drm_atomic_state *state) |
| { |
| @@ -9762,9 +9783,9 @@ static int ilk_max_pixel_rate(struct drm |
| |
| pixel_rate = ilk_pipe_pixel_rate(crtc_state); |
| |
| - /* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */ |
| - if (IS_BROADWELL(dev_priv) && crtc_state->ips_enabled) |
| - pixel_rate = DIV_ROUND_UP(pixel_rate * 100, 95); |
| + if (IS_BROADWELL(dev_priv)) |
| + pixel_rate = bdw_adjust_min_pipe_pixel_rate(crtc_state, |
| + pixel_rate); |
| |
| intel_state->min_pixclk[i] = pixel_rate; |
| } |