Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/drm_property: make replace_property_blob_from_id a DRM helper

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.

Reviewed-by: Harry Wentland <harry.wentland@amd.com>
Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
Signed-off-by: Melissa Wen <mwen@igalia.com>
Acked-by: Maxime Ripard <mripard@kernel.org>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Melissa Wen and committed by
Alex Deucher
60160310 1e13c564

+71 -48
+1 -1
drivers/gpu/drm/arm/malidp_crtc.c
··· 221 221 222 222 /* 223 223 * The size of the ctm is checked in 224 - * drm_atomic_replace_property_blob_from_id. 224 + * drm_property_replace_blob_from_id. 225 225 */ 226 226 ctm = (struct drm_color_ctm *)state->ctm->data; 227 227 for (i = 0; i < ARRAY_SIZE(ctm->matrix); ++i) {
+5 -47
drivers/gpu/drm/drm_atomic_uapi.c
··· 362 362 return fence_ptr; 363 363 } 364 364 365 - static int 366 - drm_atomic_replace_property_blob_from_id(struct drm_device *dev, 367 - struct drm_property_blob **blob, 368 - uint64_t blob_id, 369 - ssize_t expected_size, 370 - ssize_t expected_elem_size, 371 - bool *replaced) 372 - { 373 - struct drm_property_blob *new_blob = NULL; 374 - 375 - if (blob_id != 0) { 376 - new_blob = drm_property_lookup_blob(dev, blob_id); 377 - if (new_blob == NULL) { 378 - drm_dbg_atomic(dev, 379 - "cannot find blob ID %llu\n", blob_id); 380 - return -EINVAL; 381 - } 382 - 383 - if (expected_size > 0 && 384 - new_blob->length != expected_size) { 385 - drm_dbg_atomic(dev, 386 - "[BLOB:%d] length %zu different from expected %zu\n", 387 - new_blob->base.id, new_blob->length, expected_size); 388 - drm_property_blob_put(new_blob); 389 - return -EINVAL; 390 - } 391 - if (expected_elem_size > 0 && 392 - new_blob->length % expected_elem_size != 0) { 393 - drm_dbg_atomic(dev, 394 - "[BLOB:%d] length %zu not divisible by element size %zu\n", 395 - new_blob->base.id, new_blob->length, expected_elem_size); 396 - drm_property_blob_put(new_blob); 397 - return -EINVAL; 398 - } 399 - } 400 - 401 - *replaced |= drm_property_replace_blob(blob, new_blob); 402 - drm_property_blob_put(new_blob); 403 - 404 - return 0; 405 - } 406 - 407 365 static int drm_atomic_crtc_set_property(struct drm_crtc *crtc, 408 366 struct drm_crtc_state *state, struct drm_property *property, 409 367 uint64_t val) ··· 382 424 } else if (property == config->prop_vrr_enabled) { 383 425 state->vrr_enabled = val; 384 426 } else if (property == config->degamma_lut_property) { 385 - ret = drm_atomic_replace_property_blob_from_id(dev, 427 + ret = drm_property_replace_blob_from_id(dev, 386 428 &state->degamma_lut, 387 429 val, 388 430 -1, sizeof(struct drm_color_lut), ··· 390 432 state->color_mgmt_changed |= replaced; 391 433 return ret; 392 434 } else if (property == config->ctm_property) { 393 - ret = drm_atomic_replace_property_blob_from_id(dev, 435 + ret = drm_property_replace_blob_from_id(dev, 394 436 &state->ctm, 395 437 val, 396 438 sizeof(struct drm_color_ctm), -1, ··· 398 440 state->color_mgmt_changed |= replaced; 399 441 return ret; 400 442 } else if (property == config->gamma_lut_property) { 401 - ret = drm_atomic_replace_property_blob_from_id(dev, 443 + ret = drm_property_replace_blob_from_id(dev, 402 444 &state->gamma_lut, 403 445 val, 404 446 -1, sizeof(struct drm_color_lut), ··· 539 581 } else if (property == plane->color_range_property) { 540 582 state->color_range = val; 541 583 } else if (property == config->prop_fb_damage_clips) { 542 - ret = drm_atomic_replace_property_blob_from_id(dev, 584 + ret = drm_property_replace_blob_from_id(dev, 543 585 &state->fb_damage_clips, 544 586 val, 545 587 -1, ··· 736 778 if (state->link_status != DRM_LINK_STATUS_GOOD) 737 779 state->link_status = val; 738 780 } else if (property == config->hdr_output_metadata_property) { 739 - ret = drm_atomic_replace_property_blob_from_id(dev, 781 + ret = drm_property_replace_blob_from_id(dev, 740 782 &state->hdr_output_metadata, 741 783 val, 742 784 sizeof(struct hdr_output_metadata), -1,
+59
drivers/gpu/drm/drm_property.c
··· 27 27 #include <drm/drm_drv.h> 28 28 #include <drm/drm_file.h> 29 29 #include <drm/drm_framebuffer.h> 30 + #include <drm/drm_print.h> 30 31 #include <drm/drm_property.h> 31 32 32 33 #include "drm_crtc_internal.h" ··· 751 750 return true; 752 751 } 753 752 EXPORT_SYMBOL(drm_property_replace_blob); 753 + 754 + /** 755 + * drm_property_replace_blob_from_id - replace a blob property taking a reference 756 + * @dev: DRM device 757 + * @blob: a pointer to the member blob to be replaced 758 + * @blob_id: the id of the new blob to replace with 759 + * @expected_size: expected size of the blob property 760 + * @expected_elem_size: expected size of an element in the blob property 761 + * @replaced: if the blob was in fact replaced 762 + * 763 + * Look up the new blob from id, take its reference, check expected sizes of 764 + * the blob and its element and replace the old blob by the new one. Advertise 765 + * if the replacement operation was successful. 766 + * 767 + * Return: true if the blob was in fact replaced. -EINVAL if the new blob was 768 + * not found or sizes don't match. 769 + */ 770 + int drm_property_replace_blob_from_id(struct drm_device *dev, 771 + struct drm_property_blob **blob, 772 + uint64_t blob_id, 773 + ssize_t expected_size, 774 + ssize_t expected_elem_size, 775 + bool *replaced) 776 + { 777 + struct drm_property_blob *new_blob = NULL; 778 + 779 + if (blob_id != 0) { 780 + new_blob = drm_property_lookup_blob(dev, blob_id); 781 + if (new_blob == NULL) { 782 + drm_dbg_atomic(dev, 783 + "cannot find blob ID %llu\n", blob_id); 784 + return -EINVAL; 785 + } 786 + 787 + if (expected_size > 0 && 788 + new_blob->length != expected_size) { 789 + drm_dbg_atomic(dev, 790 + "[BLOB:%d] length %zu different from expected %zu\n", 791 + new_blob->base.id, new_blob->length, expected_size); 792 + drm_property_blob_put(new_blob); 793 + return -EINVAL; 794 + } 795 + if (expected_elem_size > 0 && 796 + new_blob->length % expected_elem_size != 0) { 797 + drm_dbg_atomic(dev, 798 + "[BLOB:%d] length %zu not divisible by element size %zu\n", 799 + new_blob->base.id, new_blob->length, expected_elem_size); 800 + drm_property_blob_put(new_blob); 801 + return -EINVAL; 802 + } 803 + } 804 + 805 + *replaced |= drm_property_replace_blob(blob, new_blob); 806 + drm_property_blob_put(new_blob); 807 + 808 + return 0; 809 + } 810 + EXPORT_SYMBOL(drm_property_replace_blob_from_id); 754 811 755 812 int drm_mode_getblob_ioctl(struct drm_device *dev, 756 813 void *data, struct drm_file *file_priv)
+6
include/drm/drm_property.h
··· 279 279 const void *data); 280 280 struct drm_property_blob *drm_property_lookup_blob(struct drm_device *dev, 281 281 uint32_t id); 282 + int drm_property_replace_blob_from_id(struct drm_device *dev, 283 + struct drm_property_blob **blob, 284 + uint64_t blob_id, 285 + ssize_t expected_size, 286 + ssize_t expected_elem_size, 287 + bool *replaced); 282 288 int drm_property_replace_global_blob(struct drm_device *dev, 283 289 struct drm_property_blob **replace, 284 290 size_t length,