Re: [PATCH 02/36] drm/drm_property: make replace_property_blob_from_id a DRM helper

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, May 23, 2023 at 09:14:46PM -0100, Melissa Wen wrote:
> Place it in drm_property where drm_property_replace_blob and
> drm_property_lookup_blob live. Then we can use the DRM helper for
> driver-specific KMS properties too.
> 
> Signed-off-by: Melissa Wen <mwen@xxxxxxxxxx>

I know that I've got Cc-ed because of a comment, but I did have a look at the whole
patch. If it is useful, then you can add

Reviewed-by: Liviu Dudau <liviu.dudau@xxxxxxx>

Best regards,
Liviu

> ---
>  drivers/gpu/drm/arm/malidp_crtc.c |  2 +-
>  drivers/gpu/drm/drm_atomic_uapi.c | 43 ++++-----------------------
>  drivers/gpu/drm/drm_property.c    | 49 +++++++++++++++++++++++++++++++
>  include/drm/drm_property.h        |  6 ++++
>  4 files changed, 61 insertions(+), 39 deletions(-)
> 
> diff --git a/drivers/gpu/drm/arm/malidp_crtc.c b/drivers/gpu/drm/arm/malidp_crtc.c
> index dc01c43f6193..d72c22dcf685 100644
> --- a/drivers/gpu/drm/arm/malidp_crtc.c
> +++ b/drivers/gpu/drm/arm/malidp_crtc.c
> @@ -221,7 +221,7 @@ static int malidp_crtc_atomic_check_ctm(struct drm_crtc *crtc,
>  
>  	/*
>  	 * The size of the ctm is checked in
> -	 * drm_atomic_replace_property_blob_from_id.
> +	 * drm_property_replace_blob_from_id.
>  	 */
>  	ctm = (struct drm_color_ctm *)state->ctm->data;
>  	for (i = 0; i < ARRAY_SIZE(ctm->matrix); ++i) {
> diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
> index c06d0639d552..b76d50ae244c 100644
> --- a/drivers/gpu/drm/drm_atomic_uapi.c
> +++ b/drivers/gpu/drm/drm_atomic_uapi.c
> @@ -362,39 +362,6 @@ static s32 __user *get_out_fence_for_connector(struct drm_atomic_state *state,
>  	return fence_ptr;
>  }
>  
> -static int
> -drm_atomic_replace_property_blob_from_id(struct drm_device *dev,
> -					 struct drm_property_blob **blob,
> -					 uint64_t blob_id,
> -					 ssize_t expected_size,
> -					 ssize_t expected_elem_size,
> -					 bool *replaced)
> -{
> -	struct drm_property_blob *new_blob = NULL;
> -
> -	if (blob_id != 0) {
> -		new_blob = drm_property_lookup_blob(dev, blob_id);
> -		if (new_blob == NULL)
> -			return -EINVAL;
> -
> -		if (expected_size > 0 &&
> -		    new_blob->length != expected_size) {
> -			drm_property_blob_put(new_blob);
> -			return -EINVAL;
> -		}
> -		if (expected_elem_size > 0 &&
> -		    new_blob->length % expected_elem_size != 0) {
> -			drm_property_blob_put(new_blob);
> -			return -EINVAL;
> -		}
> -	}
> -
> -	*replaced |= drm_property_replace_blob(blob, new_blob);
> -	drm_property_blob_put(new_blob);
> -
> -	return 0;
> -}
> -
>  static int drm_atomic_crtc_set_property(struct drm_crtc *crtc,
>  		struct drm_crtc_state *state, struct drm_property *property,
>  		uint64_t val)
> @@ -415,7 +382,7 @@ static int drm_atomic_crtc_set_property(struct drm_crtc *crtc,
>  	} else if (property == config->prop_vrr_enabled) {
>  		state->vrr_enabled = val;
>  	} else if (property == config->degamma_lut_property) {
> -		ret = drm_atomic_replace_property_blob_from_id(dev,
> +		ret = drm_property_replace_blob_from_id(dev,
>  					&state->degamma_lut,
>  					val,
>  					-1, sizeof(struct drm_color_lut),
> @@ -423,7 +390,7 @@ static int drm_atomic_crtc_set_property(struct drm_crtc *crtc,
>  		state->color_mgmt_changed |= replaced;
>  		return ret;
>  	} else if (property == config->ctm_property) {
> -		ret = drm_atomic_replace_property_blob_from_id(dev,
> +		ret = drm_property_replace_blob_from_id(dev,
>  					&state->ctm,
>  					val,
>  					sizeof(struct drm_color_ctm), -1,
> @@ -431,7 +398,7 @@ static int drm_atomic_crtc_set_property(struct drm_crtc *crtc,
>  		state->color_mgmt_changed |= replaced;
>  		return ret;
>  	} else if (property == config->gamma_lut_property) {
> -		ret = drm_atomic_replace_property_blob_from_id(dev,
> +		ret = drm_property_replace_blob_from_id(dev,
>  					&state->gamma_lut,
>  					val,
>  					-1, sizeof(struct drm_color_lut),
> @@ -563,7 +530,7 @@ static int drm_atomic_plane_set_property(struct drm_plane *plane,
>  	} else if (property == plane->color_range_property) {
>  		state->color_range = val;
>  	} else if (property == config->prop_fb_damage_clips) {
> -		ret = drm_atomic_replace_property_blob_from_id(dev,
> +		ret = drm_property_replace_blob_from_id(dev,
>  					&state->fb_damage_clips,
>  					val,
>  					-1,
> @@ -727,7 +694,7 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector,
>  		if (state->link_status != DRM_LINK_STATUS_GOOD)
>  			state->link_status = val;
>  	} else if (property == config->hdr_output_metadata_property) {
> -		ret = drm_atomic_replace_property_blob_from_id(dev,
> +		ret = drm_property_replace_blob_from_id(dev,
>  				&state->hdr_output_metadata,
>  				val,
>  				sizeof(struct hdr_output_metadata), -1,
> diff --git a/drivers/gpu/drm/drm_property.c b/drivers/gpu/drm/drm_property.c
> index dfec479830e4..f72ef6493340 100644
> --- a/drivers/gpu/drm/drm_property.c
> +++ b/drivers/gpu/drm/drm_property.c
> @@ -751,6 +751,55 @@ bool drm_property_replace_blob(struct drm_property_blob **blob,
>  }
>  EXPORT_SYMBOL(drm_property_replace_blob);
>  
> +/**
> + * drm_property_replace_blob_from_id - replace a blob property taking a reference
> + * @dev: DRM device
> + * @blob: a pointer to the member blob to be replaced
> + * @blob_id: the id of the new blob to replace with
> + * @expected_size: expected size of the blob property
> + * @expected_elem_size: expected size of an element in the blob property
> + * @replaced: if the blob was in fact replaced
> + *
> + * Look up the new blob from id, take its reference, check expected sizes of
> + * the blob and its element and replace the old blob by the new one. Advertise
> + * if the replacement operation was successful.
> + *
> + * Return: true if the blob was in fact replaced. -EINVAL if the new blob was
> + * not found or sizes don't match.
> + */
> +int drm_property_replace_blob_from_id(struct drm_device *dev,
> +					 struct drm_property_blob **blob,
> +					 uint64_t blob_id,
> +					 ssize_t expected_size,
> +					 ssize_t expected_elem_size,
> +					 bool *replaced)
> +{
> +	struct drm_property_blob *new_blob = NULL;
> +
> +	if (blob_id != 0) {
> +		new_blob = drm_property_lookup_blob(dev, blob_id);
> +		if (new_blob == NULL)
> +			return -EINVAL;
> +
> +		if (expected_size > 0 &&
> +		    new_blob->length != expected_size) {
> +			drm_property_blob_put(new_blob);
> +			return -EINVAL;
> +		}
> +		if (expected_elem_size > 0 &&
> +		    new_blob->length % expected_elem_size != 0) {
> +			drm_property_blob_put(new_blob);
> +			return -EINVAL;
> +		}
> +	}
> +
> +	*replaced |= drm_property_replace_blob(blob, new_blob);
> +	drm_property_blob_put(new_blob);
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL(drm_property_replace_blob_from_id);
> +
>  int drm_mode_getblob_ioctl(struct drm_device *dev,
>  			   void *data, struct drm_file *file_priv)
>  {
> diff --git a/include/drm/drm_property.h b/include/drm/drm_property.h
> index 65bc9710a470..082f29156b3e 100644
> --- a/include/drm/drm_property.h
> +++ b/include/drm/drm_property.h
> @@ -279,6 +279,12 @@ struct drm_property_blob *drm_property_create_blob(struct drm_device *dev,
>  						   const void *data);
>  struct drm_property_blob *drm_property_lookup_blob(struct drm_device *dev,
>  						   uint32_t id);
> +int drm_property_replace_blob_from_id(struct drm_device *dev,
> +				      struct drm_property_blob **blob,
> +				      uint64_t blob_id,
> +				      ssize_t expected_size,
> +				      ssize_t expected_elem_size,
> +				      bool *replaced);
>  int drm_property_replace_global_blob(struct drm_device *dev,
>  				     struct drm_property_blob **replace,
>  				     size_t length,
> -- 
> 2.39.2
> 

-- 
====================
| I would like to |
| fix the world,  |
| but they're not |
| giving me the   |
 \ source code!  /
  ---------------
    ¯\_(ツ)_/¯



[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux