mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
drm/colorop: Introduce DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE
With the introduction of the pre-blending color pipeline we can no longer have color operations that don't have a clear position in the color pipeline. We deprecate all existing plane properties. For upstream drivers those are: - COLOR_ENCODING - COLOR_RANGE Drivers are expected to ignore these properties when programming the HW. DRM clients that register with DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE will not be allowed to set the COLOR_ENCODING and COLOR_RANGE properties. Setting of the COLOR_PIPELINE plane property or drm_colorop properties is only allowed for userspace that sets this client cap. Reviewed-by: Simon Ser <contact@emersion.fr> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Harry Wentland <harry.wentland@amd.com> Reviewed-by: Daniel Stone <daniels@collabora.com> Reviewed-by: Melissa Wen <mwen@igalia.com> Reviewed-by: Sebastian Wick <sebastian.wick@redhat.com> Signed-off-by: Simon Ser <contact@emersion.fr> Link: https://patch.msgid.link/20251115000237.3561250-12-alex.hung@amd.com
This commit is contained in:
committed by
Simon Ser
parent
2afc3184f3
commit
179ab8e7d7
@@ -3439,6 +3439,7 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
|
||||
* properties reflect the latest status.
|
||||
*/
|
||||
ret = drm_mode_object_get_properties(&connector->base, file_priv->atomic,
|
||||
file_priv->plane_color_pipeline,
|
||||
(uint32_t __user *)(unsigned long)(out_resp->props_ptr),
|
||||
(uint64_t __user *)(unsigned long)(out_resp->prop_values_ptr),
|
||||
&out_resp->count_props);
|
||||
|
||||
@@ -163,6 +163,7 @@ struct drm_mode_object *__drm_mode_object_find(struct drm_device *dev,
|
||||
void drm_mode_object_unregister(struct drm_device *dev,
|
||||
struct drm_mode_object *object);
|
||||
int drm_mode_object_get_properties(struct drm_mode_object *obj, bool atomic,
|
||||
bool plane_color_pipeline,
|
||||
uint32_t __user *prop_ptr,
|
||||
uint64_t __user *prop_values,
|
||||
uint32_t *arg_count_props);
|
||||
|
||||
@@ -373,6 +373,13 @@ drm_setclientcap(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
||||
return -EINVAL;
|
||||
file_priv->supports_virtualized_cursor_plane = req->value;
|
||||
break;
|
||||
case DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE:
|
||||
if (!file_priv->atomic)
|
||||
return -EINVAL;
|
||||
if (req->value > 1)
|
||||
return -EINVAL;
|
||||
file_priv->plane_color_pipeline = req->value;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <drm/drm_device.h>
|
||||
#include <drm/drm_file.h>
|
||||
#include <drm/drm_mode_object.h>
|
||||
#include <drm/drm_plane.h>
|
||||
#include <drm/drm_print.h>
|
||||
|
||||
#include "drm_crtc_internal.h"
|
||||
@@ -386,6 +387,7 @@ EXPORT_SYMBOL(drm_object_property_get_default_value);
|
||||
|
||||
/* helper for getconnector and getproperties ioctls */
|
||||
int drm_mode_object_get_properties(struct drm_mode_object *obj, bool atomic,
|
||||
bool plane_color_pipeline,
|
||||
uint32_t __user *prop_ptr,
|
||||
uint64_t __user *prop_values,
|
||||
uint32_t *arg_count_props)
|
||||
@@ -399,6 +401,21 @@ int drm_mode_object_get_properties(struct drm_mode_object *obj, bool atomic,
|
||||
if ((prop->flags & DRM_MODE_PROP_ATOMIC) && !atomic)
|
||||
continue;
|
||||
|
||||
if (plane_color_pipeline && obj->type == DRM_MODE_OBJECT_PLANE) {
|
||||
struct drm_plane *plane = obj_to_plane(obj);
|
||||
|
||||
if (prop == plane->color_encoding_property ||
|
||||
prop == plane->color_range_property)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!plane_color_pipeline && obj->type == DRM_MODE_OBJECT_PLANE) {
|
||||
struct drm_plane *plane = obj_to_plane(obj);
|
||||
|
||||
if (prop == plane->color_pipeline_property)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (*arg_count_props > count) {
|
||||
ret = __drm_object_property_get_value(obj, prop, &val);
|
||||
if (ret)
|
||||
@@ -457,6 +474,7 @@ int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data,
|
||||
}
|
||||
|
||||
ret = drm_mode_object_get_properties(obj, file_priv->atomic,
|
||||
file_priv->plane_color_pipeline,
|
||||
(uint32_t __user *)(unsigned long)(arg->props_ptr),
|
||||
(uint64_t __user *)(unsigned long)(arg->prop_values_ptr),
|
||||
&arg->count_props);
|
||||
|
||||
@@ -206,6 +206,13 @@ struct drm_file {
|
||||
*/
|
||||
bool writeback_connectors;
|
||||
|
||||
/**
|
||||
* @plane_color_pipeline:
|
||||
*
|
||||
* True if client understands plane color pipelines
|
||||
*/
|
||||
bool plane_color_pipeline;
|
||||
|
||||
/**
|
||||
* @was_master:
|
||||
*
|
||||
|
||||
@@ -906,6 +906,21 @@ struct drm_get_cap {
|
||||
*/
|
||||
#define DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT 6
|
||||
|
||||
/**
|
||||
* DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE
|
||||
*
|
||||
* If set to 1 the DRM core will allow setting the COLOR_PIPELINE
|
||||
* property on a &drm_plane, as well as drm_colorop properties.
|
||||
*
|
||||
* Setting of these plane properties will be rejected when this client
|
||||
* cap is set:
|
||||
* - COLOR_ENCODING
|
||||
* - COLOR_RANGE
|
||||
*
|
||||
* The client must enable &DRM_CLIENT_CAP_ATOMIC first.
|
||||
*/
|
||||
#define DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE 7
|
||||
|
||||
/* DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */
|
||||
struct drm_set_client_cap {
|
||||
__u64 capability;
|
||||
|
||||
Reference in New Issue
Block a user