On 2/16/2024 7:50 PM, Mitul Golani wrote:
Add structure representing Adaptive Sync Secondary Data
Packet (AS SDP). Also, add Adaptive Sync SDP logging in
drm_dp_helper.c to facilitate debugging.

--v2:
- Update logging. [Jani, Ankit]
- use as_sdp instead of async [Ankit]
- Correct define placeholders to where it is being actually used. [Jani]
- Update members in as_sdp structure and make it uniform. [Jani]

--v3:
- Add changes dri-devel mail list. No code changes.

Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.gol...@intel.com>
---
  drivers/gpu/drm/display/drm_dp_helper.c       | 12 ++++++++
  .../drm/i915/display/intel_crtc_state_dump.c  | 12 ++++++++
  .../drm/i915/display/intel_display_types.h    |  1 +
  include/drm/display/drm_dp.h                  |  2 ++
  include/drm/display/drm_dp_helper.h           | 30 +++++++++++++++++++
  5 files changed, 57 insertions(+)

diff --git a/drivers/gpu/drm/display/drm_dp_helper.c 
b/drivers/gpu/drm/display/drm_dp_helper.c
index 81c5507928f5..5911b20de2ea 100644
--- a/drivers/gpu/drm/display/drm_dp_helper.c
+++ b/drivers/gpu/drm/display/drm_dp_helper.c
@@ -2913,6 +2913,18 @@ void drm_dp_vsc_sdp_log(struct drm_printer *p, const 
struct drm_dp_vsc_sdp *vsc)
  }
  EXPORT_SYMBOL(drm_dp_vsc_sdp_log);
+void drm_dp_as_sdp_log(struct drm_printer *p, const struct drm_dp_as_sdp *as_sdp)
+{
+       drm_printf(p, "DP SDP: AS_SDP, revision %u, length %u\n",
+                  as_sdp->revision, as_sdp->length);
+       drm_printf(p, "    vtotal: %d\n", as_sdp->vtotal);
+       drm_printf(p, "    target_rr: %d\n", as_sdp->target_rr);
+       drm_printf(p, "    duration_incr_ms: %d\n", as_sdp->duration_incr_ms);
+       drm_printf(p, "    duration_decr_ms: %d\n", as_sdp->duration_decr_ms);
+       drm_printf(p, "    operation_mode: %d\n", as_sdp->operation_mode);
+}
+EXPORT_SYMBOL(drm_dp_as_sdp_log);
+
  /**
   * drm_dp_as_sdp_supported() - check if adaptive sync sdp is supported
   * @aux: DisplayPort AUX channel
diff --git a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c 
b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
index 4bcf446c75f4..26d77c2934e8 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
@@ -60,6 +60,15 @@ intel_dump_dp_vsc_sdp(struct drm_i915_private *i915,
        drm_dp_vsc_sdp_log(&p, vsc);
  }
+static void
+intel_dump_dp_as_sdp(struct drm_i915_private *i915,
+                    const struct drm_dp_as_sdp *as_sdp)
+{
+       struct drm_printer p = drm_dbg_printer(&i915->drm, DRM_UT_KMS, 
"AS_SDP");
+
+       drm_dp_as_sdp_log(&p, as_sdp);
+}
+
  static void
  intel_dump_buffer(struct drm_i915_private *i915,
                  const char *prefix, const u8 *buf, size_t len)
@@ -299,6 +308,9 @@ void intel_crtc_state_dump(const struct intel_crtc_state 
*pipe_config,
        if (pipe_config->infoframes.enable &
            intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GAMUT_METADATA))
                intel_dump_infoframe(i915, &pipe_config->infoframes.drm);
+       if (pipe_config->infoframes.enable &
+           intel_hdmi_infoframe_enable(DP_SDP_ADAPTIVE_SYNC))
+               intel_dump_dp_as_sdp(i915, &pipe_config->infoframes.as_sdp);
        if (pipe_config->infoframes.enable &
            intel_hdmi_infoframe_enable(DP_SDP_VSC))
                intel_dump_dp_vsc_sdp(i915, &pipe_config->infoframes.vsc);
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h 
b/drivers/gpu/drm/i915/display/intel_display_types.h
index 0d4012097db1..a6991bc3f07b 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1332,6 +1332,7 @@ struct intel_crtc_state {
                union hdmi_infoframe hdmi;
                union hdmi_infoframe drm;
                struct drm_dp_vsc_sdp vsc;
+               struct drm_dp_as_sdp as_sdp;
        } infoframes;
u8 eld[MAX_ELD_BYTES];
diff --git a/include/drm/display/drm_dp.h b/include/drm/display/drm_dp.h
index 281afff6ee4e..af6790fb4791 100644
--- a/include/drm/display/drm_dp.h
+++ b/include/drm/display/drm_dp.h
@@ -1578,10 +1578,12 @@ enum drm_dp_phy {
  #define DP_SDP_AUDIO_COPYMANAGEMENT   0x05 /* DP 1.2 */
  #define DP_SDP_ISRC                   0x06 /* DP 1.2 */
  #define DP_SDP_VSC                    0x07 /* DP 1.2 */
+#define DP_SDP_ADAPTIVE_SYNC    0x22 /* DP 1.4 */
  #define DP_SDP_CAMERA_GENERIC(i)      (0x08 + (i)) /* 0-7, DP 1.3 */
  #define DP_SDP_PPS                    0x10 /* DP 1.4 */
  #define DP_SDP_VSC_EXT_VESA           0x20 /* DP 1.4 */
  #define DP_SDP_VSC_EXT_CEA            0x21 /* DP 1.4 */
+
  /* 0x80+ CEA-861 infoframe types */
#define DP_SDP_AUDIO_INFOFRAME_HB2 0x1b
diff --git a/include/drm/display/drm_dp_helper.h 
b/include/drm/display/drm_dp_helper.h
index a0356721de0f..8a692a86d8d6 100644
--- a/include/drm/display/drm_dp_helper.h
+++ b/include/drm/display/drm_dp_helper.h
@@ -98,6 +98,36 @@ struct drm_dp_vsc_sdp {
        enum dp_content_type content_type;
  };
+/**
+ * struct drm_dp_as_sdp - drm DP Adaptive Sync SDP
+ *
+ * This structure represents a DP AS SDP of drm
+ * It is based on DP 2.1 spec [Table 2-126:  Adaptive-Sync SDP Header Bytes] 
and
+ * [Table 2-127: Adaptive-Sync SDP Payload for DB0 through DB8]
+ *
+ * @sdp_type: secondary-data packet type
+ * @length: number of valid data bytes
+ * @vmin: minimum vtotal
+ * @vmax: maximum vtotal
+ * @duration_incr_ms: Successive frame duration increase
+ * @duration_decr_ms: Successive frame duration decrease
+ * @operation_mode: Adaptive Sync Operation Mode
+ */
+
+struct drm_dp_as_sdp {
+       unsigned char sdp_type;
+       unsigned char revision;
+       unsigned char length;
+       int vtotal;
+       int target_rr;
+       int duration_incr_ms;
+       int duration_decr_ms;
+       int operation_mode;

I think this should be enum, to represent different AVT and FAVT modes.

Regards,

Ankit


+};
+
+void drm_dp_as_sdp_log(struct drm_printer *p,
+                      const struct drm_dp_as_sdp *as_sdp);
+
  void drm_dp_vsc_sdp_log(struct drm_printer *p, const struct drm_dp_vsc_sdp 
*vsc);
bool drm_dp_as_sdp_supported(struct drm_dp_aux *aux, const u8 dpcd[DP_RECEIVER_CAP_SIZE]);

Reply via email to