amd-gfx.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] Fix issues when unplung monitor under mst scenario
@ 2022-05-10  9:56 Wayne Lin
  2022-05-10  9:56 ` [PATCH 1/3] Revert "drm/amd/display: Add flag to detect dpms force off during HPD" Wayne Lin
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Wayne Lin @ 2022-05-10  9:56 UTC (permalink / raw)
  To: amd-gfx
  Cc: Rodrigo.Siqueira, jerry.zuo, Aurabindo.Pillai, Wayne Lin, Harry.Wentland

This patch set is trying to resolve issues observed when unplug monitors
under mst scenario. Revert few commits which cause side effects and seems
no longer needed. And propose a patch to address the issue discussed
within the thread:
https://www.mail-archive.com/dri-devel@lists.freedesktop.org/msg396300.html

---

Wayne Lin (3):
  Revert "drm/amd/display: Add flag to detect dpms force off during HPD"
  Revert "drm/amd/display: turn DPMS off on connector unplug"
  drm/amd/display: Release remote dc_sink under mst scenario

 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 49 +++----------------
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  2 -
 .../amd/display/amdgpu_dm/amdgpu_dm_hdcp.c    | 16 ++----
 .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 18 +------
 .../display/amdgpu_dm/amdgpu_dm_mst_types.c   | 39 +++++++++++++--
 drivers/gpu/drm/amd/display/dc/core/dc.c      | 13 -----
 drivers/gpu/drm/amd/display/dc/dc_stream.h    |  1 -
 7 files changed, 46 insertions(+), 92 deletions(-)

-- 
2.36.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/3] Revert "drm/amd/display: Add flag to detect dpms force off during HPD"
  2022-05-10  9:56 [PATCH 0/3] Fix issues when unplung monitor under mst scenario Wayne Lin
@ 2022-05-10  9:56 ` Wayne Lin
  2022-05-10  9:57 ` [PATCH 2/3] Revert "drm/amd/display: turn DPMS off on connector unplug" Wayne Lin
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Wayne Lin @ 2022-05-10  9:56 UTC (permalink / raw)
  To: amd-gfx
  Cc: Rodrigo.Siqueira, jerry.zuo, Aurabindo.Pillai, Wayne Lin, Harry.Wentland

This reverts commit 035f54969bb2c1a5ced52f43e4ef393e0c0f6bfa.

[Why & How]
The reverted commit was trying to fix side effect brought by commit:
"3c4d55c9b9be drm/amd/display: turn DPMS off on connector unplug"

However,
* This reverted commit will have mst case never call dm_set_dpms_off()
  which conflicts the idea of original commit:
  commit 3c4d55c9b9be ("drm/amd/display: turn DPMS off on connector
  unplug") That's due to dm_crtc_state is always null since the input
  parameter aconnector is the root device (source) of mst topology.
  It's not an end stream sink within the mst topology.
* Setting dpms off should be triggered by usermode. Besdies, it seems
  usermode does release relevant resource for mst & non-mst case
  when unplug connecotr now. Which means we no longer need both
  commits now:
  - commit 3c4d55c9b9be ("drm/amd/display: turn DPMS off on connector
    unplug")
  - commit 035f54969bb2 ("drm/amd/display: Add flag to detect dpms
    force off during HPD")

Signed-off-by: Wayne Lin <Wayne.Lin@amd.com>
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 19 ++++++-------------
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  2 --
 .../amd/display/amdgpu_dm/amdgpu_dm_hdcp.c    | 16 ++++------------
 3 files changed, 10 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 00ebda0bea44..01a36c550778 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -2575,7 +2575,7 @@ static void dm_gpureset_commit_state(struct dc_state *dc_state,
 	return;
 }
 
-static void dm_set_dpms_off(struct dc_link *link, struct dm_crtc_state *acrtc_state)
+static void dm_set_dpms_off(struct dc_link *link)
 {
 	struct dc_stream_state *stream_state;
 	struct amdgpu_dm_connector *aconnector = link->priv;
@@ -2596,7 +2596,6 @@ static void dm_set_dpms_off(struct dc_link *link, struct dm_crtc_state *acrtc_st
 	}
 
 	stream_update.stream = stream_state;
-	acrtc_state->force_dpms_off = true;
 	dc_commit_updates_for_stream(stream_state->ctx->dc, NULL, 0,
 				     stream_state, &stream_update,
 				     stream_state->ctx->dc->current_state);
@@ -3053,16 +3052,13 @@ static void handle_hpd_irq_helper(struct amdgpu_dm_connector *aconnector)
 	struct drm_device *dev = connector->dev;
 	enum dc_connection_type new_connection_type = dc_connection_none;
 	struct amdgpu_device *adev = drm_to_adev(dev);
+#ifdef CONFIG_DRM_AMD_DC_HDCP
 	struct dm_connector_state *dm_con_state = to_dm_connector_state(connector->state);
-	struct dm_crtc_state *dm_crtc_state = NULL;
+#endif
 
 	if (adev->dm.disable_hpd_irq)
 		return;
 
-	if (dm_con_state->base.state && dm_con_state->base.crtc)
-		dm_crtc_state = to_dm_crtc_state(drm_atomic_get_crtc_state(
-					dm_con_state->base.state,
-					dm_con_state->base.crtc));
 	/*
 	 * In case of failure or MST no need to update connector status or notify the OS
 	 * since (for MST case) MST does this in its own context.
@@ -3093,9 +3089,8 @@ static void handle_hpd_irq_helper(struct amdgpu_dm_connector *aconnector)
 
 	} else if (dc_link_detect(aconnector->dc_link, DETECT_REASON_HPD)) {
 		if (new_connection_type == dc_connection_none &&
-		    aconnector->dc_link->type == dc_connection_none &&
-		    dm_crtc_state)
-			dm_set_dpms_off(aconnector->dc_link, dm_crtc_state);
+		    aconnector->dc_link->type == dc_connection_none)
+			dm_set_dpms_off(aconnector->dc_link);
 
 		amdgpu_dm_update_connector_after_detect(aconnector);
 
@@ -6609,7 +6604,6 @@ dm_crtc_duplicate_state(struct drm_crtc *crtc)
 	state->freesync_config = cur->freesync_config;
 	state->cm_has_degamma = cur->cm_has_degamma;
 	state->cm_is_degamma_srgb = cur->cm_is_degamma_srgb;
-	state->force_dpms_off = cur->force_dpms_off;
 	/* TODO Duplicate dc_stream after objects are stream object is flattened */
 
 	return &state->base;
@@ -9340,8 +9334,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
 		 * and rely on sending it from software.
 		 */
 		if (acrtc_attach->base.state->event &&
-		    acrtc_state->active_planes > 0 &&
-		    !acrtc_state->force_dpms_off) {
+		    acrtc_state->active_planes > 0) {
 			drm_crtc_vblank_get(pcrtc);
 
 			spin_lock_irqsave(&pcrtc->dev->event_lock, flags);
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
index 321279bc877b..38b0dbcb8aab 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -645,8 +645,6 @@ struct dm_crtc_state {
 
 	bool dsc_force_changed;
 	bool vrr_supported;
-
-	bool force_dpms_off;
 	struct mod_freesync_config freesync_config;
 	struct dc_info_packet vrr_infopacket;
 
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c
index bf0d50277f8f..d1af5d580e4e 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c
@@ -448,8 +448,6 @@ static void update_config(void *handle, struct cp_psp_stream_config *config)
 	struct mod_hdcp_display *display = &hdcp_work[link_index].display;
 	struct mod_hdcp_link *link = &hdcp_work[link_index].link;
 	struct drm_connector_state *conn_state;
-	struct dc_sink *sink = NULL;
-	bool link_is_hdcp14 = false;
 
 	if (config->dpms_off) {
 		hdcp_remove_display(hdcp_work, link_index, aconnector);
@@ -462,13 +460,8 @@ static void update_config(void *handle, struct cp_psp_stream_config *config)
 	display->index = aconnector->base.index;
 	display->state = MOD_HDCP_DISPLAY_ACTIVE;
 
-	if (aconnector->dc_sink)
-		sink = aconnector->dc_sink;
-	else if (aconnector->dc_em_sink)
-		sink = aconnector->dc_em_sink;
-
-	if (sink != NULL)
-		link->mode = mod_hdcp_signal_type_to_operation_mode(sink->sink_signal);
+	if (aconnector->dc_sink != NULL)
+		link->mode = mod_hdcp_signal_type_to_operation_mode(aconnector->dc_sink->sink_signal);
 
 	display->controller = CONTROLLER_ID_D0 + config->otg_inst;
 	display->dig_fe = config->dig_fe;
@@ -477,9 +470,8 @@ static void update_config(void *handle, struct cp_psp_stream_config *config)
 	display->stream_enc_idx = config->stream_enc_idx;
 	link->link_enc_idx = config->link_enc_idx;
 	link->phy_idx = config->phy_idx;
-	if (sink)
-		link_is_hdcp14 = dc_link_is_hdcp14(aconnector->dc_link, sink->sink_signal);
-	link->hdcp_supported_informational = link_is_hdcp14;
+	link->hdcp_supported_informational = dc_link_is_hdcp14(aconnector->dc_link,
+			aconnector->dc_sink->sink_signal) ? 1 : 0;
 	link->dp.rev = aconnector->dc_link->dpcd_caps.dpcd_rev.raw;
 	link->dp.assr_enabled = config->assr_enabled;
 	link->dp.mst_enabled = config->mst_enabled;
-- 
2.36.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/3] Revert "drm/amd/display: turn DPMS off on connector unplug"
  2022-05-10  9:56 [PATCH 0/3] Fix issues when unplung monitor under mst scenario Wayne Lin
  2022-05-10  9:56 ` [PATCH 1/3] Revert "drm/amd/display: Add flag to detect dpms force off during HPD" Wayne Lin
