drm/amd/display: Backup and restore plane configuration only on update
authorDillon Varone <Dillon.Varone@amd.com>
Thu, 24 Apr 2025 17:38:19 +0000 (13:38 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 13 May 2025 13:25:32 +0000 (09:25 -0400)
[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>
drivers/gpu/drm/amd/display/dc/core/dc.c
drivers/gpu/drm/amd/display/dc/core/dc_surface.c
drivers/gpu/drm/amd/display/dc/dc_plane.h

index afd298e69d4e39ed8ebc1b61e6a2a3ca7b6e883b..528e6fd546c5638ccd2d05711283bd06e5904304 100644 (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;
 }
index e6fcc21bb9bce264ddb2f109c25dd521650c6b1f..e98500665af3a4739bf40653df227af92516a94d 100644 (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));
+}
index e9413685ed4f31eee1d653a1dc93580028b67e27..8fe385f52b18184946200c263a86fb94f74258d5 100644 (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_ */