1 // SPDX-License-Identifier: GPL-2.0-or-later 2 3 #include <linux/export.h> 4 #include <linux/module.h> 5 6 #include <drm/drm_gem_ttm_helper.h> 7 #include <drm/ttm/ttm_placement.h> 8 #include <drm/ttm/ttm_tt.h> 9 10 /** 11 * DOC: overview 12 * 13 * This library provides helper functions for gem objects backed by 14 * ttm. 15 */ 16 17 /** 18 * drm_gem_ttm_print_info() - Print &ttm_buffer_object info for debugfs 19 * @p: DRM printer 20 * @indent: Tab indentation level 21 * @gem: GEM object 22 * 23 * This function can be used as &drm_gem_object_funcs.print_info 24 * callback. 25 */ 26 void drm_gem_ttm_print_info(struct drm_printer *p, unsigned int indent, 27 const struct drm_gem_object *gem) 28 { 29 static const char * const plname[] = { 30 [ TTM_PL_SYSTEM ] = "system", 31 [ TTM_PL_TT ] = "tt", 32 [ TTM_PL_VRAM ] = "vram", 33 [ TTM_PL_PRIV ] = "priv", 34 35 [ 16 ] = "cached", 36 [ 17 ] = "uncached", 37 [ 18 ] = "wc", 38 [ 19 ] = "contig", 39 40 [ 21 ] = "pinned", /* NO_EVICT */ 41 [ 22 ] = "topdown", 42 }; 43 const struct ttm_buffer_object *bo = drm_gem_ttm_of_gem(gem); 44 45 drm_printf_indent(p, indent, "placement="); 46 drm_print_bits(p, bo->resource->placement, plname, ARRAY_SIZE(plname)); 47 drm_printf(p, "\n"); 48 49 if (bo->resource->bus.is_iomem) 50 drm_printf_indent(p, indent, "bus.offset=%lx\n", 51 (unsigned long)bo->resource->bus.offset); 52 } 53 EXPORT_SYMBOL(drm_gem_ttm_print_info); 54 55 /** 56 * drm_gem_ttm_vmap() - vmap &ttm_buffer_object 57 * @gem: GEM object. 58 * @map: [out] returns the dma-buf mapping. 59 * 60 * Maps a GEM object with ttm_bo_vmap(). This function can be used as 61 * &drm_gem_object_funcs.vmap callback. 62 * 63 * Returns: 64 * 0 on success, or a negative errno code otherwise. 65 */ 66 int drm_gem_ttm_vmap(struct drm_gem_object *gem, 67 struct iosys_map *map) 68 { 69 struct ttm_buffer_object *bo = drm_gem_ttm_of_gem(gem); 70 71 return ttm_bo_vmap(bo, map); 72 } 73 EXPORT_SYMBOL(drm_gem_ttm_vmap); 74 75 /** 76 * drm_gem_ttm_vunmap() - vunmap &ttm_buffer_object 77 * @gem: GEM object. 78 * @map: dma-buf mapping. 79 * 80 * Unmaps a GEM object with ttm_bo_vunmap(). This function can be used as 81 * &drm_gem_object_funcs.vmap callback. 82 */ 83 void drm_gem_ttm_vunmap(struct drm_gem_object *gem, 84 struct iosys_map *map) 85 { 86 struct ttm_buffer_object *bo = drm_gem_ttm_of_gem(gem); 87 88 ttm_bo_vunmap(bo, map); 89 } 90 EXPORT_SYMBOL(drm_gem_ttm_vunmap); 91 92 /** 93 * drm_gem_ttm_mmap() - mmap &ttm_buffer_object 94 * @gem: GEM object. 95 * @vma: vm area. 96 * 97 * This function can be used as &drm_gem_object_funcs.mmap 98 * callback. 99 */ 100 int drm_gem_ttm_mmap(struct drm_gem_object *gem, 101 struct vm_area_struct *vma) 102 { 103 struct ttm_buffer_object *bo = drm_gem_ttm_of_gem(gem); 104 int ret; 105 106 ret = ttm_bo_mmap_obj(vma, bo); 107 if (ret < 0) 108 return ret; 109 110 /* 111 * ttm has its own object refcounting, so drop gem reference 112 * to avoid double accounting counting. 113 */ 114 drm_gem_object_put(gem); 115 116 return 0; 117 } 118 EXPORT_SYMBOL(drm_gem_ttm_mmap); 119 120 /** 121 * drm_gem_ttm_dumb_map_offset() - Implements struct &drm_driver.dumb_map_offset 122 * @file: DRM file pointer. 123 * @dev: DRM device. 124 * @handle: GEM handle 125 * @offset: Returns the mapping's memory offset on success 126 * 127 * Provides an implementation of struct &drm_driver.dumb_map_offset for 128 * TTM-based GEM drivers. TTM allocates the offset internally and 129 * drm_gem_ttm_dumb_map_offset() returns it for dumb-buffer implementations. 130 * 131 * See struct &drm_driver.dumb_map_offset. 132 * 133 * Returns: 134 * 0 on success, or a negative errno code otherwise. 135 */ 136 int drm_gem_ttm_dumb_map_offset(struct drm_file *file, struct drm_device *dev, 137 uint32_t handle, uint64_t *offset) 138 { 139 struct drm_gem_object *gem; 140 141 gem = drm_gem_object_lookup(file, handle); 142 if (!gem) 143 return -ENOENT; 144 145 *offset = drm_vma_node_offset_addr(&gem->vma_node); 146 147 drm_gem_object_put(gem); 148 149 return 0; 150 } 151 EXPORT_SYMBOL(drm_gem_ttm_dumb_map_offset); 152 153 MODULE_DESCRIPTION("DRM gem ttm helpers"); 154 MODULE_LICENSE("GPL"); 155