diff options
author | Alvin Lee <alvin.lee2@amd.com> | 2024-02-23 15:06:39 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2024-03-20 13:37:38 -0400 |
commit | d62d5551dd615f9e488b13595d69b308cd019e16 (patch) | |
tree | 2dd0f2719893197b21aa0cebf689b94dd4feaf5d /drivers/gpu/drm/amd/display/dc/core/dc.c | |
parent | 2d5bb791e24f43b6b4231b7973009987bbcc9b06 (diff) |
drm/amd/display: Backup and restore only on full updates
[WHY & HOW]
Since the backup and restore for plane and stream states has
a significant amount of data to copy, we will change the backup
and restore sequence to only take place during full updates.
We will also move the scratch memory to struct dc instead of dc_state
to avoid needing to allocate large amounts of memory every time
we create a new DC state.
Reviewed-by: Wenjing Liu <wenjing.liu@amd.com>
Acked-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Alvin Lee <alvin.lee2@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/display/dc/core/dc.c')
-rw-r--r-- | drivers/gpu/drm/amd/display/dc/core/dc.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c index 48190719bf73..6a65aa623e8a 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c @@ -3162,9 +3162,10 @@ static bool update_planes_and_stream_state(struct dc *dc, } context = dc->current_state; - backup_planes_and_stream_state(&dc->current_state->scratch, stream); update_type = dc_check_update_surfaces_for_stream( dc, srf_updates, surface_count, stream_update, stream_status); + if (update_type == UPDATE_TYPE_FULL) + backup_planes_and_stream_state(&dc->scratch.current_state, stream); /* update current stream with the new updates */ copy_stream_update_to_stream(dc, context, stream, stream_update); @@ -3263,7 +3264,8 @@ static bool update_planes_and_stream_state(struct dc *dc, *new_context = context; *new_update_type = update_type; - backup_planes_and_stream_state(&context->scratch, stream); + if (update_type == UPDATE_TYPE_FULL) + backup_planes_and_stream_state(&dc->scratch.new_state, stream); return true; @@ -4316,7 +4318,7 @@ static bool commit_minimal_transition_based_on_current_context(struct dc *dc, * This restores back the original stream and plane states associated * with the current state. */ - restore_planes_and_stream_state(&dc->current_state->scratch, stream); + restore_planes_and_stream_state(&dc->scratch.current_state, stream); intermediate_context = create_minimal_transition_state(dc, dc->current_state, &policy); if (intermediate_context) { @@ -4343,7 +4345,7 @@ static bool commit_minimal_transition_based_on_current_context(struct dc *dc, * Restore stream and plane states back to the values associated with * new context. */ - restore_planes_and_stream_state(&new_context->scratch, stream); + restore_planes_and_stream_state(&dc->scratch.new_state, stream); return success; } |