summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/amd/display/dc/core
diff options
context:
space:
mode:
authorWenjing Liu <Wenjing.Liu@amd.com>2017-09-25 14:53:14 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-10-21 16:44:19 -0400
commitdcf298c3137ace22b92c584781e6092e4eb273fb (patch)
tree2a85878c5bb0ab4f5a10b4756c686d3c9a131d06 /drivers/gpu/drm/amd/display/dc/core
parent6512387a54357c5d3fbea8995d8879ea817a5ec6 (diff)
drm/amd/display: disconnect on HPD low even if edid is the same
[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>
Diffstat (limited to 'drivers/gpu/drm/amd/display/dc/core')
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_link.c42
1 files changed, 9 insertions, 33 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 feb10be0ce4c..e414e4770789 100644
--- 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, enum dc_detect_reason reason)
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, enum dc_detect_reason reason)
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, enum dc_detect_reason reason)
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",