aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2098-drm-amd-display-fix-issue-with-eDP-not-detected-on-d.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2098-drm-amd-display-fix-issue-with-eDP-not-detected-on-d.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2098-drm-amd-display-fix-issue-with-eDP-not-detected-on-d.patch110
1 files changed, 110 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2098-drm-amd-display-fix-issue-with-eDP-not-detected-on-d.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2098-drm-amd-display-fix-issue-with-eDP-not-detected-on-d.patch
new file mode 100644
index 00000000..868fc6cf
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2098-drm-amd-display-fix-issue-with-eDP-not-detected-on-d.patch
@@ -0,0 +1,110 @@
+From 1755b98c18114680bf1c91636a9aa5a26f7eb880 Mon Sep 17 00:00:00 2001
+From: Anthony Koo <Anthony.Koo@amd.com>
+Date: Wed, 22 May 2019 21:17:38 -0400
+Subject: [PATCH 2098/2940] drm/amd/display: fix issue with eDP not detected on
+ driver load
+
+[Why]
+HPD not going to be high if Panel VDD is off
+And all AUX transaction will fail :(
+
+[How]
+1. Power on VDD before attempting detection if it isn't already on
+2. Improve the robustness by having a retry mechanism on the
+first DPCD read after VDD on. If a particular board always holds
+HPD high incorrectly, the AUX access may fail, so we can retry
+in those scenarios. This change would only improve logic
+since it prevents AUX failure leading to bad resolution on internal
+panel.
+3. We should never need to re-detect internal panel, so logic
+is re-arranged a bit to skip earlier.
+
+Signed-off-by: Anthony Koo <Anthony.Koo@amd.com>
+Reviewed-by: Jun Lei <Jun.Lei@amd.com>
+Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/core/dc_link.c | 42 ++++++++++++++-----
+ 1 file changed, 32 insertions(+), 10 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 8a51ef30d7b1..b3b358f791ae 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+@@ -217,8 +217,11 @@ bool dc_link_detect_sink(struct dc_link *link, enum dc_connection_type *type)
+ return true;
+ }
+
+- if (link->connector_signal == SIGNAL_TYPE_EDP)
++ if (link->connector_signal == SIGNAL_TYPE_EDP) {
++ /*in case it is not on*/
++ link->dc->hwss.edp_power_control(link, true);
+ link->dc->hwss.edp_wait_for_hpd_ready(link, true);
++ }
+
+ /* todo: may need to lock gpio access */
+ hpd_pin = get_hpd_gpio(link->ctx->dc_bios, link->link_id, link->ctx->gpio_service);
+@@ -520,11 +523,31 @@ static void read_edp_current_link_settings_on_detect(struct dc_link *link)
+ union lane_count_set lane_count_set = { {0} };
+ uint8_t link_bw_set;
+ uint8_t link_rate_set;
++ uint32_t read_dpcd_retry_cnt = 10;
++ enum dc_status status = DC_ERROR_UNEXPECTED;
++ int i;
+
+ // Read DPCD 00101h to find out the number of lanes currently set
+- core_link_read_dpcd(link, DP_LANE_COUNT_SET,
+- &lane_count_set.raw, sizeof(lane_count_set));
+- link->cur_link_settings.lane_count = lane_count_set.bits.LANE_COUNT_SET;
++ for (i = 0; i < read_dpcd_retry_cnt; i++) {
++ status = core_link_read_dpcd(
++ link,
++ DP_LANE_COUNT_SET,
++ &lane_count_set.raw,
++ sizeof(lane_count_set));
++ /* First DPCD read after VDD ON can fail if the particular board
++ * does not have HPD pin wired correctly. So if DPCD read fails,
++ * which it should never happen, retry a few times. Target worst
++ * case scenario of 80 ms.
++ */
++ if (status == DC_OK) {
++ link->cur_link_settings.lane_count = lane_count_set.bits.LANE_COUNT_SET;
++ break;
++ }
++
++ udelay(8000);
++ }
++
++ ASSERT(status == DC_OK);
+
+ // Read DPCD 00100h to find if standard link rates are set
+ core_link_read_dpcd(link, DP_LINK_BW_SET,
+@@ -678,6 +701,11 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
+ if (dc_is_virtual_signal(link->connector_signal))
+ return false;
+
++ if ((link->connector_signal == SIGNAL_TYPE_LVDS ||
++ link->connector_signal == SIGNAL_TYPE_EDP) &&
++ link->local_sink)
++ return true;
++
+ if (false == dc_link_detect_sink(link, &new_connection_type)) {
+ BREAK_TO_DEBUGGER();
+ return false;
+@@ -688,14 +716,8 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
+ * up to date, especially if link was powered on by GOP.
+ */
+ read_edp_current_link_settings_on_detect(link);
+- if (link->local_sink)
+- return true;
+ }
+
+- if (link->connector_signal == SIGNAL_TYPE_LVDS &&
+- link->local_sink)
+- return true;
+-
+ prev_sink = link->local_sink;
+ if (prev_sink != NULL) {
+ dc_sink_retain(prev_sink);
+--
+2.17.1
+