]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
drm/amd/display: Add support for HF-VSIF
authorAhmad Othman <ahmad.othman@amd.com>
Mon, 4 Feb 2019 21:11:44 +0000 (16:11 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 15 Jun 2022 01:38:41 +0000 (21:38 -0400)
[Why]
- Currently there is no support for HF-VSIF
- The current support of VSIF is limited to H14b infoframe

[How]
- refactor VSIF
- Added new builder for HF-VSIF
- Added the HF-VSIF packet to DisplayTarget
- Updates DC to apply HF-VSIF updates when updating streams

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/dcn10/dcn10_stream_encoder.c

index cfa6c2d1fc692d51cfadd51b1c7b2a479cee2a8f..7d71fd61c0a56de502910ae0dd0101e7170e101a 100644 (file)
@@ -2732,7 +2732,8 @@ static void commit_planes_do_stream_update(struct dc *dc,
                        if ((stream_update->hdr_static_metadata && !stream->use_dynamic_meta) ||
                                        stream_update->vrr_infopacket ||
                                        stream_update->vsc_infopacket ||
-                                       stream_update->vsp_infopacket) {
+                                       stream_update->vsp_infopacket ||
+                                       stream_update->hfvsif_infopacket) {
                                resource_build_info_frame(pipe_ctx);
                                dc->hwss.update_info_frame(pipe_ctx);
 
index 9bbdfcd6b3a470817108be6132d32a623b6f93b9..9bb0ae0dc8364b52cd7a5f63baed054be0927662 100644 (file)
@@ -2806,6 +2806,15 @@ static void set_vsc_info_packet(
 
        *info_packet = stream->vsc_infopacket;
 }
+static void set_hfvs_info_packet(
+               struct dc_info_packet *info_packet,
+               struct dc_stream_state *stream)
+{
+       if (!stream->hfvsif_infopacket.valid)
+               return;
+
+       *info_packet = stream->hfvsif_infopacket;
+}
 
 void dc_resource_state_destruct(struct dc_state *context)
 {
@@ -2886,6 +2895,7 @@ void resource_build_info_frame(struct pipe_ctx *pipe_ctx)
        info->spd.valid = false;
        info->hdrsmd.valid = false;
        info->vsc.valid = false;
+       info->hfvsif.valid = false;
 
        signal = pipe_ctx->stream->signal;
 
@@ -2894,6 +2904,7 @@ void resource_build_info_frame(struct pipe_ctx *pipe_ctx)
                set_avi_info_frame(&info->avi, pipe_ctx);
 
                set_vendor_info_packet(&info->vendor, pipe_ctx->stream);
+               set_hfvs_info_packet(&info->hfvsif, pipe_ctx->stream);
 
                set_spd_info_packet(&info->spd, pipe_ctx->stream);
 
index 68cf06a5a3e3cb28a15c16899ad8f5fb603eb0e8..376dddf54ec15ac0ad302e5c929f36e8ddf1f6df 100644 (file)
@@ -180,6 +180,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 hfvsif_infopacket;
        uint8_t dsc_packed_pps[128];
        struct rect src; /* composition area */
        struct rect dst; /* stream addressable area */
@@ -296,6 +297,7 @@ struct dc_stream_update {
        struct dc_info_packet *vrr_infopacket;
        struct dc_info_packet *vsc_infopacket;
        struct dc_info_packet *vsp_infopacket;
+       struct dc_info_packet *hfvsif_infopacket;
        bool *dpms_off;
        bool integer_scaling_update;
        bool *allow_freesync;
index 7608187751c874e647c8edff72812d47958e5929..92f474e6a96bd03638af79cd998366167342f397 100644 (file)
@@ -675,11 +675,13 @@ static void enc1_stream_encoder_update_hdmi_info_packets(
        /* for bring up, disable dp double  TODO */
        REG_UPDATE(HDMI_DB_CONTROL, HDMI_DB_DISABLE, 1);
 
+       /*Always add mandatory packets first followed by optional ones*/
        enc1_update_hdmi_info_packet(enc1, 0, &info_frame->avi);
-       enc1_update_hdmi_info_packet(enc1, 1, &info_frame->vendor);
+       enc1_update_hdmi_info_packet(enc1, 1, &info_frame->hfvsif);
        enc1_update_hdmi_info_packet(enc1, 2, &info_frame->gamut);
-       enc1_update_hdmi_info_packet(enc1, 3, &info_frame->spd);
-       enc1_update_hdmi_info_packet(enc1, 4, &info_frame->hdrsmd);
+       enc1_update_hdmi_info_packet(enc1, 3, &info_frame->vendor);
+       enc1_update_hdmi_info_packet(enc1, 4, &info_frame->spd);
+       enc1_update_hdmi_info_packet(enc1, 5, &info_frame->hdrsmd);
 }
 
 static void enc1_stream_encoder_stop_hdmi_info_packets(