aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0533-drm-amd-dal-Don-t-retrain-the-link-when-enabling-2nd.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0533-drm-amd-dal-Don-t-retrain-the-link-when-enabling-2nd.patch')
-rw-r--r--common/recipes-kernel/linux/files/0533-drm-amd-dal-Don-t-retrain-the-link-when-enabling-2nd.patch121
1 files changed, 121 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0533-drm-amd-dal-Don-t-retrain-the-link-when-enabling-2nd.patch b/common/recipes-kernel/linux/files/0533-drm-amd-dal-Don-t-retrain-the-link-when-enabling-2nd.patch
new file mode 100644
index 00000000..9bc612df
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0533-drm-amd-dal-Don-t-retrain-the-link-when-enabling-2nd.patch
@@ -0,0 +1,121 @@
+From 6d4d095d35d911aaa0387649958a8d1feb3ce2c8 Mon Sep 17 00:00:00 2001
+From: Harry Wentland <harry.wentland@amd.com>
+Date: Fri, 27 Nov 2015 00:04:11 -0500
+Subject: [PATCH 0533/1110] drm/amd/dal: Don't retrain the link when enabling
+ 2nd stream
+
+For MST we don't want to retrain the link when enabling
+the 2nd stream. This avoids that but also introduces a hole
+in the logic in that we don't disable the link after the
+last stream is cleaned up. This logic needs to be cleaned up
+further.
+
+Signed-off-by: Harry Wentland <harry.wentland@amd.com>
+Acked-by: Harry Wentland <harry.wentland@amd.com>
+---
+ drivers/gpu/drm/amd/dal/dc/core/dc_link.c | 14 +++++++++++---
+ drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c | 18 +++++++++++++-----
+ drivers/gpu/drm/amd/dal/dc/inc/core_types.h | 3 ++-
+ drivers/gpu/drm/amd/dal/dc/inc/link_hwss.h | 2 +-
+ 4 files changed, 27 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
+index 0e97180..3484db5 100644
+--- a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
++++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
+@@ -919,10 +919,18 @@ static enum dc_status enable_link_dp(struct core_stream *stream)
+ static enum dc_status enable_link_dp_mst(struct core_stream *stream)
+ {
+ struct core_link *link = stream->sink->link;
++ bool already_enabled = false;
++ int i;
++
++
++ for (i = 0; i < link->enabled_stream_count; i++) {
++ if (link->enabled_streams[i] == stream)
++ already_enabled = true;
++ }
+
+ /* TODO MST link shared by stream. counter? */
+- if (link->stream_count < 4)
+- link->stream_count++;
++ if (!already_enabled)
++ link->enabled_streams[link->enabled_stream_count++] = stream;
+
+ /* sink signal type after MST branch is MST. Multiple MST sinks
+ * share one link. Link DP PHY is enable or training only once.
+@@ -1045,7 +1053,7 @@ enum dc_status core_link_disable(struct core_stream *stream)
+ stream->sink->link, stream->signal);
+ else {
+ dp_disable_link_phy_mst(
+- stream->sink->link, stream->signal);
++ stream->sink->link, stream);
+ }
+ }
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c b/drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c
+index 3d6e2ea..551a98f 100644
+--- a/drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c
++++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c
+@@ -83,18 +83,26 @@ void dp_disable_link_phy(struct core_link *link, enum signal_type signal)
+ sizeof(link->cur_link_settings));
+ }
+
+-void dp_disable_link_phy_mst(struct core_link *link, enum signal_type signal)
++void dp_disable_link_phy_mst(struct core_link *link, struct core_stream *stream)
+ {
++ int i, j;
++
++ for (i = 0; i < link->enabled_stream_count; i++) {
++ if (link->enabled_streams[i] == stream) {
++ link->enabled_stream_count--;
++ for (j = i; i < link->enabled_stream_count; j++)
++ link->enabled_streams[j] = link->enabled_streams[j+1];
++ }
++ }
+ /* MST disable link only when no stream use the link */
+- if (link->stream_count > 0)
+- link->stream_count--;
+- if (link->stream_count > 0)
++ if (link->enabled_stream_count > 0) {
+ return;
++ }
+
+ if (!link->dp_wa.bits.KEEP_RECEIVER_POWERED)
+ dp_receiver_power_ctrl(link, false);
+
+- link->dc->hwss.encoder_disable_output(link->link_enc, signal);
++ link->dc->hwss.encoder_disable_output(link->link_enc, stream->signal);
+
+ /* Clear current link setting.*/
+ dc_service_memset(&link->cur_link_settings, 0,
+diff --git a/drivers/gpu/drm/amd/dal/dc/inc/core_types.h b/drivers/gpu/drm/amd/dal/dc/inc/core_types.h
+index 0b06314..f18034c 100644
+--- a/drivers/gpu/drm/amd/dal/dc/inc/core_types.h
++++ b/drivers/gpu/drm/amd/dal/dc/inc/core_types.h
+@@ -227,7 +227,8 @@ struct core_link {
+ union dp_wa dp_wa;
+
+ /* MST record stream using this link */
+- uint8_t stream_count;
++ const struct core_stream *enabled_streams[MAX_SINKS_PER_LINK];
++ uint8_t enabled_stream_count;
+ };
+
+ #define DC_LINK_TO_LINK(dc_link) container_of(dc_link, struct core_link, public)
+diff --git a/drivers/gpu/drm/amd/dal/dc/inc/link_hwss.h b/drivers/gpu/drm/amd/dal/dc/inc/link_hwss.h
+index a008544..c86c942 100644
+--- a/drivers/gpu/drm/amd/dal/dc/inc/link_hwss.h
++++ b/drivers/gpu/drm/amd/dal/dc/inc/link_hwss.h
+@@ -50,7 +50,7 @@ void dp_receiver_power_ctrl(struct core_link *link, bool on);
+
+ void dp_disable_link_phy(struct core_link *link, enum signal_type signal);
+
+-void dp_disable_link_phy_mst(struct core_link *link, enum signal_type signal);
++void dp_disable_link_phy_mst(struct core_link *link, struct core_stream *stream);
+
+ bool dp_set_hw_training_pattern(
+ struct core_link *link,
+--
+2.7.4
+