drm/amd/display: Backup and restore plane configuration only on update

[WHY&HOW]
When backing up and restoring plane states for minimal transition
cases, only configuration should be backed up and restored. Information
only relevant to the object/allocation (like refcount) should be
excluded. Also move this interface to dc_plane.h.

Reviewed-by: Aurabindo Pillai <aurabindo.pillai@amd.com>
Signed-off-by: Dillon Varone <Dillon.Varone@amd.com>
Signed-off-by: Ray Wu <ray.wu@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Dillon Varone 2025-04-24 13:38:19 -04:00 committed by Alex Deucher
parent 0a5c060b59
commit 3705217501
3 changed files with 20 additions and 5 deletions

View File

@ -36,6 +36,7 @@
#include "resource.h"
#include "dc_state.h"
#include "dc_state_priv.h"
#include "dc_plane.h"
#include "dc_plane_priv.h"
#include "dc_stream_priv.h"
@ -3320,7 +3321,7 @@ static void backup_planes_and_stream_state(
return;
for (i = 0; i < status->plane_count; i++) {
scratch->plane_states[i] = *status->plane_states[i];
dc_plane_copy_config(&scratch->plane_states[i], status->plane_states[i]);
}
scratch->stream_state = *stream;
}
@ -3336,10 +3337,7 @@ static void restore_planes_and_stream_state(
return;
for (i = 0; i < status->plane_count; i++) {
/* refcount will always be valid, restore everything else */
struct kref refcount = status->plane_states[i]->refcount;
*status->plane_states[i] = scratch->plane_states[i];
status->plane_states[i]->refcount = refcount;
dc_plane_copy_config(status->plane_states[i], &scratch->plane_states[i]);
}
*stream = scratch->stream_state;
}

View File

@ -294,3 +294,17 @@ void dc_plane_force_dcc_and_tiling_disable(struct dc_plane_state *plane_state,
dc->hwss.clear_surface_dcc_and_tiling(pipe_ctx, plane_state, clear_tiling);
}
}
void dc_plane_copy_config(struct dc_plane_state *dst, const struct dc_plane_state *src)
{
struct kref temp_refcount;
/* backup persistent info */
memcpy(&temp_refcount, &dst->refcount, sizeof(struct kref));
/* copy all configuration information */
memcpy(dst, src, sizeof(struct dc_plane_state));
/* restore persistent info */
memcpy(&dst->refcount, &temp_refcount, sizeof(struct kref));
}

View File

@ -37,4 +37,7 @@ void dc_plane_state_release(struct dc_plane_state *plane_state);
void dc_plane_force_dcc_and_tiling_disable(struct dc_plane_state *plane_state,
bool clear_tiling);
void dc_plane_copy_config(struct dc_plane_state *dst, const struct dc_plane_state *src);
#endif /* _DC_PLANE_H_ */