From: Leo Li <sunpeng.li@xxxxxxx> In preparation for moving the dm_update dance to the crtc atomic helper, the lock_and_validation_needed flag need to be de-localized. Move it to dm_*_states, and update it in the corresponding dm_update* functions. Add a function to determine if DC global locking is needed by iterating over all the dm_*_states. Signed-off-by: Leo Li <sunpeng.li@xxxxxxx> --- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 64 +++++++++++++++++------ drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 6 +++ 2 files changed, 53 insertions(+), 17 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 3745472..a629544 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -3472,8 +3472,7 @@ static int dm_update_crtcs_state(struct amdgpu_display_manager *dm, struct drm_crtc *crtc, struct drm_crtc_state *old_crtc_state, struct drm_crtc_state *new_crtc_state, - bool enable, - bool *lock_and_validation_needed) + bool enable) { struct dm_atomic_state *dm_state = NULL; struct dm_crtc_state *dm_old_crtc_state, *dm_new_crtc_state; @@ -3592,7 +3591,7 @@ static int dm_update_crtcs_state(struct amdgpu_display_manager *dm, reset_freesync_config_for_crtc(dm_new_crtc_state); - *lock_and_validation_needed = true; + dm_new_crtc_state->lock_and_validation_needed = true; } else {/* Add stream for any updated/enabled CRTC */ /* @@ -3630,7 +3629,7 @@ static int dm_update_crtcs_state(struct amdgpu_display_manager *dm, goto fail; } - *lock_and_validation_needed = true; + dm_new_crtc_state->lock_and_validation_needed = true; } } @@ -3690,8 +3689,7 @@ static int dm_update_planes_state(struct dc *dc, struct drm_plane *plane, struct drm_plane_state *old_plane_state, struct drm_plane_state *new_plane_state, - bool enable, - bool *lock_and_validation_needed) + bool enable) { struct dm_atomic_state *dm_state = NULL; @@ -3750,7 +3748,7 @@ static int dm_update_planes_state(struct dc *dc, dc_plane_state_release(dm_old_plane_state->dc_state); dm_new_plane_state->dc_state = NULL; - *lock_and_validation_needed = true; + dm_new_plane_state->lock_and_validation_needed = true; } else { /* Add new planes */ struct dc_plane_state *dc_new_plane_state; @@ -3819,13 +3817,47 @@ static int dm_update_planes_state(struct dc *dc, */ dm_new_plane_state->dc_state->update_flags.bits.full_update = 1; - *lock_and_validation_needed = true; + dm_new_plane_state->lock_and_validation_needed = true; } return ret; } +static bool dm_lock_and_validation_needed(struct drm_atomic_state *state) +{ + struct drm_plane *plane; + struct drm_plane_state *new_plane_state; + struct dm_plane_state *dm_new_plane_state; + struct drm_crtc *crtc; + struct drm_crtc_state *new_crtc_state; + struct dm_crtc_state *dm_new_crtc_state; + struct drm_connector *connector; + struct drm_connector_state *new_con_state; + struct dm_connector_state *dm_new_con_state; + int i = 0; + + for_each_new_plane_in_state(state, plane, new_plane_state, i) { + dm_new_plane_state = to_dm_plane_state(new_plane_state); + if (dm_new_plane_state->lock_and_validation_needed) + return true; + } + + for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) { + dm_new_crtc_state = to_dm_crtc_state(new_crtc_state); + if (dm_new_crtc_state->lock_and_validation_needed) + return true; + } + + for_each_new_connector_in_state(state, connector, new_con_state, i) { + dm_new_con_state = to_dm_connector_state(new_con_state); + if (dm_new_con_state->lock_and_validation_needed) + return true; + } + + return false; +} + static int dm_crtc_helper_atomic_check(struct drm_crtc *crtc, struct drm_crtc_state *state) { @@ -5921,8 +5953,7 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev, ret = dm_update_planes_state(dc, state, plane, old_plane_state, new_plane_state, - false, - &lock_and_validation_needed); + false); if (ret) goto fail; } @@ -5932,8 +5963,7 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev, ret = dm_update_crtcs_state(&adev->dm, state, crtc, old_crtc_state, new_crtc_state, - false, - &lock_and_validation_needed); + false); if (ret) goto fail; } @@ -5943,8 +5973,7 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev, ret = dm_update_crtcs_state(&adev->dm, state, crtc, old_crtc_state, new_crtc_state, - true, - &lock_and_validation_needed); + true); if (ret) goto fail; } @@ -5954,8 +5983,7 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev, ret = dm_update_planes_state(dc, state, plane, old_plane_state, new_plane_state, - true, - &lock_and_validation_needed); + true); if (ret) goto fail; } @@ -5985,13 +6013,15 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev, continue; overall_update_type = UPDATE_TYPE_FULL; - lock_and_validation_needed = true; + dm_new_con_state->lock_and_validation_needed = true; } ret = dm_determine_update_type_for_commit(dc, state, &update_type); if (ret) goto fail; + lock_and_validation_needed = dm_lock_and_validation_needed(state); + if (overall_update_type < update_type) overall_update_type = update_type; diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h index fbd161d..0754b3c 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h @@ -254,6 +254,8 @@ struct dc_plane_state; struct dm_plane_state { struct drm_plane_state base; struct dc_plane_state *dc_state; + + bool lock_and_validation_needed; }; struct dm_crtc_state { @@ -272,6 +274,8 @@ struct dm_crtc_state { struct dc_info_packet vrr_infopacket; int abm_level; + + bool lock_and_validation_needed; }; #define to_dm_crtc_state(x) container_of(x, struct dm_crtc_state, base) @@ -294,6 +298,8 @@ struct dm_connector_state { bool underscan_enable; bool freesync_capable; uint8_t abm_level; + + bool lock_and_validation_needed; }; #define to_dm_connector_state(x)\ -- 2.7.4 _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx