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! / --------------- ¯\_(ツ)_/¯