From: zhikzhai <[email protected]>

[ Upstream commit 1e8fd864afdc7a52df375e888a03b8472fc24f5d ]

[WHY]
Now dynamic ODM will now be disabled when MPO is required safe
transitions to avoid underflow, but we are triggering the way of minimal
transition too often. Commit state of dc with no check will do pipeline
setup which may re-initialize the component with no need such as audio.

[HOW]
Just do the minimal transition when all of pipes are in use, otherwise
return true to skip.

Tested-by: Mark Broadworth <[email protected]>
Reviewed-by: Dillon Varone <[email protected]>
Acked-by: Rodrigo Siqueira <[email protected]>
Signed-off-by: zhikzhai <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 997ab031f816..5c00907099c1 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -3650,10 +3650,32 @@ static bool commit_minimal_transition_state(struct dc 
*dc,
        bool temp_subvp_policy;
        enum dc_status ret = DC_ERROR_UNEXPECTED;
        unsigned int i, j;
+       unsigned int pipe_in_use = 0;
 
        if (!transition_context)
                return false;
 
+       /* check current pipes in use*/
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = 
&transition_base_context->res_ctx.pipe_ctx[i];
+
+               if (pipe->plane_state)
+                       pipe_in_use++;
+       }
+
+       /* When the OS add a new surface if we have been used all of pipes with 
odm combine
+        * and mpc split feature, it need use commit_minimal_transition_state 
to transition safely.
+        * After OS exit MPO, it will back to use odm and mpc split with all of 
pipes, we need
+        * call it again. Otherwise return true to skip.
+        *
+        * Reduce the scenarios to use dc_commit_state_no_check in the stage of 
flip. Especially
+        * enter/exit MPO when DCN still have enough resources.
+        */
+       if (pipe_in_use != dc->res_pool->pipe_count) {
+               dc_release_state(transition_context);
+               return true;
+       }
+
        if (!dc->config.is_vmin_only_asic) {
                tmp_mpc_policy = dc->debug.pipe_split_policy;
                dc->debug.pipe_split_policy = MPC_SPLIT_AVOID;
-- 
2.35.1

Reply via email to