drm_atomic_get_colorop_state() allocates a new colorop state by
duplicating the current one and inserts it into the atomic commit as
a single operation.

However, a later change will need to insert a colorop state into a
commit without going through the full allocation and duplication path
in drm_atomic_get_colorop_state().

Extract the state insertion logic into a new static
drm_atomic_commit_set_colorop_state() helper, and convert
drm_atomic_get_colorop_state() to use it.

Signed-off-by: Maxime Ripard <[email protected]>
---
 drivers/gpu/drm/drm_atomic.c | 29 +++++++++++++++++++++++------
 1 file changed, 23 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index 56542494ab56..f006de9b7263 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -704,10 +704,27 @@ drm_atomic_get_plane_state(struct drm_atomic_commit 
*state,
 
        return plane_state;
 }
 EXPORT_SYMBOL(drm_atomic_get_plane_state);
 
+static int drm_atomic_commit_set_colorop_state(struct drm_atomic_commit 
*commit,
+                                              struct drm_colorop *colorop,
+                                              struct drm_colorop_state 
*colorop_state)
+{
+       int index = drm_colorop_index(colorop);
+
+       drm_modeset_lock_assert_held(&colorop->plane->mutex);
+
+       commit->colorops[index].state_to_destroy = colorop_state;
+       commit->colorops[index].old_state = colorop->state;
+       commit->colorops[index].new_state = colorop_state;
+       commit->colorops[index].ptr = colorop;
+       colorop_state->state = commit;
+
+       return 0;
+}
+
 /**
  * drm_atomic_get_colorop_state - get colorop state
  * @state: global atomic state object
  * @colorop: colorop to get state object for
  *
@@ -723,11 +740,11 @@ EXPORT_SYMBOL(drm_atomic_get_plane_state);
  */
 struct drm_colorop_state *
 drm_atomic_get_colorop_state(struct drm_atomic_commit *state,
                             struct drm_colorop *colorop)
 {
-       int ret, index = drm_colorop_index(colorop);
+       int ret;
        struct drm_colorop_state *colorop_state;
 
        WARN_ON(!state->acquire_ctx);
 
        colorop_state = drm_atomic_get_new_colorop_state(state, colorop);
@@ -740,15 +757,15 @@ drm_atomic_get_colorop_state(struct drm_atomic_commit 
*state,
 
        colorop_state = drm_atomic_helper_colorop_duplicate_state(colorop);
        if (!colorop_state)
                return ERR_PTR(-ENOMEM);
 
-       state->colorops[index].state = colorop_state;
-       state->colorops[index].ptr = colorop;
-       state->colorops[index].old_state = colorop->state;
-       state->colorops[index].new_state = colorop_state;
-       colorop_state->state = state;
+       ret = drm_atomic_commit_set_colorop_state(state, colorop, 
colorop_state);
+       if (ret) {
+               drm_colorop_atomic_destroy_state(colorop, colorop_state);
+               return ERR_PTR(ret);
+       }
 
        drm_dbg_atomic(colorop->dev, "Added [COLOROP:%d:%d] %p state to %p\n",
                       colorop->base.id, colorop->type, colorop_state, state);
 
        return colorop_state;

-- 
2.54.0

Reply via email to