From 2bc4f70d3017ac1990d37e71cb7cae8d4f79022c Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Tue, 28 Sep 2021 15:49:12 +0800 Subject: [PATCH] drm/rockchip: vop2: add CRTC feature interaction with userspace move alpha scale to crtc feature and add hdr10/dolby hdr info to feature to interaction with userspace. Signed-off-by: Sandy Huang Change-Id: I492647a22b41bf43c3127bd56b2ed0b3b95284a2 --- drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 5 +- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 50 ++++++++++++++++---- drivers/gpu/drm/rockchip/rockchip_vop2_reg.c | 2 +- include/uapi/drm/rockchip_drm.h | 6 +++ 4 files changed, 51 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h index 6fe6454e109a..0f83af3e0079 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h @@ -28,8 +28,9 @@ #define VOP_FEATURE_OUTPUT_RGB10 BIT(0) #define VOP_FEATURE_INTERNAL_RGB BIT(1) -#define VOP_FEATURE_AFBDC BIT(2) -#define VOP_FEATURE_ALPHA_SCALE BIT(3) +#define VOP_FEATURE_ALPHA_SCALE BIT(2) +#define VOP_FEATURE_ALPHA_HDR10 BIT(3) +#define VOP_FEATURE_ALPHA_DOLBY_HDR BIT(4) #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 30a2e171c735..651207827a77 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -526,6 +526,10 @@ struct vop2_video_port { * @plane_mask_prop: plane mask interaction with userspace */ struct drm_property *plane_mask_prop; + /** + * @feature_prop: crtc feature interaction with userspace + */ + struct drm_property *feature_prop; /** * @primary_plane_phy_id: vp primary plane phy id, the primary plane @@ -5526,8 +5530,6 @@ static int vop2_crtc_atomic_get_property(struct drm_crtc *crtc, struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(state); struct vop2_video_port *vp = to_vop2_video_port(crtc); 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]; if (property == mode_config->tv_left_margin_property) { *val = vcstate->left_margin; @@ -5549,18 +5551,12 @@ static int vop2_crtc_atomic_get_property(struct drm_crtc *crtc, return 0; } - if (property == private->alpha_scale_prop) { - *val = (vp_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(vop2->aclk) / 1000; return 0; } - if (property == private->bg_prop) { *val = vcstate->background; return 0; @@ -6118,6 +6114,42 @@ static int vop2_crtc_create_plane_mask_property(struct vop2 *vop2, return 0; } +static int vop2_crtc_create_feature_property(struct vop2 *vop2, struct drm_crtc *crtc) +{ + const struct vop2_data *vop2_data = vop2->data; + struct vop2_video_port *vp = to_vop2_video_port(crtc); + const struct vop2_video_port_data *vp_data = &vop2_data->vp[vp->id]; + 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 (vp_data->feature & VOP_FEATURE_ALPHA_SCALE) + feature |= BIT(ROCKCHIP_DRM_CRTC_FEATURE_ALPHA_SCALE); + if (vp_data->feature & VOP_FEATURE_ALPHA_HDR10) + feature |= BIT(ROCKCHIP_DRM_CRTC_FEATURE_HDR10); + if (vp_data->feature & VOP_FEATURE_ALPHA_DOLBY_HDR) + feature |= BIT(ROCKCHIP_DRM_CRTC_FEATURE_DOLBY_HDR); + + prop = drm_property_create_bitmask(vop2->drm_dev, + DRM_MODE_PROP_IMMUTABLE, "FEATURE", + props, ARRAY_SIZE(props), + 0xffffffff); + if (!prop) { + DRM_DEV_ERROR(vop2->dev, "create FEATURE prop for vp%d failed\n", vp->id); + return -ENOMEM; + } + + vp->feature_prop = prop; + drm_object_attach_property(&crtc->base, vp->feature_prop, feature); + + return 0; +} + /* * Returns: * Registered crtc number on success, negative error code on failure. @@ -6282,7 +6314,6 @@ 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, private->alpha_scale_prop, 0); drm_object_attach_property(&crtc->base, drm_dev->mode_config.tv_left_margin_property, 100); drm_object_attach_property(&crtc->base, @@ -6292,6 +6323,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); + 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 1782f5da8f89..6df97d1c1e59 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c @@ -646,7 +646,7 @@ 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, + .feature = VOP_FEATURE_OUTPUT_10BIT | VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_ALPHA_HDR10, .gamma_lut_len = 1024, .cubic_lut_len = 729, /* 9x9x9 */ .max_output = { 4096, 2304 }, diff --git a/include/uapi/drm/rockchip_drm.h b/include/uapi/drm/rockchip_drm.h index a6590a0d43d0..a0a73ca7831c 100644 --- a/include/uapi/drm/rockchip_drm.h +++ b/include/uapi/drm/rockchip_drm.h @@ -79,6 +79,12 @@ enum drm_rockchip_gem_cpu_acquire_type { DRM_ROCKCHIP_GEM_CPU_ACQUIRE_EXCLUSIVE = 0x1, }; +enum rockchip_crtc_feture { + ROCKCHIP_DRM_CRTC_FEATURE_ALPHA_SCALE, + ROCKCHIP_DRM_CRTC_FEATURE_HDR10, + ROCKCHIP_DRM_CRTC_FEATURE_DOLBY_HDR, +}; + enum rockchip_plane_feture { ROCKCHIP_DRM_PLANE_FEATURE_SCALE, ROCKCHIP_DRM_PLANE_FEATURE_ALPHA,