Merge tag 'linux-watchdog-6.4-rc1' of git://www.linux-watchdog.org/linux-watchdog
[linux-block.git] / include / drm / drm_gem_dma_helper.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
4a83c26a
DK
2#ifndef __DRM_GEM_DMA_HELPER_H__
3#define __DRM_GEM_DMA_HELPER_H__
b9d47450 4
785cabaa
SR
5#include <drm/drm_file.h>
6#include <drm/drm_ioctl.h>
d9fc9413 7#include <drm/drm_gem.h>
740c22ae 8
785cabaa
SR
9struct drm_mode_create_dumb;
10
d7883f87 11/**
4a83c26a 12 * struct drm_gem_dma_object - GEM object backed by DMA memory allocations
d7883f87 13 * @base: base GEM object
8c30eecc 14 * @dma_addr: DMA address of the backing memory
998fb1a0
LD
15 * @sgt: scatter/gather table for imported PRIME buffers. The table can have
16 * more than one entry but they are guaranteed to have contiguous
17 * DMA addresses.
d7883f87 18 * @vaddr: kernel virtual address of the backing memory
cf8ccbc7 19 * @map_noncoherent: if true, the GEM object is backed by non-coherent memory
d7883f87 20 */
4a83c26a 21struct drm_gem_dma_object {
b9d47450 22 struct drm_gem_object base;
8c30eecc 23 dma_addr_t dma_addr;
71d7282a
LP
24 struct sg_table *sgt;
25
4a83c26a 26 /* For objects with DMA memory allocated by GEM DMA */
b9d47450 27 void *vaddr;
cf8ccbc7
PC
28
29 bool map_noncoherent;
b9d47450
SH
30};
31
4a83c26a
DK
32#define to_drm_gem_dma_obj(gem_obj) \
33 container_of(gem_obj, struct drm_gem_dma_object, base)
b9d47450 34
4a83c26a 35struct drm_gem_dma_object *drm_gem_dma_create(struct drm_device *drm,
d7883f87 36 size_t size);
4a83c26a
DK
37void drm_gem_dma_free(struct drm_gem_dma_object *dma_obj);
38void drm_gem_dma_print_info(const struct drm_gem_dma_object *dma_obj,
e580ea25 39 struct drm_printer *p, unsigned int indent);
4a83c26a
DK
40struct sg_table *drm_gem_dma_get_sg_table(struct drm_gem_dma_object *dma_obj);
41int drm_gem_dma_vmap(struct drm_gem_dma_object *dma_obj,
7938f421 42 struct iosys_map *map);
4a83c26a 43int drm_gem_dma_mmap(struct drm_gem_dma_object *dma_obj, struct vm_area_struct *vma);
b9d47450 44
4a83c26a 45extern const struct vm_operations_struct drm_gem_dma_vm_ops;
b9d47450 46
05b1de51
TZ
47/*
48 * GEM object functions
49 */
50
51/**
4a83c26a 52 * drm_gem_dma_object_free - GEM object function for drm_gem_dma_free()
05b1de51
TZ
53 * @obj: GEM object to free
54 *
4a83c26a 55 * This function wraps drm_gem_dma_free_object(). Drivers that employ the DMA helpers
05b1de51
TZ
56 * should use it as their &drm_gem_object_funcs.free handler.
57 */
4a83c26a 58static inline void drm_gem_dma_object_free(struct drm_gem_object *obj)
05b1de51 59{
4a83c26a 60 struct drm_gem_dma_object *dma_obj = to_drm_gem_dma_obj(obj);
e580ea25 61
4a83c26a 62 drm_gem_dma_free(dma_obj);
05b1de51
TZ
63}
64
65/**
4a83c26a 66 * drm_gem_dma_object_print_info() - Print &drm_gem_dma_object info for debugfs
05b1de51
TZ
67 * @p: DRM printer
68 * @indent: Tab indentation level
69 * @obj: GEM object
70 *
4a83c26a 71 * This function wraps drm_gem_dma_print_info(). Drivers that employ the DMA helpers
05b1de51
TZ
72 * should use this function as their &drm_gem_object_funcs.print_info handler.
73 */
4a83c26a 74static inline void drm_gem_dma_object_print_info(struct drm_printer *p, unsigned int indent,
05b1de51
TZ
75 const struct drm_gem_object *obj)
76{
4a83c26a 77 const struct drm_gem_dma_object *dma_obj = to_drm_gem_dma_obj(obj);
e580ea25 78
4a83c26a 79 drm_gem_dma_print_info(dma_obj, p, indent);
05b1de51
TZ
80}
81
82/**
4a83c26a 83 * drm_gem_dma_object_get_sg_table - GEM object function for drm_gem_dma_get_sg_table()
05b1de51
TZ
84 * @obj: GEM object
85 *
4a83c26a 86 * This function wraps drm_gem_dma_get_sg_table(). Drivers that employ the DMA helpers should
05b1de51
TZ
87 * use it as their &drm_gem_object_funcs.get_sg_table handler.
88 *
89 * Returns:
90 * A pointer to the scatter/gather table of pinned pages or NULL on failure.
91 */
4a83c26a 92static inline struct sg_table *drm_gem_dma_object_get_sg_table(struct drm_gem_object *obj)
05b1de51 93{
4a83c26a 94 struct drm_gem_dma_object *dma_obj = to_drm_gem_dma_obj(obj);
e580ea25 95
4a83c26a 96 return drm_gem_dma_get_sg_table(dma_obj);
05b1de51
TZ
97}
98
99/*
4a83c26a 100 * drm_gem_dma_object_vmap - GEM object function for drm_gem_dma_vmap()
05b1de51 101 * @obj: GEM object
4a83c26a 102 * @map: Returns the kernel virtual address of the DMA GEM object's backing store.
05b1de51 103 *
4a83c26a 104 * This function wraps drm_gem_dma_vmap(). Drivers that employ the DMA helpers should
05b1de51
TZ
105 * use it as their &drm_gem_object_funcs.vmap handler.
106 *
107 * Returns:
108 * 0 on success or a negative error code on failure.
109 */
4a83c26a 110static inline int drm_gem_dma_object_vmap(struct drm_gem_object *obj,
7938f421 111 struct iosys_map *map)
05b1de51 112{
4a83c26a 113 struct drm_gem_dma_object *dma_obj = to_drm_gem_dma_obj(obj);
e580ea25 114
4a83c26a 115 return drm_gem_dma_vmap(dma_obj, map);
05b1de51
TZ
116}
117
118/**
4a83c26a 119 * drm_gem_dma_object_mmap - GEM object function for drm_gem_dma_mmap()
05b1de51
TZ
120 * @obj: GEM object
121 * @vma: VMA for the area to be mapped
122 *
4a83c26a 123 * This function wraps drm_gem_dma_mmap(). Drivers that employ the dma helpers should
05b1de51
TZ
124 * use it as their &drm_gem_object_funcs.mmap handler.
125 *
126 * Returns:
127 * 0 on success or a negative error code on failure.
128 */
4a83c26a 129static inline int drm_gem_dma_object_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
05b1de51 130{
4a83c26a 131 struct drm_gem_dma_object *dma_obj = to_drm_gem_dma_obj(obj);
e580ea25 132
4a83c26a 133 return drm_gem_dma_mmap(dma_obj, vma);
05b1de51
TZ
134}
135
d0c4e34d
TZ
136/*
137 * Driver ops
138 */
139
140/* create memory region for DRM framebuffer */
4a83c26a 141int drm_gem_dma_dumb_create_internal(struct drm_file *file_priv,
d0c4e34d
TZ
142 struct drm_device *drm,
143 struct drm_mode_create_dumb *args);
144
145/* create memory region for DRM framebuffer */
4a83c26a 146int drm_gem_dma_dumb_create(struct drm_file *file_priv,
d0c4e34d
TZ
147 struct drm_device *drm,
148 struct drm_mode_create_dumb *args);
149
78467dc5 150struct drm_gem_object *
4a83c26a 151drm_gem_dma_prime_import_sg_table(struct drm_device *dev,
b5e9c1a2 152 struct dma_buf_attachment *attach,
78467dc5 153 struct sg_table *sgt);
78467dc5 154
654bf12b 155/**
4a83c26a 156 * DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE - DMA GEM driver operations
654bf12b
TZ
157 * @dumb_create_func: callback function for .dumb_create
158 *
159 * This macro provides a shortcut for setting the default GEM operations in the
160 * &drm_driver structure.
161 *
4a83c26a 162 * This macro is a variant of DRM_GEM_DMA_DRIVER_OPS for drivers that
654bf12b 163 * override the default implementation of &struct rm_driver.dumb_create. Use
4a83c26a 164 * DRM_GEM_DMA_DRIVER_OPS if possible. Drivers that require a virtual address
654bf12b 165 * on imported buffers should use
4a83c26a 166 * DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE() instead.
654bf12b 167 */
4a83c26a 168#define DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(dumb_create_func) \
654bf12b
TZ
169 .dumb_create = (dumb_create_func), \
170 .prime_handle_to_fd = drm_gem_prime_handle_to_fd, \
171 .prime_fd_to_handle = drm_gem_prime_fd_to_handle, \
4a83c26a 172 .gem_prime_import_sg_table = drm_gem_dma_prime_import_sg_table, \
f5ca8eb6 173 .gem_prime_mmap = drm_gem_prime_mmap
654bf12b
TZ
174
175/**
4a83c26a 176 * DRM_GEM_DMA_DRIVER_OPS - DMA GEM driver operations
654bf12b
TZ
177 *
178 * This macro provides a shortcut for setting the default GEM operations in the
179 * &drm_driver structure.
180 *
181 * Drivers that come with their own implementation of
182 * &struct drm_driver.dumb_create should use
4a83c26a
DK
183 * DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE() instead. Use
184 * DRM_GEM_DMA_DRIVER_OPS if possible. Drivers that require a virtual address
185 * on imported buffers should use DRM_GEM_DMA_DRIVER_OPS_VMAP instead.
654bf12b 186 */
4a83c26a
DK
187#define DRM_GEM_DMA_DRIVER_OPS \
188 DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(drm_gem_dma_dumb_create)
654bf12b 189
b9068cde 190/**
4a83c26a 191 * DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE - DMA GEM driver operations
06d66201
TZ
192 * ensuring a virtual address
193 * on the buffer
194 * @dumb_create_func: callback function for .dumb_create
b9068cde
NT
195 *
196 * This macro provides a shortcut for setting the default GEM operations in the
197 * &drm_driver structure for drivers that need the virtual address also on
198 * imported buffers.
06d66201 199 *
4a83c26a 200 * This macro is a variant of DRM_GEM_DMA_DRIVER_OPS_VMAP for drivers that
654bf12b 201 * override the default implementation of &struct drm_driver.dumb_create. Use
4a83c26a 202 * DRM_GEM_DMA_DRIVER_OPS_VMAP if possible. Drivers that do not require a
654bf12b 203 * virtual address on imported buffers should use
4a83c26a 204 * DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE() instead.
b9068cde 205 */
4a83c26a 206#define DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE(dumb_create_func) \
654bf12b 207 .dumb_create = dumb_create_func, \
b9068cde
NT
208 .prime_handle_to_fd = drm_gem_prime_handle_to_fd, \
209 .prime_fd_to_handle = drm_gem_prime_fd_to_handle, \
4a83c26a 210 .gem_prime_import_sg_table = drm_gem_dma_prime_import_sg_table_vmap, \
b9068cde
NT
211 .gem_prime_mmap = drm_gem_prime_mmap
212
06d66201 213/**
4a83c26a 214 * DRM_GEM_DMA_DRIVER_OPS_VMAP - DMA GEM driver operations ensuring a virtual
06d66201
TZ
215 * address on the buffer
216 *
217 * This macro provides a shortcut for setting the default GEM operations in the
218 * &drm_driver structure for drivers that need the virtual address also on
219 * imported buffers.
220 *
221 * Drivers that come with their own implementation of
222 * &struct drm_driver.dumb_create should use
4a83c26a
DK
223 * DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE() instead. Use
224 * DRM_GEM_DMA_DRIVER_OPS_VMAP if possible. Drivers that do not require a
225 * virtual address on imported buffers should use DRM_GEM_DMA_DRIVER_OPS
654bf12b 226 * instead.
06d66201 227 */
4a83c26a
DK
228#define DRM_GEM_DMA_DRIVER_OPS_VMAP \
229 DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE(drm_gem_dma_dumb_create)
06d66201 230
b9068cde 231struct drm_gem_object *
4a83c26a 232drm_gem_dma_prime_import_sg_table_vmap(struct drm_device *drm,
b9068cde
NT
233 struct dma_buf_attachment *attach,
234 struct sg_table *sgt);
235
d0c4e34d
TZ
236/*
237 * File ops
238 */
239
240#ifndef CONFIG_MMU
4a83c26a 241unsigned long drm_gem_dma_get_unmapped_area(struct file *filp,
d0c4e34d
TZ
242 unsigned long addr,
243 unsigned long len,
244 unsigned long pgoff,
245 unsigned long flags);
4a83c26a
DK
246#define DRM_GEM_DMA_UNMAPPED_AREA_FOPS \
247 .get_unmapped_area = drm_gem_dma_get_unmapped_area,
d0c4e34d 248#else
4a83c26a 249#define DRM_GEM_DMA_UNMAPPED_AREA_FOPS
d0c4e34d
TZ
250#endif
251
252/**
4a83c26a 253 * DEFINE_DRM_GEM_DMA_FOPS() - macro to generate file operations for DMA drivers
d0c4e34d
TZ
254 * @name: name for the generated structure
255 *
4a83c26a 256 * This macro autogenerates a suitable &struct file_operations for DMA based
d0c4e34d
TZ
257 * drivers, which can be assigned to &drm_driver.fops. Note that this structure
258 * cannot be shared between drivers, because it contains a reference to the
259 * current module using THIS_MODULE.
260 *
261 * Note that the declaration is already marked as static - if you need a
262 * non-static version of this you're probably doing it wrong and will break the
263 * THIS_MODULE reference by accident.
264 */
4a83c26a 265#define DEFINE_DRM_GEM_DMA_FOPS(name) \
d0c4e34d
TZ
266 static const struct file_operations name = {\
267 .owner = THIS_MODULE,\
268 .open = drm_open,\
269 .release = drm_release,\
270 .unlocked_ioctl = drm_ioctl,\
271 .compat_ioctl = drm_compat_ioctl,\
272 .poll = drm_poll,\
273 .read = drm_read,\
274 .llseek = noop_llseek,\
275 .mmap = drm_gem_mmap,\
4a83c26a 276 DRM_GEM_DMA_UNMAPPED_AREA_FOPS \
d0c4e34d
TZ
277 }
278
4a83c26a 279#endif /* __DRM_GEM_DMA_HELPER_H__ */