Currently we are setting AS SDP version to 2 without checking if the sink
supports it or whether we need to send version 1.

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.

Add a helper to compute the AS SDP version based on sink support and
feature requirement.

If AS SDP V2 is supported we use V2, unless Panel Replay with Link On is
enabled, for which we use V1.
If AS SDP V1 is not supported, we always send V1, without the payload.

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

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 4d0a7695be5a..6b45894e40e0 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -5109,6 +5109,10 @@ static ssize_t intel_dp_as_sdp_pack(const struct 
drm_dp_as_sdp *as_sdp,
        sdp->sdp_header.HB2 = as_sdp->revision;
        sdp->sdp_header.HB3 = as_sdp->length;
 
+       /* No Payload Data bytes for Version 1 */
+       if (as_sdp->revision == 0x1)
+               return length;
+
        /* Fill AS (Adaptive Sync) SDP Payload */
        sdp->db[0] = as_sdp->mode;
        sdp->db[1] = as_sdp->vtotal & 0xFF;
@@ -7330,6 +7334,19 @@ void intel_dp_mst_resume(struct intel_display *display)
        }
 }
 
+static bool intel_dp_get_as_sdp_revision(struct intel_dp *intel_dp,
+                                        struct intel_crtc_state *crtc_state)
+{
+       if (crtc_state->has_panel_replay &&
+           !intel_alpm_is_alpm_aux_less(intel_dp, crtc_state))
+               return 1;
+
+       if (intel_dp->as_sdp_v2_supported)
+               return 2;
+
+       return 1;
+}
+
 static
 void intel_dp_as_sdp_compute_config_late(struct intel_dp *intel_dp,
                                         struct intel_crtc_state *crtc_state)
@@ -7345,7 +7362,12 @@ void intel_dp_as_sdp_compute_config_late(struct intel_dp 
*intel_dp,
        as_sdp->sdp_type = DP_SDP_ADAPTIVE_SYNC;
        as_sdp->length = 0x9;
        as_sdp->duration_incr_ms = 0;
-       as_sdp->revision = 0x2;
+       as_sdp->revision = intel_dp_get_as_sdp_revision(intel_dp, crtc_state);
+
+       /* No payload data bytes for Version 1 */
+       if (as_sdp->revision == 1)
+               return;
+
        as_sdp->vtotal = intel_vrr_vmin_vtotal(crtc_state);
 
        if (crtc_state->cmrr.enable) {
-- 
2.45.2

Reply via email to