drm: Use state helper instead of plane state pointer in atomic_check
authorMaxime Ripard <maxime@cerno.tech>
Fri, 19 Feb 2021 12:00:26 +0000 (13:00 +0100)
committerMaxime Ripard <maxime@cerno.tech>
Wed, 24 Feb 2021 19:27:05 +0000 (20:27 +0100)
Many drivers reference the plane->state pointer in order to get the
current plane state in their atomic_check hook, which would be the old
plane state in the global atomic state since _swap_state hasn't happened
when atomic_check is run.

Use the drm_atomic_get_old_plane_state helper to get that state to make
it more obvious.

This was made using the coccinelle script below:

@ plane_atomic_func @
identifier helpers;
identifier func;
@@

static struct drm_plane_helper_funcs helpers = {
...,
.atomic_check = func,
...,
};

@ replaces_old_state @
identifier plane_atomic_func.func;
identifier plane, state, plane_state;
@@

 func(struct drm_plane *plane, struct drm_atomic_state *state) {
  ...
- struct drm_plane_state *plane_state = plane->state;
+ struct drm_plane_state *plane_state = drm_atomic_get_old_plane_state(state, plane);
  ...
 }

@@
identifier plane_atomic_func.func;
identifier plane, state, plane_state;
@@

 func(struct drm_plane *plane, struct drm_atomic_state *state) {
  struct drm_plane_state *plane_state = drm_atomic_get_old_plane_state(state, plane);
  <...
- plane->state
+ plane_state
  ...>
 }

@ adds_old_state @
identifier plane_atomic_func.func;
identifier plane, state;
@@

 func(struct drm_plane *plane, struct drm_atomic_state *state) {
+ struct drm_plane_state *old_plane_state = drm_atomic_get_old_plane_state(state, plane);
  <...
- plane->state
+ old_plane_state
  ...>
 }

@ include depends on adds_old_state || replaces_old_state @
@@

 #include <drm/drm_atomic.h>

@ no_include depends on !include && (adds_old_state || replaces_old_state) @
@@

+ #include <drm/drm_atomic.h>
  #include <drm/...>

Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20210219120032.260676-6-maxime@cerno.tech
drivers/gpu/drm/imx/ipuv3-plane.c
drivers/gpu/drm/ingenic/ingenic-drm-drv.c
drivers/gpu/drm/ingenic/ingenic-ipu.c
drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
drivers/gpu/drm/tilcdc/tilcdc_plane.c

