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 */ 23 void 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 } 50 EXPORT_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 */ 63 int 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 } 70 EXPORT_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 */ 80 void 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 } 87 EXPORT_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 */ 97 int 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 } 115 EXPORT_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 */ 133 int 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 } 148 EXPORT_SYMBOL(drm_gem_ttm_dumb_map_offset); 149 150 MODULE_DESCRIPTION("DRM gem ttm helpers"); 151 MODULE_LICENSE("GPL"); 152