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.base=%lx\n",
  48                                  (unsigned long)bo->mem.bus.base);
  49                drm_printf_indent(p, indent, "bus.offset=%lx\n",
  50                                  (unsigned long)bo->mem.bus.offset);
  51        }
  52}
  53EXPORT_SYMBOL(drm_gem_ttm_print_info);
  54
  55/**
  56 * drm_gem_ttm_mmap() - mmap &ttm_buffer_object
  57 * @gem: GEM object.
  58 * @vma: vm area.
  59 *
  60 * This function can be used as &drm_gem_object_funcs.mmap
  61 * callback.
  62 */
  63int drm_gem_ttm_mmap(struct drm_gem_object *gem,
  64                     struct vm_area_struct *vma)
  65{
  66        struct ttm_buffer_object *bo = drm_gem_ttm_of_gem(gem);
  67        int ret;
  68
  69        ret = ttm_bo_mmap_obj(vma, bo);
  70        if (ret < 0)
  71                return ret;
  72
  73        /*
  74         * ttm has its own object refcounting, so drop gem reference
  75         * to avoid double accounting counting.
  76         */
  77        drm_gem_object_put_unlocked(gem);
  78
  79        return 0;
  80}
  81EXPORT_SYMBOL(drm_gem_ttm_mmap);
  82
  83MODULE_DESCRIPTION("DRM gem ttm helpers");
  84MODULE_LICENSE("GPL");
  85