Adaptive Sync SDP (AS SDP) is also used for Panel Replay (PR).
For PR with Link ON, the AS SDP version V1 is used. When using
AS SDP Version 1, AS SDP payload and parity bytes are all set to zeroes.

Bspec: 75639
Signed-off-by: Ankit Nautiyal <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_dp.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index d08db4938638..5952db6197cf 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -3115,7 +3115,8 @@ static bool intel_dp_needs_as_sdp(struct intel_dp 
*intel_dp,
                                  struct intel_crtc_state *crtc_state)
 {
        return crtc_state->vrr.enable ||
-              crtc_state->cmrr.enable;
+              crtc_state->cmrr.enable ||
+              crtc_state->has_panel_replay;
 }
 
 static void intel_dp_compute_as_sdp(struct intel_dp *intel_dp,
@@ -3137,6 +3138,16 @@ static void intel_dp_compute_as_sdp(struct intel_dp 
*intel_dp,
        as_sdp->length = 0x9;
        as_sdp->duration_incr_ms = 0;
        as_sdp->version = 0x2;
+
+       if (crtc_state->vrr.enable)
+               as_sdp->version = 0x2;
+       else
+               as_sdp->version = 0x1;
+
+       /* No payload data bytes for Version 1 */
+       if (as_sdp->version == 0x1)
+               return;
+
        as_sdp->vtotal = intel_vrr_vmin_vtotal(crtc_state);
 
        if (crtc_state->cmrr.enable) {
@@ -5005,6 +5016,10 @@ static ssize_t intel_dp_as_sdp_pack(const struct 
drm_dp_as_sdp *as_sdp,
        sdp->sdp_header.HB2 = as_sdp->version;
        sdp->sdp_header.HB3 = as_sdp->length;
 
+       /* No Payload Data bytes for Version 1 */
+       if (as_sdp->version == 0x1)
+               return length;
+
        /* Fill AS (Adaptive Sync) SDP Payload */
        sdp->db[0] = as_sdp->mode;
        sdp->db[1] = as_sdp->vtotal & 0xFF;
-- 
2.45.2

Reply via email to