@ 2022-05-10  9:57 ` Wayne Lin
  2022-05-10  9:57 ` [PATCH 3/3] drm/amd/display: Release remote dc_sink under mst scenario Wayne Lin
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Wayne Lin @ 2022-05-10  9:57 UTC (permalink / raw)
  To: amd-gfx
  Cc: Rodrigo.Siqueira, jerry.zuo, Aurabindo.Pillai, Wayne Lin, Harry.Wentland

This reverts commit 3c4d55c9b9becedd8d31a7c96783a364533713ab.

[Why and How]
Revert the commit because:
- It's incomplete of the function dm_set_dpms_off() for mst case.
  For stream sinks whithin the same mst topology, they share the
  same dc_link. dm_set_dpms_off() tries to update one mst stream
  only which is incomplete.
- Setting dpms off should be triggered by usermode. Besdies, it seems
  usermode does release relevant resource for mst & non-mst case
  when unplug connecotr now.

Signed-off-by: Wayne Lin <Wayne.Lin@amd.com>
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 31 -------------------
 drivers/gpu/drm/amd/display/dc/core/dc.c      | 13 --------
 drivers/gpu/drm/amd/display/dc/dc_stream.h    |  1 -
 3 files changed, 45 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 01a36c550778..d81b9ef11dba 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -2575,33 +2575,6 @@ static void dm_gpureset_commit_state(struct dc_state *dc_state,
 	return;
 }
 
