From: Joshua Aberback <[email protected]>

[Why]
The update v3 path got refactored into new functions, which happened just
before the previous implementation was submitted, which resulted in the
optimizations not executing. This commit re-implements the same logic in
the new codepath.

Reviewed-by: Aric Cyr <[email protected]>
Signed-off-by: Joshua Aberback <[email protected]>
Signed-off-by: Matthew Stewart <[email protected]>
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 49 ++++++++++++++++--------
 1 file changed, 33 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 57f6a4c8afff..aba5ad2a7a33 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -7246,6 +7246,14 @@ static bool 
update_planes_and_stream_prepare_v3_intermediate_seamless(
        );
 }
 
+static void transition_countdown_init(struct dc *dc)
+{
+       dc->check_config.transition_countdown_to_steady_state =
+                       dc->debug.num_fast_flips_to_steady_state_override ?
+                       dc->debug.num_fast_flips_to_steady_state_override :
+                       NUM_FAST_FLIPS_TO_STEADY_STATE;
+}
+
 static bool update_planes_and_stream_prepare_v3(
                struct dc_update_scratch_space *scratch
 )
@@ -7305,9 +7313,17 @@ static bool update_planes_and_stream_prepare_v3(
        );
        if (seamless) {
                scratch->flow = UPDATE_V3_FLOW_NEW_CONTEXT_SEAMLESS;
+               if (scratch->dc->check_config.deferred_transition_state)
+                       /* reset countdown as steady state not reached */
+                       transition_countdown_init(scratch->dc);
                return true;
        }
 
+       if (!scratch->dc->debug.disable_deferred_minimal_transitions) {
+               scratch->dc->check_config.deferred_transition_state = true;
+               transition_countdown_init(scratch->dc);
+       }
+
        scratch->intermediate_context = create_minimal_transition_state(
                scratch->dc,
                scratch->new_context,
@@ -7351,7 +7367,8 @@ static bool update_planes_and_stream_prepare_v3(
 static void update_planes_and_stream_execute_v3_commit(
                const struct dc_update_scratch_space *scratch,
                bool intermediate_update,
-               bool intermediate_context
+               bool intermediate_context,
+               bool use_stream_update
 )
 {
        commit_planes_for_stream(
@@ -7359,7 +7376,7 @@ static void update_planes_and_stream_execute_v3_commit(
                        intermediate_update ? scratch->intermediate_updates : 
scratch->surface_updates,
                        intermediate_update ? scratch->intermediate_count : 
scratch->surface_count,
                        scratch->stream,
-                       intermediate_context ? NULL : scratch->stream_update,
+                       use_stream_update ? scratch->stream_update : NULL,
                        intermediate_context ? UPDATE_TYPE_FULL : 
scratch->update_type,
                        // `dc->current_state` only used in `NO_NEW_CONTEXT`, 
where it is equal to `new_context`
                        intermediate_context ? scratch->intermediate_context : 
scratch->new_context
@@ -7385,15 +7402,16 @@ static void update_planes_and_stream_execute_v3(
 
        case UPDATE_V3_FLOW_NO_NEW_CONTEXT_CONTEXT_FULL:
        case UPDATE_V3_FLOW_NEW_CONTEXT_SEAMLESS:
-               update_planes_and_stream_execute_v3_commit(scratch, false, 
false);
+               update_planes_and_stream_execute_v3_commit(scratch, false, 
false, true);
                break;
 
        case UPDATE_V3_FLOW_NEW_CONTEXT_MINIMAL_NEW:
-               update_planes_and_stream_execute_v3_commit(scratch, false, 
true);
+               update_planes_and_stream_execute_v3_commit(scratch, false, true,
+                               
scratch->dc->check_config.deferred_transition_state);
                break;
 
        case UPDATE_V3_FLOW_NEW_CONTEXT_MINIMAL_CURRENT:
-               update_planes_and_stream_execute_v3_commit(scratch, true, true);
+               update_planes_and_stream_execute_v3_commit(scratch, true, true, 
false);
                break;
 
        case UPDATE_V3_FLOW_INVALID:
@@ -7402,13 +7420,6 @@ static void update_planes_and_stream_execute_v3(
        }
 }
 
-static void update_planes_and_stream_cleanup_v3_new_context(
-               struct dc_update_scratch_space *scratch
-)
-{
-       swap_and_release_current_context(scratch->dc, scratch->new_context, 
scratch->stream);
-}
-
 static void update_planes_and_stream_cleanup_v3_release_minimal(
                struct dc_update_scratch_space *scratch,
                bool backup
@@ -7439,17 +7450,23 @@ static bool update_planes_and_stream_cleanup_v3(
        switch (scratch->flow) {
        case UPDATE_V3_FLOW_NO_NEW_CONTEXT_CONTEXT_FAST:
        case UPDATE_V3_FLOW_NO_NEW_CONTEXT_CONTEXT_FULL:
-               // No cleanup required
+               if 
(scratch->dc->check_config.transition_countdown_to_steady_state)
+                       
scratch->dc->check_config.transition_countdown_to_steady_state--;
                break;
 
        case UPDATE_V3_FLOW_NEW_CONTEXT_SEAMLESS:
-               update_planes_and_stream_cleanup_v3_new_context(scratch);
+               swap_and_release_current_context(scratch->dc, 
scratch->new_context, scratch->stream);
                break;
 
        case UPDATE_V3_FLOW_NEW_CONTEXT_MINIMAL_NEW:
                update_planes_and_stream_cleanup_v3_intermediate(scratch, 
false);
-               scratch->flow = UPDATE_V3_FLOW_NEW_CONTEXT_SEAMLESS;
-               return true;
+               if (scratch->dc->check_config.deferred_transition_state) {
+                       dc_state_release(scratch->new_context);
+               } else {
+                       scratch->flow = UPDATE_V3_FLOW_NEW_CONTEXT_SEAMLESS;
+                       return true;
+               }
+               break;
 
        case UPDATE_V3_FLOW_NEW_CONTEXT_MINIMAL_CURRENT:
                update_planes_and_stream_cleanup_v3_intermediate(scratch, true);
-- 
2.52.0

Reply via email to