From 6d4d095d35d911aaa0387649958a8d1feb3ce2c8 Mon Sep 17 00:00:00 2001 From: Harry Wentland 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 Acked-by: Harry Wentland --- 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