diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 05880b2e4e9a..9cbef7e33704 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -5078,7 +5078,11 @@ static int vop2_crtc_loader_protect(struct drm_crtc *crtc, bool on) struct vop2_video_port *vp = to_vop2_video_port(crtc); struct vop2 *vop2 = vp->vop2; struct rockchip_drm_private *private = crtc->dev->dev_private; - struct vop2_win *win; + const struct vop2_video_port_data *vp_data = &vop2->data->vp[vp->id]; + struct vop2_video_port *splice_vp = &vop2->vps[vp_data->splice_vp_id]; + struct drm_crtc_state *crtc_state; + struct drm_display_mode *mode; + struct vop2_win *win, *splice_win; if (on == vp->loader_protect) return 0; @@ -5090,9 +5094,30 @@ static int vop2_crtc_loader_protect(struct drm_crtc *crtc, bool on) vop2_initial(crtc); if (crtc->primary) { win = to_vop2_win(crtc->primary); - if (win->pd && VOP_WIN_GET(vop2, win, enable)) { - win->pd->ref_count++; - win->pd->vp_mask |= BIT(vp->id); + if (VOP_WIN_GET(vop2, win, enable)) { + if (win->pd) { + win->pd->ref_count++; + win->pd->vp_mask |= BIT(vp->id); + } + + crtc_state = drm_atomic_get_crtc_state(crtc->state->state, crtc); + mode = &crtc_state->adjusted_mode; + if (mode->hdisplay > VOP2_MAX_VP_OUTPUT_WIDTH) { + splice_win = vop2_find_win_by_phys_id(vop2, + win->splice_win_id); + splice_win->splice_mode_right = true; + splice_win->left_win = win; + win->splice_win = splice_win; + splice_vp->win_mask |= BIT(splice_win->phys_id); + splice_win->vp_mask = BIT(splice_vp->id); + vop2->active_vp_mask |= BIT(splice_vp->id); + + if (splice_win->pd && + VOP_WIN_GET(vop2, splice_win, enable)) { + splice_win->pd->ref_count++; + splice_win->pd->vp_mask |= BIT(splice_vp->id); + } + } } } drm_crtc_vblank_on(crtc);