Commit da5e1490 authored by Aurabindo Pillai's avatar Aurabindo Pillai Committed by Alex Deucher

drm/amd/display: Fix hang when skipping modeset

[Why&How]

When skipping full modeset since the only state change was a front porch
change, the DC commit sequence requires extra checks to handle non
existant plane states being asked to be removed from context.
Reviewed-by: default avatarAlvin Lee <Alvin.Lee2@amd.com>
Acked-by: default avatarQingqing Zhuo <qingqing.zhuo@amd.com>
Signed-off-by: default avatarAurabindo Pillai <aurabindo.pillai@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 3fb7efd6
...@@ -7972,6 +7972,8 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, ...@@ -7972,6 +7972,8 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
continue; continue;
dc_plane = dm_new_plane_state->dc_state; dc_plane = dm_new_plane_state->dc_state;
if (!dc_plane)
continue;
bundle->surface_updates[planes_count].surface = dc_plane; bundle->surface_updates[planes_count].surface = dc_plane;
if (new_pcrtc_state->color_mgmt_changed) { if (new_pcrtc_state->color_mgmt_changed) {
...@@ -9620,8 +9622,9 @@ static int dm_update_plane_state(struct dc *dc, ...@@ -9620,8 +9622,9 @@ static int dm_update_plane_state(struct dc *dc,
return -EINVAL; return -EINVAL;
} }
if (dm_old_plane_state->dc_state)
dc_plane_state_release(dm_old_plane_state->dc_state);
dc_plane_state_release(dm_old_plane_state->dc_state);
dm_new_plane_state->dc_state = NULL; dm_new_plane_state->dc_state = NULL;
*lock_and_validation_needed = true; *lock_and_validation_needed = true;
......
...@@ -1707,6 +1707,9 @@ bool dc_remove_plane_from_context( ...@@ -1707,6 +1707,9 @@ bool dc_remove_plane_from_context(
struct dc_stream_status *stream_status = NULL; struct dc_stream_status *stream_status = NULL;
struct resource_pool *pool = dc->res_pool; struct resource_pool *pool = dc->res_pool;
if (!plane_state)
return true;
for (i = 0; i < context->stream_count; i++) for (i = 0; i < context->stream_count; i++)
if (context->streams[i] == stream) { if (context->streams[i] == stream) {
stream_status = &context->stream_status[i]; stream_status = &context->stream_status[i];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment