diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 09f9b74493ee..dd15da42ec13 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -3453,6 +3453,8 @@ static int vop_plane_init(struct vop *vop, struct vop_win *win, feature |= BIT(ROCKCHIP_DRM_PLANE_FEATURE_HDR2SDR); if (win->feature & WIN_FEATURE_SDR2HDR) feature |= BIT(ROCKCHIP_DRM_PLANE_FEATURE_SDR2HDR); + if (win->feature & WIN_FEATURE_AFBDC) + feature |= BIT(ROCKCHIP_DRM_PLANE_FEATURE_AFBDC); drm_object_attach_property(&win->base.base, vop->plane_feature_prop, feature); @@ -3704,6 +3706,7 @@ static int vop_win_init(struct vop *vop) { ROCKCHIP_DRM_PLANE_FEATURE_ALPHA, "alpha" }, { ROCKCHIP_DRM_PLANE_FEATURE_HDR2SDR, "hdr2sdr" }, { ROCKCHIP_DRM_PLANE_FEATURE_SDR2HDR, "sdr2hdr" }, + { ROCKCHIP_DRM_PLANE_FEATURE_AFBDC, "afbdc" }, }; static const struct drm_prop_enum_list crtc_props[] = { { ROCKCHIP_DRM_CRTC_FEATURE_AFBDC, "afbdc" }, @@ -3761,7 +3764,8 @@ static int vop_win_init(struct vop *vop) BIT(ROCKCHIP_DRM_PLANE_FEATURE_SCALE) | BIT(ROCKCHIP_DRM_PLANE_FEATURE_ALPHA) | BIT(ROCKCHIP_DRM_PLANE_FEATURE_HDR2SDR) | - BIT(ROCKCHIP_DRM_PLANE_FEATURE_SDR2HDR)); + BIT(ROCKCHIP_DRM_PLANE_FEATURE_SDR2HDR) | + BIT(ROCKCHIP_DRM_PLANE_FEATURE_AFBDC)); if (!vop->plane_feature_prop) { DRM_ERROR("failed to create feature property\n"); return -EINVAL; diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h index fd944d6a8615..d60d30b6127e 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h @@ -396,6 +396,7 @@ struct vop_win_data { #define WIN_FEATURE_HDR2SDR BIT(0) #define WIN_FEATURE_SDR2HDR BIT(1) #define WIN_FEATURE_PRE_OVERLAY BIT(2) +#define WIN_FEATURE_AFBDC BIT(3) struct vop_rect { int width; diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c index 8e0619317a6a..1fff14cefab9 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c @@ -548,15 +548,19 @@ static const struct vop_csc rk3399_win3_csc = { static const struct vop_win_data rk3399_vop_win_data[] = { { .base = 0x00, .phy = &rk3288_win01_data, .csc = &rk3399_win0_csc, - .type = DRM_PLANE_TYPE_PRIMARY }, + .type = DRM_PLANE_TYPE_PRIMARY, + .feature = WIN_FEATURE_AFBDC }, { .base = 0x40, .phy = &rk3288_win01_data, .csc = &rk3399_win1_csc, - .type = DRM_PLANE_TYPE_OVERLAY }, + .type = DRM_PLANE_TYPE_OVERLAY, + .feature = WIN_FEATURE_AFBDC }, { .base = 0x00, .phy = &rk3368_win23_data, .csc = &rk3399_win2_csc, .type = DRM_PLANE_TYPE_OVERLAY, + .feature = WIN_FEATURE_AFBDC, .area = rk3368_area_data, .area_size = ARRAY_SIZE(rk3368_area_data), }, { .base = 0x50, .phy = &rk3368_win23_data, .csc = &rk3399_win3_csc, .type = DRM_PLANE_TYPE_CURSOR, + .feature = WIN_FEATURE_AFBDC, .area = rk3368_area_data, .area_size = ARRAY_SIZE(rk3368_area_data), }, }; @@ -575,10 +579,12 @@ static const struct vop_data rk3399_vop_big = { static const struct vop_win_data rk3399_vop_lit_win_data[] = { { .base = 0x00, .phy = &rk3288_win01_data, .csc = &rk3399_win0_csc, - .type = DRM_PLANE_TYPE_PRIMARY }, + .type = DRM_PLANE_TYPE_PRIMARY, + .feature = WIN_FEATURE_AFBDC }, { .phy = NULL }, { .base = 0x00, .phy = &rk3368_win23_data, .csc = &rk3399_win2_csc, .type = DRM_PLANE_TYPE_CURSOR, + .feature = WIN_FEATURE_AFBDC, .area = rk3368_area_data, .area_size = ARRAY_SIZE(rk3368_area_data), }, { .phy = NULL }, diff --git a/include/uapi/drm/rockchip_drm.h b/include/uapi/drm/rockchip_drm.h index 8e7c6350e20c..d5bab5a8cf18 100644 --- a/include/uapi/drm/rockchip_drm.h +++ b/include/uapi/drm/rockchip_drm.h @@ -122,6 +122,7 @@ enum rockchip_plane_feture { ROCKCHIP_DRM_PLANE_FEATURE_ALPHA, ROCKCHIP_DRM_PLANE_FEATURE_HDR2SDR, ROCKCHIP_DRM_PLANE_FEATURE_SDR2HDR, + ROCKCHIP_DRM_PLANE_FEATURE_AFBDC, ROCKCHIP_DRM_PLANE_FEATURE_MAX, };