From 8d62bc847582e251ce7dd12ca1a91c0182016a8a Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Sun, 7 Apr 2024 16:01:15 +0800 Subject: [PATCH] drm/rockchip: vop2: check xmirror/ymirror/rotate90/rotate270 for cluster 1. Cluster can't support xmirror/rotate90/rotate270 when it isn't fbc format. 2. Cluster can't support xmirror/ymirror/rotate90/rotate270 when it is tiled format. Signed-off-by: Sandy Huang Change-Id: I191c090d69177f13b0352a0df452fc050f66a74c --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 32 ++++++++++++-------- drivers/gpu/drm/rockchip/rockchip_vop2_reg.c | 5 +++ 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 50d87c3abe8f..d3628f938892 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -5295,23 +5295,31 @@ static int vop2_plane_atomic_check(struct drm_plane *plane, struct drm_atomic_st if (!vpstate->afbc_en && (fb->format->format == DRM_FORMAT_XRGB2101010 || fb->format->format == DRM_FORMAT_XBGR2101010)) { - DRM_ERROR("RK3588 unsupported linear XRGB2101010 at %s\n", win->name); + DRM_ERROR("Unsupported linear XRGB2101010 at %s\n", win->name); + return -EINVAL; + } + + if (vop2_cluster_window(win) && !vpstate->afbc_en && fb->format->is_yuv) { + DRM_ERROR("Unsupported linear yuv format at %s\n", win->name); return -EINVAL; } } - if (vp->vop2->version > VOP_VERSION_RK3568) { - if (vop2_cluster_window(win) && !vpstate->afbc_en && fb->format->is_yuv && !is_vop3(vop2)) { - DRM_ERROR("Unsupported linear yuv format at %s\n", win->name); - return -EINVAL; - } + /* Cluster can't support xmirror/rotate90/rotate270 when it isn't fbc format. */ + if (vop2_cluster_window(win) && !vpstate->afbc_en && + (pstate->rotation & (DRM_MODE_REFLECT_X | DRM_MODE_ROTATE_90 | DRM_MODE_ROTATE_270))) { + DRM_ERROR("Unsupported linear rotation(%d) format at %s\n", + pstate->rotation, win->name); + return -EINVAL; + } - if (vop2_cluster_window(win) && !vpstate->afbc_en && - (win->supported_rotations & pstate->rotation)) { - DRM_ERROR("Unsupported linear rotation(%d) format at %s\n", - pstate->rotation, win->name); - return -EINVAL; - } + /* Cluster can't support xmirror/ymirror/rotate90/rotate270 when it is tiled format. */ + if (vop2_cluster_window(win) && vpstate->tiled_en && + (pstate->rotation & (DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y | + DRM_MODE_ROTATE_90 | DRM_MODE_ROTATE_270))) { + DRM_ERROR("Unsupported x/y mirror or rotation(%d) tiled format at %s\n", + pstate->rotation, win->name); + return -EINVAL; } if (win->feature & WIN_FEATURE_CLUSTER_SUB) { diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c index a8dda26f6bea..949df47cd342 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c @@ -2861,6 +2861,7 @@ static const struct vop2_win_regs rk3528_cluster0_win_data = { .y2r_en = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 8), .r2y_en = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 9), .csc_mode = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x7, 10), + .ymirror = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 21), .axi_yrgb_id = VOP_REG(RK3528_CLUSTER0_WIN0_CTRL2, 0x1f, 0), .axi_uv_id = VOP_REG(RK3528_CLUSTER0_WIN0_CTRL2, 0x1f, 5), }; @@ -2883,6 +2884,7 @@ static const struct vop2_win_regs rk3568_cluster0_win_data = { .y2r_en = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 8), .r2y_en = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 9), .csc_mode = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x3, 10), + .ymirror = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 21), .axi_yrgb_id = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL2, 0x1f, 0), .axi_uv_id = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL2, 0x1f, 5), .axi_id = VOP_REG(RK3568_CLUSTER0_CTRL, 0x1, 13), @@ -2906,6 +2908,7 @@ static const struct vop2_win_regs rk3568_cluster1_win_data = { .y2r_en = VOP_REG(RK3568_CLUSTER1_WIN0_CTRL0, 0x1, 8), .r2y_en = VOP_REG(RK3568_CLUSTER1_WIN0_CTRL0, 0x1, 9), .csc_mode = VOP_REG(RK3568_CLUSTER1_WIN0_CTRL0, 0x3, 10), + .ymirror = VOP_REG(RK3568_CLUSTER1_WIN0_CTRL0, 0x1, 21), .axi_yrgb_id = VOP_REG(RK3568_CLUSTER1_WIN0_CTRL2, 0x1f, 0), .axi_uv_id = VOP_REG(RK3568_CLUSTER1_WIN0_CTRL2, 0x1f, 5), .axi_id = VOP_REG(RK3568_CLUSTER1_CTRL, 0x1, 13), @@ -3560,6 +3563,7 @@ static const struct vop2_win_regs rk3576_cluster0_win_data = { .csc_mode = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x7, 10), .axi_yrgb_id = VOP_REG(RK3528_CLUSTER0_WIN0_CTRL2, 0x1f, 0), .axi_uv_id = VOP_REG(RK3528_CLUSTER0_WIN0_CTRL2, 0x1f, 5), + .ymirror = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 21), .csc_y2r_path_sel = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 24), }; @@ -3611,6 +3615,7 @@ static const struct vop2_win_regs rk3576_cluster1_win_data = { .csc_mode = VOP_REG(RK3568_CLUSTER1_WIN0_CTRL0, 0x7, 10), .axi_yrgb_id = VOP_REG(RK3568_CLUSTER1_WIN0_CTRL2, 0x1f, 0), .axi_uv_id = VOP_REG(RK3568_CLUSTER1_WIN0_CTRL2, 0x1f, 5), + .ymirror = VOP_REG(RK3568_CLUSTER1_WIN0_CTRL0, 0x1, 21), .csc_y2r_path_sel = VOP_REG(RK3568_CLUSTER1_WIN0_CTRL0, 0x1, 24), };