drm/gem-vram: Ignore planes that are unused by framebuffer format
authorThomas Zimmermann <tzimmermann@suse.de>
Tue, 17 May 2022 11:33:26 +0000 (13:33 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Thu, 19 May 2022 17:25:19 +0000 (19:25 +0200)
Only handle color planes that exist in a framebuffer's color format.
Ignore non-existing planes.

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

index 566d139f0fa0af1cf321136dfdbc77b93b0b29e9..d607043716d38b1f104e810bef3d9f5a788a0087 100644 (file)
@@ -667,17 +667,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;
@@ -714,7 +719,7 @@ drm_gem_vram_plane_helper_cleanup_fb(struct drm_plane *plane,
        if (!fb)
                return;
 
-       __drm_gem_vram_plane_helper_cleanup_fb(plane, old_state, ARRAY_SIZE(fb->obj));
+       __drm_gem_vram_plane_helper_cleanup_fb(plane, old_state, fb->format->num_planes);
 }
 EXPORT_SYMBOL(drm_gem_vram_plane_helper_cleanup_fb);