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)) {
 
                /* 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;
        }
 
 
                }
        }
 
-       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];
 
                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;
                        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;
 }