From: Wenjing Liu <wenjing....@amd.com>

[why]
During detection link training if a display is disconnected,
the current code will retry 3 times of link training
on disconnected link before giving up.

[how]
Before each retry check for HPD status, only retry
verify link cap when HPD is still high.
Also put a 10ms delay between each retry to improve
the chance of success.

Signed-off-by: Wenjing Liu <wenjing....@amd.com>
Reviewed-by: Jun Lei <jun....@amd.com>
Acked-by: Abdoulaye Berthe <abdoulaye.ber...@amd.com>
Acked-by: Leo Li <sunpeng...@amd.com>
---
 drivers/gpu/drm/amd/display/dc/core/dc_link.c | 27 +++++--------------
 .../gpu/drm/amd/display/dc/core/dc_link_dp.c  | 27 +++++++++++++++++++
 .../gpu/drm/amd/display/dc/inc/dc_link_dp.h   |  5 ++++
 3 files changed, 38 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
index 1a30066ac605..78c4d07253bb 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
@@ -852,16 +852,9 @@ bool dc_link_detect(struct dc_link *link, enum 
dc_detect_reason reason)
                                        dc_sink_release(prev_sink);
                                } else {
                                        /* Empty dongle plug in */
-                                       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);
-
-                                               if (fail_count == 0)
-                                                       break;
-                                       }
+                                       dp_verify_link_cap_with_retries(link,
+                                                       
&link->reported_link_cap,
+                                                       
LINK_TRAINING_MAX_VERIFY_RETRY);
                                }
                                return true;
                        }
@@ -965,17 +958,9 @@ bool dc_link_detect(struct dc_link *link, enum 
dc_detect_reason reason)
                         */
 
                        /* 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);
-
-                               if (fail_count == 0)
-                                       break;
-                       }
-
+                       dp_verify_link_cap_with_retries(link,
+                                       &link->reported_link_cap,
+                                       LINK_TRAINING_MAX_VERIFY_RETRY);
                } else {
                        // If edid is the same, then discard new sink and 
revert back to original sink
                        if (same_edid) {
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 8e66b2e9d6af..2e87942b3e9c 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
@@ -1643,6 +1643,33 @@ bool dp_verify_link_cap(
        return success;
 }
 
+bool dp_verify_link_cap_with_retries(
+       struct dc_link *link,
+       struct dc_link_settings *known_limit_link_setting,
+       int attempts)
+{
+       uint8_t i = 0;
+       bool success = false;
+
+       for (i = 0; i < attempts; i++) {
+               int fail_count = 0;
+               enum dc_connection_type type;
+
+               memset(&link->verified_link_cap, 0,
+                               sizeof(struct dc_link_settings));
+               if (!dc_link_detect_sink(link, &type)) {
+                       break;
+               } else if (dp_verify_link_cap(link,
+                               &link->reported_link_cap,
+                               &fail_count) && fail_count == 0) {
+                       success = true;
+                       break;
+               }
+               msleep(10);
+       }
+       return success;
+}
+
 static struct dc_link_settings get_common_supported_link_settings(
                struct dc_link_settings link_setting_a,
                struct dc_link_settings link_setting_b)
diff --git a/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h 
b/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h
index b4e7b0c56f83..08a4df2c61a8 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h
@@ -38,6 +38,11 @@ bool dp_verify_link_cap(
        struct dc_link_settings *known_limit_link_setting,
        int *fail_count);
 
+bool dp_verify_link_cap_with_retries(
+       struct dc_link *link,
+       struct dc_link_settings *known_limit_link_setting,
+       int attempts);
+
 bool dp_validate_mode_timing(
        struct dc_link *link,
        const struct dc_crtc_timing *timing);
-- 
2.22.0

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

Reply via email to