Add a helper to compute vblank time needed for transmitting specific DisplayPort SDPs like PPS, GAMUT_METADATA, and VSC_EXT. Latency is based on line count per packet type and current line time.
Used to ensure adequate vblank when features like DSC/HDR are enabled. Bspec: 70151 Signed-off-by: Ankit Nautiyal <ankit.k.nauti...@intel.com> Reviewed-by: Mitul Golani <mitulkumar.ajitkumar.gol...@intel.com> --- drivers/gpu/drm/i915/display/intel_dp.c | 47 +++++++++++++++++++++++++ drivers/gpu/drm/i915/display/intel_dp.h | 1 + 2 files changed, 48 insertions(+) diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 996edb8deded..4dc1ce383b8e 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -6842,3 +6842,50 @@ void intel_dp_mst_resume(struct intel_display *display) } } } + +static +int intel_dp_get_sdp_latency(u32 type, int linetime_us) +{ + int lines; + + switch (type) { + case DP_SDP_VSC_EXT_VESA: + case DP_SDP_VSC_EXT_CEA: + lines = 10; + break; + case HDMI_PACKET_TYPE_GAMUT_METADATA: + lines = 8; + break; + case DP_SDP_PPS: + lines = 6; + break; + default: + lines = 0; + break; + } + + return lines * linetime_us; +} + +int intel_dp_compute_sdp_latency(struct intel_crtc_state *crtc_state, + bool assume_all_enabled) +{ + const struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; + int sdp_latency = 0; + int linetime_us; + + linetime_us = DIV_ROUND_UP(adjusted_mode->crtc_htotal * 1000, + adjusted_mode->crtc_clock); + if (assume_all_enabled || + crtc_state->infoframes.enable & + intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GAMUT_METADATA)) + sdp_latency = max(sdp_latency, + intel_dp_get_sdp_latency(HDMI_PACKET_TYPE_GAMUT_METADATA, + linetime_us)); + + if (assume_all_enabled || crtc_state->dsc.compression_enable) + sdp_latency = max(sdp_latency, + intel_dp_get_sdp_latency(DP_SDP_PPS, linetime_us)); + + return sdp_latency; +} diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h index f90cfd1dbbd0..bfd1bd448672 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.h +++ b/drivers/gpu/drm/i915/display/intel_dp.h @@ -215,5 +215,6 @@ int intel_dp_compute_min_hblank(struct intel_crtc_state *crtc_state, int intel_dp_dsc_bpp_step_x16(const struct intel_connector *connector); void intel_dp_dpcd_set_probe(struct intel_dp *intel_dp, bool force_on_external); bool intel_dp_in_hdr_mode(const struct drm_connector_state *conn_state); +int intel_dp_compute_sdp_latency(struct intel_crtc_state *crtc_state, bool assume_all_enabled); #endif /* __INTEL_DP_H__ */ -- 2.45.2