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 193a634f46e6e3f5aa34f94f2ca0a135f25ce573..4f1e31cd4cbe2ef749764fd4c6d0986f63f14e7c 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -4357,6 +4357,7 @@ static int dm_update_crtcs_state( int i; struct dm_crtc_state *old_acrtc_state, *new_acrtc_state; struct dm_atomic_state *dm_state = to_dm_atomic_state(state); + struct dc_stream_state *new_stream; int ret = 0; /*TODO Move this code into dm_crtc_atomic_check once we get rid of dc_validation_set */ @@ -4364,10 +4365,11 @@ static int dm_update_crtcs_state( for_each_crtc_in_state(state, crtc, crtc_state, i) { struct amdgpu_crtc *acrtc = NULL; struct amdgpu_connector *aconnector = NULL; - struct dc_stream_state *new_stream = NULL; struct drm_connector_state *conn_state = NULL; struct dm_connector_state *dm_conn_state = NULL; + new_stream = NULL; + old_acrtc_state = to_dm_crtc_state(crtc->state); new_acrtc_state = to_dm_crtc_state(crtc_state); acrtc = to_amdgpu_crtc(crtc); @@ -4415,7 +4417,7 @@ static int dm_update_crtcs_state( if (!drm_atomic_crtc_needs_modeset(crtc_state)) - continue; + goto next_crtc; DRM_DEBUG_KMS( "amdgpu_crtc id:%d crtc_state_flags: enable:%d, active:%d, " @@ -4433,7 +4435,7 @@ static int dm_update_crtcs_state( if (!enable) { if (!old_acrtc_state->stream) - continue; + goto next_crtc; DRM_DEBUG_KMS("Disabling DRM crtc: %d\n", crtc->base.id); @@ -4444,7 +4446,7 @@ static int dm_update_crtcs_state( dm_state->context, old_acrtc_state->stream)) { ret = -EINVAL; - break; + goto fail; } dc_stream_release(old_acrtc_state->stream); @@ -4455,7 +4457,7 @@ static int dm_update_crtcs_state( } else {/* Add stream for any updated/enabled CRTC */ if (modereset_required(crtc_state)) - continue; + goto next_crtc; if (modeset_required(crtc_state, new_stream, old_acrtc_state->stream)) { @@ -4473,19 +4475,25 @@ static int dm_update_crtcs_state( dm_state->context, new_acrtc_state->stream)) { ret = -EINVAL; - break; + goto fail; } *lock_and_validation_needed = true; } } +next_crtc: /* Release extra reference */ if (new_stream) dc_stream_release(new_stream); } return ret; + +fail: + if (new_stream) + dc_stream_release(new_stream); + return ret; } static int dm_update_planes_state(