drm/rockchip: vop2: Add "DIMMING_DATA" property for local dimming

The user can update the dimming data via "DIMMING_DATA" property, and
it will be sent to the panel supported local dimming function in the
rockchip dimming panel driver.

Change-Id: I7dba541450fce86be064d0205af0f595b1712aea
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
This commit is contained in:
Damon Ding
2024-10-08 20:14:01 +08:00
committed by Tao Huang
parent e78f73a9b5
commit e8cba62d56
3 changed files with 28 additions and 0 deletions

View File

@@ -1516,6 +1516,9 @@ static int rockchip_drm_create_properties(struct drm_device *dev)
private->cubic_lut_size_prop = drm_property_create_range(dev, DRM_MODE_PROP_IMMUTABLE,
"CUBIC_LUT_SIZE", 0, UINT_MAX);
private->dimming_data_prop = drm_property_create(dev, DRM_MODE_PROP_BLOB,
"DIMMING_DATA", 0);
return drm_mode_create_tv_properties(dev, 0, NULL);
}

View File

@@ -298,6 +298,8 @@ struct rockchip_crtc_state {
*/
bool sharp_en;
bool dimming_changed;
struct drm_tv_connector_state *tv_state;
int left_margin;
int right_margin;
@@ -347,6 +349,7 @@ struct rockchip_crtc_state {
struct drm_property_blob *post_csc_data;
struct drm_property_blob *post_sharp_data;
struct drm_property_blob *cubic_lut_data;
struct drm_property_blob *dimming_data;
int request_refresh_rate;
int max_refresh_rate;
@@ -579,6 +582,9 @@ struct rockchip_drm_private {
struct drm_property *connector_id_prop;
struct drm_property *split_area_prop;
/* private local dimming prop */
struct drm_property *dimming_data_prop;
const struct rockchip_crtc_funcs *crtc_funcs[ROCKCHIP_MAX_CRTC];
uint64_t iommu_fault_count;

View File

@@ -13635,6 +13635,8 @@ static struct drm_crtc_state *vop2_crtc_duplicate_state(struct drm_crtc *crtc)
drm_property_blob_get(vcstate->cubic_lut_data);
if (vcstate->post_sharp_data)
drm_property_blob_get(vcstate->post_sharp_data);
if (vcstate->dimming_data)
drm_property_blob_get(vcstate->dimming_data);
__drm_atomic_helper_crtc_duplicate_state(crtc, &vcstate->base);
return &vcstate->base;
@@ -13651,6 +13653,7 @@ static void vop2_crtc_destroy_state(struct drm_crtc *crtc,
drm_property_blob_put(vcstate->post_csc_data);
drm_property_blob_put(vcstate->cubic_lut_data);
drm_property_blob_put(vcstate->post_sharp_data);
drm_property_blob_put(vcstate->dimming_data);
kfree(vcstate);
}
@@ -13846,6 +13849,11 @@ static int vop2_crtc_atomic_get_property(struct drm_crtc *crtc,
return 0;
}
if (property == private->dimming_data_prop) {
*val = (vcstate->dimming_data) ? vcstate->dimming_data->base.id : 0;
return 0;
}
DRM_ERROR("failed to get vop2 crtc property: %s\n", property->name);
return -EINVAL;
@@ -14006,6 +14014,16 @@ static int vop2_crtc_atomic_set_property(struct drm_crtc *crtc,
return ret;
}
if (property == private->dimming_data_prop) {
ret = vop2_atomic_replace_property_blob_from_id(drm_dev,
&vcstate->dimming_data,
val,
-1, -1,
&replaced);
vcstate->dimming_changed |= replaced;
return ret;
}
DRM_ERROR("failed to set vop2 crtc property %s\n", property->name);
return -EINVAL;
@@ -15327,6 +15345,7 @@ static int vop2_create_crtc(struct vop2 *vop2, uint8_t enabled_vp_mask)
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->dimming_data_prop, 0);
if (vp_data->feature & VOP_FEATURE_OVERSCAN) {
drm_object_attach_property(&crtc->base,
drm_dev->mode_config.tv_left_margin_property, 100);