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

drm/object: Add drm_object_property_get_default_value() function

Some functions to create properties (drm_plane_create_zpos_property or
drm_plane_create_color_properties for example) will ask for a range of
acceptable value and an initial one.

This initial value is then stored in the values array for that property.

Let's provide an helper to access this property.

Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
Link: https://patchwork.freedesktop.org/patch/msgid/20220221095918.18763-7-maxime@cerno.tech

authored by

Dave Stevenson and committed by
Maxime Ripard
adf47b75 f6e63222

+50 -10
+43 -10
drivers/gpu/drm/drm_mode_object.c
··· 297 297 } 298 298 EXPORT_SYMBOL(drm_object_property_set_value); 299 299 300 + static int __drm_object_property_get_prop_value(struct drm_mode_object *obj, 301 + struct drm_property *property, 302 + uint64_t *val) 303 + { 304 + int i; 305 + 306 + for (i = 0; i < obj->properties->count; i++) { 307 + if (obj->properties->properties[i] == property) { 308 + *val = obj->properties->values[i]; 309 + return 0; 310 + } 311 + } 312 + 313 + return -EINVAL; 314 + } 315 + 300 316 static int __drm_object_property_get_value(struct drm_mode_object *obj, 301 317 struct drm_property *property, 302 318 uint64_t *val) 303 319 { 304 - int i; 305 320 306 321 /* read-only properties bypass atomic mechanism and still store 307 322 * their value in obj->properties->values[].. mostly to avoid ··· 326 311 !(property->flags & DRM_MODE_PROP_IMMUTABLE)) 327 312 return drm_atomic_get_property(obj, property, val); 328 313 329 - for (i = 0; i < obj->properties->count; i++) { 330 - if (obj->properties->properties[i] == property) { 331 - *val = obj->properties->values[i]; 332 - return 0; 333 - } 334 - 335 - } 336 - 337 - return -EINVAL; 314 + return __drm_object_property_get_prop_value(obj, property, val); 338 315 } 339 316 340 317 /** ··· 354 347 return __drm_object_property_get_value(obj, property, val); 355 348 } 356 349 EXPORT_SYMBOL(drm_object_property_get_value); 350 + 351 + /** 352 + * drm_object_property_get_default_value - retrieve the default value of a 353 + * property when in atomic mode. 354 + * @obj: drm mode object to get property value from 355 + * @property: property to retrieve 356 + * @val: storage for the property value 357 + * 358 + * This function retrieves the default state of the given property as passed in 359 + * to drm_object_attach_property 360 + * 361 + * Only atomic drivers should call this function directly, as for non-atomic 362 + * drivers it will return the current value. 363 + * 364 + * Returns: 365 + * Zero on success, error code on failure. 366 + */ 367 + int drm_object_property_get_default_value(struct drm_mode_object *obj, 368 + struct drm_property *property, 369 + uint64_t *val) 370 + { 371 + WARN_ON(!drm_drv_uses_atomic_modeset(property->dev)); 372 + 373 + return __drm_object_property_get_prop_value(obj, property, val); 374 + } 375 + EXPORT_SYMBOL(drm_object_property_get_default_value); 357 376 358 377 /* helper for getconnector and getproperties ioctls */ 359 378 int drm_mode_object_get_properties(struct drm_mode_object *obj, bool atomic,
+7
include/drm/drm_mode_object.h
··· 98 98 * Hence atomic drivers should not use drm_object_property_set_value() 99 99 * and drm_object_property_get_value() on mutable objects, i.e. those 100 100 * without the DRM_MODE_PROP_IMMUTABLE flag set. 101 + * 102 + * For atomic drivers the default value of properties is stored in this 103 + * array, so drm_object_property_get_default_value can be used to 104 + * retrieve it. 101 105 */ 102 106 uint64_t values[DRM_OBJECT_MAX_PROPERTY]; 103 107 }; ··· 130 126 int drm_object_property_get_value(struct drm_mode_object *obj, 131 127 struct drm_property *property, 132 128 uint64_t *value); 129 + int drm_object_property_get_default_value(struct drm_mode_object *obj, 130 + struct drm_property *property, 131 + uint64_t *val); 133 132 134 133 void drm_object_attach_property(struct drm_mode_object *obj, 135 134 struct drm_property *property,