aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1654-drm-amd-display-Expose-generic-SDP-message-access-in.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1654-drm-amd-display-Expose-generic-SDP-message-access-in.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1654-drm-amd-display-Expose-generic-SDP-message-access-in.patch209
1 files changed, 209 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1654-drm-amd-display-Expose-generic-SDP-message-access-in.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1654-drm-amd-display-Expose-generic-SDP-message-access-in.patch
new file mode 100644
index 00000000..61d0f4e2
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1654-drm-amd-display-Expose-generic-SDP-message-access-in.patch
@@ -0,0 +1,209 @@
+From 304260e93386ec4e7c6d134053ce3ca9d2a0a466 Mon Sep 17 00:00:00 2001
+From: "Leo (Hanghong) Ma" <hanghong.ma@amd.com>
+Date: Thu, 7 Mar 2019 15:31:11 -0500
+Subject: [PATCH 1654/2940] drm/amd/display: Expose generic SDP message access
+ interface
+
+[Why]
+We need to add DP SDP message test debugfs to make sdp message test
+more convenient and efficient.
+
+[How]
+Add a DM accessible SDP interface for custom data.
+
+Change-Id: I8ad12f9ffb8dd2b7d01d12f572bbc7eb0c6c2537
+Signed-off-by: Leo (Hanghong) Ma <hanghong.ma@amd.com>
+Reviewed-by: Harry Wentland <Harry.Wentland@amd.com>
+Reviewed-by: Roman Li <Roman.Li@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 | 62 +++++++++++++++++++
+ drivers/gpu/drm/amd/display/dc/dc_stream.h | 8 +++
+ .../display/dc/dcn10/dcn10_stream_encoder.c | 8 ++-
+ .../amd/display/dc/inc/hw/stream_encoder.h | 2 +
+ 5 files changed, 97 insertions(+), 1 deletion(-)
+
+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 c1b04f779044..740602111110 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+@@ -2394,6 +2394,21 @@ 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)
+@@ -2490,6 +2505,7 @@ 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;
+
+@@ -2509,6 +2525,8 @@ 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 59ccab36dab8..4af3545fc414 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
+@@ -345,6 +345,68 @@ 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 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,
+diff --git a/drivers/gpu/drm/amd/display/dc/dc_stream.h b/drivers/gpu/drm/amd/display/dc/dc_stream.h
+index 5657cb3a2ad3..17fa3bf6cf7b 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc_stream.h
++++ b/drivers/gpu/drm/amd/display/dc/dc_stream.h
+@@ -80,6 +80,7 @@ struct dc_stream_state {
+ 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 */
+@@ -221,6 +222,13 @@ struct dc_stream_state *dc_get_stream_at_index(struct dc *dc, uint8_t i);
+ */
+ 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
+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 0d46aa75361b..6a0e748f0e57 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
+@@ -725,13 +725,19 @@ 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);
++
+ /* 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,
+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 8aafed8793df..ce3c4ecd9c24 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,6 +63,8 @@ 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 {
+--
+2.17.1
+