Commit 179ab8e7 authored by Harry Wentland's avatar Harry Wentland Committed by Simon Ser
Browse files

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: default avatarSimon Ser <contact@emersion.fr>
Signed-off-by: default avatarAlex Hung <alex.hung@amd.com>
Signed-off-by: default avatarHarry Wentland <harry.wentland@amd.com>
Reviewed-by: default avatarDaniel Stone <daniels@collabora.com>
Reviewed-by: default avatarMelissa Wen <mwen@igalia.com>
Reviewed-by: default avatarSebastian Wick <sebastian.wick@redhat.com>
Signed-off-by: default avatarSimon Ser <contact@emersion.fr>
Link: https://patch.msgid.link/20251115000237.3561250-12-alex.hung@amd.com
parent 2afc3184
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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);
+1 −0
Original line number Diff line number Diff line
@@ -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);
+7 −0
Original line number Diff line number Diff line
@@ -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;
	}
+18 −0
Original line number Diff line number Diff line
@@ -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);
+7 −0
Original line number Diff line number Diff line
@@ -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:
	 *
Loading