drm/amd/display: DP Compliance 400.1.1 failure
authorabdoulaye berthe <abdoulaye.berthe@amd.com>
Thu, 19 Jul 2018 19:39:55 +0000 (15:39 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 6 Aug 2018 19:35:23 +0000 (14:35 -0500)
[Why]
400.1.1 is failing because we are not performing link training when
we get an HPD pulse for the same display. This is breaking DP
compliance

[How]
Always perform link training after HPD pulse if the detection
reason is not  DETECT_REASON_HPDRX.

Signed-off-by: abdoulaye berthe <abdoulaye.berthe@amd.com>
Reviewed-by: Wenjing Liu <Wenjing.Liu@amd.com>
Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc_link.c

index 89d7c1e..ce65b4d 100644 (file)
@@ -764,39 +764,41 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
                if ((prev_sink != NULL) && ((edid_status == EDID_THE_SAME) || (edid_status == EDID_OK)))
                        same_edid = is_same_edid(&prev_sink->dc_edid, &sink->dc_edid);
 
-               // If both edid and dpcd are the same, then discard new sink and revert back to original sink
-               if ((same_edid) && (same_dpcd)) {
-                       link_disconnect_remap(prev_sink, link);
-                       sink = prev_sink;
-                       prev_sink = NULL;
-               } else {
-                       if (link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT &&
-                                       sink_caps.transaction_type ==
-                                               DDC_TRANSACTION_TYPE_I2C_OVER_AUX) {
-                               /*
-                                * TODO debug why Dell 2413 doesn't like
-                                *  two link trainings
-                                */
+               if (link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT &&
+                       sink_caps.transaction_type == DDC_TRANSACTION_TYPE_I2C_OVER_AUX &&
+                       reason != DETECT_REASON_HPDRX) {
+                       /*
+                        * TODO debug why Dell 2413 doesn't like
+                        *  two link trainings
+                        */
 
-                               /* deal with non-mst cases */
-                               for (i = 0; i < LINK_TRAINING_MAX_VERIFY_RETRY; i++) {
-                                       int fail_count = 0;
+                       /* deal with non-mst cases */
+                       for (i = 0; i < LINK_TRAINING_MAX_VERIFY_RETRY; i++) {
+                               int fail_count = 0;
 
-                                       dp_verify_link_cap(link,
-                                                         &link->reported_link_cap,
-                                                         &fail_count);
+                               dp_verify_link_cap(link,
+                                                 &link->reported_link_cap,
+                                                 &fail_count);
 
-                                       if (fail_count == 0)
-                                               break;
-                               }
+                               if (fail_count == 0)
+                                       break;
                        }
 
-                       /* HDMI-DVI Dongle */
-                       if (sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A &&
-                                       !sink->edid_caps.edid_hdmi)
-                               sink->sink_signal = SIGNAL_TYPE_DVI_SINGLE_LINK;
+               } else {
+                       // If edid is the same, then discard new sink and revert back to original sink
+                       if (same_edid) {
+                               link_disconnect_remap(prev_sink, link);
+                               sink = prev_sink;
+                               prev_sink = NULL;
+
+                       }
                }
 
+               /* HDMI-DVI Dongle */
+               if (sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A &&
+                               !sink->edid_caps.edid_hdmi)
+                       sink->sink_signal = SIGNAL_TYPE_DVI_SINGLE_LINK;
+
                /* Connectivity log: detection */
                for (i = 0; i < sink->dc_edid.length / EDID_BLOCK_SIZE; i++) {
                        CONN_DATA_DETECT(link,