File Index
Files and directories
Sign in
FILE

drm_gem_ttm_helper.c

File preview with syntax highlighting.

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