linux/drivers/gpu/drm/drm_gem_ttm_helper.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2
   3#include <linux/module.h>
   4
   5#include <drm/drm_gem_ttm_helper.h>
   6
   7/**
   8 * DOC: overview
   9 *
  10 * This library provides helper functions for gem objects backed by
  11 * ttm.
  12 */
  13
  14/**
  15 * drm_gem_ttm_print_info() - Print &ttm_buffer_object info for debugfs
  16 * @p: DRM printer
  17 * @indent: Tab indentation level
  18 * @gem: GEM object
  19 *
  20 * This function can be used as &drm_gem_object_funcs.print_info
  21 * callback.
  22 */
  23void drm_gem_ttm_print_info(struct drm_printer *p, unsigned int indent,
  24                            const struct drm_gem_object *gem)
  25{
  26        static const char * const plname[] = {
  27                [ TTM_PL_SYSTEM ] = "system",
  28                [ TTM_PL_TT     ] = "tt",
  29                [ TTM_PL_VRAM   ] = "vram",
  30                [ TTM_PL_PRIV   ] = "priv",
  31
  32                [ 16 ]            = "cached",
  33                [ 17 ]            = "uncached",
  34                [ 18 ]            = "wc",
  35                [ 19 ]            = "contig",
  36
  37                [ 21 ]            = "pinned", /* NO_EVICT */
  38                [ 22 ]            = "topdown",
  39        };
  40        const struct ttm_buffer_object *bo = drm_gem_ttm_of_gem(gem);
  41
  42        drm_printf_indent(p, indent, "placement=");
  43        drm_print_bits(p, bo->mem.placement, plname, ARRAY_SIZE(plname));
  44        drm_printf(p, "\n");
  45
  46        if (bo->mem.bus.is_iomem)
  47                drm_printf_indent(p, indent, "bus.offset=%lx\n",
  48                                  (unsigned long)bo->mem.bus.offset);
  49}
  50EXPORT_SYMBOL(drm_gem_ttm_print_info);
  51
  52/**
  53 * drm_gem_ttm_vmap() - vmap &ttm_buffer_object
  54 * @gem: GEM object.
  55 * @map: [out] returns the dma-buf mapping.
  56 *
  57 * Maps a GEM object with ttm_bo_vmap(). This function can be used as
  58 * &drm_gem_object_funcs.vmap callback.
  59 *
  60 * Returns:
  61 * 0 on success, or a negative errno code otherwise.
  62 */
  63int drm_gem_ttm_vmap(struct drm_gem_object *gem,
  64                     struct dma_buf_map *map)
  65{
  66        struct ttm_buffer_object *bo = drm_gem_ttm_of_gem(gem);
  67
  68        return ttm_bo_vmap(bo, map);
  69}
  70EXPORT_SYMBOL(drm_gem_ttm_vmap);
  71
  72/**
  73 * drm_gem_ttm_vunmap() - vunmap &ttm_buffer_object
  74 * @gem: GEM object.
  75 * @map: dma-buf mapping.
  76 *
  77 * Unmaps a GEM object with ttm_bo_vunmap(). This function can be used as
  78 * &drm_gem_object_funcs.vmap callback.
  79 */
  80void drm_gem_ttm_vunmap(struct drm_gem_object *gem,
  81                        struct dma_buf_map *map)
  82{
  83        struct ttm_buffer_object *bo = drm_gem_ttm_of_gem(gem);
  84
  85        ttm_bo_vunmap(bo, map);
  86}
  87EXPORT_SYMBOL(drm_gem_ttm_vunmap);
  88
  89/**
  90 * drm_gem_ttm_mmap() - mmap &ttm_buffer_object
  91 * @gem: GEM object.
  92 * @vma: vm area.
  93 *
  94 * This function can be used as &drm_gem_object_funcs.mmap
  95 * callback.
  96 */
  97int drm_gem_ttm_mmap(struct drm_gem_object *gem,
  98                     struct vm_area_struct *vma)
  99{
 100        struct ttm_buffer_object *bo = drm_gem_ttm_of_gem(gem);
 101        int ret;
 102
 103        ret = ttm_bo_mmap_obj(vma, bo);
 104        if (ret < 0)
 105                return ret;
 106
 107        /*
 108         * ttm has its own object refcounting, so drop gem reference
 109         * to avoid double accounting counting.
 110         */
 111        drm_gem_object_put(gem);
 112
 113        return 0;
 114}
 115EXPORT_SYMBOL(drm_gem_ttm_mmap);
 116
 117MODULE_DESCRIPTION("DRM gem ttm helpers");
 118MODULE_LICENSE("GPL");
 119