aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0113-drm-amd-display-Fix-link-retraining-hw-sequence.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0113-drm-amd-display-Fix-link-retraining-hw-sequence.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0113-drm-amd-display-Fix-link-retraining-hw-sequence.patch140
1 files changed, 140 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0113-drm-amd-display-Fix-link-retraining-hw-sequence.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0113-drm-amd-display-Fix-link-retraining-hw-sequence.patch
new file mode 100644
index 00000000..cddfd3bc
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0113-drm-amd-display-Fix-link-retraining-hw-sequence.patch
@@ -0,0 +1,140 @@
+From adccecb927349ea98ee429f75a3e50955432acf2 Mon Sep 17 00:00:00 2001
+From: Zeyu Fan <Zeyu.Fan@amd.com>
+Date: Fri, 23 Dec 2016 16:53:12 -0500
+Subject: [PATCH 0113/4131] drm/amd/display: Fix link retraining hw sequence
+
+Signed-off-by: Zeyu Fan <Zeyu.Fan@amd.com>
+Reviewed-by: Hersen Wu <hersenxs.wu@amd.com>
+Acked-by: Harry Wentland <Harry.Wentland@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/core/dc.c | 15 +++----
+ drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c | 49 +++++++++++++++++++++-
+ drivers/gpu/drm/amd/display/dc/dc.h | 3 +-
+ drivers/gpu/drm/amd/display/dc/inc/link_hwss.h | 4 ++
+ 4 files changed, 62 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
+index 69819d8..ad1ce60 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
+@@ -357,17 +357,18 @@ static void perform_link_training(struct dc *dc,
+ }
+
+ static void set_preferred_link_settings(struct dc *dc,
+- struct dc_link_settings *link_setting)
++ struct dc_link_settings *link_setting,
++ const struct dc_link *link)
+ {
+- struct core_dc *core_dc = DC_TO_CORE(dc);
+- int i;
++ struct core_link *core_link = DC_LINK_TO_CORE(link);
+
+- for (i = 0; i < core_dc->link_count; i++) {
+- core_dc->links[i]->public.verified_link_cap.lane_count =
++ core_link->public.verified_link_cap.lane_count =
+ link_setting->lane_count;
+- core_dc->links[i]->public.verified_link_cap.link_rate =
++ core_link->public.verified_link_cap.link_rate =
+ link_setting->link_rate;
+- }
++ dp_retrain_link_physi(core_link,
++ link_setting,
++ false);
+ }
+
+ static void enable_hpd(const struct dc_link *link)
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c
+index 4febc8d..f870a0e 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c
+@@ -200,7 +200,6 @@ void dp_set_hw_test_pattern(
+ encoder->funcs->dp_set_phy_pattern(encoder, &pattern_param);
+ }
+
+-
+ void dp_retrain_link(struct core_link *link)
+ {
+ struct pipe_ctx *pipes = link->dc->current_context->res_ctx.pipe_ctx;
+@@ -221,3 +220,51 @@ void dp_retrain_link(struct core_link *link)
+ }
+ }
+ }
++
++void dp_retrain_link_physi(struct core_link *link,
++ struct dc_link_settings *link_setting,
++ bool skip_video_pattern)
++{
++ struct pipe_ctx *pipes =
++ &link->dc->current_context->res_ctx.pipe_ctx[0];
++ unsigned int i;
++
++ for (i = 0; i < MAX_PIPES; i++) {
++ if (pipes[i].stream != NULL &&
++ pipes[i].stream->sink != NULL &&
++ pipes[i].stream->sink->link != NULL &&
++ pipes[i].stream_enc != NULL &&
++ pipes[i].stream->sink->link == link) {
++ dm_delay_in_microseconds(link->ctx, 100);
++
++ pipes[i].stream_enc->funcs->dp_blank(
++ pipes[i].stream_enc);
++
++ dp_receiver_power_ctrl(link, false);
++
++ link->link_enc->funcs->disable_output(
++ link->link_enc,
++ SIGNAL_TYPE_DISPLAY_PORT);
++
++ /* Clear current link setting.
++ * memset(&link->public.cur_link_settings, 0,
++ * sizeof(link->public.cur_link_settings));
++ */
++
++ link->link_enc->funcs->enable_dp_output(
++ link->link_enc,
++ link_setting,
++ pipes[i].clock_source->id);
++
++ dp_receiver_power_ctrl(link, true);
++
++ dc_link_dp_perform_link_training(
++ &link->public,
++ link_setting,
++ skip_video_pattern);
++
++ link->dc->hwss.unblank_stream(&pipes[i],
++ link_setting);
++ }
++ }
++}
+diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h
+index 599f8b0..83d78c2 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc.h
++++ b/drivers/gpu/drm/amd/display/dc/dc.h
+@@ -117,7 +117,8 @@ struct dc_link_funcs {
+ struct dc_link_settings *link_setting,
+ bool skip_video_pattern);
+ void (*set_preferred_link_settings)(struct dc *dc,
+- struct dc_link_settings *link_setting);
++ struct dc_link_settings *link_setting,
++ const struct dc_link *link);
+ void (*enable_hpd)(const struct dc_link *link);
+ void (*disable_hpd)(const struct dc_link *link);
+ void (*set_test_pattern)(
+diff --git a/drivers/gpu/drm/amd/display/dc/inc/link_hwss.h b/drivers/gpu/drm/amd/display/dc/inc/link_hwss.h
+index 662fa30..30831c5 100644
+--- a/drivers/gpu/drm/amd/display/dc/inc/link_hwss.h
++++ b/drivers/gpu/drm/amd/display/dc/inc/link_hwss.h
+@@ -70,4 +70,8 @@ enum dp_panel_mode dp_get_panel_mode(struct core_link *link);
+
+ void dp_retrain_link(struct core_link *link);
+
++void dp_retrain_link_physi(struct core_link *link,
++ struct dc_link_settings *link_setting,
++ bool skip_video_pattern);
++
+ #endif /* __DC_LINK_HWSS_H__ */
+--
+2.7.4
+