drm/amd/display: check dpcd read status of DP_DOWNSTREAM_PORT_0
authorjinlong zhang <jinlong.zhang@amd.com>
Wed, 17 Jun 2020 15:20:56 +0000 (23:20 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 2 Jul 2020 16:02:53 +0000 (12:02 -0400)
[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.zhang@amd.com>
Reviewed-by: Wenjing Liu <Wenjing.Liu@amd.com>
Acked-by: Eryk Brol <eryk.brol@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c

index 3d969f83b3ccb0b9f49dd71fc4de95cdd69a3942..1f94591ce5fb94bc8b17bea35a3ba21a62cee60c 100644 (file)
@@ -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;
                }
        }