drm/amd/display: Use min transition for all SubVP plane add/remove
authorjsg <jsg@openbsd.org>
Fri, 4 Aug 2023 08:33:41 +0000 (08:33 +0000)
committerjsg <jsg@openbsd.org>
Fri, 4 Aug 2023 08:33:41 +0000 (08:33 +0000)
From Alvin Lee
3a88351318bb70f0bc60153d8d80d642fb051a86 in linux-6.1.y/6.1.43
e4c1b01bc35b04e15782608165aa85b9e1724f7b in mainline linux

sys/dev/pci/drm/amd/display/dc/core/amdgpu_dc.c

index cbbad49..c429748 100644 (file)
@@ -3731,17 +3731,17 @@ static bool could_mpcc_tree_change_for_active_pipes(struct dc *dc,
                }
        }
 
-       /* For SubVP when adding MPO video we need to add a minimal transition.
+       /* For SubVP when adding or removing planes we need to add a minimal transition
+        * (even when disabling all planes). Whenever disabling a phantom pipe, we
+        * must use the minimal transition path to disable the pipe correctly.
         */
        if (cur_stream_status && stream->mall_stream_config.type == SUBVP_MAIN) {
                /* determine if minimal transition is required due to SubVP*/
-               if (surface_count > 0) {
-                       if (cur_stream_status->plane_count > surface_count) {
-                               force_minimal_pipe_splitting = true;
-                       } else if (cur_stream_status->plane_count < surface_count) {
-                               force_minimal_pipe_splitting = true;
-                               *is_plane_addition = true;
-                       }
+               if (cur_stream_status->plane_count > surface_count) {
+                       force_minimal_pipe_splitting = true;
+               } else if (cur_stream_status->plane_count < surface_count) {
+                       force_minimal_pipe_splitting = true;
+                       *is_plane_addition = true;
                }
        }
 
@@ -3758,6 +3758,7 @@ static bool commit_minimal_transition_state(struct dc *dc,
        enum dc_status ret = DC_ERROR_UNEXPECTED;
        unsigned int i, j;
        unsigned int pipe_in_use = 0;
+       bool subvp_in_use = false;
 
        if (!transition_context)
                return false;
@@ -3770,6 +3771,18 @@ static bool commit_minimal_transition_state(struct dc *dc,
                        pipe_in_use++;
        }
 
+       /* If SubVP is enabled and we are adding or removing planes from any main subvp
+        * pipe, we must use the minimal transition.
+        */
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &dc->current_state->res_ctx.pipe_ctx[i];
+
+               if (pipe->stream && pipe->stream->mall_stream_config.type == SUBVP_PHANTOM) {
+                       subvp_in_use = true;
+                       break;
+               }
+       }
+
        /* 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
@@ -3778,7 +3791,7 @@ static bool commit_minimal_transition_state(struct dc *dc,
         * 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) {
+       if (pipe_in_use != dc->res_pool->pipe_count && !subvp_in_use) {
                dc_release_state(transition_context);
                return true;
        }