From 3325b43a1abbfc6f2e467aed56dcdb69f146343c Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Sat, 17 Jun 2023 17:04:28 +0800 Subject: [PATCH] drm/rockchip: vop2: move cubic lut to rockchip drm driver move cubic lut support from drm croe to rockchip drm driver and remove depend on NO_GKI. Signed-off-by: Sandy Huang Change-Id: I8fb6ba4fc927bf9f7e1b38c180986b1e25393347 --- drivers/gpu/drm/rockchip/Kconfig | 7 --- drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 3 ++ drivers/gpu/drm/rockchip/rockchip_drm_drv.h | 3 ++ drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 46 +++++++++++--------- 4 files changed, 32 insertions(+), 27 deletions(-) diff --git a/drivers/gpu/drm/rockchip/Kconfig b/drivers/gpu/drm/rockchip/Kconfig index 8d5dda562c88..3154597de251 100644 --- a/drivers/gpu/drm/rockchip/Kconfig +++ b/drivers/gpu/drm/rockchip/Kconfig @@ -20,13 +20,6 @@ config DRM_ROCKCHIP if DRM_ROCKCHIP -config ROCKCHIP_DRM_CUBIC_LUT - bool "Support 3D cubic LUT" - depends on NO_GKI - help - This add properties to support provision of a 3D cubic - look up table, allowing for color specific adjustments. - config ROCKCHIP_DRM_DEBUG bool "Rockchip DRM debug" depends on DEBUG_FS diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index d5b93d57fd89..a731b593980f 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c @@ -1337,6 +1337,9 @@ static int rockchip_drm_create_properties(struct drm_device *dev) private->aclk_prop = drm_property_create_range(dev, 0, "ACLK", 0, UINT_MAX); private->bg_prop = drm_property_create_range(dev, 0, "BACKGROUND", 0, UINT_MAX); private->line_flag_prop = drm_property_create_range(dev, 0, "LINE_FLAG1", 0, UINT_MAX); + private->cubic_lut_prop = drm_property_create(dev, DRM_MODE_PROP_BLOB, "CUBIC_LUT", 0); + private->cubic_lut_size_prop = drm_property_create_range(dev, DRM_MODE_PROP_IMMUTABLE, + "CUBIC_LUT_SIZE", 0, UINT_MAX); return drm_mode_create_tv_properties(dev, 0, NULL); } diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h index 4c36d9b08638..153ccd07de52 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h @@ -255,6 +255,7 @@ struct rockchip_crtc_state { struct drm_property_blob *hdr_ext_data; struct drm_property_blob *acm_lut_data; struct drm_property_blob *post_csc_data; + struct drm_property_blob *cubic_lut_data; int request_refresh_rate; int max_refresh_rate; @@ -452,6 +453,8 @@ struct rockchip_drm_private { struct drm_property *aclk_prop; struct drm_property *bg_prop; struct drm_property *line_flag_prop; + struct drm_property *cubic_lut_prop; + struct drm_property *cubic_lut_size_prop; /* private plane prop */ struct drm_property *eotf_prop; diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index ed50bb2fee1f..ecaacd9f8052 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -3524,7 +3524,6 @@ static int vop2_crtc_atomic_gamma_set(struct drm_crtc *crtc, return 0; } -#if defined(CONFIG_ROCKCHIP_DRM_CUBIC_LUT) static int vop2_crtc_atomic_cubic_lut_set(struct drm_crtc *crtc, struct drm_crtc_state *old_state) { @@ -3597,18 +3596,12 @@ static int vop2_crtc_atomic_cubic_lut_set(struct drm_crtc *crtc, return 0; } -static void drm_crtc_enable_cubic_lut(struct drm_crtc *crtc, unsigned int cubic_lut_size) +static void vop2_attach_cubic_lut_prop(struct drm_crtc *crtc, unsigned int cubic_lut_size) { - struct drm_device *dev = crtc->dev; - struct drm_mode_config *config = &dev->mode_config; + struct rockchip_drm_private *private = crtc->dev->dev_private; - if (cubic_lut_size) { - drm_object_attach_property(&crtc->base, - config->cubic_lut_property, 0); - drm_object_attach_property(&crtc->base, - config->cubic_lut_size_property, - cubic_lut_size); - } + drm_object_attach_property(&crtc->base, private->cubic_lut_prop, 0); + drm_object_attach_property(&crtc->base, private->cubic_lut_size_prop, cubic_lut_size); } static void vop2_cubic_lut_init(struct vop2 *vop2) @@ -3628,12 +3621,9 @@ static void vop2_cubic_lut_init(struct vop2 *vop2) vp->cubic_lut_len = vp_data->cubic_lut_len; if (vp->cubic_lut_len) - drm_crtc_enable_cubic_lut(crtc, vp->cubic_lut_len); + vop2_attach_cubic_lut_prop(crtc, vp->cubic_lut_len); } } -#else -static void vop2_cubic_lut_init(struct vop2 *vop2) { } -#endif static int vop2_core_clks_prepare_enable(struct vop2 *vop2) { @@ -9755,13 +9745,11 @@ static void vop2_crtc_atomic_flush(struct drm_crtc *crtc, struct drm_crtc_state vp->gamma_lut = crtc->state->gamma_lut->data; vop2_crtc_atomic_gamma_set(crtc, crtc->state); } -#if defined(CONFIG_ROCKCHIP_DRM_CUBIC_LUT) - if (crtc->state->cubic_lut || vp->cubic_lut) { - if (crtc->state->cubic_lut) - vp->cubic_lut = crtc->state->cubic_lut->data; + if (vcstate->cubic_lut_data || vp->cubic_lut) { + if (vcstate->cubic_lut_data) + vp->cubic_lut = vcstate->cubic_lut_data->data; vop2_crtc_atomic_cubic_lut_set(crtc, crtc->state); } -#endif } else { VOP_MODULE_SET(vop2, vp, cubic_lut_update_en, 0); } @@ -9874,6 +9862,8 @@ static struct drm_crtc_state *vop2_crtc_duplicate_state(struct drm_crtc *crtc) drm_property_blob_get(vcstate->acm_lut_data); if (vcstate->post_csc_data) drm_property_blob_get(vcstate->post_csc_data); + if (vcstate->cubic_lut_data) + drm_property_blob_get(vcstate->cubic_lut_data); __drm_atomic_helper_crtc_duplicate_state(crtc, &vcstate->base); return &vcstate->base; @@ -9888,6 +9878,7 @@ static void vop2_crtc_destroy_state(struct drm_crtc *crtc, drm_property_blob_put(vcstate->hdr_ext_data); drm_property_blob_put(vcstate->acm_lut_data); drm_property_blob_put(vcstate->post_csc_data); + drm_property_blob_put(vcstate->cubic_lut_data); kfree(vcstate); } @@ -10034,6 +10025,11 @@ static int vop2_crtc_atomic_get_property(struct drm_crtc *crtc, return 0; } + if (property == private->cubic_lut_prop) { + *val = (vcstate->cubic_lut_data) ? vcstate->cubic_lut_data->base.id : 0; + return 0; + } + DRM_ERROR("failed to get vop2 crtc property: %s\n", property->name); return -EINVAL; @@ -10159,6 +10155,16 @@ static int vop2_crtc_atomic_set_property(struct drm_crtc *crtc, return ret; } + if (property == private->cubic_lut_prop) { + ret = vop2_atomic_replace_property_blob_from_id(drm_dev, + &vcstate->cubic_lut_data, + val, + -1, sizeof(struct drm_color_lut), + &replaced); + state->color_mgmt_changed |= replaced; + return ret; + } + DRM_ERROR("failed to set vop2 crtc property %s\n", property->name); return -EINVAL;