From: Dillon Varone <[email protected]>

[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 <[email protected]>
Signed-off-by: Dillon Varone <[email protected]>
Signed-off-by: Ray Wu <[email protected]>
---
 drivers/gpu/drm/amd/display/dc/core/dc.c         |  8 +++-----
 drivers/gpu/drm/amd/display/dc/core/dc_surface.c | 14 ++++++++++++++
 drivers/gpu/drm/amd/display/dc/dc_plane.h        |  3 +++
 3 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index afd298e69d4e..528e6fd546c5 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -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;
 }
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_surface.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_surface.c
index e6fcc21bb9bc..e98500665af3 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_surface.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_surface.c
@@ -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));
+}
diff --git a/drivers/gpu/drm/amd/display/dc/dc_plane.h 
b/drivers/gpu/drm/amd/display/dc/dc_plane.h
index e9413685ed4f..8fe385f52b18 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_plane.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_plane.h
@@ -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_ */
-- 
2.43.0

Reply via email to