From: jinlong zhang <jinlong.zh...@amd.com>

[Why]
For special DP convert VGA dongle, core_link_read_dpcd for
DP_DOWNSTREAM_PORT_0 always return fail, then dongle_type will be set to
DISPLAY_DONGLE_NONE, which will cause desktop resolution abnormal.

[How]
If dpcd for DP_DOWNSTREAM_PORT_0 read fail, skip set dongle_type =
DISPLAY_DONGLE_NONE.

Signed-off-by: jinlong zhang <jinlong.zh...@amd.com>
Reviewed-by: Wenjing Liu <wenjing....@amd.com>
Acked-by: Eryk Brol <eryk.b...@amd.com>
---
 .../gpu/drm/amd/display/dc/core/dc_link_dp.c  | 105 +++++++++---------
 1 file changed, 53 insertions(+), 52 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
index d2116cb71937..7ae6d903cf04 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
@@ -3097,62 +3097,63 @@ static void get_active_converter_info(
                uint8_t det_caps[16]; /* CTS 4.2.2.7 expects source to read 
Detailed Capabilities Info : 00080h-0008F.*/
                union dwnstream_port_caps_byte0 *port_caps =
                        (union dwnstream_port_caps_byte0 *)det_caps;
-               core_link_read_dpcd(link, DP_DOWNSTREAM_PORT_0,
-                               det_caps, sizeof(det_caps));
+               if (core_link_read_dpcd(link, DP_DOWNSTREAM_PORT_0,
+                               det_caps, sizeof(det_caps)) == DC_OK) {
 
-               switch (port_caps->bits.DWN_STRM_PORTX_TYPE) {
-               /*Handle DP case as DONGLE_NONE*/
-               case DOWN_STREAM_DETAILED_DP:
-                       link->dpcd_caps.dongle_type = DISPLAY_DONGLE_NONE;
-                       break;
-               case DOWN_STREAM_DETAILED_VGA:
-                       link->dpcd_caps.dongle_type =
-                               DISPLAY_DONGLE_DP_VGA_CONVERTER;
-                       break;
-               case DOWN_STREAM_DETAILED_DVI:
-                       link->dpcd_caps.dongle_type =
-                               DISPLAY_DONGLE_DP_DVI_CONVERTER;
-                       break;
-               case DOWN_STREAM_DETAILED_HDMI:
-               case DOWN_STREAM_DETAILED_DP_PLUS_PLUS:
-                       /*Handle DP++ active converter case, process DP++ case 
as HDMI case according DP1.4 spec*/
-                       link->dpcd_caps.dongle_type =
-                               DISPLAY_DONGLE_DP_HDMI_CONVERTER;
-
-                       link->dpcd_caps.dongle_caps.dongle_type = 
link->dpcd_caps.dongle_type;
-                       if (ds_port.fields.DETAILED_CAPS) {
-
-                               union dwnstream_port_caps_byte3_hdmi
-                                       hdmi_caps = {.raw = det_caps[3] };
-                               union dwnstream_port_caps_byte2
-                                       hdmi_color_caps = {.raw = det_caps[2] };
-                               
link->dpcd_caps.dongle_caps.dp_hdmi_max_pixel_clk_in_khz =
-                                       det_caps[1] * 2500;
-
-                               
link->dpcd_caps.dongle_caps.is_dp_hdmi_s3d_converter =
-                                       hdmi_caps.bits.FRAME_SEQ_TO_FRAME_PACK;
-                               /*YCBCR capability only for HDMI case*/
-                               if (port_caps->bits.DWN_STRM_PORTX_TYPE
-                                               == DOWN_STREAM_DETAILED_HDMI) {
-                                       
link->dpcd_caps.dongle_caps.is_dp_hdmi_ycbcr422_pass_through =
-                                                       
hdmi_caps.bits.YCrCr422_PASS_THROUGH;
-                                       
link->dpcd_caps.dongle_caps.is_dp_hdmi_ycbcr420_pass_through =
-                                                       
hdmi_caps.bits.YCrCr420_PASS_THROUGH;
-                                       
link->dpcd_caps.dongle_caps.is_dp_hdmi_ycbcr422_converter =
-                                                       
hdmi_caps.bits.YCrCr422_CONVERSION;
-                                       
link->dpcd_caps.dongle_caps.is_dp_hdmi_ycbcr420_converter =
-                                                       
hdmi_caps.bits.YCrCr420_CONVERSION;
+                       switch (port_caps->bits.DWN_STRM_PORTX_TYPE) {
+                       /*Handle DP case as DONGLE_NONE*/
+                       case DOWN_STREAM_DETAILED_DP:
+                               link->dpcd_caps.dongle_type = 
DISPLAY_DONGLE_NONE;
+                               break;
+                       case DOWN_STREAM_DETAILED_VGA:
+                               link->dpcd_caps.dongle_type =
+                                       DISPLAY_DONGLE_DP_VGA_CONVERTER;
+                               break;
+                       case DOWN_STREAM_DETAILED_DVI:
+                               link->dpcd_caps.dongle_type =
+                                       DISPLAY_DONGLE_DP_DVI_CONVERTER;
+                               break;
+                       case DOWN_STREAM_DETAILED_HDMI:
+                       case DOWN_STREAM_DETAILED_DP_PLUS_PLUS:
+                               /*Handle DP++ active converter case, process 
DP++ case as HDMI case according DP1.4 spec*/
+                               link->dpcd_caps.dongle_type =
+                                       DISPLAY_DONGLE_DP_HDMI_CONVERTER;
+
+                               link->dpcd_caps.dongle_caps.dongle_type = 
link->dpcd_caps.dongle_type;
+                               if (ds_port.fields.DETAILED_CAPS) {
+
+                                       union dwnstream_port_caps_byte3_hdmi
+                                               hdmi_caps = {.raw = det_caps[3] 
};
+                                       union dwnstream_port_caps_byte2
+                                               hdmi_color_caps = {.raw = 
det_caps[2] };
+                                       
link->dpcd_caps.dongle_caps.dp_hdmi_max_pixel_clk_in_khz =
+                                               det_caps[1] * 2500;
+
+                                       
link->dpcd_caps.dongle_caps.is_dp_hdmi_s3d_converter =
+                                               
hdmi_caps.bits.FRAME_SEQ_TO_FRAME_PACK;
+                                       /*YCBCR capability only for HDMI case*/
+                                       if (port_caps->bits.DWN_STRM_PORTX_TYPE
+                                                       == 
DOWN_STREAM_DETAILED_HDMI) {
+                                               
link->dpcd_caps.dongle_caps.is_dp_hdmi_ycbcr422_pass_through =
+                                                               
hdmi_caps.bits.YCrCr422_PASS_THROUGH;
+                                               
link->dpcd_caps.dongle_caps.is_dp_hdmi_ycbcr420_pass_through =
+                                                               
hdmi_caps.bits.YCrCr420_PASS_THROUGH;
+                                               
link->dpcd_caps.dongle_caps.is_dp_hdmi_ycbcr422_converter =
+                                                               
hdmi_caps.bits.YCrCr422_CONVERSION;
+                                               
link->dpcd_caps.dongle_caps.is_dp_hdmi_ycbcr420_converter =
+                                                               
hdmi_caps.bits.YCrCr420_CONVERSION;
+                                       }
+
+                                       
link->dpcd_caps.dongle_caps.dp_hdmi_max_bpc =
+                                               translate_dpcd_max_bpc(
+                                                       
hdmi_color_caps.bits.MAX_BITS_PER_COLOR_COMPONENT);
+
+                                       if 
(link->dpcd_caps.dongle_caps.dp_hdmi_max_pixel_clk_in_khz != 0)
+                                               
link->dpcd_caps.dongle_caps.extendedCapValid = true;
                                }
 
-                               link->dpcd_caps.dongle_caps.dp_hdmi_max_bpc =
-                                       translate_dpcd_max_bpc(
-                                               
hdmi_color_caps.bits.MAX_BITS_PER_COLOR_COMPONENT);
-
-                               if 
(link->dpcd_caps.dongle_caps.dp_hdmi_max_pixel_clk_in_khz != 0)
-                                       
link->dpcd_caps.dongle_caps.extendedCapValid = true;
+                               break;
                        }
-
-                       break;
                }
        }
 
-- 
2.25.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to