drm/gem-vram: Share code between GEM VRAM's _{prepare, cleanup}_fb()
authorThomas Zimmermann <tzimmermann@suse.de>
Tue, 17 May 2022 11:33:25 +0000 (13:33 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Thu, 19 May 2022 17:25:10 +0000 (19:25 +0200)
The error-recovery code in drm_gem_vram_plane_helper_prepare_fb() is of
the same pattern as drm_gem_vram_plane_helper_cleanup_fb(). Implement
both of them using an internal helper. No functional changes.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Acked-by: Christian König <christian.koenig@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220517113327.26919-4-tzimmermann@suse.de
drivers/gpu/drm/drm_gem_vram_helper.c

index 123045b58fec7033551fb39b22757664794f0c81..566d139f0fa0af1cf321136dfdbc77b93b0b29e9 100644 (file)
@@ -9,6 +9,7 @@
 #include <drm/drm_file.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_atomic_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_gem_ttm_helper.h>
 #include <drm/drm_gem_vram_helper.h>
 #include <drm/drm_managed.h>
@@ -630,6 +631,24 @@ EXPORT_SYMBOL(drm_gem_vram_driver_dumb_create);
  * Helpers for struct drm_plane_helper_funcs
  */
 
+static void __drm_gem_vram_plane_helper_cleanup_fb(struct drm_plane *plane,
+                                                  struct drm_plane_state *state,
+                                                  unsigned int num_planes)
+{
+       struct drm_gem_object *obj;
+       struct drm_gem_vram_object *gbo;
+       struct drm_framebuffer *fb = state->fb;
+
+       while (num_planes) {
+               --num_planes;
+               obj = drm_gem_fb_get_obj(fb, num_planes);
+               if (!obj)
+                       continue;
+               gbo = drm_gem_vram_of_gem(obj);
+               drm_gem_vram_unpin(gbo);
+       }
+}
+
 /**
  * drm_gem_vram_plane_helper_prepare_fb() - \
  *     Implements &struct drm_plane_helper_funcs.prepare_fb
@@ -671,11 +690,7 @@ drm_gem_vram_plane_helper_prepare_fb(struct drm_plane *plane,
        return 0;
 
 err_drm_gem_vram_unpin:
-       while (i) {
-               --i;
-               gbo = drm_gem_vram_of_gem(new_state->fb->obj[i]);
-               drm_gem_vram_unpin(gbo);
-       }
+       __drm_gem_vram_plane_helper_cleanup_fb(plane, new_state, i);
        return ret;
 }
 EXPORT_SYMBOL(drm_gem_vram_plane_helper_prepare_fb);
@@ -694,18 +709,12 @@ void
 drm_gem_vram_plane_helper_cleanup_fb(struct drm_plane *plane,
                                     struct drm_plane_state *old_state)
 {
-       size_t i;
-       struct drm_gem_vram_object *gbo;
+       struct drm_framebuffer *fb = old_state->fb;
 
-       if (!old_state->fb)
+       if (!fb)
                return;
 
-       for (i = 0; i < ARRAY_SIZE(old_state->fb->obj); ++i) {
-               if (!old_state->fb->obj[i])
-                       continue;
-               gbo = drm_gem_vram_of_gem(old_state->fb->obj[i]);
-               drm_gem_vram_unpin(gbo);
-       }
+       __drm_gem_vram_plane_helper_cleanup_fb(plane, old_state, ARRAY_SIZE(fb->obj));
 }
 EXPORT_SYMBOL(drm_gem_vram_plane_helper_cleanup_fb);