On 3/18/2026 9:57 PM, Melissa Wen wrote:
For suspend/resume to work correctly, do for colorop state the same we
do for plane/crtc/connector states: duplicate the state of colorops in a
color pipeline if it's in use by a given plane when suspending and
restore cached colorop states when resuming.

Fixes: 2afc3184f3b3 ("drm/plane: Add COLOR PIPELINE property")
Reviewed-by: Harry Wentland <[email protected]>
Reviewed-by: Alex Hung <[email protected]>
Reviewed-by: Chaitanya Kumar Borah <[email protected]>
Signed-off-by: Melissa Wen <[email protected]>
---

Changes from v1 
(https://lore.kernel.org/dri-devel/[email protected]/):
- keep the object hierarchy (Chaitanya)
- add r-b from Harry, Alex H. and Chaitanya (pending to confirm)

Chaitanya,

I kept the fix for unused-variable warning together because the warning
only appears with this new usage of for_each_new_colorop_in_state() in
drm_atomic_helper_commit_duplicated_state() here. Let me know if you
don't agree with this approach.


Please go ahead. Just add a "while at it" to the commit message.

Melissa

---
  drivers/gpu/drm/drm_atomic_helper.c | 12 ++++++++++++
  include/drm/drm_atomic.h            |  3 ++-
  2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_atomic_helper.c 
b/drivers/gpu/drm/drm_atomic_helper.c
index 26953ed6b53e..481f92a03683 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -3751,6 +3751,13 @@ drm_atomic_helper_duplicate_state(struct drm_device *dev,
                        err = PTR_ERR(plane_state);
                        goto free;
                }
+
+               if (plane_state->color_pipeline) {
+                       err = drm_atomic_add_affected_colorops(state, plane);
+                       if (err)
+                               goto free;
+               }
+
        }
drm_connector_list_iter_begin(dev, &conn_iter);
@@ -3856,6 +3863,8 @@ int drm_atomic_helper_commit_duplicated_state(struct 
drm_atomic_state *state,
        int i, ret;
        struct drm_plane *plane;
        struct drm_plane_state *new_plane_state;
+       struct drm_colorop *colorop;
+       struct drm_colorop_state *new_colorop_state;
        struct drm_connector *connector;
        struct drm_connector_state *new_conn_state;
        struct drm_crtc *crtc;
@@ -3863,6 +3872,9 @@ int drm_atomic_helper_commit_duplicated_state(struct 
drm_atomic_state *state,
state->acquire_ctx = ctx; + for_each_new_colorop_in_state(state, colorop, new_colorop_state, i)
+               state->colorops[i].old_state = colorop->state;
+
        for_each_new_plane_in_state(state, plane, new_plane_state, i)
                state->planes[i].old_state = plane->state;
diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h
index 0b1b32bcd2bd..96fd32a3e92c 100644
--- a/include/drm/drm_atomic.h
+++ b/include/drm/drm_atomic.h
@@ -1102,7 +1102,8 @@ void drm_state_dump(struct drm_device *dev, struct 
drm_printer *p);
                for_each_if ((__state)->colorops[__i].ptr &&         \
                             ((colorop) = (__state)->colorops[__i].ptr,      \
                              (void)(colorop) /* Only to avoid 
unused-but-set-variable warning */, \
-                             (new_colorop_state) = 
(__state)->colorops[__i].new_state, 1))
+                             (new_colorop_state) = 
(__state)->colorops[__i].new_state,\
+                             (void)(new_colorop_state) /* Only to avoid 
unused-but-set-variable warning */, 1))
/**
   * for_each_oldnew_plane_in_state - iterate over all planes in an atomic 
update

Reply via email to