Blob Blame History Raw
From: Wenjing Liu <Wenjing.Liu@amd.com>
Date: Mon, 25 Sep 2017 14:53:14 -0400
Subject: drm/amd/display: disconnect on HPD low even if edid is the same
Git-commit: dcf298c3137ace22b92c584781e6092e4eb273fb
Patch-mainline: v4.15-rc1
References: FATE#326289 FATE#326079 FATE#326049 FATE#322398 FATE#326166

[Description]
There are many occasions we need to retrieve sink capability and
notify connectivity change to os even if edid is not changed
on a HPD toggle.
(HDMI2.0 display needs re-enable link on every hpd,
display changes other capability outside from edid
 need to be queried again and possibly reset the mode, etc.)

In these cases we cannot keep the same sink without letting DM know.

Signed-off-by: Wenjing Liu <Wenjing.Liu@amd.com>
Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
Acked-by: Harry Wentland <Harry.Wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Acked-by: Petr Tesarik <ptesarik@suse.com>
---
 drivers/gpu/drm/amd/display/dc/core/dc_link.c |   42 +++++---------------------
 1 file changed, 9 insertions(+), 33 deletions(-)

--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
@@ -566,6 +566,8 @@ bool dc_link_detect(struct dc_link *link
 			link->local_sink)
 		return true;
 
+	link_disconnect_sink(link);
+
 	if (new_connection_type != dc_connection_none) {
 		link->type = new_connection_type;
 
@@ -656,28 +658,15 @@ bool dc_link_detect(struct dc_link *link
 			return false;
 		}
 
-		if (link->local_sink) {
-			edid_status = dm_helpers_read_local_edid(
-				link->ctx,
-				link,
-				sink);
+		sink->dongle_max_pix_clk = sink_caps.max_hdmi_pixel_clock;
+		sink->converter_disable_audio = converter_disable_audio;
 
-			if (edid_status == EDID_OK) {
-				// Edid is not the same, to update the local sink with new sink.
-				sink->dongle_max_pix_clk = sink_caps.max_hdmi_pixel_clock;
-				sink->converter_disable_audio = converter_disable_audio;
-				link->local_sink = sink;
-			}
-		} else {
-			sink->dongle_max_pix_clk = sink_caps.max_hdmi_pixel_clock;
-			sink->converter_disable_audio = converter_disable_audio;
-			link->local_sink = sink;
+		link->local_sink = sink;
 
-			edid_status = dm_helpers_read_local_edid(
+		edid_status = dm_helpers_read_local_edid(
 				link->ctx,
 				link,
 				sink);
-		}
 
 		switch (edid_status) {
 		case EDID_BAD_CHECKSUM:
@@ -758,28 +747,15 @@ bool dc_link_detect(struct dc_link *link
 		if (link->type == dc_connection_mst_branch) {
 			LINK_INFO("link=%d, mst branch is now Disconnected\n",
 				link->link_index);
+
 			dm_helpers_dp_mst_stop_top_mgr(link->ctx, link);
 
 			link->mst_stream_alloc_table.stream_count = 0;
 			memset(link->mst_stream_alloc_table.stream_allocations, 0, sizeof(link->mst_stream_alloc_table.stream_allocations));
 		}
 
-		if (link->local_sink) {
-			sink = link->local_sink;
-			edid_status = dm_helpers_read_local_edid(
-						link->ctx,
-						link,
-						sink);
-			if (edid_status != EDID_OK && edid_status != EDID_THE_SAME) {
-				link_disconnect_sink(link);
-				link->type = dc_connection_none;
-				sink_caps.signal = SIGNAL_TYPE_NONE;
-			}
-		} else {
-			link_disconnect_sink(link);
-			link->type = dc_connection_none;
-			sink_caps.signal = SIGNAL_TYPE_NONE;
-		}
+		link->type = dc_connection_none;
+		sink_caps.signal = SIGNAL_TYPE_NONE;
 	}
 
 	LINK_INFO("link=%d, dc_sink_in=%p is now %s\n",