tg->funcs->clear_optc_underflow(tg);
 }
 
+static int calculate_vready_offset_for_group(struct pipe_ctx *pipe)
+{
+       struct pipe_ctx *other_pipe;
+       int vready_offset = pipe->pipe_dlg_param.vready_offset;
+
+       /* Always use the largest vready_offset of all connected pipes */
+       for (other_pipe = pipe->bottom_pipe; other_pipe != NULL; other_pipe = other_pipe->bottom_pipe) {
+               if (other_pipe->pipe_dlg_param.vready_offset > vready_offset)
+                       vready_offset = other_pipe->pipe_dlg_param.vready_offset;
+       }
+       for (other_pipe = pipe->top_pipe; other_pipe != NULL; other_pipe = other_pipe->top_pipe) {
+               if (other_pipe->pipe_dlg_param.vready_offset > vready_offset)
+                       vready_offset = other_pipe->pipe_dlg_param.vready_offset;
+       }
+       for (other_pipe = pipe->next_odm_pipe; other_pipe != NULL; other_pipe = other_pipe->next_odm_pipe) {
+               if (other_pipe->pipe_dlg_param.vready_offset > vready_offset)
+                       vready_offset = other_pipe->pipe_dlg_param.vready_offset;
+       }
+       for (other_pipe = pipe->prev_odm_pipe; other_pipe != NULL; other_pipe = other_pipe->prev_odm_pipe) {
+               if (other_pipe->pipe_dlg_param.vready_offset > vready_offset)
+                       vready_offset = other_pipe->pipe_dlg_param.vready_offset;
+       }
+
+       return vready_offset;
+}
+
 enum dc_status dcn10_enable_stream_timing(
                struct pipe_ctx *pipe_ctx,
                struct dc_state *context,
        pipe_ctx->stream_res.tg->funcs->program_timing(
                        pipe_ctx->stream_res.tg,
                        &stream->timing,
-                       pipe_ctx->pipe_dlg_param.vready_offset,
+                       calculate_vready_offset_for_group(pipe_ctx),
                        pipe_ctx->pipe_dlg_param.vstartup_start,
                        pipe_ctx->pipe_dlg_param.vupdate_offset,
                        pipe_ctx->pipe_dlg_param.vupdate_width,
 
                pipe_ctx->stream_res.tg->funcs->program_global_sync(
                                pipe_ctx->stream_res.tg,
-                               pipe_ctx->pipe_dlg_param.vready_offset,
+                               calculate_vready_offset_for_group(pipe_ctx),
                                pipe_ctx->pipe_dlg_param.vstartup_start,
                                pipe_ctx->pipe_dlg_param.vupdate_offset,
                                pipe_ctx->pipe_dlg_param.vupdate_width);
 
                hubp->funcs->phantom_hubp_post_enable(hubp);
 }
 
+static int calculate_vready_offset_for_group(struct pipe_ctx *pipe)
+{
+       struct pipe_ctx *other_pipe;
+       int vready_offset = pipe->pipe_dlg_param.vready_offset;
+
+       /* Always use the largest vready_offset of all connected pipes */
+       for (other_pipe = pipe->bottom_pipe; other_pipe != NULL; other_pipe = other_pipe->bottom_pipe) {
+               if (other_pipe->pipe_dlg_param.vready_offset > vready_offset)
+                       vready_offset = other_pipe->pipe_dlg_param.vready_offset;
+       }
+       for (other_pipe = pipe->top_pipe; other_pipe != NULL; other_pipe = other_pipe->top_pipe) {
+               if (other_pipe->pipe_dlg_param.vready_offset > vready_offset)
+                       vready_offset = other_pipe->pipe_dlg_param.vready_offset;
+       }
+       for (other_pipe = pipe->next_odm_pipe; other_pipe != NULL; other_pipe = other_pipe->next_odm_pipe) {
+               if (other_pipe->pipe_dlg_param.vready_offset > vready_offset)
+                       vready_offset = other_pipe->pipe_dlg_param.vready_offset;
+       }
+       for (other_pipe = pipe->prev_odm_pipe; other_pipe != NULL; other_pipe = other_pipe->prev_odm_pipe) {
+               if (other_pipe->pipe_dlg_param.vready_offset > vready_offset)
+                       vready_offset = other_pipe->pipe_dlg_param.vready_offset;
+       }
+
+       return vready_offset;
+}
 
 static void dcn20_program_pipe(
                struct dc *dc,
                        && !pipe_ctx->prev_odm_pipe) {
                pipe_ctx->stream_res.tg->funcs->program_global_sync(
                                pipe_ctx->stream_res.tg,
-                               pipe_ctx->pipe_dlg_param.vready_offset,
+                               calculate_vready_offset_for_group(pipe_ctx),
                                pipe_ctx->pipe_dlg_param.vstartup_start,
                                pipe_ctx->pipe_dlg_param.vupdate_offset,
                                pipe_ctx->pipe_dlg_param.vupdate_width);
 
                        pipe_ctx->stream_res.tg->funcs->program_global_sync(
                                        pipe_ctx->stream_res.tg,
-                                       pipe_ctx->pipe_dlg_param.vready_offset,
+                                       calculate_vready_offset_for_group(pipe_ctx),
                                        pipe_ctx->pipe_dlg_param.vstartup_start,
                                        pipe_ctx->pipe_dlg_param.vupdate_offset,
                                        pipe_ctx->pipe_dlg_param.vupdate_width);