diff options
Diffstat (limited to 'drivers/gpu/drm/drm_plane.c')
| -rw-r--r-- | drivers/gpu/drm/drm_plane.c | 56 | 
1 files changed, 56 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c index 672c655c7a8e..57662a1fd345 100644 --- a/drivers/gpu/drm/drm_plane.c +++ b/drivers/gpu/drm/drm_plane.c @@ -140,6 +140,25 @@   *     DRM_FORMAT_MOD_LINEAR. Before linux kernel release v5.1 there have been   *     various bugs in this area with inconsistencies between the capability   *     flag and per-plane properties. + * + * SIZE_HINTS: + *     Blob property which contains the set of recommended plane size + *     which can used for simple "cursor like" use cases (eg. no scaling). + *     Using these hints frees userspace from extensive probing of + *     supported plane sizes through atomic/setcursor ioctls. + * + *     The blob contains an array of struct drm_plane_size_hint, in + *     order of preference. For optimal usage userspace should pick + *     the first size that satisfies its own requirements. + * + *     Drivers should only attach this property to planes that + *     support a very limited set of sizes. + * + *     Note that property value 0 (ie. no blob) is reserved for potential + *     future use. Current userspace is expected to ignore the property + *     if the value is 0, and fall back to some other means (eg. + *     &DRM_CAP_CURSOR_WIDTH and &DRM_CAP_CURSOR_HEIGHT) to determine + *     the appropriate plane size to use.   */  static unsigned int drm_num_planes(struct drm_device *dev) @@ -1729,3 +1748,40 @@ int drm_plane_create_scaling_filter_property(struct drm_plane *plane,  	return 0;  }  EXPORT_SYMBOL(drm_plane_create_scaling_filter_property); + +/** + * drm_plane_add_size_hints_property - create a size hints property + * + * @plane: drm plane + * @hints: size hints + * @num_hints: number of size hints + * + * Create a size hints property for the plane. + * + * RETURNS: + * Zero for success or -errno + */ +int drm_plane_add_size_hints_property(struct drm_plane *plane, +				      const struct drm_plane_size_hint *hints, +				      int num_hints) +{ +	struct drm_device *dev = plane->dev; +	struct drm_mode_config *config = &dev->mode_config; +	struct drm_property_blob *blob; + +	/* extending to other plane types needs actual thought */ +	if (drm_WARN_ON(dev, plane->type != DRM_PLANE_TYPE_CURSOR)) +		return -EINVAL; + +	blob = drm_property_create_blob(dev, +					array_size(sizeof(hints[0]), num_hints), +					hints); +	if (IS_ERR(blob)) +		return PTR_ERR(blob); + +	drm_object_attach_property(&plane->base, config->size_hints_property, +				   blob->base.id); + +	return 0; +} +EXPORT_SYMBOL(drm_plane_add_size_hints_property);  |