aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1902-drm-amd-display-Expose-send-immediate-sdp-message-in.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1902-drm-amd-display-Expose-send-immediate-sdp-message-in.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1902-drm-amd-display-Expose-send-immediate-sdp-message-in.patch455
1 files changed, 455 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1902-drm-amd-display-Expose-send-immediate-sdp-message-in.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1902-drm-amd-display-Expose-send-immediate-sdp-message-in.patch
new file mode 100644
index 00000000..9802de79
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1902-drm-amd-display-Expose-send-immediate-sdp-message-in.patch
@@ -0,0 +1,455 @@
+From 120e167fbd1e5711cdc1ff274d6d3006b2bd3af0 Mon Sep 17 00:00:00 2001
+From: "Leo (Hanghong) Ma" <hanghong.ma@amd.com>
+Date: Tue, 16 Apr 2019 11:07:22 -0400
+Subject: [PATCH 1902/2940] drm/amd/display: Expose send immediate sdp message
+ interface
+
+[Why]
+To send sdp message immediately from a single slot.
+
+[How]
+Modify the generic SDP message interface, and use GSP4 to send immediate
+sdp message.
+
+Change-Id: I3f4c5ed84a021ee030d002d0155d6541f04930b9
+Signed-off-by: Leo (Hanghong) Ma <hanghong.ma@amd.com>
+Reviewed-by: Harry Wentland <Harry.Wentland@amd.com>
+Acked-by: Bhawanpreet Lakha <Bhawanpreet Lakha@amd.com>
+---
+ .../gpu/drm/amd/display/dc/core/dc_resource.c | 18 ---
+ .../gpu/drm/amd/display/dc/core/dc_stream.c | 47 ++------
+ .../amd/display/dc/dcn10/dcn10_hw_sequencer.c | 13 +++
+ .../display/dc/dcn10/dcn10_stream_encoder.c | 106 +++++++++++++++++-
+ .../display/dc/dcn10/dcn10_stream_encoder.h | 22 ++++
+ .../amd/display/dc/inc/hw/stream_encoder.h | 7 +-
+ .../gpu/drm/amd/display/dc/inc/hw_sequencer.h | 5 +
+ 7 files changed, 155 insertions(+), 63 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+index 47b99458d319..58ce7a6b914c 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+@@ -2446,21 +2446,6 @@ static void set_spd_info_packet(
+ *info_packet = stream->vrr_infopacket;
+ }
+
+-static void set_dp_sdp_info_packet(
+- struct dc_info_packet *info_packet,
+- struct dc_stream_state *stream)
+-{
+- /* SPD info packet for custom sdp message */
+-
+- /* Return if false. If true,
+- * set the corresponding bit in the info packet
+- */
+- if (!stream->dpsdp_infopacket.valid)
+- return;
+-
+- *info_packet = stream->dpsdp_infopacket;
+-}
+-
+ static void set_hdr_static_info_packet(
+ struct dc_info_packet *info_packet,
+ struct dc_stream_state *stream)
+@@ -2557,7 +2542,6 @@ void resource_build_info_frame(struct pipe_ctx *pipe_ctx)
+ info->spd.valid = false;
+ info->hdrsmd.valid = false;
+ info->vsc.valid = false;
+- info->dpsdp.valid = false;
+
+ signal = pipe_ctx->stream->signal;
+
+@@ -2577,8 +2561,6 @@ void resource_build_info_frame(struct pipe_ctx *pipe_ctx)
+ set_spd_info_packet(&info->spd, pipe_ctx->stream);
+
+ set_hdr_static_info_packet(&info->hdrsmd, pipe_ctx->stream);
+-
+- set_dp_sdp_info_packet(&info->dpsdp, pipe_ctx->stream);
+ }
+
+ patch_gamut_packet_checksum(&info->gamut);
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
+index a79f608b2f79..b723ffc8ea25 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
+@@ -371,42 +371,12 @@ uint32_t dc_stream_get_vblank_counter(const struct dc_stream_state *stream)
+ return 0;
+ }
+
+-static void build_dp_sdp_info_frame(struct pipe_ctx *pipe_ctx,
+- const uint8_t *custom_sdp_message,
+- unsigned int sdp_message_size)
+-{
+- uint8_t i;
+- struct encoder_info_frame *info = &pipe_ctx->stream_res.encoder_info_frame;
+-
+- /* set valid info */
+- info->dpsdp.valid = true;
+-
+- /* set sdp message header */
+- info->dpsdp.hb0 = custom_sdp_message[0]; /* package id */
+- info->dpsdp.hb1 = custom_sdp_message[1]; /* package type */
+- info->dpsdp.hb2 = custom_sdp_message[2]; /* package specific byte 0 any data */
+- info->dpsdp.hb3 = custom_sdp_message[3]; /* package specific byte 0 any data */
+-
+- /* set sdp message data */
+- for (i = 0; i < 32; i++)
+- info->dpsdp.sb[i] = (custom_sdp_message[i+4]);
+-
+-}
+-
+-static void invalid_dp_sdp_info_frame(struct pipe_ctx *pipe_ctx)
+-{
+- struct encoder_info_frame *info = &pipe_ctx->stream_res.encoder_info_frame;
+-
+- /* in-valid info */
+- info->dpsdp.valid = false;
+-}
+-
+ bool dc_stream_send_dp_sdp(const struct dc_stream_state *stream,
+ const uint8_t *custom_sdp_message,
+ unsigned int sdp_message_size)
+ {
+ int i;
+- struct dc *core_dc;
++ struct dc *dc;
+ struct resource_context *res_ctx;
+
+ if (stream == NULL) {
+@@ -414,8 +384,8 @@ bool dc_stream_send_dp_sdp(const struct dc_stream_state *stream,
+ return false;
+ }
+
+- core_dc = stream->ctx->dc;
+- res_ctx = &core_dc->current_state->res_ctx;
++ dc = stream->ctx->dc;
++ res_ctx = &dc->current_state->res_ctx;
+
+ for (i = 0; i < MAX_PIPES; i++) {
+ struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i];
+@@ -423,11 +393,14 @@ bool dc_stream_send_dp_sdp(const struct dc_stream_state *stream,
+ if (pipe_ctx->stream != stream)
+ continue;
+
+- build_dp_sdp_info_frame(pipe_ctx, custom_sdp_message, sdp_message_size);
+-
+- core_dc->hwss.update_info_frame(pipe_ctx);
++ if (dc->hwss.send_immediate_sdp_message != NULL)
++ dc->hwss.send_immediate_sdp_message(pipe_ctx,
++ custom_sdp_message,
++ sdp_message_size);
++ else
++ DC_LOG_WARNING("%s:send_immediate_sdp_message not implemented on this ASIC\n",
++ __func__);
+
+- invalid_dp_sdp_info_frame(pipe_ctx);
+ }
+
+ return true;
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+index 6c1c8065ab56..2aa6da562d37 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+@@ -2956,6 +2956,18 @@ static void dcn10_unblank_stream(struct pipe_ctx *pipe_ctx,
+ }
+ }
+
++static void dcn10_send_immediate_sdp_message(struct pipe_ctx *pipe_ctx,
++ const uint8_t *custom_sdp_message,
++ unsigned int sdp_message_size)
++{
++ if (dc_is_dp_signal(pipe_ctx->stream->signal)) {
++ pipe_ctx->stream_res.stream_enc->funcs->send_immediate_sdp_message(
++ pipe_ctx->stream_res.stream_enc,
++ custom_sdp_message,
++ sdp_message_size);
++ }
++}
++
+ static const struct hw_sequencer_funcs dcn10_funcs = {
+ .program_gamut_remap = program_gamut_remap,
+ .init_hw = dcn10_init_hw,
+@@ -2975,6 +2987,7 @@ static const struct hw_sequencer_funcs dcn10_funcs = {
+ .enable_timing_synchronization = dcn10_enable_timing_synchronization,
+ .enable_per_frame_crtc_position_reset = dcn10_enable_per_frame_crtc_position_reset,
+ .update_info_frame = dce110_update_info_frame,
++ .send_immediate_sdp_message = dcn10_send_immediate_sdp_message,
+ .enable_stream = dce110_enable_stream,
+ .disable_stream = dce110_disable_stream,
+ .unblank_stream = dcn10_unblank_stream,
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.c
+index c259c51dff9a..ba71b5224e7f 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.c
+@@ -727,11 +727,9 @@ void enc1_stream_encoder_update_dp_info_packets(
+ 3, /* packetIndex */
+ &info_frame->hdrsmd);
+
+- if (info_frame->dpsdp.valid)
+- enc1_update_generic_info_packet(
+- enc1,
+- 4,/* packetIndex */
+- &info_frame->dpsdp);
++ /* packetIndex 4 is used for send immediate sdp message, and please
++ * use other packetIndex (such as 5,6) for other info packet
++ */
+
+ /* enable/disable transmission of packet(s).
+ * If enabled, packet transmission begins on the next frame
+@@ -739,7 +737,101 @@ void enc1_stream_encoder_update_dp_info_packets(
+ REG_UPDATE(DP_SEC_CNTL, DP_SEC_GSP0_ENABLE, info_frame->vsc.valid);
+ REG_UPDATE(DP_SEC_CNTL, DP_SEC_GSP2_ENABLE, info_frame->spd.valid);
+ REG_UPDATE(DP_SEC_CNTL, DP_SEC_GSP3_ENABLE, info_frame->hdrsmd.valid);
+- REG_UPDATE(DP_SEC_CNTL, DP_SEC_GSP4_ENABLE, info_frame->dpsdp.valid);
++
++
++ /* This bit is the master enable bit.
++ * When enabling secondary stream engine,
++ * this master bit must also be set.
++ * This register shared with audio info frame.
++ * Therefore we need to enable master bit
++ * if at least on of the fields is not 0
++ */
++ value = REG_READ(DP_SEC_CNTL);
++ if (value)
++ REG_UPDATE(DP_SEC_CNTL, DP_SEC_STREAM_ENABLE, 1);
++}
++
++void enc1_stream_encoder_send_immediate_sdp_message(
++ struct stream_encoder *enc,
++ const uint8_t *custom_sdp_message,
++ unsigned int sdp_message_size)
++{
++ struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
++ uint32_t value = 0;
++
++ /* TODOFPGA Figure out a proper number for max_retries polling for lock
++ * use 50 for now.
++ */
++ uint32_t max_retries = 50;
++
++ /* check if GSP4 is transmitted */
++ REG_WAIT(DP_SEC_CNTL2, DP_SEC_GSP4_SEND_PENDING,
++ 0, 10, max_retries);
++
++ /* disable GSP4 transmitting */
++ REG_UPDATE(DP_SEC_CNTL2, DP_SEC_GSP4_SEND, 0);
++
++ /* transmit GSP4 at the earliest time in a frame */
++ REG_UPDATE(DP_SEC_CNTL2, DP_SEC_GSP4_SEND_ANY_LINE, 1);
++
++ /*we need turn on clock before programming AFMT block*/
++ REG_UPDATE(AFMT_CNTL, AFMT_AUDIO_CLOCK_EN, 1);
++
++ /* check if HW reading GSP memory */
++ REG_WAIT(AFMT_VBI_PACKET_CONTROL, AFMT_GENERIC_CONFLICT,
++ 0, 10, max_retries);
++
++ /* HW does is not reading GSP memory not reading too long ->
++ * something wrong. clear GPS memory access and notify?
++ * hw SW is writing to GSP memory
++ */
++ REG_UPDATE(AFMT_VBI_PACKET_CONTROL, AFMT_GENERIC_CONFLICT_CLR, 1);
++
++ /* use generic packet 4 for immediate sdp message */
++ REG_UPDATE(AFMT_VBI_PACKET_CONTROL,
++ AFMT_GENERIC_INDEX, 4);
++
++ /* write generic packet header
++ * (4th byte is for GENERIC0 only)
++ */
++ REG_SET_4(AFMT_GENERIC_HDR, 0,
++ AFMT_GENERIC_HB0, custom_sdp_message[0],
++ AFMT_GENERIC_HB1, custom_sdp_message[1],
++ AFMT_GENERIC_HB2, custom_sdp_message[2],
++ AFMT_GENERIC_HB3, custom_sdp_message[3]);
++
++ /* write generic packet contents
++ * (we never use last 4 bytes)
++ * there are 8 (0-7) mmDIG0_AFMT_GENERIC0_x registers
++ */
++ {
++ const uint32_t *content =
++ (const uint32_t *) &custom_sdp_message[4];
++
++ REG_WRITE(AFMT_GENERIC_0, *content++);
++ REG_WRITE(AFMT_GENERIC_1, *content++);
++ REG_WRITE(AFMT_GENERIC_2, *content++);
++ REG_WRITE(AFMT_GENERIC_3, *content++);
++ REG_WRITE(AFMT_GENERIC_4, *content++);
++ REG_WRITE(AFMT_GENERIC_5, *content++);
++ REG_WRITE(AFMT_GENERIC_6, *content++);
++ REG_WRITE(AFMT_GENERIC_7, *content);
++ }
++
++ /* check whether GENERIC4 registers double buffer update in immediate mode
++ * is pending
++ */
++ REG_WAIT(AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC4_IMMEDIATE_UPDATE_PENDING,
++ 0, 10, max_retries);
++
++ /* atomically update double-buffered GENERIC4 registers in immediate mode
++ * (update immediately)
++ */
++ REG_UPDATE(AFMT_VBI_PACKET_CONTROL1,
++ AFMT_GENERIC4_IMMEDIATE_UPDATE, 1);
++
++ /* enable GSP4 transmitting */
++ REG_UPDATE(DP_SEC_CNTL2, DP_SEC_GSP4_SEND, 1);
+
+ /* This bit is the master enable bit.
+ * When enabling secondary stream engine,
+@@ -1463,6 +1555,8 @@ static const struct stream_encoder_funcs dcn10_str_enc_funcs = {
+ enc1_stream_encoder_stop_hdmi_info_packets,
+ .update_dp_info_packets =
+ enc1_stream_encoder_update_dp_info_packets,
++ .send_immediate_sdp_message =
++ enc1_stream_encoder_send_immediate_sdp_message,
+ .stop_dp_info_packets =
+ enc1_stream_encoder_stop_dp_info_packets,
+ .dp_blank =
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h
+index e654c2f55971..a292b106a8b1 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h
+@@ -81,6 +81,7 @@
+ SRI(DP_MSE_RATE_UPDATE, DP, id), \
+ SRI(DP_PIXEL_FORMAT, DP, id), \
+ SRI(DP_SEC_CNTL, DP, id), \
++ SRI(DP_SEC_CNTL2, DP, id), \
+ SRI(DP_STEER_FIFO, DP, id), \
+ SRI(DP_VID_M, DP, id), \
+ SRI(DP_VID_N, DP, id), \
+@@ -118,10 +119,12 @@ struct dcn10_stream_enc_registers {
+ uint32_t AFMT_60958_1;
+ uint32_t AFMT_60958_2;
+ uint32_t DIG_FE_CNTL;
++ uint32_t DIG_FE_CNTL2;
+ uint32_t DP_MSE_RATE_CNTL;
+ uint32_t DP_MSE_RATE_UPDATE;
+ uint32_t DP_PIXEL_FORMAT;
+ uint32_t DP_SEC_CNTL;
++ uint32_t DP_SEC_CNTL2;
+ uint32_t DP_STEER_FIFO;
+ uint32_t DP_VID_M;
+ uint32_t DP_VID_N;
+@@ -191,6 +194,10 @@ struct dcn10_stream_enc_registers {
+ SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP2_ENABLE, mask_sh),\
+ SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP3_ENABLE, mask_sh),\
+ SE_SF(DP0_DP_SEC_CNTL, DP_SEC_MPG_ENABLE, mask_sh),\
++ SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND, mask_sh),\
++ SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND_PENDING, mask_sh),\
++ SE_SF(DP0_DP_SEC_CNTL4, DP_SEC_GSP4_LINE_NUM, mask_sh),\
++ SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND_ANY_LINE, mask_sh),\
+ SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_DIS_DEFER, mask_sh),\
+ SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, mask_sh),\
+ SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_STATUS, mask_sh),\
+@@ -245,6 +252,7 @@ struct dcn10_stream_enc_registers {
+ SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC2_FRAME_UPDATE_PENDING, mask_sh),\
+ SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC3_FRAME_UPDATE_PENDING, mask_sh),\
+ SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC4_FRAME_UPDATE_PENDING, mask_sh),\
++ SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC4_IMMEDIATE_UPDATE_PENDING, mask_sh),\
+ SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC5_FRAME_UPDATE_PENDING, mask_sh),\
+ SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC6_FRAME_UPDATE_PENDING, mask_sh),\
+ SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC7_FRAME_UPDATE_PENDING, mask_sh),\
+@@ -253,6 +261,7 @@ struct dcn10_stream_enc_registers {
+ SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC2_FRAME_UPDATE, mask_sh),\
+ SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC3_FRAME_UPDATE, mask_sh),\
+ SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC4_FRAME_UPDATE, mask_sh),\
++ SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC4_IMMEDIATE_UPDATE, mask_sh),\
+ SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC5_FRAME_UPDATE, mask_sh),\
+ SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC6_FRAME_UPDATE, mask_sh),\
+ SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC7_FRAME_UPDATE, mask_sh),\
+@@ -260,6 +269,7 @@ struct dcn10_stream_enc_registers {
+ SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP5_ENABLE, mask_sh),\
+ SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP6_ENABLE, mask_sh),\
+ SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP7_ENABLE, mask_sh),\
++ SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP7_PPS, mask_sh),\
+ SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP7_SEND, mask_sh),\
+ SE_SF(DP0_DP_DB_CNTL, DP_DB_DISABLE, mask_sh),\
+ SE_SF(DP0_DP_MSA_COLORIMETRY, DP_MSA_MISC0, mask_sh),\
+@@ -304,6 +314,7 @@ struct dcn10_stream_enc_registers {
+ type AFMT_GENERIC2_FRAME_UPDATE_PENDING;\
+ type AFMT_GENERIC3_FRAME_UPDATE_PENDING;\
+ type AFMT_GENERIC4_FRAME_UPDATE_PENDING;\
++ type AFMT_GENERIC4_IMMEDIATE_UPDATE_PENDING;\
+ type AFMT_GENERIC5_FRAME_UPDATE_PENDING;\
+ type AFMT_GENERIC6_FRAME_UPDATE_PENDING;\
+ type AFMT_GENERIC7_FRAME_UPDATE_PENDING;\
+@@ -312,6 +323,7 @@ struct dcn10_stream_enc_registers {
+ type AFMT_GENERIC2_FRAME_UPDATE;\
+ type AFMT_GENERIC3_FRAME_UPDATE;\
+ type AFMT_GENERIC4_FRAME_UPDATE;\
++ type AFMT_GENERIC4_IMMEDIATE_UPDATE;\
+ type AFMT_GENERIC5_FRAME_UPDATE;\
+ type AFMT_GENERIC6_FRAME_UPDATE;\
+ type AFMT_GENERIC7_FRAME_UPDATE;\
+@@ -366,7 +378,12 @@ struct dcn10_stream_enc_registers {
+ type DP_SEC_GSP5_ENABLE;\
+ type DP_SEC_GSP6_ENABLE;\
+ type DP_SEC_GSP7_ENABLE;\
++ type DP_SEC_GSP7_PPS;\
+ type DP_SEC_GSP7_SEND;\
++ type DP_SEC_GSP4_SEND;\
++ type DP_SEC_GSP4_SEND_PENDING;\
++ type DP_SEC_GSP4_LINE_NUM;\
++ type DP_SEC_GSP4_SEND_ANY_LINE;\
+ type DP_SEC_MPG_ENABLE;\
+ type DP_VID_STREAM_DIS_DEFER;\
+ type DP_VID_STREAM_ENABLE;\
+@@ -484,6 +501,11 @@ void enc1_stream_encoder_update_dp_info_packets(
+ struct stream_encoder *enc,
+ const struct encoder_info_frame *info_frame);
+
++void enc1_stream_encoder_send_immediate_sdp_message(
++ struct stream_encoder *enc,
++ const uint8_t *custom_sdp_message,
++ unsigned int sdp_message_size);
++
+ void enc1_stream_encoder_stop_dp_info_packets(
+ struct stream_encoder *enc);
+
+diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h b/drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h
+index 49854eb73d1d..537563888f87 100644
+--- a/drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h
++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h
+@@ -63,8 +63,6 @@ struct encoder_info_frame {
+ struct dc_info_packet vsc;
+ /* HDR Static MetaData */
+ struct dc_info_packet hdrsmd;
+- /* custom sdp message */
+- struct dc_info_packet dpsdp;
+ };
+
+ struct encoder_unblank_param {
+@@ -123,6 +121,11 @@ struct stream_encoder_funcs {
+ struct stream_encoder *enc,
+ const struct encoder_info_frame *info_frame);
+
++ void (*send_immediate_sdp_message)(
++ struct stream_encoder *enc,
++ const uint8_t *custom_sdp_message,
++ unsigned int sdp_message_size);
++
+ void (*stop_dp_info_packets)(
+ struct stream_encoder *enc);
+
+diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h
+index 33905468e2b9..eb1c12ed026a 100644
+--- a/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h
++++ b/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h
+@@ -158,6 +158,11 @@ struct hw_sequencer_funcs {
+
+ void (*update_info_frame)(struct pipe_ctx *pipe_ctx);
+
++ void (*send_immediate_sdp_message)(
++ struct pipe_ctx *pipe_ctx,
++ const uint8_t *custom_sdp_message,
++ unsigned int sdp_message_size);
++
+ void (*enable_stream)(struct pipe_ctx *pipe_ctx);
+
+ void (*disable_stream)(struct pipe_ctx *pipe_ctx,
+--
+2.17.1
+