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, }, };