int i;
        struct timing_generator *tg;
        bool removed_pipe[4] = { false };
+       bool interdependent_update = false;
        struct pipe_ctx *top_pipe_to_program =
                        find_top_pipe_for_stream(dc, context, stream);
        DC_LOGGER_INIT(dc->ctx->logger);
 
        tg = top_pipe_to_program->stream_res.tg;
 
-       dcn10_pipe_control_lock(dc, top_pipe_to_program, true);
+       interdependent_update = top_pipe_to_program->plane_state &&
+               top_pipe_to_program->plane_state->update_flags.bits.full_update;
+
+       if (interdependent_update)
+               lock_all_pipes(dc, context, true);
+       else
+               dcn10_pipe_control_lock(dc, top_pipe_to_program, true);
 
        if (num_planes == 0) {
                /* OTG blank before remove all front end */
                 */
                if (pipe_ctx->plane_state && !old_pipe_ctx->plane_state) {
                        if (old_pipe_ctx->stream_res.tg == tg &&
-                               old_pipe_ctx->plane_res.hubp &&
-                               old_pipe_ctx->plane_res.hubp->opp_id != 0xf) {
+                           old_pipe_ctx->plane_res.hubp &&
+                           old_pipe_ctx->plane_res.hubp->opp_id != 0xf)
                                dcn10_disable_plane(dc, old_pipe_ctx);
-                               /*
-                                * power down fe will unlock when calling reset, need
-                                * to lock it back here. Messy, need rework.
-                                */
-                               pipe_ctx->stream_res.tg->funcs->lock(pipe_ctx->stream_res.tg);
-                       }
                }
 
                if ((!pipe_ctx->plane_state ||
        if (num_planes > 0)
                program_all_pipe_in_tree(dc, top_pipe_to_program, context);
 
-       dcn10_pipe_control_lock(dc, top_pipe_to_program, false);
-
-       if (top_pipe_to_program->plane_state &&
-                       top_pipe_to_program->plane_state->update_flags.bits.full_update)
+       if (interdependent_update)
                for (i = 0; i < dc->res_pool->pipe_count; i++) {
                        struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
-                       tg = pipe_ctx->stream_res.tg;
                        /* Skip inactive pipes and ones already updated */
-                       if (!pipe_ctx->stream || pipe_ctx->stream == stream
-                                       || !pipe_ctx->plane_state
-                                       || !tg->funcs->is_tg_enabled(tg))
+                       if (!pipe_ctx->stream || pipe_ctx->stream == stream ||
+                           !pipe_ctx->plane_state || !tg->funcs->is_tg_enabled(tg))
                                continue;
 
-                       tg->funcs->lock(tg);
-
                        pipe_ctx->plane_res.hubp->funcs->hubp_setup_interdependent(
                                pipe_ctx->plane_res.hubp,
                                &pipe_ctx->dlg_regs,
                                &pipe_ctx->ttu_regs);
-
-                       tg->funcs->unlock(tg);
                }
 
+       if (interdependent_update)
+               lock_all_pipes(dc, context, false);
+       else
+               dcn10_pipe_control_lock(dc, top_pipe_to_program, false);
+
        if (num_planes == 0)
                false_optc_underflow_wa(dc, stream, tg);
 
        return vertical_line_start;
 }
 
+void lock_all_pipes(struct dc *dc,
+       struct dc_state *context,
+       bool lock)
+{
+       struct pipe_ctx *pipe_ctx;
+       struct timing_generator *tg;
+       int i;
+
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               pipe_ctx = &context->res_ctx.pipe_ctx[i];
+               tg = pipe_ctx->stream_res.tg;
+               /*
+                * Only lock the top pipe's tg to prevent redundant
+                * (un)locking. Also skip if pipe is disabled.
+                */
+               if (pipe_ctx->top_pipe ||
+                   !pipe_ctx->stream || !pipe_ctx->plane_state ||
+                   !tg->funcs->is_tg_enabled(tg))
+                       continue;
+
+               if (lock)
+                       tg->funcs->lock(tg);
+               else
+                       tg->funcs->unlock(tg);
+       }
+}
+
 static void calc_vupdate_position(
                struct pipe_ctx *pipe_ctx,
                uint32_t *start_line,