All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Daniel Vetter <daniel@ffwll.ch>
Cc: Yannick Fertre <yannick.fertre@st.com>,
	Philippe Cornu <philippe.cornu@st.com>,
	David Airlie <airlied@linux.ie>,
	Russell King <linux@armlinux.org.uk>,
	dri-devel@lists.freedesktop.org, Sandy Huang <hjc@rock-chips.com>,
	Paul Cercueil <paul@crapouillou.net>,
	Tomi Valkeinen <tomi.valkeinen@ti.com>,
	Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
	Thomas Zimmermann <tzimmermann@suse.de>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	Vincent Abriou <vincent.abriou@st.com>,
	Maxime Coquelin <mcoquelin.stm32@gmail.com>,
	Alexandre Torgue <alexandre.torgue@st.com>
Subject: Re: [PATCH v3 1/2] drm: automatic legacy gamma support
Date: Thu, 10 Dec 2020 18:32:31 +0200	[thread overview]
Message-ID: <X9JNn4AZaaG4YOIR@intel.com> (raw)
In-Reply-To: <20201210152739.GF401619@phenom.ffwll.local>

On Thu, Dec 10, 2020 at 04:27:39PM +0100, Daniel Vetter wrote:
> On Thu, Dec 10, 2020 at 04:08:51PM +0200, Tomi Valkeinen wrote:
> > 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.
> > 
> > Add three functions to drm_color_mgmt.c:
> > 
> > drm_crtc_supports_legacy_gamma() which tells if the driver supports
> > setting the legacy gamma.
> > 
> > drm_crtc_gamma_ramp_set() which sets the given gamma ramp to GAMMA_LUT
> > and resets DEGAMMA_LUT and CTM.
> > 
> > drm_crtc_legacy_gamma_set() which sets the given gamma ramp values
> > either using drm_crtc_funcs.gamma_set or drm_crtc_gamma_ramp_set().
> > 
> > These functions are used from the drm_mode_gamma_set_ioctl, and from
> > drm_fb_helper.c when it is dealing with fbdev cmap.
> > 
> > We can then drop drm_atomic_helper_legacy_gamma_set() and remove all its
> > uses.
> > 
> > Note that we need to EXPORT_SYMBOL all the new functions as they are
> > used from drm_fb_helper, but they are declared in drm_crtc_internal.h as
> > they are not supposed to be used by the drivers.
> > 
> > Signed-off-by: Tomi Valkeinen <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              | 138 ++++++++++++++++--
> >  drivers/gpu/drm/drm_crtc_internal.h           |  10 ++
> >  drivers/gpu/drm/drm_fb_helper.c               |  28 ++--
> >  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 -
> >  include/drm/drm_color_mgmt.h                  |   1 -
> >  22 files changed, 148 insertions(+), 121 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > index 2855bb918535..848b06c51b0e 100644
> > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > @@ -5396,7 +5396,6 @@ static void dm_disable_vblank(struct drm_crtc *crtc)
> >  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,
> > diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
> > index 4b485eb512e2..59172acb9738 100644
> > --- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
> > +++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
> > @@ -550,7 +550,6 @@ static void komeda_crtc_vblank_disable(struct drm_crtc *crtc)
> >  }
> >  
> >  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,
> > diff --git a/drivers/gpu/drm/arm/malidp_crtc.c b/drivers/gpu/drm/arm/malidp_crtc.c
> > index 108e7a31bd26..494075ddbef6 100644
> > --- 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(struct drm_crtc *crtc)
> >  }
> >  
> >  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,
> > diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c
> > index 3ebcf5a52c8b..b7bb90ae787f 100644
> > --- a/drivers/gpu/drm/armada/armada_crtc.c
> > +++ b/drivers/gpu/drm/armada/armada_crtc.c
> > @@ -820,7 +820,6 @@ static const struct drm_crtc_funcs armada_crtc_funcs = {
> >  	.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,
> > diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
> > index 9db371f4054f..5b0ec785c516 100644
> > --- a/drivers/gpu/drm/ast/ast_mode.c
> > +++ b/drivers/gpu/drm/ast/ast_mode.c
> > @@ -903,7 +903,6 @@ static void ast_crtc_atomic_destroy_state(struct drm_crtc *crtc,
> >  
> >  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,
> > diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c
> > index c58fa00b4848..05ad75d155e8 100644
> > --- 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_hlcdc_crtc_funcs = {
> >  	.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)
> > diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
> > index ba1507036f26..b114658100b3 100644
> > --- a/drivers/gpu/drm/drm_atomic_helper.c
> > +++ b/drivers/gpu/drm/drm_atomic_helper.c
> > @@ -3499,76 +3499,6 @@ int drm_atomic_helper_page_flip_target(struct drm_crtc *crtc,
> >  }
> >  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
> > diff --git a/drivers/gpu/drm/drm_color_mgmt.c b/drivers/gpu/drm/drm_color_mgmt.c
> > index 3bcabc2f6e0e..c4e4d59c4432 100644
> > --- 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_n);
> >   * 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,
> > @@ -231,6 +228,129 @@ int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc,
> >  }
> >  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.
> > + */
> > +bool drm_crtc_supports_legacy_gamma(struct drm_crtc *crtc)
> > +{
> > +	uint32_t 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);
> > +}
> > +EXPORT_SYMBOL(drm_crtc_supports_legacy_gamma);
> > +
> > +/**
> > + * drm_crtc_gamma_ramp_set - set gamma ramp using GAMMA_LUT property
> > + * @state: atomic state to which the gamma ramp is set
> > + * @crtc: CRTC object
> > + * @blob: property blob for the gamma ramp
> > + *
> > + * Set given gamma ramp to the crtc using GAMMA_LUT property and resetting
> > + * DEGAMMA_LUT and CTM.
> > + */
> > +int drm_crtc_gamma_ramp_set(struct drm_atomic_state *state, struct drm_crtc *crtc,
> > +		       struct drm_property_blob *blob)
> > +{
> > +	struct drm_crtc_state *crtc_state;
> > +	struct drm_property_blob *gamma_blob;
> > +	struct drm_property_blob *degamma_blob;
> > +	bool replaced;
> > +
> > +	gamma_blob = blob;
> > +	degamma_blob = NULL;
> > +
> > +	crtc_state = drm_atomic_get_crtc_state(state, crtc);
> > +	if (IS_ERR(crtc_state))
> > +		return PTR_ERR(crtc_state);
> > +
> > +	/* Set GAMMA_LUT and reset DEGAMMA_LUT and CTM */
> > +	replaced = drm_property_replace_blob(&crtc_state->degamma_lut, degamma_blob);
> > +	replaced |= drm_property_replace_blob(&crtc_state->ctm, NULL);
> > +	replaced |= drm_property_replace_blob(&crtc_state->gamma_lut, gamma_blob);
> > +	crtc_state->color_mgmt_changed |= replaced;
> > +
> > +	return 0;
> > +}
> > +EXPORT_SYMBOL(drm_crtc_gamma_ramp_set);
> > +
> > +/**
> > + * 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.
> > + */
> > +int drm_crtc_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_property_blob *blob;
> > +	struct drm_color_lut *blob_data;
> > +	int i, ret = 0;
> > +
> > +	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;
> > +
> > +	ret = drm_crtc_gamma_ramp_set(state, crtc, blob);
> > +	if (ret)
> > +		goto fail;
> > +
> > +	ret = drm_atomic_commit(state);
> > +
> > +fail:
> > +	drm_atomic_state_put(state);
> > +	drm_property_blob_put(blob);
> > +	return ret;
> > +}
> > +EXPORT_SYMBOL(drm_crtc_legacy_gamma_set);
> > +
> >  /**
> >   * drm_mode_gamma_set_ioctl - set the gamma table
> >   * @dev: DRM device
> > @@ -262,7 +382,7 @@ int drm_mode_gamma_set_ioctl(struct drm_device *dev,
> >  	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 +410,8 @@ int drm_mode_gamma_set_ioctl(struct drm_device *dev,
> >  		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);
> > diff --git a/drivers/gpu/drm/drm_crtc_internal.h b/drivers/gpu/drm/drm_crtc_internal.h
> > index 54d4cf1233e9..74856df6482a 100644
> > --- a/drivers/gpu/drm/drm_crtc_internal.h
> > +++ b/drivers/gpu/drm/drm_crtc_internal.h
> > @@ -51,9 +51,11 @@ struct drm_mode_fb_cmd2;
> >  struct drm_mode_fb_cmd;
> >  struct drm_mode_object;
> >  struct drm_mode_set;
> > +struct drm_modeset_acquire_ctx;
> >  struct drm_plane;
> >  struct drm_plane_state;
> >  struct drm_property;
> > +struct drm_property_blob;
> >  struct edid;
> >  struct kref;
> >  struct work_struct;
> > @@ -114,6 +116,14 @@ int drm_mode_destroy_dumb_ioctl(struct drm_device *dev,
> >  const char *drm_get_color_encoding_name(enum drm_color_encoding encoding);
> >  const char *drm_get_color_range_name(enum drm_color_range range);
> >  
> > +bool drm_crtc_supports_legacy_gamma(struct drm_crtc *crtc);
> > +int drm_crtc_gamma_ramp_set(struct drm_atomic_state *state, struct drm_crtc *crtc,
> > +		       struct drm_property_blob *blob);
> > +int drm_crtc_legacy_gamma_set(struct drm_crtc *crtc,
> > +			      u16 *red, u16 *green, u16 *blue,
> > +			      uint32_t size,
> > +			      struct drm_modeset_acquire_ctx *ctx);
> > +
> >  /* IOCTLs */
> >  int drm_mode_gamma_get_ioctl(struct drm_device *dev,
> >  			     void *data, struct drm_file *file_priv);
> > diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
> > index e82db0f4e771..80e3797f0f01 100644
> > --- a/drivers/gpu/drm/drm_fb_helper.c
> > +++ b/drivers/gpu/drm/drm_fb_helper.c
> > @@ -46,6 +46,7 @@
> >  #include <drm/drm_print.h>
> >  #include <drm/drm_vblank.h>
> >  
> > +#include "drm_crtc_internal.h"
> 
> So this is a bit annoying, because thus far we managed to have a very
> clear split between core and helpers. And I think we can keep that.
> 
> >  #include "drm_crtc_helper_internal.h"
> >  #include "drm_internal.h"
> >  
> > @@ -136,15 +137,15 @@ static void drm_fb_helper_restore_lut_atomic(struct drm_crtc *crtc)
> >  {
> >  	uint16_t *r_base, *g_base, *b_base;
> >  
> > -	if (crtc->funcs->gamma_set == NULL)
> > +	if (!drm_crtc_supports_legacy_gamma(crtc))
> >  		return;
> >  
> >  	r_base = crtc->gamma_store;
> >  	g_base = r_base + crtc->gamma_size;
> >  	b_base = g_base + crtc->gamma_size;
> >  
> > -	crtc->funcs->gamma_set(crtc, r_base, g_base, b_base,
> > -			       crtc->gamma_size, NULL);
> > +	drm_crtc_legacy_gamma_set(crtc, r_base, g_base, b_base,
> > +				  crtc->gamma_size, NULL);
> 
> This is only used by legacy non-atomic drivers. It's pretty much
> impossible to make kgdb work with atomic drivers, so really let's just not
> bother and keep the code as-is.
> 
> >  }
> >  
> >  /**
> > @@ -946,7 +947,7 @@ static int setcmap_legacy(struct fb_cmap *cmap, struct fb_info *info)
> >  	drm_modeset_lock_all(fb_helper->dev);
> >  	drm_client_for_each_modeset(modeset, &fb_helper->client) {
> >  		crtc = modeset->crtc;
> > -		if (!crtc->funcs->gamma_set || !crtc->gamma_size) {
> > +		if (!drm_crtc_supports_legacy_gamma(crtc)) {
> >  			ret = -EINVAL;
> >  			goto out;
> >  		}
> > @@ -964,8 +965,8 @@ static int setcmap_legacy(struct fb_cmap *cmap, struct fb_info *info)
> >  		memcpy(g + cmap->start, cmap->green, cmap->len * sizeof(*g));
> >  		memcpy(b + cmap->start, cmap->blue, cmap->len * sizeof(*b));
> >  
> > -		ret = crtc->funcs->gamma_set(crtc, r, g, b,
> > -					     crtc->gamma_size, NULL);
> > +		ret = drm_crtc_legacy_gamma_set(crtc, r, g, b, crtc->gamma_size,
> > +						NULL);
> >  		if (ret)
> >  			goto out;
> 
> Same here.
> 
> >  	}
> > @@ -1024,12 +1025,10 @@ static int setcmap_atomic(struct fb_cmap *cmap, struct fb_info *info)
> >  	struct drm_device *dev = fb_helper->dev;
> >  	struct drm_property_blob *gamma_lut = NULL;
> >  	struct drm_modeset_acquire_ctx ctx;
> > -	struct drm_crtc_state *crtc_state;
> >  	struct drm_atomic_state *state;
> >  	struct drm_mode_set *modeset;
> >  	struct drm_crtc *crtc;
> >  	u16 *r, *g, *b;
> > -	bool replaced;
> >  	int ret = 0;
> >  
> >  	drm_modeset_acquire_init(&ctx, 0);
> > @@ -1053,18 +1052,9 @@ static int setcmap_atomic(struct fb_cmap *cmap, struct fb_info *info)
> >  			goto out_state;
> >  		}
> >  
> > -		crtc_state = drm_atomic_get_crtc_state(state, crtc);
> > -		if (IS_ERR(crtc_state)) {
> > -			ret = PTR_ERR(crtc_state);
> > +		ret = drm_crtc_gamma_ramp_set(state, crtc, gamma_lut);
> > +		if (ret)
> 
> You're nesting an atomic commit in an atomic commit here, that will go
> boom. I guess ideally we'd move this into drm_client_modeset so it
> remembers the fbdev gamma ramp and does it all in one go.

IIRC that's pretty much what's in my branch that I mentioned earlier.
Mentioning it again in case someone wants a leg up for implementing
this idea ;)

-- 
Ville Syrjälä
Intel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  parent reply	other threads:[~2020-12-10 16:32 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-10 14:08 [PATCH v3 0/2] drm: automatic legacy gamma support Tomi Valkeinen
2020-12-10 14:08 ` [PATCH v3 1/2] " Tomi Valkeinen
2020-12-10 15:27   ` Daniel Vetter
2020-12-10 15:43     ` Tomi Valkeinen
2020-12-10 16:39       ` Daniel Vetter
2020-12-10 16:32     ` Ville Syrjälä [this message]
2020-12-10 16:45       ` Tomi Valkeinen
2020-12-10 14:08 ` [PATCH v3 2/2] drm: add legacy support for using degamma for gamma Tomi Valkeinen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=X9JNn4AZaaG4YOIR@intel.com \
    --to=ville.syrjala@linux.intel.com \
    --cc=airlied@linux.ie \
    --cc=alexandre.torgue@st.com \
    --cc=daniel@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=hjc@rock-chips.com \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux@armlinux.org.uk \
    --cc=matthias.bgg@gmail.com \
    --cc=mcoquelin.stm32@gmail.com \
    --cc=paul@crapouillou.net \
    --cc=philippe.cornu@st.com \
    --cc=tomi.valkeinen@ti.com \
    --cc=tzimmermann@suse.de \
    --cc=vincent.abriou@st.com \
    --cc=yannick.fertre@st.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.