mirror of
https://github.com/torvalds/linux.git
synced 2026-05-25 15:41:52 +02:00
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:
parent
0a5c060b59
commit
3705217501
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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_ */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user