From: Rodrigo Siqueira <rodrigo.sique...@amd.com>

SubVP has some issues related to how we allocate and enable it. This
commit fixes this behavior by adding the proper check and configuration
to the SubVP code path.

Reviewed-by: Aurabindo Pillai <aurabindo.pil...@amd.com>
Signed-off-by: Rodrigo Siqueira <rodrigo.sique...@amd.com>
---
 drivers/gpu/drm/amd/display/dc/core/dc.c       | 16 ++++++++++++++--
 .../gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c | 18 ------------------
 .../drm/amd/display/dc/dcn32/dcn32_resource.c  |  6 ++++++
 3 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 1508679873d9..3a4f2d58f2e8 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -2946,6 +2946,12 @@ static bool update_planes_and_stream_state(struct dc *dc,
                dc_resource_state_copy_construct(
                                dc->current_state, context);
 
+               /* For each full update, remove all existing phantom pipes 
first.
+                * Ensures that we have enough pipes for newly added MPO planes
+                */
+               if (dc->res_pool->funcs->remove_phantom_pipes)
+                       dc->res_pool->funcs->remove_phantom_pipes(dc, context);
+
                /*remove old surfaces from context */
                if (!dc_rem_all_planes_for_stream(dc, stream, context)) {
 
@@ -3353,8 +3359,14 @@ static void commit_planes_for_stream(struct dc *dc,
                /* Since phantom pipe programming is moved to 
post_unlock_program_front_end,
                 * move the SubVP lock to after the phantom pipes have been 
setup
                 */
-               if (dc->hwss.subvp_pipe_control_lock)
-                       dc->hwss.subvp_pipe_control_lock(dc, context, false, 
should_lock_all_pipes, NULL, subvp_prev_use);
+               if (should_lock_all_pipes && 
dc->hwss.interdependent_update_lock) {
+                       if (dc->hwss.subvp_pipe_control_lock)
+                               dc->hwss.subvp_pipe_control_lock(dc, context, 
false, should_lock_all_pipes, NULL, subvp_prev_use);
+               } else {
+                       if (dc->hwss.subvp_pipe_control_lock)
+                               dc->hwss.subvp_pipe_control_lock(dc, context, 
false, should_lock_all_pipes, NULL, subvp_prev_use);
+               }
+
                return;
        }
 
diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
index 7de511fd004b..d732b6f031a1 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
@@ -1860,24 +1860,6 @@ void dcn20_post_unlock_program_front_end(
                }
        }
 
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-               struct pipe_ctx *mpcc_pipe;
-
-               if (pipe->vtp_locked) {
-                       
dc->hwseq->funcs.wait_for_blank_complete(pipe->stream_res.opp);
-                       
pipe->plane_res.hubp->funcs->set_blank(pipe->plane_res.hubp, true);
-                       pipe->vtp_locked = false;
-
-                       for (mpcc_pipe = pipe->bottom_pipe; mpcc_pipe; 
mpcc_pipe = mpcc_pipe->bottom_pipe)
-                               
mpcc_pipe->plane_res.hubp->funcs->set_blank(mpcc_pipe->plane_res.hubp, true);
-
-                       for (i = 0; i < dc->res_pool->pipe_count; i++)
-                               if 
(context->res_ctx.pipe_ctx[i].update_flags.bits.disable)
-                                       dc->hwss.disable_plane(dc, 
&dc->current_state->res_ctx.pipe_ctx[i]);
-               }
-       }
-
        for (i = 0; i < dc->res_pool->pipe_count; i++) {
                struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
                struct pipe_ctx *old_pipe = 
&dc->current_state->res_ctx.pipe_ctx[i];
diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c 
b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c
index 752a4accb116..9585b25f10e5 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c
@@ -1680,6 +1680,8 @@ static void dcn32_enable_phantom_plane(struct dc *dc,
                phantom_plane->clip_rect.y = 0;
                phantom_plane->clip_rect.height = 
phantom_stream->timing.v_addressable;
 
+               phantom_plane->is_phantom = true;
+
                dc_add_plane_to_context(dc, phantom_stream, phantom_plane, 
context);
 
                curr_pipe = curr_pipe->bottom_pipe;
@@ -1749,6 +1751,10 @@ bool dcn32_remove_phantom_pipes(struct dc *dc, struct 
dc_state *context)
                        pipe->stream->mall_stream_config.type = SUBVP_NONE;
                        pipe->stream->mall_stream_config.paired_stream = NULL;
                }
+
+               if (pipe->plane_state) {
+                       pipe->plane_state->is_phantom = false;
+               }
        }
        return removed_pipe;
 }
-- 
2.37.2

Reply via email to