From 53da5945970f8a079b4d6ff957ed25be94b59d35 Mon Sep 17 00:00:00 2001 From: Zhang Yubing Date: Thu, 5 May 2022 16:12:08 +0800 Subject: [PATCH] drm/rockchip: vop2: support vop splice mode in loader protect when the hdisplay more than 4096, vop need use splice mode to output image. So another vop port need config in load protect function. Signed-off-by: Zhang Yubing Change-Id: I64b7726397553af4aeb3cf35ef751b73345497ad --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 33 +++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) 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);