summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
diff options
context:
space:
mode:
authorAndrey Grodzovsky <Andrey.Grodzovsky@amd.com>2016-12-07 14:10:05 -0500
committerAlex Deucher <alexander.deucher@amd.com>2017-09-26 17:04:38 -0400
commit922aa1e15e03ee2b32f50cd8a9d2c8376a19d22c (patch)
tree3a6bda92474a208ec6e2839c6526e65f72225485 /drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
parentf4c07f88cc30e77d2431b5bcf95a05e0ee6f3482 (diff)
downloadlwn-922aa1e15e03ee2b32f50cd8a9d2c8376a19d22c.tar.gz
lwn-922aa1e15e03ee2b32f50cd8a9d2c8376a19d22c.zip
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 <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>
Diffstat (limited to 'drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c')
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c12
1 files changed, 11 insertions, 1 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 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);