index b69ebf41f57076baa63b259a3b845bfef1adeffb..4ce15b761dfa3b1950ba42e184473b2b7600b1fd 100644 (file)
@@ -341,7 +341,8 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
 {
        struct drm_plane_state *new_state = drm_atomic_get_new_plane_state(state,
                                                                           plane);
-       struct drm_plane_state *old_state = plane->state;
+       struct drm_plane_state *old_state = drm_atomic_get_old_plane_state(state,
+                                                                          plane);
        struct drm_crtc_state *crtc_state;
        struct device *dev = plane->dev->dev;
        struct drm_framebuffer *fb = new_state->fb;
index 68f7f874a633d8531c3f4985f5e51ecb631b3576..496f87ebabe34595868ce7eb6a4c78cbaa35402f 100644 (file)
@@ -362,11 +362,13 @@ static void ingenic_drm_crtc_atomic_flush(struct drm_crtc *crtc,
 static int ingenic_drm_plane_atomic_check(struct drm_plane *plane,
                                          struct drm_atomic_state *state)
 {
+       struct drm_plane_state *old_plane_state = drm_atomic_get_old_plane_state(state,
+                                                                                plane);
        struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(state,
                                                                                 plane);
        struct ingenic_drm *priv = drm_device_get_priv(plane->dev);
        struct drm_crtc_state *crtc_state;
-       struct drm_crtc *crtc = new_plane_state->crtc ?: plane->state->crtc;
+       struct drm_crtc *crtc = new_plane_state->crtc ?: old_plane_state->crtc;
        int ret;
 
        if (!crtc)
@@ -400,12 +402,12 @@ static int ingenic_drm_plane_atomic_check(struct drm_plane *plane,
         * its position, size or depth.
         */
        if (priv->soc_info->has_osd &&
-           (!plane->state->fb || !new_plane_state->fb ||
-            plane->state->crtc_x != new_plane_state->crtc_x ||
-            plane->state->crtc_y != new_plane_state->crtc_y ||
-            plane->state->crtc_w != new_plane_state->crtc_w ||
-            plane->state->crtc_h != new_plane_state->crtc_h ||
-            plane->state->fb->format->format != new_plane_state->fb->format->format))
+           (!old_plane_state->fb || !new_plane_state->fb ||
+            old_plane_state->crtc_x != new_plane_state->crtc_x ||
+            old_plane_state->crtc_y != new_plane_state->crtc_y ||
+            old_plane_state->crtc_w != new_plane_state->crtc_w ||
+            old_plane_state->crtc_h != new_plane_state->crtc_h ||
+            old_plane_state->fb->format->format != new_plane_state->fb->format->format))
                crtc_state->mode_changed = true;
 
        return 0;
index effba5d087385fa51bc2c8564a9365006aac0298..98e7d3ec4c8529ecf6d501e757b45daca1a0496b 100644 (file)
@@ -516,11 +516,13 @@ static void ingenic_ipu_plane_atomic_update(struct drm_plane *plane,
 static int ingenic_ipu_plane_atomic_check(struct drm_plane *plane,
                                          struct drm_atomic_state *state)
 {
+       struct drm_plane_state *old_plane_state = drm_atomic_get_old_plane_state(state,
+                                                                                plane);
        struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(state,
                                                                                 plane);
        unsigned int num_w, denom_w, num_h, denom_h, xres, yres, max_w, max_h;
        struct ingenic_ipu *ipu = plane_to_ingenic_ipu(plane);
-       struct drm_crtc *crtc = new_plane_state->crtc ?: plane->state->crtc;
+       struct drm_crtc *crtc = new_plane_state->crtc ?: old_plane_state->crtc;
        struct drm_crtc_state *crtc_state;
 
        if (!crtc)
@@ -531,7 +533,7 @@ static int ingenic_ipu_plane_atomic_check(struct drm_plane *plane,
                return -EINVAL;
 
        /* Request a full modeset if we are enabling or disabling the IPU. */
-       if (!plane->state->crtc ^ !new_plane_state->crtc)
+       if (!old_plane_state->crtc ^ !new_plane_state->crtc)
                crtc_state->mode_changed = true;
 
        if (!new_plane_state->crtc ||
@@ -552,7 +554,7 @@ static int ingenic_ipu_plane_atomic_check(struct drm_plane *plane,
        if (((new_plane_state->src_w >> 16) & 1) || (new_plane_state->crtc_w & 1))
                return -EINVAL;
 
-       if (!osd_changed(new_plane_state, plane->state))
+       if (!osd_changed(new_plane_state, old_plane_state))
                return 0;
 
        crtc_state->mode_changed = true;
index 4aac6217a5adb455bd7843e06eed01b3e98846d7..6ce6ce09fecc9f75e8d507004f10a253e07cfbdd 100644 (file)
@@ -406,12 +406,14 @@ static int mdp5_plane_atomic_check_with_state(struct drm_crtc_state *crtc_state,
 static int mdp5_plane_atomic_check(struct drm_plane *plane,
                                   struct drm_atomic_state *state)
 {
+       struct drm_plane_state *old_plane_state = drm_atomic_get_old_plane_state(state,
+                                                                                plane);
        struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(state,
                                                                                 plane);
        struct drm_crtc *crtc;
        struct drm_crtc_state *crtc_state;
 
-       crtc = new_plane_state->crtc ? new_plane_state->crtc : plane->state->crtc;
+       crtc = new_plane_state->crtc ? new_plane_state->crtc : old_plane_state->crtc;
        if (!crtc)
                return 0;
 
index ebdd42dcaf82a9763ace8344167d0de96bd3b55b..c862581324321bb5846c3693f56d867b79e54a3d 100644 (file)
@@ -26,7 +26,8 @@ static int tilcdc_plane_atomic_check(struct drm_plane *plane,
        struct drm_plane_state *new_state = drm_atomic_get_new_plane_state(state,
                                                                           plane);
        struct drm_crtc_state *crtc_state;
-       struct drm_plane_state *old_state = plane->state;
+       struct drm_plane_state *old_state = drm_atomic_get_old_plane_state(state,
+                                                                          plane);
        unsigned int pitch;
 
        if (!new_state->crtc)