diff options
Diffstat (limited to 'target/linux/bcm27xx/patches-5.10/950-0689-drm-automatic-legacy-gamma-support.patch')
-rw-r--r-- | target/linux/bcm27xx/patches-5.10/950-0689-drm-automatic-legacy-gamma-support.patch | 458 |
1 files changed, 458 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.10/950-0689-drm-automatic-legacy-gamma-support.patch b/target/linux/bcm27xx/patches-5.10/950-0689-drm-automatic-legacy-gamma-support.patch new file mode 100644 index 0000000000..c6f9bf19d3 --- /dev/null +++ b/target/linux/bcm27xx/patches-5.10/950-0689-drm-automatic-legacy-gamma-support.patch @@ -0,0 +1,458 @@ +From 88dea782ac45343b039ee1b6ee15b55e63a5f835 Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen <tomi.valkeinen@ti.com> +Date: Fri, 11 Dec 2020 13:42:36 +0200 +Subject: [PATCH] drm: automatic legacy gamma support + +To support legacy gamma ioctls the drivers need to set +drm_crtc_funcs.gamma_set either to a custom implementation or to +drm_atomic_helper_legacy_gamma_set. Most of the atomic drivers do the +latter. + +We can simplify this by making the core handle it automatically. + +Move the drm_atomic_helper_legacy_gamma_set() functionality into +drm_color_mgmt.c to make drm_mode_gamma_set_ioctl() use +drm_crtc_funcs.gamma_set if set or GAMMA_LUT property if not. + +Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> +Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> +Reviewed-by: Philippe Cornu <philippe.cornu@st.com> +Link: https://patchwork.freedesktop.org/patch/msgid/20201211114237.213288-2-tomi.valkeinen@ti.com +--- + .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 1 - + .../gpu/drm/arm/display/komeda/komeda_crtc.c | 1 - + drivers/gpu/drm/arm/malidp_crtc.c | 1 - + drivers/gpu/drm/armada/armada_crtc.c | 1 - + drivers/gpu/drm/ast/ast_mode.c | 1 - + .../gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c | 1 - + drivers/gpu/drm/drm_atomic_helper.c | 70 ----------- + drivers/gpu/drm/drm_color_mgmt.c | 111 ++++++++++++++++-- + drivers/gpu/drm/i915/display/intel_display.c | 1 - + drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 2 - + drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 1 - + drivers/gpu/drm/nouveau/dispnv50/head.c | 2 - + drivers/gpu/drm/omapdrm/omap_crtc.c | 1 - + drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 1 - + drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 1 - + drivers/gpu/drm/stm/ltdc.c | 1 - + drivers/gpu/drm/vc4/vc4_crtc.c | 1 - + drivers/gpu/drm/vc4/vc4_txp.c | 1 - + include/drm/drm_atomic_helper.h | 4 - + 19 files changed, 102 insertions(+), 101 deletions(-) + +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -4988,7 +4988,6 @@ static void dm_disable_vblank(struct drm + static const struct drm_crtc_funcs amdgpu_dm_crtc_funcs = { + .reset = dm_crtc_reset_state, + .destroy = amdgpu_dm_crtc_destroy, +- .gamma_set = drm_atomic_helper_legacy_gamma_set, + .set_config = drm_atomic_helper_set_config, + .page_flip = drm_atomic_helper_page_flip, + .atomic_duplicate_state = dm_crtc_duplicate_state, +--- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c ++++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c +@@ -548,7 +548,6 @@ static void komeda_crtc_vblank_disable(s + } + + static const struct drm_crtc_funcs komeda_crtc_funcs = { +- .gamma_set = drm_atomic_helper_legacy_gamma_set, + .destroy = drm_crtc_cleanup, + .set_config = drm_atomic_helper_set_config, + .page_flip = drm_atomic_helper_page_flip, +--- a/drivers/gpu/drm/arm/malidp_crtc.c ++++ b/drivers/gpu/drm/arm/malidp_crtc.c +@@ -510,7 +510,6 @@ static void malidp_crtc_disable_vblank(s + } + + static const struct drm_crtc_funcs malidp_crtc_funcs = { +- .gamma_set = drm_atomic_helper_legacy_gamma_set, + .destroy = drm_crtc_cleanup, + .set_config = drm_atomic_helper_set_config, + .page_flip = drm_atomic_helper_page_flip, +--- a/drivers/gpu/drm/armada/armada_crtc.c ++++ b/drivers/gpu/drm/armada/armada_crtc.c +@@ -816,7 +816,6 @@ static const struct drm_crtc_funcs armad + .cursor_set = armada_drm_crtc_cursor_set, + .cursor_move = armada_drm_crtc_cursor_move, + .destroy = armada_drm_crtc_destroy, +- .gamma_set = drm_atomic_helper_legacy_gamma_set, + .set_config = drm_atomic_helper_set_config, + .page_flip = drm_atomic_helper_page_flip, + .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state, +--- a/drivers/gpu/drm/ast/ast_mode.c ++++ b/drivers/gpu/drm/ast/ast_mode.c +@@ -898,7 +898,6 @@ static void ast_crtc_atomic_destroy_stat + + static const struct drm_crtc_funcs ast_crtc_funcs = { + .reset = ast_crtc_reset, +- .gamma_set = drm_atomic_helper_legacy_gamma_set, + .destroy = drm_crtc_cleanup, + .set_config = drm_atomic_helper_set_config, + .page_flip = drm_atomic_helper_page_flip, +--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c ++++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c +@@ -473,7 +473,6 @@ static const struct drm_crtc_funcs atmel + .atomic_destroy_state = atmel_hlcdc_crtc_destroy_state, + .enable_vblank = atmel_hlcdc_crtc_enable_vblank, + .disable_vblank = atmel_hlcdc_crtc_disable_vblank, +- .gamma_set = drm_atomic_helper_legacy_gamma_set, + }; + + int atmel_hlcdc_crtc_create(struct drm_device *dev) +--- a/drivers/gpu/drm/drm_atomic_helper.c ++++ b/drivers/gpu/drm/drm_atomic_helper.c +@@ -3500,76 +3500,6 @@ fail: + EXPORT_SYMBOL(drm_atomic_helper_page_flip_target); + + /** +- * drm_atomic_helper_legacy_gamma_set - set the legacy gamma correction table +- * @crtc: CRTC object +- * @red: red correction table +- * @green: green correction table +- * @blue: green correction table +- * @size: size of the tables +- * @ctx: lock acquire context +- * +- * Implements support for legacy gamma correction table for drivers +- * that support color management through the DEGAMMA_LUT/GAMMA_LUT +- * properties. See drm_crtc_enable_color_mgmt() and the containing chapter for +- * how the atomic color management and gamma tables work. +- */ +-int drm_atomic_helper_legacy_gamma_set(struct drm_crtc *crtc, +- u16 *red, u16 *green, u16 *blue, +- uint32_t size, +- struct drm_modeset_acquire_ctx *ctx) +-{ +- struct drm_device *dev = crtc->dev; +- struct drm_atomic_state *state; +- struct drm_crtc_state *crtc_state; +- struct drm_property_blob *blob = NULL; +- struct drm_color_lut *blob_data; +- int i, ret = 0; +- bool replaced; +- +- state = drm_atomic_state_alloc(crtc->dev); +- if (!state) +- return -ENOMEM; +- +- blob = drm_property_create_blob(dev, +- sizeof(struct drm_color_lut) * size, +- NULL); +- if (IS_ERR(blob)) { +- ret = PTR_ERR(blob); +- blob = NULL; +- goto fail; +- } +- +- /* Prepare GAMMA_LUT with the legacy values. */ +- blob_data = blob->data; +- for (i = 0; i < size; i++) { +- blob_data[i].red = red[i]; +- blob_data[i].green = green[i]; +- blob_data[i].blue = blue[i]; +- } +- +- state->acquire_ctx = ctx; +- crtc_state = drm_atomic_get_crtc_state(state, crtc); +- if (IS_ERR(crtc_state)) { +- ret = PTR_ERR(crtc_state); +- goto fail; +- } +- +- /* Reset DEGAMMA_LUT and CTM properties. */ +- replaced = drm_property_replace_blob(&crtc_state->degamma_lut, NULL); +- replaced |= drm_property_replace_blob(&crtc_state->ctm, NULL); +- replaced |= drm_property_replace_blob(&crtc_state->gamma_lut, blob); +- crtc_state->color_mgmt_changed |= replaced; +- +- ret = drm_atomic_commit(state); +- +-fail: +- drm_atomic_state_put(state); +- drm_property_blob_put(blob); +- return ret; +-} +-EXPORT_SYMBOL(drm_atomic_helper_legacy_gamma_set); +- +-/** + * drm_atomic_helper_bridge_propagate_bus_fmt() - Propagate output format to + * the input end of a bridge + * @bridge: bridge control structure +--- a/drivers/gpu/drm/drm_color_mgmt.c ++++ b/drivers/gpu/drm/drm_color_mgmt.c +@@ -22,6 +22,7 @@ + + #include <linux/uaccess.h> + ++#include <drm/drm_atomic.h> + #include <drm/drm_color_mgmt.h> + #include <drm/drm_crtc.h> + #include <drm/drm_device.h> +@@ -89,9 +90,8 @@ + * modes) appropriately. + * + * There is also support for a legacy gamma table, which is set up by calling +- * drm_mode_crtc_set_gamma_size(). Drivers which support both should use +- * drm_atomic_helper_legacy_gamma_set() to alias the legacy gamma ramp with the +- * "GAMMA_LUT" property above. ++ * drm_mode_crtc_set_gamma_size(). The DRM core will then alias the legacy gamma ++ * ramp with "GAMMA_LUT". + * + * Support for different non RGB color encodings is controlled through + * &drm_plane specific COLOR_ENCODING and COLOR_RANGE properties. They +@@ -156,9 +156,6 @@ EXPORT_SYMBOL(drm_color_ctm_s31_32_to_qm + * optional. The gamma and degamma properties are only attached if + * their size is not 0 and ctm_property is only attached if has_ctm is + * true. +- * +- * Drivers should use drm_atomic_helper_legacy_gamma_set() to implement the +- * legacy &drm_crtc_funcs.gamma_set callback. + */ + void drm_crtc_enable_color_mgmt(struct drm_crtc *crtc, + uint degamma_lut_size, +@@ -232,6 +229,102 @@ int drm_mode_crtc_set_gamma_size(struct + EXPORT_SYMBOL(drm_mode_crtc_set_gamma_size); + + /** ++ * drm_crtc_supports_legacy_gamma - does the crtc support legacy gamma correction table ++ * @crtc: CRTC object ++ * ++ * Returns true/false if the given crtc supports setting the legacy gamma ++ * correction table. ++ */ ++static bool drm_crtc_supports_legacy_gamma(struct drm_crtc *crtc) ++{ ++ u32 gamma_id = crtc->dev->mode_config.gamma_lut_property->base.id; ++ ++ if (!crtc->gamma_size) ++ return false; ++ ++ if (crtc->funcs->gamma_set) ++ return true; ++ ++ return !!drm_mode_obj_find_prop_id(&crtc->base, gamma_id); ++} ++ ++/** ++ * drm_crtc_legacy_gamma_set - set the legacy gamma correction table ++ * @crtc: CRTC object ++ * @red: red correction table ++ * @green: green correction table ++ * @blue: green correction table ++ * @size: size of the tables ++ * @ctx: lock acquire context ++ * ++ * Implements support for legacy gamma correction table for drivers ++ * that have set drm_crtc_funcs.gamma_set or that support color management ++ * through the DEGAMMA_LUT/GAMMA_LUT properties. See ++ * drm_crtc_enable_color_mgmt() and the containing chapter for ++ * how the atomic color management and gamma tables work. ++ * ++ * This function sets the gamma using drm_crtc_funcs.gamma_set if set, or ++ * alternatively using crtc color management properties. ++ */ ++static int drm_crtc_legacy_gamma_set(struct drm_crtc *crtc, ++ u16 *red, u16 *green, u16 *blue, ++ u32 size, ++ struct drm_modeset_acquire_ctx *ctx) ++{ ++ struct drm_device *dev = crtc->dev; ++ struct drm_atomic_state *state; ++ struct drm_crtc_state *crtc_state; ++ struct drm_property_blob *blob; ++ struct drm_color_lut *blob_data; ++ int i, ret = 0; ++ bool replaced; ++ ++ if (crtc->funcs->gamma_set) ++ return crtc->funcs->gamma_set(crtc, red, green, blue, size, ctx); ++ ++ state = drm_atomic_state_alloc(crtc->dev); ++ if (!state) ++ return -ENOMEM; ++ ++ blob = drm_property_create_blob(dev, ++ sizeof(struct drm_color_lut) * size, ++ NULL); ++ if (IS_ERR(blob)) { ++ ret = PTR_ERR(blob); ++ blob = NULL; ++ goto fail; ++ } ++ ++ /* Prepare GAMMA_LUT with the legacy values. */ ++ blob_data = blob->data; ++ for (i = 0; i < size; i++) { ++ blob_data[i].red = red[i]; ++ blob_data[i].green = green[i]; ++ blob_data[i].blue = blue[i]; ++ } ++ ++ state->acquire_ctx = ctx; ++ crtc_state = drm_atomic_get_crtc_state(state, crtc); ++ if (IS_ERR(crtc_state)) { ++ ret = PTR_ERR(crtc_state); ++ goto fail; ++ } ++ ++ /* Set GAMMA_LUT and reset DEGAMMA_LUT and CTM */ ++ replaced = drm_property_replace_blob(&crtc_state->degamma_lut, NULL); ++ replaced |= drm_property_replace_blob(&crtc_state->ctm, NULL); ++ replaced |= drm_property_replace_blob(&crtc_state->gamma_lut, blob); ++ crtc_state->color_mgmt_changed |= replaced; ++ ++ ret = drm_atomic_commit(state); ++ ++fail: ++ drm_atomic_state_put(state); ++ drm_property_blob_put(blob); ++ return ret; ++} ++ ++/** + * drm_mode_gamma_set_ioctl - set the gamma table + * @dev: DRM device + * @data: ioctl data +@@ -262,7 +355,7 @@ int drm_mode_gamma_set_ioctl(struct drm_ + if (!crtc) + return -ENOENT; + +- if (crtc->funcs->gamma_set == NULL) ++ if (!drm_crtc_supports_legacy_gamma(crtc)) + return -ENOSYS; + + /* memcpy into gamma store */ +@@ -290,8 +383,8 @@ int drm_mode_gamma_set_ioctl(struct drm_ + goto out; + } + +- ret = crtc->funcs->gamma_set(crtc, r_base, g_base, b_base, +- crtc->gamma_size, &ctx); ++ ret = drm_crtc_legacy_gamma_set(crtc, r_base, g_base, b_base, ++ crtc->gamma_size, &ctx); + + out: + DRM_MODESET_LOCK_ALL_END(dev, ctx, ret); +--- a/drivers/gpu/drm/i915/display/intel_display.c ++++ b/drivers/gpu/drm/i915/display/intel_display.c +@@ -16562,7 +16562,6 @@ fail: + } + + #define INTEL_CRTC_FUNCS \ +- .gamma_set = drm_atomic_helper_legacy_gamma_set, \ + .set_config = drm_atomic_helper_set_config, \ + .destroy = intel_crtc_destroy, \ + .page_flip = drm_atomic_helper_page_flip, \ +--- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c ++++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c +@@ -647,8 +647,6 @@ static const struct drm_crtc_funcs ingen + + .enable_vblank = ingenic_drm_enable_vblank, + .disable_vblank = ingenic_drm_disable_vblank, +- +- .gamma_set = drm_atomic_helper_legacy_gamma_set, + }; + + static const struct drm_plane_helper_funcs ingenic_drm_plane_helper_funcs = { +--- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c ++++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c +@@ -614,7 +614,6 @@ static const struct drm_crtc_funcs mtk_c + .reset = mtk_drm_crtc_reset, + .atomic_duplicate_state = mtk_drm_crtc_duplicate_state, + .atomic_destroy_state = mtk_drm_crtc_destroy_state, +- .gamma_set = drm_atomic_helper_legacy_gamma_set, + .enable_vblank = mtk_drm_crtc_enable_vblank, + .disable_vblank = mtk_drm_crtc_disable_vblank, + }; +--- a/drivers/gpu/drm/nouveau/dispnv50/head.c ++++ b/drivers/gpu/drm/nouveau/dispnv50/head.c +@@ -501,7 +501,6 @@ nv50_head_destroy(struct drm_crtc *crtc) + static const struct drm_crtc_funcs + nv50_head_func = { + .reset = nv50_head_reset, +- .gamma_set = drm_atomic_helper_legacy_gamma_set, + .destroy = nv50_head_destroy, + .set_config = drm_atomic_helper_set_config, + .page_flip = drm_atomic_helper_page_flip, +@@ -516,7 +515,6 @@ nv50_head_func = { + static const struct drm_crtc_funcs + nvd9_head_func = { + .reset = nv50_head_reset, +- .gamma_set = drm_atomic_helper_legacy_gamma_set, + .destroy = nv50_head_destroy, + .set_config = drm_atomic_helper_set_config, + .page_flip = drm_atomic_helper_page_flip, +--- a/drivers/gpu/drm/omapdrm/omap_crtc.c ++++ b/drivers/gpu/drm/omapdrm/omap_crtc.c +@@ -741,7 +741,6 @@ static const struct drm_crtc_funcs omap_ + .set_config = drm_atomic_helper_set_config, + .destroy = omap_crtc_destroy, + .page_flip = drm_atomic_helper_page_flip, +- .gamma_set = drm_atomic_helper_legacy_gamma_set, + .atomic_duplicate_state = omap_crtc_duplicate_state, + .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state, + .atomic_set_property = omap_crtc_atomic_set_property, +--- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c ++++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c +@@ -1138,7 +1138,6 @@ static const struct drm_crtc_funcs crtc_ + .set_crc_source = rcar_du_crtc_set_crc_source, + .verify_crc_source = rcar_du_crtc_verify_crc_source, + .get_crc_sources = rcar_du_crtc_get_crc_sources, +- .gamma_set = drm_atomic_helper_legacy_gamma_set, + }; + + /* ----------------------------------------------------------------------------- +--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c ++++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +@@ -1642,7 +1642,6 @@ static const struct drm_crtc_funcs vop_c + .disable_vblank = vop_crtc_disable_vblank, + .set_crc_source = vop_crtc_set_crc_source, + .verify_crc_source = vop_crtc_verify_crc_source, +- .gamma_set = drm_atomic_helper_legacy_gamma_set, + }; + + static void vop_fb_unref_worker(struct drm_flip_work *work, void *val) +--- a/drivers/gpu/drm/stm/ltdc.c ++++ b/drivers/gpu/drm/stm/ltdc.c +@@ -742,7 +742,6 @@ static const struct drm_crtc_funcs ltdc_ + .enable_vblank = ltdc_crtc_enable_vblank, + .disable_vblank = ltdc_crtc_disable_vblank, + .get_vblank_timestamp = drm_crtc_vblank_helper_get_vblank_timestamp, +- .gamma_set = drm_atomic_helper_legacy_gamma_set, + }; + + /* +--- a/drivers/gpu/drm/vc4/vc4_crtc.c ++++ b/drivers/gpu/drm/vc4/vc4_crtc.c +@@ -937,7 +937,6 @@ static const struct drm_crtc_funcs vc4_c + .reset = vc4_crtc_reset, + .atomic_duplicate_state = vc4_crtc_duplicate_state, + .atomic_destroy_state = vc4_crtc_destroy_state, +- .gamma_set = drm_atomic_helper_legacy_gamma_set, + .enable_vblank = vc4_enable_vblank, + .disable_vblank = vc4_disable_vblank, + .get_vblank_timestamp = drm_crtc_vblank_helper_get_vblank_timestamp, +--- a/drivers/gpu/drm/vc4/vc4_txp.c ++++ b/drivers/gpu/drm/vc4/vc4_txp.c +@@ -380,7 +380,6 @@ static const struct drm_crtc_funcs vc4_t + .reset = vc4_crtc_reset, + .atomic_duplicate_state = vc4_crtc_duplicate_state, + .atomic_destroy_state = vc4_crtc_destroy_state, +- .gamma_set = drm_atomic_helper_legacy_gamma_set, + .enable_vblank = vc4_txp_enable_vblank, + .disable_vblank = vc4_txp_disable_vblank, + }; +--- a/include/drm/drm_atomic_helper.h ++++ b/include/drm/drm_atomic_helper.h +@@ -147,10 +147,6 @@ int drm_atomic_helper_page_flip_target( + uint32_t flags, + uint32_t target, + struct drm_modeset_acquire_ctx *ctx); +-int drm_atomic_helper_legacy_gamma_set(struct drm_crtc *crtc, +- u16 *red, u16 *green, u16 *blue, +- uint32_t size, +- struct drm_modeset_acquire_ctx *ctx); + + /** + * drm_atomic_crtc_for_each_plane - iterate over planes currently attached to CRTC |