-static void dm_set_dpms_off(struct dc_link *link)
-{
-	struct dc_stream_state *stream_state;
-	struct amdgpu_dm_connector *aconnector = link->priv;
-	struct amdgpu_device *adev = drm_to_adev(aconnector->base.dev);
-	struct dc_stream_update stream_update;
-	bool dpms_off = true;
-
-	memset(&stream_update, 0, sizeof(stream_update));
-	stream_update.dpms_off = &dpms_off;
-
-	mutex_lock(&adev->dm.dc_lock);
-	stream_state = dc_stream_find_from_link(link);
-
-	if (stream_state == NULL) {
-		DRM_DEBUG_DRIVER("Error finding stream state associated with link!\n");
-		mutex_unlock(&adev->dm.dc_lock);
-		return;
-	}
-
-	stream_update.stream = stream_state;
-	dc_commit_updates_for_stream(stream_state->ctx->dc, NULL, 0,
-				     stream_state, &stream_update,
-				     stream_state->ctx->dc->current_state);
-	mutex_unlock(&adev->dm.dc_lock);
-}
-
 static int dm_resume(void *handle)
 {
 	struct amdgpu_device *adev = handle;
@@ -3088,10 +3061,6 @@ static void handle_hpd_irq_helper(struct amdgpu_dm_connector *aconnector)
 			drm_kms_helper_connector_hotplug_event(connector);
 
 	} else if (dc_link_detect(aconnector->dc_link, DETECT_REASON_HPD)) {
-		if (new_connection_type == dc_connection_none &&
-		    aconnector->dc_link->type == dc_connection_none)
-			dm_set_dpms_off(aconnector->dc_link);
-
 		amdgpu_dm_update_connector_after_detect(aconnector);
 
 		drm_modeset_lock_all(dev);
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
index c2fcd67bcc4d..cc2910d251d2 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -3260,19 +3260,6 @@ struct dc_stream_state *dc_get_stream_at_index(struct dc *dc, uint8_t i)
 	return NULL;
 }
 
