Only handle color planes that exist in a framebuffer's color format.
Ignore non-existing planes.

Signed-off-by: Thomas Zimmermann <tzimmerm...@suse.de>
---
 drivers/gpu/drm/drm_gem_vram_helper.c | 36 ++++++++++++++++++---------
 1 file changed, 24 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/drm_gem_vram_helper.c 
b/drivers/gpu/drm/drm_gem_vram_helper.c
index 123045b58fec..3305541a10ab 100644
--- a/drivers/gpu/drm/drm_gem_vram_helper.c
+++ b/drivers/gpu/drm/drm_gem_vram_helper.c
@@ -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>
@@ -648,17 +649,22 @@ int
 drm_gem_vram_plane_helper_prepare_fb(struct drm_plane *plane,
                                     struct drm_plane_state *new_state)
 {
-       size_t i;
+       struct drm_framebuffer *fb = new_state->fb;
        struct drm_gem_vram_object *gbo;
+       struct drm_gem_object *obj;
+       unsigned int i;
        int ret;
 
-       if (!new_state->fb)
+       if (!fb)
                return 0;
 
-       for (i = 0; i < ARRAY_SIZE(new_state->fb->obj); ++i) {
-               if (!new_state->fb->obj[i])
-                       continue;
-               gbo = drm_gem_vram_of_gem(new_state->fb->obj[i]);
+       for (i = 0; i < fb->format->num_planes; ++i) {
+               obj = drm_gem_fb_get_obj(fb, i);
+               if (!obj) {
+                       ret = -EINVAL;
+                       goto err_drm_gem_vram_unpin;
+               }
+               gbo = drm_gem_vram_of_gem(obj);
                ret = drm_gem_vram_pin(gbo, DRM_GEM_VRAM_PL_FLAG_VRAM);
                if (ret)
                        goto err_drm_gem_vram_unpin;
@@ -673,7 +679,10 @@ drm_gem_vram_plane_helper_prepare_fb(struct drm_plane 
*plane,
 err_drm_gem_vram_unpin:
        while (i) {
                --i;
-               gbo = drm_gem_vram_of_gem(new_state->fb->obj[i]);
+               obj = drm_gem_fb_get_obj(fb, i);
+               if (!obj)
+                       continue;
+               gbo = drm_gem_vram_of_gem(obj);
                drm_gem_vram_unpin(gbo);
        }
        return ret;
@@ -694,16 +703,19 @@ void
 drm_gem_vram_plane_helper_cleanup_fb(struct drm_plane *plane,
                                     struct drm_plane_state *old_state)
 {
-       size_t i;
+       struct drm_framebuffer *fb = old_state->fb;
        struct drm_gem_vram_object *gbo;
+       struct drm_gem_object *obj;
+       unsigned int i;
 
-       if (!old_state->fb)
+       if (!fb)
                return;
 
-       for (i = 0; i < ARRAY_SIZE(old_state->fb->obj); ++i) {
-               if (!old_state->fb->obj[i])
+       for (i = 0; i < fb->format->num_planes; ++i) {
+               obj = drm_gem_fb_get_obj(fb, i);
+               if (!obj)
                        continue;
-               gbo = drm_gem_vram_of_gem(old_state->fb->obj[i]);
+               gbo = drm_gem_vram_of_gem(obj);
                drm_gem_vram_unpin(gbo);
        }
 }
-- 
2.36.0

Reply via email to