From e1c6772ef9b9b354798fe44410fe16bfc84e48b4 Mon Sep 17 00:00:00 2001 From: Andy Yan Date: Mon, 21 Jun 2021 14:32:33 +0800 Subject: [PATCH] drm/rockchip: vop2: No register mirror win when only one vp used when only one vp(crtc) is registered to drm, all the plane->possible_crtc will be force set to this crtc. this make current hwc think that all these planes can be assigned to this crtc, but the mirror plane(rk3566 feature) cant't be activated on the same crtc with source plane. So if some boards only use one vp(crtc), don't register mirror plane. Change-Id: Ib25246cf44a0fc4caf98e7c6d21ebba18f1a6c88 Signed-off-by: Andy Yan --- drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 9 + drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 13 ++ drivers/gpu/drm/rockchip/rockchip_vop2_reg.c | 182 ++++++++++--------- 3 files changed, 114 insertions(+), 90 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h index d01c7ab1d131..4ba1a150d57a 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h @@ -32,6 +32,15 @@ #define WIN_FEATURE_AFBDC BIT(3) #define WIN_FEATURE_CLUSTER_MAIN BIT(4) #define WIN_FEATURE_CLUSTER_SUB BIT(5) +/* a mirror win can only get fb address + * from source win: + * Cluster1---->Cluster0 + * Esmart1 ---->Esmart0 + * Smart1 ---->Smart0 + * This is a feather on rk3566 + */ +#define WIN_FEATURE_MIRROR BIT(6) + #define DSP_BG_SWAP 0x1 #define DSP_RB_SWAP 0x2 diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 3b02e3c29b9f..9643459e3c07 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -702,6 +702,11 @@ static bool vop2_soc_is_rk3566(void) return soc_is_rk3566(); } +static bool vop2_is_mirror_win(struct vop2_win *win) +{ + return soc_is_rk3566() && (win->feature & WIN_FEATURE_MIRROR); +} + static uint64_t vop2_soc_id_fixup(uint64_t soc_id) { switch (soc_id) { @@ -6012,6 +6017,7 @@ static int vop2_create_crtc(struct vop2 *vop2) const struct vop2_video_port_data *vp_data; uint32_t possible_crtcs; uint64_t soc_id; + uint32_t registered_num_crtcs = 0; char dclk_name[9]; int i = 0, j = 0, k = 0; int ret = 0; @@ -6141,6 +6147,7 @@ static int vop2_create_crtc(struct vop2 *vop2) drm_object_attach_property(&crtc->base, drm_dev->mode_config.tv_bottom_margin_property, 100); vop2_crtc_create_plane_mask_property(vop2, crtc); + registered_num_crtcs++; } /* @@ -6171,6 +6178,11 @@ static int vop2_create_crtc(struct vop2 *vop2) if (win->type != DRM_PLANE_TYPE_OVERLAY) continue; + /* + * Only dual display(which need two crtcs) need mirror win + */ + if (registered_num_crtcs < 2 && vop2_is_mirror_win(win)) + continue; ret = vop2_plane_init(vop2, win, possible_crtcs); if (ret) @@ -6249,6 +6261,7 @@ static int vop2_win_init(struct vop2 *vop2) area->regs = regs; area->type = DRM_PLANE_TYPE_OVERLAY; area->formats = win->formats; + area->feature = win->feature; area->nformats = win->nformats; area->format_modifiers = win->format_modifiers; area->max_upscale_factor = win_data->max_upscale_factor; diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c index c0931334ef02..8f092d458d2e 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c @@ -1007,6 +1007,96 @@ static const struct vop2_win_regs rk3568_esmart_win_data = { * @TODO describe the wind like cpu-map dt nodes; */ static const struct vop2_win_data rk3568_vop_win_data[] = { + { + .name = "Smart0-win0", + .phys_id = 4, + .base = 0x400, + .formats = formats_win_lite, + .nformats = ARRAY_SIZE(formats_win_lite), + .format_modifiers = format_modifiers, + .layer_sel_id = 3, + .supported_rotations = DRM_MODE_REFLECT_Y, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .regs = &rk3568_esmart_win_data, + .area = rk3568_area_data, + .area_size = ARRAY_SIZE(rk3568_area_data), + .type = DRM_PLANE_TYPE_PRIMARY, + .max_upscale_factor = 8, + .max_downscale_factor = 8, + .dly = { 20, 47, 41 }, + }, + + { + .name = "Smart1-win0", + .phys_id = 5, + .formats = formats_win_lite, + .nformats = ARRAY_SIZE(formats_win_lite), + .format_modifiers = format_modifiers, + .base = 0x600, + .layer_sel_id = 7, + .supported_rotations = DRM_MODE_REFLECT_Y, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .regs = &rk3568_esmart_win_data, + .area = rk3568_area_data, + .area_size = ARRAY_SIZE(rk3568_area_data), + .type = DRM_PLANE_TYPE_PRIMARY, + .max_upscale_factor = 8, + .max_downscale_factor = 8, + .dly = { 20, 47, 41 }, + .feature = WIN_FEATURE_MIRROR, + }, + + { + .name = "Esmart1-win0", + .phys_id = 3, + .formats = formats_win_full_10bit_yuyv, + .nformats = ARRAY_SIZE(formats_win_full_10bit_yuyv), + .format_modifiers = format_modifiers, + .base = 0x200, + .layer_sel_id = 6, + .supported_rotations = DRM_MODE_REFLECT_Y, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .regs = &rk3568_esmart_win_data, + .area = rk3568_area_data, + .area_size = ARRAY_SIZE(rk3568_area_data), + .type = DRM_PLANE_TYPE_PRIMARY, + .max_upscale_factor = 8, + .max_downscale_factor = 8, + .dly = { 20, 47, 41 }, + .feature = WIN_FEATURE_MIRROR, + }, + + { + .name = "Esmart0-win0", + .phys_id = 2, + .formats = formats_win_full_10bit_yuyv, + .nformats = ARRAY_SIZE(formats_win_full_10bit_yuyv), + .format_modifiers = format_modifiers, + .base = 0x0, + .layer_sel_id = 2, + .supported_rotations = DRM_MODE_REFLECT_Y, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .regs = &rk3568_esmart_win_data, + .area = rk3568_area_data, + .area_size = ARRAY_SIZE(rk3568_area_data), + .type = DRM_PLANE_TYPE_OVERLAY, + .max_upscale_factor = 8, + .max_downscale_factor = 8, + .dly = { 20, 47, 41 }, + }, + { .name = "Cluster0-win0", .phys_id = 0, @@ -1068,7 +1158,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = { .max_upscale_factor = 4, .max_downscale_factor = 4, .dly = { 0, 27, 21 }, - .feature = WIN_FEATURE_AFBDC | WIN_FEATURE_CLUSTER_MAIN, + .feature = WIN_FEATURE_AFBDC | WIN_FEATURE_CLUSTER_MAIN | WIN_FEATURE_MIRROR, }, { @@ -1088,95 +1178,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = { .type = DRM_PLANE_TYPE_OVERLAY, .max_upscale_factor = 4, .max_downscale_factor = 4, - .feature = WIN_FEATURE_AFBDC | WIN_FEATURE_CLUSTER_SUB, - }, - - { - .name = "Esmart0-win0", - .phys_id = 2, - .formats = formats_win_full_10bit_yuyv, - .nformats = ARRAY_SIZE(formats_win_full_10bit_yuyv), - .format_modifiers = format_modifiers, - .base = 0x0, - .layer_sel_id = 2, - .supported_rotations = DRM_MODE_REFLECT_Y, - .hsu_filter_mode = VOP2_SCALE_UP_BIC, - .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, - .vsu_filter_mode = VOP2_SCALE_UP_BIL, - .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, - .regs = &rk3568_esmart_win_data, - .area = rk3568_area_data, - .area_size = ARRAY_SIZE(rk3568_area_data), - .type = DRM_PLANE_TYPE_OVERLAY, - .max_upscale_factor = 8, - .max_downscale_factor = 8, - .dly = { 20, 47, 41 }, - }, - - { - .name = "Esmart1-win0", - .phys_id = 3, - .formats = formats_win_full_10bit_yuyv, - .nformats = ARRAY_SIZE(formats_win_full_10bit_yuyv), - .format_modifiers = format_modifiers, - .base = 0x200, - .layer_sel_id = 6, - .supported_rotations = DRM_MODE_REFLECT_Y, - .hsu_filter_mode = VOP2_SCALE_UP_BIC, - .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, - .vsu_filter_mode = VOP2_SCALE_UP_BIL, - .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, - .regs = &rk3568_esmart_win_data, - .area = rk3568_area_data, - .area_size = ARRAY_SIZE(rk3568_area_data), - .type = DRM_PLANE_TYPE_PRIMARY, - .max_upscale_factor = 8, - .max_downscale_factor = 8, - .dly = { 20, 47, 41 }, - }, - - { - .name = "Smart0-win0", - .phys_id = 4, - .base = 0x400, - .formats = formats_win_lite, - .nformats = ARRAY_SIZE(formats_win_lite), - .format_modifiers = format_modifiers, - .layer_sel_id = 3, - .supported_rotations = DRM_MODE_REFLECT_Y, - .hsu_filter_mode = VOP2_SCALE_UP_BIC, - .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, - .vsu_filter_mode = VOP2_SCALE_UP_BIL, - .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, - .regs = &rk3568_esmart_win_data, - .area = rk3568_area_data, - .area_size = ARRAY_SIZE(rk3568_area_data), - .type = DRM_PLANE_TYPE_PRIMARY, - .max_upscale_factor = 8, - .max_downscale_factor = 8, - .dly = { 20, 47, 41 }, - }, - - { - .name = "Smart1-win0", - .phys_id = 5, - .formats = formats_win_lite, - .nformats = ARRAY_SIZE(formats_win_lite), - .format_modifiers = format_modifiers, - .base = 0x600, - .layer_sel_id = 7, - .supported_rotations = DRM_MODE_REFLECT_Y, - .hsu_filter_mode = VOP2_SCALE_UP_BIC, - .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, - .vsu_filter_mode = VOP2_SCALE_UP_BIL, - .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, - .regs = &rk3568_esmart_win_data, - .area = rk3568_area_data, - .area_size = ARRAY_SIZE(rk3568_area_data), - .type = DRM_PLANE_TYPE_PRIMARY, - .max_upscale_factor = 8, - .max_downscale_factor = 8, - .dly = { 20, 47, 41 }, + .feature = WIN_FEATURE_AFBDC | WIN_FEATURE_CLUSTER_SUB | WIN_FEATURE_MIRROR, }, };