Blob Blame History Raw
From: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com>
Date: Wed, 7 Dec 2016 14:10:05 -0500
Subject: drm/amd/display: Fix refcount over dc_sink.
Git-commit: 922aa1e15e03ee2b32f50cd8a9d2c8376a19d22c
Patch-mainline: v4.15-rc1
References: FATE#326289 FATE#326079 FATE#326049 FATE#322398 FATE#326166

Retain a dc_sink pointer until a new physical pointer
arrives in case of new display connected.

Signed-off-by: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com>
Reviewed-by: Andrey Grodzovsky <Andrey.Grodzovsky@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/amdgpu_dm/amdgpu_dm.c |   12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -737,9 +737,17 @@ void amdgpu_dm_update_connector_after_de
 		mutex_lock(&dev->mode_config.mutex);
 
 		if (sink) {
-			if (aconnector->dc_sink)
+			if (aconnector->dc_sink) {
 				amdgpu_dm_remove_sink_from_freesync_module(
 								connector);
+				/* retain and release bellow are used for
+				 * bump up refcount for sink because the link don't point
+				 * to it anymore after disconnect so on next crtc to connector
+				 * reshuffle by UMD we will get into unwanted dc_sink release
+				 */
+				if (aconnector->dc_sink != aconnector->dc_em_sink)
+					dc_sink_release(aconnector->dc_sink);
+			}
 			aconnector->dc_sink = sink;
 			amdgpu_dm_add_sink_to_freesync_module(
 						connector, aconnector->edid);
@@ -747,6 +755,8 @@ void amdgpu_dm_update_connector_after_de
 			amdgpu_dm_remove_sink_from_freesync_module(connector);
 			if (!aconnector->dc_sink)
 				aconnector->dc_sink = aconnector->dc_em_sink;
+			else if (aconnector->dc_sink != aconnector->dc_em_sink)
+				dc_sink_retain(aconnector->dc_sink);
 		}
 
 		mutex_unlock(&dev->mode_config.mutex);