aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1811-drm-amd-display-Fix-eDP-Black-screen-after-S4-resume.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1811-drm-amd-display-Fix-eDP-Black-screen-after-S4-resume.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1811-drm-amd-display-Fix-eDP-Black-screen-after-S4-resume.patch188
1 files changed, 188 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1811-drm-amd-display-Fix-eDP-Black-screen-after-S4-resume.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1811-drm-amd-display-Fix-eDP-Black-screen-after-S4-resume.patch
new file mode 100644
index 00000000..17cdb7a3
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1811-drm-amd-display-Fix-eDP-Black-screen-after-S4-resume.patch
@@ -0,0 +1,188 @@
+From 3c7159f359c1a591fb36c0e9bfaf6d6c047d0ce2 Mon Sep 17 00:00:00 2001
+From: Anthony Koo <Anthony.Koo@amd.com>
+Date: Thu, 4 Apr 2019 14:42:44 -0400
+Subject: [PATCH 1811/2940] drm/amd/display: Fix eDP Black screen after S4
+ resume
+
+[Why]
+Power down of PHY on eDP requires us to call eDP power
+control to power on again
+
+[How]
+1. In the case link rates don't match, disable PHY
+requires calling of eDP power control ON after
+
+2. Link disable case limit to eDP path since
+this is not really applicable to DP since we do
+power down PHY as part of verify link cap
+
+3. Move detection of eDP link settings to be
+done even for S4 resume cases where other
+dpcd cap read and edid read can be skipped
+
+Signed-off-by: Anthony Koo <Anthony.Koo@amd.com>
+Reviewed-by: Jun Lei <Jun.Lei@amd.com>
+Acked-by: Aric Cyr <Aric.Cyr@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/core/dc_link.c | 71 ++++++++++++++-----
+ .../gpu/drm/amd/display/dc/core/dc_link_dp.c | 30 --------
+ 2 files changed, 55 insertions(+), 46 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 fa7ba2d3f9a2..30d0dc10fdbb 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+@@ -514,6 +514,40 @@ static void link_disconnect_remap(struct dc_sink *prev_sink, struct dc_link *lin
+ }
+
+
++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;
++
++ // 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;
++
++ // Read DPCD 00100h to find if standard link rates are set
++ core_link_read_dpcd(link, DP_LINK_BW_SET,
++ &link_bw_set, sizeof(link_bw_set));
++
++ if (link_bw_set == 0) {
++ /* If standard link rates are not being used,
++ * Read DPCD 00115h to find the link rate set used
++ */
++ core_link_read_dpcd(link, DP_LINK_RATE_SET,
++ &link_rate_set, sizeof(link_rate_set));
++
++ if (link_rate_set < link->dpcd_caps.edp_supported_link_rates_count) {
++ link->cur_link_settings.link_rate =
++ link->dpcd_caps.edp_supported_link_rates[link_rate_set];
++ link->cur_link_settings.link_rate_set = link_rate_set;
++ link->cur_link_settings.use_link_rate_set = true;
++ }
++ } else {
++ link->cur_link_settings.link_rate = link_bw_set;
++ link->cur_link_settings.use_link_rate_set = false;
++ }
++}
++
+ static bool detect_dp(
+ struct dc_link *link,
+ struct display_sink_capability *sink_caps,
+@@ -648,9 +682,14 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
+ return false;
+ }
+
+- if (link->connector_signal == SIGNAL_TYPE_EDP &&
+- link->local_sink)
+- return true;
++ if (link->connector_signal == SIGNAL_TYPE_EDP) {
++ /* On detect, we want to make sure current link settings are
++ * 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)
+@@ -1396,13 +1435,19 @@ static enum dc_status enable_link_dp(
+ /* get link settings for video mode timing */
+ decide_link_settings(stream, &link_settings);
+
+- /* If link settings are different than current and link already enabled
+- * then need to disable before programming to new rate.
+- */
+- if (link->link_status.link_active &&
+- (link->cur_link_settings.lane_count != link_settings.lane_count ||
+- link->cur_link_settings.link_rate != link_settings.link_rate)) {
+- dp_disable_link_phy(link, pipe_ctx->stream->signal);
++ if (pipe_ctx->stream->signal == SIGNAL_TYPE_EDP) {
++ /* If link settings are different than current and link already enabled
++ * then need to disable before programming to new rate.
++ */
++ if (link->link_status.link_active &&
++ (link->cur_link_settings.lane_count != link_settings.lane_count ||
++ link->cur_link_settings.link_rate != link_settings.link_rate)) {
++ dp_disable_link_phy(link, pipe_ctx->stream->signal);
++ }
++
++ /*in case it is not on*/
++ link->dc->hwss.edp_power_control(link, true);
++ link->dc->hwss.edp_wait_for_hpd_ready(link, true);
+ }
+
+ pipe_ctx->stream_res.pix_clk_params.requested_sym_clk =
+@@ -1448,15 +1493,9 @@ static enum dc_status enable_link_edp(
+ struct pipe_ctx *pipe_ctx)
+ {
+ enum dc_status status;
+- struct dc_stream_state *stream = pipe_ctx->stream;
+- struct dc_link *link = stream->link;
+- /*in case it is not on*/
+- link->dc->hwss.edp_power_control(link, true);
+- link->dc->hwss.edp_wait_for_hpd_ready(link, true);
+
+ status = enable_link_dp(state, pipe_ctx);
+
+-
+ return status;
+ }
+
+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 a6424c70f4c5..64a309a5e1c9 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
+@@ -2586,9 +2586,6 @@ void detect_edp_sink_caps(struct dc_link *link)
+ uint32_t entry;
+ uint32_t link_rate_in_khz;
+ enum dc_link_rate link_rate = LINK_RATE_UNKNOWN;
+- union lane_count_set lane_count_set = { {0} };
+- uint8_t link_bw_set;
+- uint8_t link_rate_set;
+
+ retrieve_link_cap(link);
+ link->dpcd_caps.edp_supported_link_rates_count = 0;
+@@ -2614,33 +2611,6 @@ void detect_edp_sink_caps(struct dc_link *link)
+ }
+ }
+ link->verified_link_cap = link->reported_link_cap;
+-
+- // 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;
+-
+- // Read DPCD 00100h to find if standard link rates are set
+- core_link_read_dpcd(link, DP_LINK_BW_SET,
+- &link_bw_set, sizeof(link_bw_set));
+-
+- if (link_bw_set == 0) {
+- /* If standard link rates are not being used,
+- * Read DPCD 00115h to find the link rate set used
+- */
+- core_link_read_dpcd(link, DP_LINK_RATE_SET,
+- &link_rate_set, sizeof(link_rate_set));
+-
+- if (link_rate_set < link->dpcd_caps.edp_supported_link_rates_count) {
+- link->cur_link_settings.link_rate =
+- link->dpcd_caps.edp_supported_link_rates[link_rate_set];
+- link->cur_link_settings.link_rate_set = link_rate_set;
+- link->cur_link_settings.use_link_rate_set = true;
+- }
+- } else {
+- link->cur_link_settings.link_rate = link_bw_set;
+- link->cur_link_settings.use_link_rate_set = false;
+- }
+ }
+
+ void dc_link_dp_enable_hpd(const struct dc_link *link)
+--
+2.17.1
+