forked from Minki/linux
drm/amd/display: Fix update type mismatches in atomic check
[Why] Whenever a stream or plane is added or removed from the context the pointer will change from old to new. We set lock and validation needed in these cases. But not all of these cases match update_type from dm_determine_update_type_for_commit - an example being overlay plane updates. There are warnings for a few of these cases that should be fixed. [How] We can closer align to DC (and lock_and_validation_needed) by comparing stream and plane pointers. Since the old stream/old plane state is never freed until sometime after the commit tail work finishes we are guaranteed to never get back the same block of memory when we remove and create a stream or plane state in the same commit. Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> Reviewed-by: Leo Li <sunpeng.li@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
3e4ba0cdbb
commit
6836d23916
@ -5791,15 +5791,14 @@ dm_determine_update_type_for_commit(struct dc *dc,
|
||||
old_dm_crtc_state = to_dm_crtc_state(old_crtc_state);
|
||||
num_plane = 0;
|
||||
|
||||
if (!new_dm_crtc_state->stream) {
|
||||
if (!new_dm_crtc_state->stream && old_dm_crtc_state->stream) {
|
||||
update_type = UPDATE_TYPE_FULL;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
continue;
|
||||
if (new_dm_crtc_state->stream != old_dm_crtc_state->stream) {
|
||||
update_type = UPDATE_TYPE_FULL;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!new_dm_crtc_state->stream)
|
||||
continue;
|
||||
|
||||
for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, j) {
|
||||
new_plane_crtc = new_plane_state->crtc;
|
||||
old_plane_crtc = old_plane_state->crtc;
|
||||
@ -5809,6 +5808,11 @@ dm_determine_update_type_for_commit(struct dc *dc,
|
||||
if (plane->type == DRM_PLANE_TYPE_CURSOR)
|
||||
continue;
|
||||
|
||||
if (new_dm_plane_state->dc_state != old_dm_plane_state->dc_state) {
|
||||
update_type = UPDATE_TYPE_FULL;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!state->allow_modeset)
|
||||
continue;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user