drm/amd/display: differentiate vsc sdp colorimetry use criteria between MST and SST
authorMartin Tsai <martin.tsai@amd.com>
Tue, 3 Mar 2020 02:04:08 +0000 (10:04 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 19 Mar 2020 04:03:04 +0000 (00:03 -0400)
[Why]
We should check MST BU support capability on output port before building
vsc info packet.

[How]
Add a new definition for port and sink capability check.

Signed-off-by: Martin Tsai <martin.tsai@amd.com>
Reviewed-by: Wenjing Liu <Wenjing.Liu@amd.com>
Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
drivers/gpu/drm/amd/display/dc/dc.h
drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h
drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c

index 307b0b9..a425678 100644 (file)
@@ -4316,9 +4316,22 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
                        struct dmcu *dmcu = core_dc->res_pool->dmcu;
 
                        stream->psr_version = dmcu->dmcu_version.psr_version;
-                       mod_build_vsc_infopacket(stream,
-                                       &stream->vsc_infopacket,
-                                       &stream->use_vsc_sdp_for_colorimetry);
+
+                       //
+                       // should decide stream support vsc sdp colorimetry capability
+                       // before building vsc info packet
+                       //
+                       stream->use_vsc_sdp_for_colorimetry = false;
+                       if (aconnector->dc_sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT_MST) {
+                               stream->use_vsc_sdp_for_colorimetry =
+                                       aconnector->dc_sink->is_vsc_sdp_colorimetry_supported;
+                       } else {
+                               if (stream->link->dpcd_caps.dpcd_rev.raw >= 0x14 &&
+                                       stream->link->dpcd_caps.dprx_feature.bits.VSC_SDP_COLORIMETRY_SUPPORTED) {
+                                       stream->use_vsc_sdp_for_colorimetry = true;
+                               }
+                       }
+                       mod_build_vsc_infopacket(stream, &stream->vsc_infopacket);
                }
        }
 finish:
index 280b015..6cfb534 100644 (file)
@@ -1047,6 +1047,8 @@ struct dc_sink {
        struct dc_sink_dsc_caps dsc_caps;
        struct dc_sink_fec_caps fec_caps;
 
+       bool is_vsc_sdp_colorimetry_supported;
+
        /* private to DC core */
        struct dc_link *link;
        struct dc_context *ctx;
index 42cbeff..13c57ff 100644 (file)
@@ -34,8 +34,7 @@ struct dc_info_packet;
 struct mod_vrr_params;
 
 void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
-               struct dc_info_packet *info_packet,
-               bool *use_vsc_sdp_for_colorimetry);
+               struct dc_info_packet *info_packet);
 
 void mod_build_hf_vsif_infopacket(const struct dc_stream_state *stream,
                struct dc_info_packet *info_packet, int ALLMEnabled, int ALLMValue);
index 6a8a056..cff3ab1 100644 (file)
@@ -130,8 +130,7 @@ enum ColorimetryYCCDP {
 };
 
 void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
-               struct dc_info_packet *info_packet,
-               bool *use_vsc_sdp_for_colorimetry)
+               struct dc_info_packet *info_packet)
 {
        unsigned int vsc_packet_revision = vsc_packet_undefined;
        unsigned int i;
@@ -139,11 +138,6 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
        unsigned int colorimetryFormat = 0;
        bool stereo3dSupport = false;
 
-       /* Initialize first, later if infopacket is valid determine if VSC SDP
-        * should be used to signal colorimetry format and pixel encoding.
-        */
-       *use_vsc_sdp_for_colorimetry = false;
-
        if (stream->timing.timing_3d_format != TIMING_3D_FORMAT_NONE && stream->view_format != VIEW_3D_FORMAT_NONE) {
                vsc_packet_revision = vsc_packet_rev1;
                stereo3dSupport = true;
@@ -153,9 +147,8 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
        if (stream->psr_version != 0)
                vsc_packet_revision = vsc_packet_rev2;
 
-       /* Update to revision 5 for extended colorimetry support for DPCD 1.4+ */
-       if (stream->link->dpcd_caps.dpcd_rev.raw >= 0x14 &&
-                       stream->link->dpcd_caps.dprx_feature.bits.VSC_SDP_COLORIMETRY_SUPPORTED)
+       /* Update to revision 5 for extended colorimetry support */
+       if (stream->use_vsc_sdp_for_colorimetry)
                vsc_packet_revision = vsc_packet_rev5;
 
        /* VSC packet not needed based on the features
@@ -269,13 +262,6 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
 
                info_packet->valid = true;
 
-               /* If we are using VSC SDP revision 05h, use this to signal for
-                * colorimetry format and pixel encoding. HW should later be
-                * programmed to set MSA MISC1 bit 6 to indicate ignore
-                * colorimetry format and pixel encoding in the MSA.
-                */
-               *use_vsc_sdp_for_colorimetry = true;
-
                /* Set VSC SDP fields for pixel encoding and colorimetry format from DP 1.3 specs
                 * Data Bytes DB 18~16
                 * Bits 3:0 (Colorimetry Format)        |  Bits 7:4 (Pixel Encoding)