-struct dc_stream_state *dc_stream_find_from_link(const struct dc_link *link)
-{
-	uint8_t i;
-	struct dc_context *ctx = link->ctx;
-
-	for (i = 0; i < ctx->dc->current_state->stream_count; i++) {
-		if (ctx->dc->current_state->streams[i]->link == link)
-			return ctx->dc->current_state->streams[i];
-	}
-
-	return NULL;
-}
-
 enum dc_irq_source dc_interrupt_to_irq_source(
 		struct dc *dc,
 		uint32_t src_id,
diff --git a/drivers/gpu/drm/amd/display/dc/dc_stream.h b/drivers/gpu/drm/amd/display/dc/dc_stream.h
index 58941f4defb3..fecdbc75b47b 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_stream.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_stream.h
@@ -323,7 +323,6 @@ void dc_stream_log(const struct dc *dc, const struct dc_stream_state *stream);
 
 uint8_t dc_get_current_stream_count(struct dc *dc);
 struct dc_stream_state *dc_get_stream_at_index(struct dc *dc, uint8_t i);
-struct dc_stream_state *dc_stream_find_from_link(const struct dc_link *link);
 
 /*
  * Return the current frame counter.
-- 
2.36.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/3] drm/amd/display: Release remote dc_sink under mst scenario
  2022-05-10  9:56 [PATCH 0/3] Fix issues when unplung monitor under mst scenario Wayne Lin
  2022-05-10  9:56 ` [PATCH 1/3] Revert "drm/amd/display: Add flag to detect dpms force off during HPD" Wayne Lin
  2022-05-10  9:57 ` [PATCH 2/3] Revert "drm/amd/display: turn DPMS off on connector unplug" Wayne Lin
@ 2022-05-10  9:57 ` Wayne Lin
  2022-05-17 21:49 ` [PATCH 0/3] Fix issues when unplung monitor " Lyude Paul
  2022-05-31 19:38 ` Lyude Paul
  4 siblings, 0 replies; 7+ messages in thread
From: Wayne Lin @ 2022-05-10  9:57 UTC (permalink / raw)
  To: amd-gfx
  Cc: Rodrigo.Siqueira, jerry.zuo, Aurabindo.Pillai, Wayne Lin, Harry.Wentland

[Why]
Observe that we have several problems while releasing remote dc_sink
under mst cases.

- When unplug mst branch device from the source, we now try to free all
  remote dc_sinks in dm_helpers_dp_mst_stop_top_mgr(). However, there are
  bugs while we're releasing dc_sinks here. First of all,
  link->remote_sinks[] array get shuffled within
  dc_link_remove_remote_sink(). As the result, increasing the array index
  within the releasing loop is wrong. Secondly, it tries to call
  dc_sink_release() to release the dc_sink of the same aconnector every
  time in the loop. Which can't release dc_sink of all aconnector in the
  mst topology.
- There is no code path for us to release remote dc_sink for disconnected
  sst monitor which unplug event is notified by CSN sideband message. Which
  means we'll use stale dc_sink data to represent later on connected
  monitor. Also, has chance to break the maximum remote dc_sink number
  constraint.

[How]
Distinguish unplug event of mst scenario into 2 cases.

* Unplug sst/legacy stream sink off the mst topology
- Release related remote dc_sink in detec_ctx().

* Unplug mst branch device off the mst topology
- Release related remote dc_sink in early_unregister()

Signed-off-by: Wayne Lin <Wayne.Lin@amd.com>
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  5 ++-
 .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 18 +--------
 .../display/amdgpu_dm/amdgpu_dm_mst_types.c   | 39 +++++++++++++++++--
 3 files changed, 39 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index d81b9ef11dba..f53f8962e6da 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -2191,7 +2191,8 @@ static void s3_handle_mst(struct drm_device *dev, bool suspend)
 		} else {
 			ret = drm_dp_mst_topology_mgr_resume(mgr, true);
 			if (ret < 0) {
-				drm_dp_mst_topology_mgr_set_mst(mgr, false);
+				dm_helpers_dp_mst_stop_top_mgr(aconnector->dc_link->ctx,
+					aconnector->dc_link);
 				need_hotplug = true;
 			}
 		}
@@ -10359,7 +10360,7 @@ static int dm_update_crtc_state(struct amdgpu_display_manager *dm,
 		 * added MST connectors not found in existing crtc_state in the chained mode
 		 * TODO: need to dig out the root cause of that
 		 */
-		if (!aconnector || (!aconnector->dc_sink && aconnector->mst_port))
+		if (!aconnector)
 			goto skip_modeset;
 
 		if (modereset_required(new_crtc_state))
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
index 28cf24f6ab32..e4fb19a68ccd 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
@@ -451,7 +451,6 @@ bool dm_helpers_dp_mst_stop_top_mgr(
 		struct dc_link *link)
 {
 	struct amdgpu_dm_connector *aconnector = link->priv;
-	uint8_t i;
 
 	if (!aconnector) {
 		DRM_ERROR("Failed to find connector for link!");
@@ -463,22 +462,7 @@ bool dm_helpers_dp_mst_stop_top_mgr(
 
 	if (aconnector->mst_mgr.mst_state == true) {
 		drm_dp_mst_topology_mgr_set_mst(&aconnector->mst_mgr, false);
-
-		for (i = 0; i < MAX_SINKS_PER_LINK; i++) {
-			if (link->remote_sinks[i] == NULL)
-				continue;
-
-			if (link->remote_sinks[i]->sink_signal ==
-			    SIGNAL_TYPE_DISPLAY_PORT_MST) {
-				dc_link_remove_remote_sink(link, link->remote_sinks[i]);
-
-				if (aconnector->dc_sink) {
-					dc_sink_release(aconnector->dc_sink);
-					aconnector->dc_sink = NULL;
-					aconnector->dc_link->cur_link_settings.lane_count = 0;
-				}
-			}
-		}
+		link->cur_link_settings.lane_count = 0;
 	}
 
 	return false;
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
index 0542034530b1..e0531a569a14 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
@@ -142,11 +142,28 @@ amdgpu_dm_mst_connector_late_register(struct drm_connector *connector)
 static void
 amdgpu_dm_mst_connector_early_unregister(struct drm_connector *connector)
 {
-	struct amdgpu_dm_connector *amdgpu_dm_connector =
+	struct amdgpu_dm_connector *aconnector =
 		to_amdgpu_dm_connector(connector);
-	struct drm_dp_mst_port *port = amdgpu_dm_connector->port;
+	struct drm_dp_mst_port *port = aconnector->port;
+	struct amdgpu_dm_connector *root = aconnector->mst_port;
+	struct dc_link *dc_link = aconnector->dc_link;
+	struct dc_sink *dc_sink = aconnector->dc_sink;
 
 	drm_dp_mst_connector_early_unregister(connector, port);
+
+	/*
+	 * Release dc_sink for connector which its attached port is
+	 * no longer in the mst topology
+	 */
+	drm_modeset_lock(&root->mst_mgr.base.lock, NULL);
+	if (dc_sink) {
+		if (dc_link->sink_count)
+			dc_link_remove_remote_sink(dc_link, dc_sink);
+
+		dc_sink_release(dc_sink);
+		aconnector->dc_sink = NULL;
+	}
+	drm_modeset_unlock(&root->mst_mgr.base.lock);
 }
 
 static const struct drm_connector_funcs dm_dp_mst_connector_funcs = {
@@ -346,12 +363,26 @@ dm_dp_mst_detect(struct drm_connector *connector,
 {
 	struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
 	struct amdgpu_dm_connector *master = aconnector->mst_port;
+	int connection_status;
 
 	if (drm_connector_is_unregistered(connector))
 		return connector_status_disconnected;
 
-	return drm_dp_mst_detect_port(connector, ctx, &master->mst_mgr,
-				      aconnector->port);
+	connection_status = drm_dp_mst_detect_port(connector, ctx, &master->mst_mgr,
+							aconnector->port);
+
+	/*
+	 * Release dc_sink for connector which unplug event is notified by CSN msg
+	 */
+	if (connection_status == connector_status_disconnected && aconnector->dc_sink) {
+		if (aconnector->dc_link->sink_count)
+			dc_link_remove_remote_sink(aconnector->dc_link, aconnector->dc_sink);
+
+		dc_sink_release(aconnector->dc_sink);
+		aconnector->dc_sink = NULL;
+	}
+
+	return connection_status;
 }
 
 static int dm_dp_mst_atomic_check(struct drm_connector *connector,
-- 
2.36.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 0/3] Fix issues when unplung monitor under mst scenario
  2022-05-10  9:56 [PATCH 0/3] Fix issues when unplung monitor under mst scenario Wayne Lin
                   ` (2 preceding siblings ...)
  2022-05-10  9:57 ` [PATCH 3/3] drm/amd/display: Release remote dc_sink under mst scenario Wayne Lin
@ 2022-05-17 21:49 ` Lyude Paul
  2022-05-31 19:38 ` Lyude Paul
  4 siblings, 0 replies; 7+ messages in thread
From: Lyude Paul @ 2022-05-17 21:49 UTC (permalink / raw)
  To: Wayne Lin, amd-gfx
  Cc: Rodrigo.Siqueira, jerry.zuo, Aurabindo.Pillai, Harry.Wentland

I will try to take a look at this during this week btw

On Tue, 2022-05-10 at 17:56 +0800, Wayne Lin wrote:
> This patch set is trying to resolve issues observed when unplug monitors
> under mst scenario. Revert few commits which cause side effects and seems
> no longer needed. And propose a patch to address the issue discussed
> within the thread:
> https://www.mail-archive.com/dri-devel@lists.freedesktop.org/msg396300.html
> 
> ---
> 
> Wayne Lin (3):
>   Revert "drm/amd/display: Add flag to detect dpms force off during HPD"
>   Revert "drm/amd/display: turn DPMS off on connector unplug"
>   drm/amd/display: Release remote dc_sink under mst scenario
> 
>  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 49 +++----------------
>  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  2 -
>  .../amd/display/amdgpu_dm/amdgpu_dm_hdcp.c    | 16 ++----
>  .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 18 +------
>  .../display/amdgpu_dm/amdgpu_dm_mst_types.c   | 39 +++++++++++++--
>  drivers/gpu/drm/amd/display/dc/core/dc.c      | 13 -----
>  drivers/gpu/drm/amd/display/dc/dc_stream.h    |  1 -
>  7 files changed, 46 insertions(+), 92 deletions(-)
> 

-- 
Cheers,
 Lyude Paul (she/her)
 Software Engineer at Red Hat


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 0/3] Fix issues when unplung monitor under mst scenario
  2022-05-10  9:56 [PATCH 0/3] Fix issues when unplung monitor under mst scenario Wayne Lin
                   ` (3 preceding siblings ...)
  2022-05-17 21:49 ` [PATCH 0/3] Fix issues when unplung monitor " Lyude Paul
@ 2022-05-31 19:38 ` Lyude Paul
  2022-06-01  6:05   ` Lin, Wayne
  4 siblings, 1 reply; 7+ messages in thread
From: Lyude Paul @ 2022-05-31 19:38 UTC (permalink / raw)
  To: Wayne Lin, amd-gfx
  Cc: Rodrigo.Siqueira, jerry.zuo, Aurabindo.Pillai, Harry.Wentland

For the whole series:

Acked-by: Lyude Paul <lyude@redhat.com>

This looks a lot better for sure :)

On Tue, 2022-05-10 at 17:56 +0800, Wayne Lin wrote:
> This patch set is trying to resolve issues observed when unplug monitors
> under mst scenario. Revert few commits which cause side effects and seems
> no longer needed. And propose a patch to address the issue discussed
> within the thread:
> https://www.mail-archive.com/dri-devel@lists.freedesktop.org/msg396300.html
> 
> ---
> 
> Wayne Lin (3):
>   Revert "drm/amd/display: Add flag to detect dpms force off during HPD"
>   Revert "drm/amd/display: turn DPMS off on connector unplug"
>   drm/amd/display: Release remote dc_sink under mst scenario
> 
>  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 49 +++----------------
>  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  2 -
>  .../amd/display/amdgpu_dm/amdgpu_dm_hdcp.c    | 16 ++----
>  .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 18 +------
>  .../display/amdgpu_dm/amdgpu_dm_mst_types.c   | 39 +++++++++++++--
>  drivers/gpu/drm/amd/display/dc/core/dc.c      | 13 -----
>  drivers/gpu/drm/amd/display/dc/dc_stream.h    |  1 -
>  7 files changed, 46 insertions(+), 92 deletions(-)
> 

-- 
Cheers,
 Lyude Paul (she/her)
 Software Engineer at Red Hat


^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [PATCH 0/3] Fix issues when unplung monitor under mst scenario
  2022-05-31 19:38 ` Lyude Paul
@ 2022-06-01  6:05   ` Lin, Wayne
  0 siblings, 0 replies; 7+ messages in thread
From: Lin, Wayne @ 2022-06-01  6:05 UTC (permalink / raw)
  To: Lyude Paul, amd-gfx
  Cc: Siqueira, Rodrigo, Zuo, Jerry, Pillai, Aurabindo, Wentland, Harry

[AMD Official Use Only - General]

Thanks for your time, Lyude : )

Regards,
Wayne

> -----Original Message-----
> From: Lyude Paul <lyude@redhat.com>
> Sent: Wednesday, June 1, 2022 3:38 AM
> To: Lin, Wayne <Wayne.Lin@amd.com>; amd-gfx@lists.freedesktop.org
> Cc: Wentland, Harry <Harry.Wentland@amd.com>; Pillai, Aurabindo
> <Aurabindo.Pillai@amd.com>; Zuo, Jerry <Jerry.Zuo@amd.com>; Siqueira,
> Rodrigo <Rodrigo.Siqueira@amd.com>
> Subject: Re: [PATCH 0/3] Fix issues when unplung monitor under mst
> scenario
> 
> For the whole series:
> 
> Acked-by: Lyude Paul <lyude@redhat.com>
> 
> This looks a lot better for sure :)
> 
> On Tue, 2022-05-10 at 17:56 +0800, Wayne Lin wrote:
> > This patch set is trying to resolve issues observed when unplug
> > monitors under mst scenario. Revert few commits which cause side
> > effects and seems no longer needed. And propose a patch to address the
> > issue discussed within the thread:
> >
> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww
> w.
> > mail-archive.com%2Fdri-
> devel%40lists.freedesktop.org%2Fmsg396300.html&
> >
> amp;data=05%7C01%7Cwayne.lin%40amd.com%7Ce9f99928cc0a4d2fd1cc08d
> a433d1
> >
> ce2%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C63789622700307
> 6525%7C
> >
> Unknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJB
> TiI6Ik1h
> >
> aWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&amp;sdata=E75eUgMj3%2Fek
> MsLUjpzBCfU
> > Y45twQE5w44%2B2KyxzT6c%3D&amp;reserved=0
> >
> > ---
> >
> > Wayne Lin (3):
> >   Revert "drm/amd/display: Add flag to detect dpms force off during HPD"
> >   Revert "drm/amd/display: turn DPMS off on connector unplug"
> >   drm/amd/display: Release remote dc_sink under mst scenario
> >
> >  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 49
> > +++----------------
> >  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  2 -
> >  .../amd/display/amdgpu_dm/amdgpu_dm_hdcp.c    | 16 ++----
> >  .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 18 +------
> >  .../display/amdgpu_dm/amdgpu_dm_mst_types.c   | 39 +++++++++++++-
> -
> >  drivers/gpu/drm/amd/display/dc/core/dc.c      | 13 -----
> >  drivers/gpu/drm/amd/display/dc/dc_stream.h    |  1 -
> >  7 files changed, 46 insertions(+), 92 deletions(-)
> >
> 
> --
> Cheers,
>  Lyude Paul (she/her)
>  Software Engineer at Red Hat

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2022-06-01  6:05 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-10  9:56 [PATCH 0/3] Fix issues when unplung monitor under mst scenario Wayne Lin
2022-05-10  9:56 ` [PATCH 1/3] Revert "drm/amd/display: Add flag to detect dpms force off during HPD" Wayne Lin
2022-05-10  9:57 ` [PATCH 2/3] Revert "drm/amd/display: turn DPMS off on connector unplug" Wayne Lin
2022-05-10  9:57 ` [PATCH 3/3] drm/amd/display: Release remote dc_sink under mst scenario Wayne Lin
2022-05-17 21:49 ` [PATCH 0/3] Fix issues when unplung monitor " Lyude Paul
2022-05-31 19:38 ` Lyude Paul
2022-06-01  6:05   ` Lin, Wayne

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).