aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3440-drm-amd-display-check-hpd-before-retry-verify-link-c.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3440-drm-amd-display-check-hpd-before-retry-verify-link-c.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3440-drm-amd-display-check-hpd-before-retry-verify-link-c.patch129
1 files changed, 129 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3440-drm-amd-display-check-hpd-before-retry-verify-link-c.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3440-drm-amd-display-check-hpd-before-retry-verify-link-c.patch
new file mode 100644
index 00000000..f5abd36c
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3440-drm-amd-display-check-hpd-before-retry-verify-link-c.patch
@@ -0,0 +1,129 @@
+From 17bb08b1420d8cb71ef456d6e4a2038ec0dad2dc Mon Sep 17 00:00:00 2001
+From: Wenjing Liu <Wenjing.Liu@amd.com>
+Date: Fri, 26 Jul 2019 14:53:20 -0400
+Subject: [PATCH 3440/4256] drm/amd/display: check hpd before retry verify link
+ cap
+
+[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.Liu@amd.com>
+Reviewed-by: Jun Lei <Jun.Lei@amd.com>
+Acked-by: Abdoulaye Berthe <Abdoulaye.Berthe@amd.com>
+Acked-by: Leo Li <sunpeng.li@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 429c1ad59089..c953f6d2770a 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.17.1
+