Skip to content

Commit f6424ec

Browse files
author
Thomas Zimmermann
committed
drm/gem: Provide drm_gem_fb_{vmap,vunmap}()
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. v4: * remove duplicated blank line 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 <[email protected]> Reviewed-by: Sam Ravnborg <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 279cc2e commit f6424ec

File tree

3 files changed

+80
-33
lines changed

3 files changed

+80
-33
lines changed

drivers/gpu/drm/drm_gem_atomic_helper.c

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -330,10 +330,7 @@ int drm_gem_prepare_shadow_fb(struct drm_plane *plane, struct drm_plane_state *p
330330
{
331331
struct drm_shadow_plane_state *shadow_plane_state = to_drm_shadow_plane_state(plane_state);
332332
struct drm_framebuffer *fb = plane_state->fb;
333-
struct drm_gem_object *obj;
334-
struct dma_buf_map map;
335333
int ret;
336-
size_t i;
337334

338335
if (!fb)
339336
return 0;
@@ -342,27 +339,7 @@ int drm_gem_prepare_shadow_fb(struct drm_plane *plane, struct drm_plane_state *p
342339
if (ret)
343340
return ret;
344341

345-
for (i = 0; i < ARRAY_SIZE(shadow_plane_state->map); ++i) {
346-
obj = drm_gem_fb_get_obj(fb, i);
347-
if (!obj)
348-
continue;
349-
ret = drm_gem_vmap(obj, &map);
350-
if (ret)
351-
goto err_drm_gem_vunmap;
352-
shadow_plane_state->map[i] = map;
353-
}
354-
355-
return 0;
356-
357-
err_drm_gem_vunmap:
358-
while (i) {
359-
--i;
360-
obj = drm_gem_fb_get_obj(fb, i);
361-
if (!obj)
362-
continue;
363-
drm_gem_vunmap(obj, &shadow_plane_state->map[i]);
364-
}
365-
return ret;
342+
return drm_gem_fb_vmap(fb, shadow_plane_state->map);
366343
}
367344
EXPORT_SYMBOL(drm_gem_prepare_shadow_fb);
368345

@@ -380,19 +357,11 @@ void drm_gem_cleanup_shadow_fb(struct drm_plane *plane, struct drm_plane_state *
380357
{
381358
struct drm_shadow_plane_state *shadow_plane_state = to_drm_shadow_plane_state(plane_state);
382359
struct drm_framebuffer *fb = plane_state->fb;
383-
size_t i = ARRAY_SIZE(shadow_plane_state->map);
384-
struct drm_gem_object *obj;
385360

386361
if (!fb)
387362
return;
388363

389-
while (i) {
390-
--i;
391-
obj = drm_gem_fb_get_obj(fb, i);
392-
if (!obj)
393-
continue;
394-
drm_gem_vunmap(obj, &shadow_plane_state->map[i]);
395-
}
364+
drm_gem_fb_vunmap(fb, shadow_plane_state->map);
396365
}
397366
EXPORT_SYMBOL(drm_gem_cleanup_shadow_fb);
398367

drivers/gpu/drm/drm_gem_framebuffer_helper.c

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
#include <drm/drm_gem_framebuffer_helper.h>
1616
#include <drm/drm_modeset_helper.h>
1717

18+
#include "drm_internal.h"
19+
1820
#define AFBC_HEADER_SIZE 16
1921
#define AFBC_TH_LAYOUT_ALIGNMENT 8
2022
#define AFBC_HDR_ALIGN 64
@@ -309,6 +311,76 @@ drm_gem_fb_create_with_dirty(struct drm_device *dev, struct drm_file *file,
309311
}
310312
EXPORT_SYMBOL_GPL(drm_gem_fb_create_with_dirty);
311313

314+
/**
315+
* drm_gem_fb_vmap - maps all framebuffer BOs into kernel address space
316+
* @fb: the framebuffer
317+
* @map: returns the mapping's address for each BO
318+
*
319+
* This function maps all buffer objects of the given framebuffer into
320+
* kernel address space and stores them in struct dma_buf_map. If the
321+
* mapping operation fails for one of the BOs, the function unmaps the
322+
* already established mappings automatically.
323+
*
324+
* See drm_gem_fb_vunmap() for unmapping.
325+
*
326+
* Returns:
327+
* 0 on success, or a negative errno code otherwise.
328+
*/
329+
int drm_gem_fb_vmap(struct drm_framebuffer *fb,
330+
struct dma_buf_map map[static DRM_FORMAT_MAX_PLANES])
331+
{
332+
struct drm_gem_object *obj;
333+
unsigned int i;
334+
int ret;
335+
336+
for (i = 0; i < DRM_FORMAT_MAX_PLANES; ++i) {
337+
obj = drm_gem_fb_get_obj(fb, i);
338+
if (!obj)
339+
continue;
340+
ret = drm_gem_vmap(obj, &map[i]);
341+
if (ret)
342+
goto err_drm_gem_vunmap;
343+
}
344+
345+
return 0;
346+
347+
err_drm_gem_vunmap:
348+
while (i) {
349+
--i;
350+
obj = drm_gem_fb_get_obj(fb, i);
351+
if (!obj)
352+
continue;
353+
drm_gem_vunmap(obj, &map[i]);
354+
}
355+
return ret;
356+
}
357+
EXPORT_SYMBOL(drm_gem_fb_vmap);
358+
359+
/**
360+
* drm_gem_fb_vunmap - unmaps framebuffer BOs from kernel address space
361+
* @fb: the framebuffer
362+
* @map: mapping addresses as returned by drm_gem_fb_vmap()
363+
*
364+
* This function unmaps all buffer objects of the given framebuffer.
365+
*
366+
* See drm_gem_fb_vmap() for more information.
367+
*/
368+
void drm_gem_fb_vunmap(struct drm_framebuffer *fb,
369+
struct dma_buf_map map[static DRM_FORMAT_MAX_PLANES])
370+
{
371+
unsigned int i = DRM_FORMAT_MAX_PLANES;
372+
struct drm_gem_object *obj;
373+
374+
while (i) {
375+
--i;
376+
obj = drm_gem_fb_get_obj(fb, i);
377+
if (!obj)
378+
continue;
379+
drm_gem_vunmap(obj, &map[i]);
380+
}
381+
}
382+
EXPORT_SYMBOL(drm_gem_fb_vunmap);
383+
312384
/**
313385
* drm_gem_fb_begin_cpu_access - prepares GEM buffer objects for CPU access
314386
* @fb: the framebuffer

include/drm/drm_gem_framebuffer_helper.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#include <linux/dma-buf.h>
55
#include <linux/dma-buf-map.h>
66

7+
#include <drm/drm_fourcc.h>
8+
79
struct drm_afbc_framebuffer;
810
struct drm_device;
911
struct drm_fb_helper_surface_size;
@@ -37,6 +39,10 @@ struct drm_framebuffer *
3739
drm_gem_fb_create_with_dirty(struct drm_device *dev, struct drm_file *file,
3840
const struct drm_mode_fb_cmd2 *mode_cmd);
3941

42+
int drm_gem_fb_vmap(struct drm_framebuffer *fb,
43+
struct dma_buf_map map[static DRM_FORMAT_MAX_PLANES]);
44+
void drm_gem_fb_vunmap(struct drm_framebuffer *fb,
45+
struct dma_buf_map map[static DRM_FORMAT_MAX_PLANES]);
4046
int drm_gem_fb_begin_cpu_access(struct drm_framebuffer *fb, enum dma_data_direction dir);
4147
void drm_gem_fb_end_cpu_access(struct drm_framebuffer *fb, enum dma_data_direction dir);
4248

0 commit comments

Comments
 (0)