drm/amd/display: Adding VTEM to dc
authorAhmad Othman <ahmad.othman@amd.com>
Thu, 1 Aug 2019 19:05:04 +0000 (15:05 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 15 Jun 2022 01:38:41 +0000 (21:38 -0400)
[Why]
Video Timing Extended Metadata packet (VTEM) is required for features
like VRR and FVA

[How]
Adding support for VTEM transmission to stream encoders in DCN20 and DCN30
as part of FVA support

Acked-by: Alan Liu <HaoPing.Liu@amd.com>
Signed-off-by: Ahmad Othman <ahmad.othman@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc.c
drivers/gpu/drm/amd/display/dc/core/dc_resource.c
drivers/gpu/drm/amd/display/dc/dc_stream.h
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_stream_encoder.c
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_stream_encoder.c
drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h

index 400b37e..7c2b652 100644 (file)
@@ -2661,6 +2661,9 @@ static void copy_stream_update_to_stream(struct dc *dc,
        if (update->hfvsif_infopacket)
                stream->hfvsif_infopacket = *update->hfvsif_infopacket;
 
+       if (update->vtem_infopacket)
+               stream->vtem_infopacket = *update->vtem_infopacket;
+
        if (update->vsc_infopacket)
                stream->vsc_infopacket = *update->vsc_infopacket;
 
@@ -2736,7 +2739,8 @@ static void commit_planes_do_stream_update(struct dc *dc,
                                        stream_update->vrr_infopacket ||
                                        stream_update->vsc_infopacket ||
                                        stream_update->vsp_infopacket ||
-                                       stream_update->hfvsif_infopacket) {
+                                       stream_update->hfvsif_infopacket ||
+                                       stream_update->vtem_infopacket) {
                                resource_build_info_frame(pipe_ctx);
                                dc->hwss.update_info_frame(pipe_ctx);
 
index 9bb0ae0..463ff12 100644 (file)
@@ -2816,6 +2816,17 @@ static void set_hfvs_info_packet(
        *info_packet = stream->hfvsif_infopacket;
 }
 
+
+static void set_vtem_info_packet(
+               struct dc_info_packet *info_packet,
+               struct dc_stream_state *stream)
+{
+       if (!stream->vtem_infopacket.valid)
+               return;
+
+       *info_packet = stream->vtem_infopacket;
+}
+
 void dc_resource_state_destruct(struct dc_state *context)
 {
        int i, j;
@@ -2896,7 +2907,7 @@ void resource_build_info_frame(struct pipe_ctx *pipe_ctx)
        info->hdrsmd.valid = false;
        info->vsc.valid = false;
        info->hfvsif.valid = false;
-
+       info->vtem.valid = false;
        signal = pipe_ctx->stream->signal;
 
        /* HDMi and DP have different info packets*/
@@ -2905,6 +2916,7 @@ void resource_build_info_frame(struct pipe_ctx *pipe_ctx)
 
                set_vendor_info_packet(&info->vendor, pipe_ctx->stream);
                set_hfvs_info_packet(&info->hfvsif, pipe_ctx->stream);
+               set_vtem_info_packet(&info->vtem, pipe_ctx->stream);
 
                set_spd_info_packet(&info->spd, pipe_ctx->stream);
 
index 376dddf..c76fac3 100644 (file)
@@ -181,6 +181,7 @@ struct dc_stream_state {
        struct dc_info_packet vsc_infopacket;
        struct dc_info_packet vsp_infopacket;
        struct dc_info_packet hfvsif_infopacket;
+       struct dc_info_packet vtem_infopacket;
        uint8_t dsc_packed_pps[128];
        struct rect src; /* composition area */
        struct rect dst; /* stream addressable area */
@@ -298,6 +299,7 @@ struct dc_stream_update {
        struct dc_info_packet *vsc_infopacket;
        struct dc_info_packet *vsp_infopacket;
        struct dc_info_packet *hfvsif_infopacket;
+       struct dc_info_packet *vtem_infopacket;
        bool *dpms_off;
        bool integer_scaling_update;
        bool *allow_freesync;
index aab25ca..e8f5c01 100644 (file)
@@ -159,6 +159,7 @@ static void enc2_stream_encoder_update_hdmi_info_packets(
        enc2_update_hdmi_info_packet(enc1, 3, &info_frame->vendor);
        enc2_update_hdmi_info_packet(enc1, 4, &info_frame->spd);
        enc2_update_hdmi_info_packet(enc1, 5, &info_frame->hdrsmd);
+       enc2_update_hdmi_info_packet(enc1, 6, &info_frame->vtem);
 }
 
 static void enc2_stream_encoder_stop_hdmi_info_packets(
index 1a26ce8..25e5c3b 100644 (file)
@@ -212,6 +212,7 @@ void enc3_stream_encoder_update_hdmi_info_packets(
        enc3_update_hdmi_info_packet(enc1, 1, &info_frame->vendor);
        enc3_update_hdmi_info_packet(enc1, 3, &info_frame->spd);
        enc3_update_hdmi_info_packet(enc1, 4, &info_frame->hdrsmd);
+       enc3_update_hdmi_info_packet(enc1, 6, &info_frame->vtem);
 }
 
 void enc3_stream_encoder_stop_hdmi_info_packets(
index e5fe0f6..e04a51a 100644 (file)
@@ -77,6 +77,7 @@ struct encoder_info_frame {
        struct dc_info_packet gamut;
        struct dc_info_packet vendor;
        struct dc_info_packet hfvsif;
+       struct dc_info_packet vtem;
        /* source product description */
        struct dc_info_packet spd;
        /* video stream configuration */