Commit 37052175 authored by Dillon Varone's avatar Dillon Varone Committed by Alex Deucher
Browse files

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: default avatarAurabindo Pillai <aurabindo.pillai@amd.com>
Signed-off-by: default avatarDillon Varone <Dillon.Varone@amd.com>
Signed-off-by: default avatarRay Wu <ray.wu@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 0a5c060b
Loading
Loading
Loading
Loading
+3 −5
Original line number Diff line number Diff line
@@ -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;
}
+14 −0
Original line number Diff line number Diff line
@@ -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));
}
+3 −0
Original line number Diff line number Diff line
@@ -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_ */