diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 7bdaa024ecc7..ccf39dcf63dc 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -3686,6 +3686,7 @@ static void vop_cfg_update(struct drm_crtc *crtc, struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state); struct vop *vop = to_vop(crtc); + const struct vop_data *vop_data = vop->data; spin_lock(&vop->reg_lock); @@ -3713,7 +3714,8 @@ static void vop_cfg_update(struct drm_crtc *crtc, VOP_CTRL_SET(vop, afbdc_en, s->afbdc_en); VOP_CTRL_SET(vop, dsp_layer_sel, s->dsp_layer_sel); - vop_post_config(crtc); + if (vop_data->feature & VOP_FEATURE_OVERSCAN) + vop_post_config(crtc); spin_unlock(&vop->reg_lock); } @@ -4409,9 +4411,9 @@ static int vop_crtc_create_feature_property(struct vop *vop, struct drm_crtc *cr if (vop_data->feature & VOP_FEATURE_ALPHA_SCALE) feature |= BIT(ROCKCHIP_DRM_CRTC_FEATURE_ALPHA_SCALE); - if (vop_data->feature & VOP_FEATURE_ALPHA_HDR10) + if (vop_data->feature & VOP_FEATURE_HDR10) feature |= BIT(ROCKCHIP_DRM_CRTC_FEATURE_HDR10); - if (vop_data->feature & VOP_FEATURE_ALPHA_NEXT_HDR) + if (vop_data->feature & VOP_FEATURE_NEXT_HDR) feature |= BIT(ROCKCHIP_DRM_CRTC_FEATURE_NEXT_HDR); prop = drm_property_create_bitmask(vop->drm_dev, diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h index 94e1183ef534..69cbff33a8d0 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h @@ -32,10 +32,11 @@ #define VOP_FEATURE_OUTPUT_RGB10 BIT(0) #define VOP_FEATURE_INTERNAL_RGB BIT(1) #define VOP_FEATURE_ALPHA_SCALE BIT(2) -#define VOP_FEATURE_ALPHA_HDR10 BIT(3) -#define VOP_FEATURE_ALPHA_NEXT_HDR BIT(4) +#define VOP_FEATURE_HDR10 BIT(3) +#define VOP_FEATURE_NEXT_HDR BIT(4) /* a feature to splice two windows and two vps to support resolution > 4096 */ #define VOP_FEATURE_SPLICE BIT(5) +#define VOP_FEATURE_OVERSCAN BIT(6) #define VOP_FEATURE_OUTPUT_10BIT VOP_FEATURE_OUTPUT_RGB10 diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 95e7391db83d..2230bf47f760 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -5476,7 +5476,8 @@ static void vop2_crtc_atomic_enable(struct drm_crtc *crtc, struct drm_crtc_state else clk_set_rate(vp->dclk, adjusted_mode->crtc_clock * 1000); - vop2_post_config(crtc); + if (vp_data->feature & VOP_FEATURE_OVERSCAN) + vop2_post_config(crtc); if (vcstate->dsc_enable) vop2_crtc_enable_dsc(crtc, old_state); @@ -6357,6 +6358,8 @@ static void vop2_cfg_update(struct drm_crtc *crtc, struct vop2_video_port *vp = to_vop2_video_port(crtc); struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(crtc->state); struct vop2 *vop2 = vp->vop2; + const struct vop2_data *vop2_data = vop2->data; + const struct vop2_video_port_data *vp_data = &vop2_data->vp[vp->id]; uint32_t val; uint32_t r, g, b; @@ -6386,7 +6389,8 @@ static void vop2_cfg_update(struct drm_crtc *crtc, vop2_tv_config_update(crtc, old_crtc_state); - vop2_post_config(crtc); + if (vp_data->feature & VOP_FEATURE_OVERSCAN) + vop2_post_config(crtc); spin_unlock(&vop2->reg_lock); } @@ -7259,9 +7263,9 @@ static int vop2_crtc_create_feature_property(struct vop2 *vop2, struct drm_crtc if (vp_data->feature & VOP_FEATURE_ALPHA_SCALE) feature |= BIT(ROCKCHIP_DRM_CRTC_FEATURE_ALPHA_SCALE); - if (vp_data->feature & VOP_FEATURE_ALPHA_HDR10) + if (vp_data->feature & VOP_FEATURE_HDR10) feature |= BIT(ROCKCHIP_DRM_CRTC_FEATURE_HDR10); - if (vp_data->feature & VOP_FEATURE_ALPHA_NEXT_HDR) + if (vp_data->feature & VOP_FEATURE_NEXT_HDR) feature |= BIT(ROCKCHIP_DRM_CRTC_FEATURE_NEXT_HDR); prop = drm_property_create_bitmask(vop2->drm_dev, @@ -7443,14 +7447,16 @@ static int vop2_create_crtc(struct vop2 *vop2) drm_object_attach_property(&crtc->base, private->aclk_prop, 0); drm_object_attach_property(&crtc->base, private->bg_prop, 0); drm_object_attach_property(&crtc->base, private->line_flag_prop, 0); - drm_object_attach_property(&crtc->base, - drm_dev->mode_config.tv_left_margin_property, 100); - drm_object_attach_property(&crtc->base, - drm_dev->mode_config.tv_right_margin_property, 100); - drm_object_attach_property(&crtc->base, - drm_dev->mode_config.tv_top_margin_property, 100); - drm_object_attach_property(&crtc->base, - drm_dev->mode_config.tv_bottom_margin_property, 100); + if (vp_data->feature & VOP_FEATURE_OVERSCAN) { + drm_object_attach_property(&crtc->base, + drm_dev->mode_config.tv_left_margin_property, 100); + drm_object_attach_property(&crtc->base, + drm_dev->mode_config.tv_right_margin_property, 100); + drm_object_attach_property(&crtc->base, + drm_dev->mode_config.tv_top_margin_property, 100); + drm_object_attach_property(&crtc->base, + drm_dev->mode_config.tv_bottom_margin_property, 100); + } vop2_crtc_create_plane_mask_property(vop2, crtc); vop2_crtc_create_feature_property(vop2, crtc); registered_num_crtcs++; diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c index 7406bd3d6579..32b14fe7985c 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c @@ -806,7 +806,8 @@ static const struct vop2_video_port_data rk3568_vop_video_ports[] = { { .id = 0, .soc_id = { 0x3568, 0x3566 }, - .feature = VOP_FEATURE_OUTPUT_10BIT | VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_ALPHA_HDR10, + .feature = VOP_FEATURE_OUTPUT_10BIT | VOP_FEATURE_ALPHA_SCALE | + VOP_FEATURE_HDR10 | VOP_FEATURE_OVERSCAN, .gamma_lut_len = 1024, .cubic_lut_len = 729, /* 9x9x9 */ .max_output = { 4096, 2304 }, @@ -818,7 +819,7 @@ static const struct vop2_video_port_data rk3568_vop_video_ports[] = { { .id = 1, .soc_id = { 0x3568, 0x3566 }, - .feature = VOP_FEATURE_ALPHA_SCALE, + .feature = VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN, .gamma_lut_len = 1024, .max_output = { 2048, 1536 }, .pre_scan_max_dly = { 40, 40, 40, 40 }, @@ -827,7 +828,7 @@ static const struct vop2_video_port_data rk3568_vop_video_ports[] = { }, { .id = 2, - .feature = VOP_FEATURE_ALPHA_SCALE, + .feature = VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN, .soc_id = { 0x3568, 0x3566 }, .gamma_lut_len = 1024, .max_output = { 1920, 1080 }, @@ -1099,7 +1100,8 @@ static const struct vop2_video_port_data rk3588_vop_video_ports[] = { .id = 0, .splice_vp_id = 1, .soc_id = { 0x3588, 0x3588 }, - .feature = VOP_FEATURE_OUTPUT_10BIT, + .feature = VOP_FEATURE_OUTPUT_10BIT | VOP_FEATURE_ALPHA_SCALE | + VOP_FEATURE_HDR10 | VOP_FEATURE_NEXT_HDR, .gamma_lut_len = 1024, .cubic_lut_len = 729, /* 9x9x9 */ .dclk_max = 600000000, @@ -1113,6 +1115,7 @@ static const struct vop2_video_port_data rk3588_vop_video_ports[] = { { .id = 1, .soc_id = { 0x3588, 0x3588 }, + .feature = VOP_FEATURE_OUTPUT_10BIT | VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_HDR10, .gamma_lut_len = 1024, .dclk_max = 600000000, .max_output = { 4096, 2304 }, @@ -1125,6 +1128,7 @@ static const struct vop2_video_port_data rk3588_vop_video_ports[] = { { .id = 2, .soc_id = { 0x3588, 0x3588 }, + .feature = VOP_FEATURE_OUTPUT_10BIT | VOP_FEATURE_ALPHA_SCALE, .gamma_lut_len = 1024, .dclk_max = 600000000, .max_output = { 4096, 2304 }, @@ -1135,6 +1139,7 @@ static const struct vop2_video_port_data rk3588_vop_video_ports[] = { { .id = 3, .soc_id = { 0x3588, 0x3588 }, + .feature = VOP_FEATURE_ALPHA_SCALE, .gamma_lut_len = 1024, .dclk_max = 200000000, .max_output = { 2048, 1536 }, @@ -1142,7 +1147,6 @@ static const struct vop2_video_port_data rk3588_vop_video_ports[] = { .intr = &rk3588_vp3_intr, .regs = &rk3588_vop_vp3_regs, }, - }; /* diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c index 89bae068fc02..f33e7d1be2a6 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c @@ -398,7 +398,7 @@ static const struct vop_data rk3288_vop_big = { .soc_id = 0x3288, .vop_id = 0, .version = VOP_VERSION(3, 0), - .feature = VOP_FEATURE_OUTPUT_10BIT | VOP_FEATURE_ALPHA_SCALE, + .feature = VOP_FEATURE_OUTPUT_10BIT | VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN, .max_input = {4096, 8192}, .max_output = {3840, 2160}, .intr = &rk3288_vop_intr, @@ -412,7 +412,7 @@ static const struct vop_data rk3288_vop_lit = { .soc_id = 0x3288, .vop_id = 1, .version = VOP_VERSION(3, 0), - .feature = VOP_FEATURE_OUTPUT_10BIT | VOP_FEATURE_ALPHA_SCALE, + .feature = VOP_FEATURE_OUTPUT_10BIT | VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN, .max_input = {4096, 8192}, .max_output = {2560, 1600}, .intr = &rk3288_vop_intr, @@ -521,7 +521,7 @@ static const struct vop_data rk3368_vop = { .soc_id = 0x3368, .vop_id = 0, .version = VOP_VERSION(3, 2), - .feature = VOP_FEATURE_ALPHA_SCALE, + .feature = VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN, .max_input = {4096, 8192}, .max_output = {4096, 2160}, .intr = &rk3368_vop_intr, @@ -548,7 +548,7 @@ static const struct vop_data rk3366_vop = { .soc_id = 0x3366, .vop_id = 0, .version = VOP_VERSION(3, 4), - .feature = VOP_FEATURE_ALPHA_SCALE, + .feature = VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN, .max_input = {4096, 8192}, .max_output = {4096, 2160}, .intr = &rk3366_vop_intr, @@ -709,7 +709,7 @@ static const struct vop_data rk3399_vop_big = { .vop_id = 0, .version = VOP_VERSION(3, 5), .csc_table = &rk3399_csc_table, - .feature = VOP_FEATURE_OUTPUT_10BIT | VOP_FEATURE_ALPHA_SCALE, + .feature = VOP_FEATURE_OUTPUT_10BIT | VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN, .max_input = {4096, 8192}, .max_output = {4096, 2160}, .intr = &rk3366_vop_intr, @@ -738,7 +738,7 @@ static const struct vop_data rk3399_vop_lit = { .soc_id = 0x3399, .vop_id = 1, .version = VOP_VERSION(3, 6), - .feature = VOP_FEATURE_ALPHA_SCALE, + .feature = VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN, .csc_table = &rk3399_csc_table, .max_input = {4096, 8192}, .max_output = {2560, 1600}, @@ -759,7 +759,7 @@ static const struct vop_data rk3228_vop = { .soc_id = 0x3228, .vop_id = 0, .version = VOP_VERSION(3, 7), - .feature = VOP_FEATURE_OUTPUT_10BIT | VOP_FEATURE_ALPHA_SCALE, + .feature = VOP_FEATURE_OUTPUT_10BIT | VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN, .max_input = {4096, 8192}, .max_output = {4096, 2160}, .intr = &rk3366_vop_intr, @@ -1152,7 +1152,8 @@ static const struct vop_data rk3328_vop = { .soc_id = 0x3328, .vop_id = 0, .version = VOP_VERSION(3, 8), - .feature = VOP_FEATURE_OUTPUT_10BIT | VOP_FEATURE_ALPHA_SCALE, + .feature = VOP_FEATURE_OUTPUT_10BIT | VOP_FEATURE_HDR10 | + VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN, .hdr_table = &rk3328_hdr_table, .max_input = {4096, 8192}, .max_output = {4096, 2160},