diff options
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.patch | 209 |
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 + |