If colorop TYPE requires a data blob, userspace have to set a blob
whenever enables this colorop, i.e. when setting this colorop bypass
property to false.
Fixes: e5719e7f1900 ("drm/colorop: Add 3x4 CTM type")
Signed-off-by: Melissa Wen <[email protected]>
---
drivers/gpu/drm/drm_atomic.c | 22 ++++++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index 86e4348cad58..7b9d52cf87d0 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -947,8 +947,13 @@ drm_atomic_add_pipeline_colorops(struct drm_atomic_commit
*state,
* drm_atomic_colorop_check - check new colorop state
* @new_colorop_state: new colorop state to check
*
- * Ensure that the colorop in @new_colorop_state belongs to an active color
- * pipeline, i.e. it's in the chain of colorops set to the color_pipeline
+ * Check that a colorop whose TYPE requires a data blob has one when it's
+ * enabled, i.e. userspace can't clear (or never set) the DATA property while
+ * taking the colorop out of bypass, since drivers would have nothing to
+ * program.
+ *
+ * Also ensure that the colorop in @new_colorop_state belongs to an active
+ * color pipeline, i.e. it's in the chain of colorops set to the color_pipeline
* property of current, old or new plane state.
*
* Userspace is allowed to finalize colorop's settings in the same commit that
@@ -972,6 +977,19 @@ static int drm_atomic_colorop_check(const struct
drm_colorop_state *new_colorop_
if (state->duplicated)
return 0;
+ /*
+ * Reject if colorop TYPE requires a DATA but set bypass to false and
+ * no blob submitted
+ */
+ if (new_colorop_state->colorop->data_property &&
+ !new_colorop_state->bypass && !new_colorop_state->data) {
+ drm_dbg_atomic(new_colorop_state->colorop->dev,
+ "[COLOROP:%d:%d] enabled without a DATA blob\n",
+ new_colorop_state->colorop->base.id,
+ new_colorop_state->colorop->type);
+ return -EINVAL;
+ }
+
/* Not a plane colorop */
if (!plane)
return 0;
--
2.53.0