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 <hjc@rock-chips.com>
Change-Id: I492647a22b41bf43c3127bd56b2ed0b3b95284a2
This commit is contained in:
Sandy Huang
2021-09-28 15:49:12 +08:00
parent a14c198318
commit 2bc4f70d30
4 changed files with 51 additions and 12 deletions

View File

@@ -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

View File

@@ -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++;
}

View File

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

View File

@@ -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,