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: Alvin Lee <Alvin.Lee2@amd.com> Acked-by: Qingqing Zhuo <qingqing.zhuo@amd.com> Signed-off-by: Aurabindo Pillai <aurabindo.pillai@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Родитель
3fb7efd686
Коммит
da5e149097
|
@ -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,
|
||||||
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(
|
||||||
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];
|
||||||
|
|
Загрузка…
Ссылка в новой задаче