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->resource->placement, plname, ARRAY_SIZE(plname));
  44        drm_printf(p, "\n");
  45
  46        if (bo->resource->bus.is_iomem)
  47                drm_printf_indent(p, indent, "bus.offset=%lx\n",
  48                                  (unsigned long)bo->resource->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
 117/**
 118 * drm_gem_ttm_dumb_map_offset() - Implements struct &drm_driver.dumb_map_offset
 119 * @file:       DRM file pointer.
 120 * @dev:        DRM device.
 121 * @handle:     GEM handle
 122 * @offset:     Returns the mapping's memory offset on success
 123 *
 124 * Provides an implementation of struct &drm_driver.dumb_map_offset for
 125 * TTM-based GEM drivers. TTM allocates the offset internally and
 126 * drm_gem_ttm_dumb_map_offset() returns it for dumb-buffer implementations.
 127 *
 128 * See struct &drm_driver.dumb_map_offset.
 129 *
 130 * Returns:
 131 * 0 on success, or a negative errno code otherwise.
 132 */
 133int drm_gem_ttm_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
 134                                uint32_t handle, uint64_t *offset)
 135{
 136        struct drm_gem_object *gem;
 137
 138        gem = drm_gem_object_lookup(file, handle);
 139        if (!gem)
 140                return -ENOENT;
 141
 142        *offset = drm_vma_node_offset_addr(&gem->vma_node);
 143
 144        drm_gem_object_put(gem);
 145
 146        return 0;
 147}
 148EXPORT_SYMBOL(drm_gem_ttm_dumb_map_offset);
 149
 150MODULE_DESCRIPTION("DRM gem ttm helpers");
 151MODULE_LICENSE("GPL");
 152