*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)
        info->spd.valid = false;
        info->hdrsmd.valid = false;
        info->vsc.valid = false;
+       info->dpsdp.valid = false;
 
        signal = pipe_ctx->stream->signal;
 
                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);
 
        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 resource_context *res_ctx;
+
+       if (stream == NULL) {
+               dm_error("DC: dc_stream is NULL!\n");
+               return false;
+       }
+
+       core_dc = stream->ctx->dc;
+       res_ctx = &core_dc->current_state->res_ctx;
+
+       for (i = 0; i < MAX_PIPES; i++) {
+               struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i];
+
+               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);
+
+               invalid_dp_sdp_info_frame(pipe_ctx);
+       }
+
+       return true;
+}
+
 bool dc_stream_get_scanoutpos(const struct dc_stream_state *stream,
                                  uint32_t *v_blank_start,
                                  uint32_t *v_blank_end,
 
        struct dc_info_packet vrr_infopacket;
        struct dc_info_packet vsc_infopacket;
        struct dc_info_packet vsp_infopacket;
+       struct dc_info_packet dpsdp_infopacket;
 
        struct rect src; /* composition area */
        struct rect dst; /* stream addressable area */
  */
 uint32_t dc_stream_get_vblank_counter(const struct dc_stream_state *stream);
 
+/*
+ * Send dp sdp message.
+ */
+bool dc_stream_send_dp_sdp(const struct dc_stream_state *stream,
+               const uint8_t *custom_sdp_message,
+               unsigned int sdp_message_size);
+
 /* TODO: Return parsed values rather than direct register read
  * This has a dependency on the caller (amdgpu_display_get_crtc_scanoutpos)
  * being refactored properly to be dce-specific
 
                                3,  /* packetIndex */
                                &info_frame->hdrsmd);
 
+       if (info_frame->dpsdp.valid)
+               enc1_update_generic_info_packet(
+                               enc1,
+                               4,/* packetIndex */
+                               &info_frame->dpsdp);
+
        /* enable/disable transmission of packet(s).
         * If enabled, packet transmission begins on the next frame
         */
        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,
 
        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 {