Compute the most appropriate VS/PE-O index for C10. For external DP use 2nd table if encoder supports any mode beyond or including HBR2. Use 1st table if external DP encoder supports anything lower than HBR2.
For eDP use 4th table if encoder supports HBR3. Otherwise use 3rd table for eDP. Warn if encoder does not support DP. In that case fallback to using default VS/PE tables. v2->v3 - return -EINVAL instead of -1 (Suraj) Signed-off-by: Michał Grzelak <[email protected]> --- .../drm/i915/display/intel_ddi_buf_trans.c | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c b/drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c index 2e4177ab55a34..a9f1242e2bcf0 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c +++ b/drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c @@ -1786,6 +1786,30 @@ xe3plpd_get_lt_buf_trans(struct intel_encoder *encoder, return intel_get_buf_trans(&xe3plpd_lt_trans_dp14, n_entries); } +static int +snps_c10_compute_index(const struct intel_crtc_state *crtc_state) +{ + if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) { + if (crtc_state->port_clock > 540000) + return 3; + else + return 2; + } + + if (intel_crtc_has_dp_encoder(crtc_state)) { + if (crtc_state->port_clock > 270000) + return 1; + else + return 0; + } + + drm_WARN(to_intel_display(crtc_state)->drm, 1, + "non-DP (%d) encoder asks to compute VS/PE-O index\n", + crtc_state->output_types); + + return -EINVAL; +} + static enum snps_c20_vspeo_index snps_c20_compute_index(const struct intel_crtc_state *crtc_state) { @@ -1829,7 +1853,9 @@ vspeo_compute_index(struct intel_encoder *encoder, if (HAS_LT_PHY(display)) { return lt_compute_index(crtc_state); } else if (DISPLAY_VER(display) >= 14) { - if (!intel_encoder_is_c10phy(encoder)) + if (intel_encoder_is_c10phy(encoder)) + return snps_c10_compute_index(crtc_state); + else return snps_c20_compute_index(crtc_state); } -- 2.45.2
