Move framebuffer vmap code from shadow-buffered plane state into the new
interfaces drm_gem_fb_vmap() and drm_gem_fb_vunmap(). These functions
provide mappings of a framebuffer's BOs into kernel address space. No
functional changes.

v2:
        * using [static N] for array parameters enables compile-time checks
        * include <drm/drm_fourcc.h> for DRM_FORMAT_MAX_PLANES (kernel
          test robot)

Signed-off-by: Thomas Zimmermann <tzimmerm...@suse.de>
Reviewed-by: Sam Ravnborg <s...@ravnborg.org>
---
 drivers/gpu/drm/drm_gem_atomic_helper.c      | 37 +---------
 drivers/gpu/drm/drm_gem_framebuffer_helper.c | 73 ++++++++++++++++++++
 include/drm/drm_gem_framebuffer_helper.h     |  6 ++
 3 files changed, 82 insertions(+), 34 deletions(-)

diff --git a/drivers/gpu/drm/drm_gem_atomic_helper.c 
b/drivers/gpu/drm/drm_gem_atomic_helper.c
index 26af09b959d4..b1cc19e47165 100644
--- a/drivers/gpu/drm/drm_gem_atomic_helper.c
+++ b/drivers/gpu/drm/drm_gem_atomic_helper.c
@@ -330,10 +330,7 @@ int drm_gem_prepare_shadow_fb(struct drm_plane *plane, 
struct drm_plane_state *p
 {
        struct drm_shadow_plane_state *shadow_plane_state = 
to_drm_shadow_plane_state(plane_state);
        struct drm_framebuffer *fb = plane_state->fb;
-       struct drm_gem_object *obj;
-       struct dma_buf_map map;
        int ret;
-       size_t i;
 
        if (!fb)
                return 0;
@@ -342,27 +339,7 @@ int drm_gem_prepare_shadow_fb(struct drm_plane *plane, 
struct drm_plane_state *p
        if (ret)
                return ret;
 
-       for (i = 0; i < ARRAY_SIZE(shadow_plane_state->map); ++i) {
-               obj = drm_gem_fb_get_obj(fb, i);
-               if (!obj)
-                       continue;
-               ret = drm_gem_vmap(obj, &map);
-               if (ret)
-                       goto err_drm_gem_vunmap;
-               shadow_plane_state->map[i] = map;
-       }
-
-       return 0;
-
-err_drm_gem_vunmap:
-       while (i) {
-               --i;
-               obj = drm_gem_fb_get_obj(fb, i);
-               if (!obj)
-                       continue;
-               drm_gem_vunmap(obj, &shadow_plane_state->map[i]);
-       }
-       return ret;
+       return drm_gem_fb_vmap(fb, shadow_plane_state->map);
 }
 EXPORT_SYMBOL(drm_gem_prepare_shadow_fb);
 
@@ -374,25 +351,17 @@ EXPORT_SYMBOL(drm_gem_prepare_shadow_fb);
  * This function implements struct &drm_plane_helper_funcs.cleanup_fb.
  * This function unmaps all buffer objects of the plane's framebuffer.
  *
- * See drm_gem_prepare_shadow_fb() for more inforamtion.
+ * See drm_gem_prepare_shadow_fb() for more information.
  */
 void drm_gem_cleanup_shadow_fb(struct drm_plane *plane, struct drm_plane_state 
*plane_state)
 {
        struct drm_shadow_plane_state *shadow_plane_state = 
to_drm_shadow_plane_state(plane_state);
        struct drm_framebuffer *fb = plane_state->fb;
-       size_t i = ARRAY_SIZE(shadow_plane_state->map);
-       struct drm_gem_object *obj;
 
        if (!fb)
                return;
 
-       while (i) {
-               --i;
-               obj = drm_gem_fb_get_obj(fb, i);
-               if (!obj)
-                       continue;
-               drm_gem_vunmap(obj, &shadow_plane_state->map[i]);
-       }
+       drm_gem_fb_vunmap(fb, shadow_plane_state->map);
 }
 EXPORT_SYMBOL(drm_gem_cleanup_shadow_fb);
 
diff --git a/drivers/gpu/drm/drm_gem_framebuffer_helper.c 
b/drivers/gpu/drm/drm_gem_framebuffer_helper.c
index 421e029a6b3e..243affbad437 100644
--- a/drivers/gpu/drm/drm_gem_framebuffer_helper.c
+++ b/drivers/gpu/drm/drm_gem_framebuffer_helper.c
@@ -15,6 +15,8 @@
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_modeset_helper.h>
 
+#include "drm_internal.h"
+
 #define AFBC_HEADER_SIZE               16
 #define AFBC_TH_LAYOUT_ALIGNMENT       8
 #define AFBC_HDR_ALIGN                 64
@@ -309,6 +311,77 @@ drm_gem_fb_create_with_dirty(struct drm_device *dev, 
struct drm_file *file,
 }
 EXPORT_SYMBOL_GPL(drm_gem_fb_create_with_dirty);
 
+
+/**
+ * drm_gem_fb_vmap - maps all framebuffer BOs into kernel address space
+ * @fb: the framebuffer
+ * @map: returns the mapping's address for each BO
+ *
+ * This function maps all buffer objects of the given framebuffer into
+ * kernel address space and stores them in struct dma_buf_map. If the
+ * mapping operation fails for one of the BOs, the function unmaps the
+ * already established mappings automatically.
+ *
+ * See drm_gem_fb_vunmap() for unmapping.
+ *
+ * Returns:
+ * 0 on success, or a negative errno code otherwise.
+ */
+int drm_gem_fb_vmap(struct drm_framebuffer *fb,
+                   struct dma_buf_map map[static DRM_FORMAT_MAX_PLANES])
+{
+       struct drm_gem_object *obj;
+       unsigned int i;
+       int ret;
+
+       for (i = 0; i < DRM_FORMAT_MAX_PLANES; ++i) {
+               obj = drm_gem_fb_get_obj(fb, i);
+               if (!obj)
+                       continue;
+               ret = drm_gem_vmap(obj, &map[i]);
+               if (ret)
+                       goto err_drm_gem_vunmap;
+       }
+
+       return 0;
+
+err_drm_gem_vunmap:
+       while (i) {
+               --i;
+               obj = drm_gem_fb_get_obj(fb, i);
+               if (!obj)
+                       continue;
+               drm_gem_vunmap(obj, &map[i]);
+       }
+       return ret;
+}
+EXPORT_SYMBOL(drm_gem_fb_vmap);
+
+/**
+ * drm_gem_fb_vunmap - unmaps framebuffer BOs from kernel address space
+ * @fb: the framebuffer
+ * @map: mapping addresses as returned by drm_gem_fb_vmap()
+ *
+ * This function unmaps all buffer objects of the given framebuffer.
+ *
+ * See drm_gem_fb_vmap() for more information.
+ */
+void drm_gem_fb_vunmap(struct drm_framebuffer *fb,
+                      struct dma_buf_map map[static DRM_FORMAT_MAX_PLANES])
+{
+       unsigned int i = DRM_FORMAT_MAX_PLANES;
+       struct drm_gem_object *obj;
+
+       while (i) {
+               --i;
+               obj = drm_gem_fb_get_obj(fb, i);
+               if (!obj)
+                       continue;
+               drm_gem_vunmap(obj, &map[i]);
+       }
+}
+EXPORT_SYMBOL(drm_gem_fb_vunmap);
+
 /**
  * drm_gem_fb_begin_cpu_access - prepares GEM buffer objects for CPU access
  * @fb: the framebuffer
diff --git a/include/drm/drm_gem_framebuffer_helper.h 
b/include/drm/drm_gem_framebuffer_helper.h
index 5705722f0855..ff2024dd7b77 100644
--- a/include/drm/drm_gem_framebuffer_helper.h
+++ b/include/drm/drm_gem_framebuffer_helper.h
@@ -4,6 +4,8 @@
 #include <linux/dma-buf.h>
 #include <linux/dma-buf-map.h>
 
+#include <drm/drm_fourcc.h>
+
 struct drm_afbc_framebuffer;
 struct drm_device;
 struct drm_fb_helper_surface_size;
@@ -37,6 +39,10 @@ struct drm_framebuffer *
 drm_gem_fb_create_with_dirty(struct drm_device *dev, struct drm_file *file,
                             const struct drm_mode_fb_cmd2 *mode_cmd);
 
+int drm_gem_fb_vmap(struct drm_framebuffer *fb,
+                   struct dma_buf_map map[static DRM_FORMAT_MAX_PLANES]);
+void drm_gem_fb_vunmap(struct drm_framebuffer *fb,
+                      struct dma_buf_map map[static DRM_FORMAT_MAX_PLANES]);
 int drm_gem_fb_begin_cpu_access(struct drm_framebuffer *fb, enum 
dma_data_direction dir);
 void drm_gem_fb_end_cpu_access(struct drm_framebuffer *fb, enum 
dma_data_direction dir);
 
-- 
2.32.0

Reply via email to