From: Andrey Grodzovsky Date: Wed, 7 Dec 2016 19:10:05 +0000 (-0500) Subject: drm/amd/display: Fix refcount over dc_sink. X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=922aa1e15e03ee2b32f50cd8a9d2c8376a19d22c;p=openwrt%2Fstaging%2Fblogic.git 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 --- 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 396dbd661183..e5ba23253814 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);