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 <yubing.zhang@rock-chips.com>
Change-Id: I64b7726397553af4aeb3cf35ef751b73345497ad
This commit is contained in:
Zhang Yubing
2022-05-05 16:12:08 +08:00
committed by Tao Huang
parent 0a196311ef
commit 53da594597

View File

@@ -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);