From 6f6a9132b79f55dd25cbcce208aaed806a20d7e5 Mon Sep 17 00:00:00 2001 From: Andrey Grodzovsky Date: Wed, 7 Dec 2016 14:10:05 -0500 Subject: [PATCH 0054/4131] drm/amd/display: Fix refcount over dc_sink. Retain a dc_sink pointer until a new physical pointer arrives in case of new display connected. Signed-off-by: Andrey Grodzovsky Reviewed-by: Andrey Grodzovsky Acked-by: Harry Wentland Signed-off-by: Alex Deucher --- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) 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 88c32c1..2f13465 100644 --- 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_detect( 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_detect( 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); -- 2.7.4