diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index 1c19c0fa8c53..83189c48c03c 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c @@ -425,12 +425,6 @@ static int rockchip_drm_create_properties(struct drm_device *dev) return -ENOMEM; private->color_space_prop = prop; - prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC, - "ALPHA_SCALE", 0, 1); - if (!prop) - return -ENOMEM; - private->alpha_scale_prop = prop; - prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC, "ASYNC_COMMIT", 0, 1); if (!prop) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h index a472e25b9194..80b59b6df8c3 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h @@ -220,7 +220,6 @@ struct rockchip_drm_private { /* private plane prop */ struct drm_property *eotf_prop; struct drm_property *color_space_prop; - struct drm_property *alpha_scale_prop; struct drm_property *async_commit_prop; struct drm_property *share_id_prop; diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index cde2ba5aa0e4..be880feb1728 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -233,6 +233,7 @@ struct vop { struct drm_info_list *debugfs_files; struct drm_property *plane_feature_prop; struct drm_property *plane_mask_prop; + struct drm_property *feature_prop; bool is_iommu_enabled; bool is_iommu_needed; @@ -3964,18 +3965,12 @@ static int vop_crtc_atomic_get_property(struct drm_crtc *crtc, return 0; } - if (property == private->alpha_scale_prop) { - *val = (vop->data->feature & VOP_FEATURE_ALPHA_SCALE) ? 1 : 0; - return 0; - } - if (property == private->aclk_prop) { /* KHZ, keep align with mode->clock */ *val = clk_get_rate(vop->aclk) / 1000; return 0; } - if (property == private->bg_prop) { *val = vop->background; return 0; @@ -4374,6 +4369,41 @@ static int vop_crtc_create_plane_mask_property(struct vop *vop, struct drm_crtc return 0; } +static int vop_crtc_create_feature_property(struct vop *vop, struct drm_crtc *crtc) +{ + const struct vop_data *vop_data = vop->data; + + struct drm_property *prop; + u64 feature = 0; + + static const struct drm_prop_enum_list props[] = { + { ROCKCHIP_DRM_CRTC_FEATURE_ALPHA_SCALE, "ALPHA_SCALE" }, + { ROCKCHIP_DRM_CRTC_FEATURE_HDR10, "HDR10" }, + { ROCKCHIP_DRM_CRTC_FEATURE_DOLBY_HDR, "DOLBY_HDR" }, + }; + + if (vop_data->feature & VOP_FEATURE_ALPHA_SCALE) + feature |= BIT(ROCKCHIP_DRM_CRTC_FEATURE_ALPHA_SCALE); + if (vop_data->feature & VOP_FEATURE_ALPHA_HDR10) + feature |= BIT(ROCKCHIP_DRM_CRTC_FEATURE_HDR10); + if (vop_data->feature & VOP_FEATURE_ALPHA_DOLBY_HDR) + feature |= BIT(ROCKCHIP_DRM_CRTC_FEATURE_DOLBY_HDR); + + prop = drm_property_create_bitmask(vop->drm_dev, + DRM_MODE_PROP_IMMUTABLE, "FEATURE", + props, ARRAY_SIZE(props), + 0xffffffff); + if (!prop) { + DRM_DEV_ERROR(vop->dev, "create FEATURE prop for vop%d failed\n", vop->id); + return -ENOMEM; + } + + vop->feature_prop = prop; + drm_object_attach_property(&crtc->base, vop->feature_prop, feature); + + return 0; +} + static int vop_create_crtc(struct vop *vop) { struct device *dev = vop->dev; @@ -4455,7 +4485,6 @@ static int vop_create_crtc(struct vop *vop) 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, private->alpha_scale_prop, 0); #define VOP_ATTACH_MODE_CONFIG_PROP(prop, v) \ drm_object_attach_property(&crtc->base, drm_dev->mode_config.prop, v) @@ -4466,6 +4495,7 @@ static int vop_create_crtc(struct vop *vop) VOP_ATTACH_MODE_CONFIG_PROP(tv_bottom_margin_property, 100); #undef VOP_ATTACH_MODE_CONFIG_PROP vop_crtc_create_plane_mask_property(vop, crtc); + vop_crtc_create_feature_property(vop, crtc); if (vop->lut_regs) { u16 *r_base, *g_base, *b_base;