hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/include/drm/drm_gem.h
....@@ -35,8 +35,143 @@
3535 */
3636
3737 #include <linux/kref.h>
38
+#include <linux/dma-resv.h>
3839
3940 #include <drm/drm_vma_manager.h>
41
+
42
+struct drm_gem_object;
43
+
44
+/**
45
+ * struct drm_gem_object_funcs - GEM object functions
46
+ */
47
+struct drm_gem_object_funcs {
48
+ /**
49
+ * @free:
50
+ *
51
+ * Deconstructor for drm_gem_objects.
52
+ *
53
+ * This callback is mandatory.
54
+ */
55
+ void (*free)(struct drm_gem_object *obj);
56
+
57
+ /**
58
+ * @open:
59
+ *
60
+ * Called upon GEM handle creation.
61
+ *
62
+ * This callback is optional.
63
+ */
64
+ int (*open)(struct drm_gem_object *obj, struct drm_file *file);
65
+
66
+ /**
67
+ * @close:
68
+ *
69
+ * Called upon GEM handle release.
70
+ *
71
+ * This callback is optional.
72
+ */
73
+ void (*close)(struct drm_gem_object *obj, struct drm_file *file);
74
+
75
+ /**
76
+ * @print_info:
77
+ *
78
+ * If driver subclasses struct &drm_gem_object, it can implement this
79
+ * optional hook for printing additional driver specific info.
80
+ *
81
+ * drm_printf_indent() should be used in the callback passing it the
82
+ * indent argument.
83
+ *
84
+ * This callback is called from drm_gem_print_info().
85
+ *
86
+ * This callback is optional.
87
+ */
88
+ void (*print_info)(struct drm_printer *p, unsigned int indent,
89
+ const struct drm_gem_object *obj);
90
+
91
+ /**
92
+ * @export:
93
+ *
94
+ * Export backing buffer as a &dma_buf.
95
+ * If this is not set drm_gem_prime_export() is used.
96
+ *
97
+ * This callback is optional.
98
+ */
99
+ struct dma_buf *(*export)(struct drm_gem_object *obj, int flags);
100
+
101
+ /**
102
+ * @pin:
103
+ *
104
+ * Pin backing buffer in memory. Used by the drm_gem_map_attach() helper.
105
+ *
106
+ * This callback is optional.
107
+ */
108
+ int (*pin)(struct drm_gem_object *obj);
109
+
110
+ /**
111
+ * @unpin:
112
+ *
113
+ * Unpin backing buffer. Used by the drm_gem_map_detach() helper.
114
+ *
115
+ * This callback is optional.
116
+ */
117
+ void (*unpin)(struct drm_gem_object *obj);
118
+
119
+ /**
120
+ * @get_sg_table:
121
+ *
122
+ * Returns a Scatter-Gather table representation of the buffer.
123
+ * Used when exporting a buffer by the drm_gem_map_dma_buf() helper.
124
+ * Releasing is done by calling dma_unmap_sg_attrs() and sg_free_table()
125
+ * in drm_gem_unmap_buf(), therefore these helpers and this callback
126
+ * here cannot be used for sg tables pointing at driver private memory
127
+ * ranges.
128
+ *
129
+ * See also drm_prime_pages_to_sg().
130
+ */
131
+ struct sg_table *(*get_sg_table)(struct drm_gem_object *obj);
132
+
133
+ /**
134
+ * @vmap:
135
+ *
136
+ * Returns a virtual address for the buffer. Used by the
137
+ * drm_gem_dmabuf_vmap() helper.
138
+ *
139
+ * This callback is optional.
140
+ */
141
+ void *(*vmap)(struct drm_gem_object *obj);
142
+
143
+ /**
144
+ * @vunmap:
145
+ *
146
+ * Releases the address previously returned by @vmap. Used by the
147
+ * drm_gem_dmabuf_vunmap() helper.
148
+ *
149
+ * This callback is optional.
150
+ */
151
+ void (*vunmap)(struct drm_gem_object *obj, void *vaddr);
152
+
153
+ /**
154
+ * @mmap:
155
+ *
156
+ * Handle mmap() of the gem object, setup vma accordingly.
157
+ *
158
+ * This callback is optional.
159
+ *
160
+ * The callback is used by both drm_gem_mmap_obj() and
161
+ * drm_gem_prime_mmap(). When @mmap is present @vm_ops is not
162
+ * used, the @mmap callback must set vma->vm_ops instead.
163
+ */
164
+ int (*mmap)(struct drm_gem_object *obj, struct vm_area_struct *vma);
165
+
166
+ /**
167
+ * @vm_ops:
168
+ *
169
+ * Virtual memory operations used with mmap.
170
+ *
171
+ * This is optional but necessary for mmap support.
172
+ */
173
+ const struct vm_operations_struct *vm_ops;
174
+};
40175
41176 /**
42177 * struct drm_gem_object - GEM buffer object
....@@ -52,8 +187,8 @@
52187 *
53188 * Reference count of this object
54189 *
55
- * Please use drm_gem_object_get() to acquire and drm_gem_object_put()
56
- * or drm_gem_object_put_unlocked() to release a reference to a GEM
190
+ * Please use drm_gem_object_get() to acquire and drm_gem_object_put_locked()
191
+ * or drm_gem_object_put() to release a reference to a GEM
57192 * buffer object.
58193 */
59194 struct kref refcount;
....@@ -137,8 +272,9 @@
137272 * attachment point for the device. This is invariant over the lifetime
138273 * of a gem object.
139274 *
140
- * The &drm_driver.gem_free_object callback is responsible for cleaning
141
- * up the dma_buf attachment and references acquired at import time.
275
+ * The &drm_driver.gem_free_object_unlocked callback is responsible for
276
+ * cleaning up the dma_buf attachment and references acquired at import
277
+ * time.
142278 *
143279 * Note that the drm gem/prime core does not depend upon drivers setting
144280 * this field any more. So for drivers where this doesn't make sense
....@@ -146,6 +282,35 @@
146282 * simply leave it as NULL.
147283 */
148284 struct dma_buf_attachment *import_attach;
285
+
286
+ /**
287
+ * @resv:
288
+ *
289
+ * Pointer to reservation object associated with the this GEM object.
290
+ *
291
+ * Normally (@resv == &@_resv) except for imported GEM objects.
292
+ */
293
+ struct dma_resv *resv;
294
+
295
+ /**
296
+ * @_resv:
297
+ *
298
+ * A reservation object for this GEM object.
299
+ *
300
+ * This is unused for imported GEM objects.
301
+ */
302
+ struct dma_resv _resv;
303
+
304
+ /**
305
+ * @funcs:
306
+ *
307
+ * Optional GEM object functions. If this is set, it will be used instead of the
308
+ * corresponding &drm_driver GEM callbacks.
309
+ *
310
+ * New drivers should use this.
311
+ *
312
+ */
313
+ const struct drm_gem_object_funcs *funcs;
149314 };
150315
151316 /**
....@@ -198,79 +363,27 @@
198363 kref_get(&obj->refcount);
199364 }
200365
201
-/**
202
- * __drm_gem_object_put - raw function to release a GEM buffer object reference
203
- * @obj: GEM buffer object
204
- *
205
- * This function is meant to be used by drivers which are not encumbered with
206
- * &drm_device.struct_mutex legacy locking and which are using the
207
- * gem_free_object_unlocked callback. It avoids all the locking checks and
208
- * locking overhead of drm_gem_object_put() and drm_gem_object_put_unlocked().
209
- *
210
- * Drivers should never call this directly in their code. Instead they should
211
- * wrap it up into a ``driver_gem_object_put(struct driver_gem_object *obj)``
212
- * wrapper function, and use that. Shared code should never call this, to
213
- * avoid breaking drivers by accident which still depend upon
214
- * &drm_device.struct_mutex locking.
215
- */
366
+__attribute__((nonnull))
216367 static inline void
217368 __drm_gem_object_put(struct drm_gem_object *obj)
218369 {
219370 kref_put(&obj->refcount, drm_gem_object_free);
220371 }
221372
222
-void drm_gem_object_put_unlocked(struct drm_gem_object *obj);
223
-void drm_gem_object_put(struct drm_gem_object *obj);
224
-
225373 /**
226
- * drm_gem_object_reference - acquire a GEM buffer object reference
374
+ * drm_gem_object_put - drop a GEM buffer object reference
227375 * @obj: GEM buffer object
228376 *
229
- * This is a compatibility alias for drm_gem_object_get() and should not be
230
- * used by new code.
231
- */
232
-static inline void drm_gem_object_reference(struct drm_gem_object *obj)
233
-{
234
- drm_gem_object_get(obj);
235
-}
236
-
237
-/**
238
- * __drm_gem_object_unreference - raw function to release a GEM buffer object
239
- * reference
240
- * @obj: GEM buffer object
241
- *
242
- * This is a compatibility alias for __drm_gem_object_put() and should not be
243
- * used by new code.
244
- */
245
-static inline void __drm_gem_object_unreference(struct drm_gem_object *obj)
246
-{
247
- __drm_gem_object_put(obj);
248
-}
249
-
250
-/**
251
- * drm_gem_object_unreference_unlocked - release a GEM buffer object reference
252
- * @obj: GEM buffer object
253
- *
254
- * This is a compatibility alias for drm_gem_object_put_unlocked() and should
255
- * not be used by new code.
377
+ * This releases a reference to @obj.
256378 */
257379 static inline void
258
-drm_gem_object_unreference_unlocked(struct drm_gem_object *obj)
380
+drm_gem_object_put(struct drm_gem_object *obj)
259381 {
260
- drm_gem_object_put_unlocked(obj);
382
+ if (obj)
383
+ __drm_gem_object_put(obj);
261384 }
262385
263
-/**
264
- * drm_gem_object_unreference - release a GEM buffer object reference
265
- * @obj: GEM buffer object
266
- *
267
- * This is a compatibility alias for drm_gem_object_put() and should not be
268
- * used by new code.
269
- */
270
-static inline void drm_gem_object_unreference(struct drm_gem_object *obj)
271
-{
272
- drm_gem_object_put(obj);
273
-}
386
+void drm_gem_object_put_locked(struct drm_gem_object *obj);
274387
275388 int drm_gem_handle_create(struct drm_file *file_priv,
276389 struct drm_gem_object *obj,
....@@ -286,7 +399,20 @@
286399 void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages,
287400 bool dirty, bool accessed);
288401
402
+int drm_gem_objects_lookup(struct drm_file *filp, void __user *bo_handles,
403
+ int count, struct drm_gem_object ***objs_out);
289404 struct drm_gem_object *drm_gem_object_lookup(struct drm_file *filp, u32 handle);
405
+long drm_gem_dma_resv_wait(struct drm_file *filep, u32 handle,
406
+ bool wait_all, unsigned long timeout);
407
+int drm_gem_lock_reservations(struct drm_gem_object **objs, int count,
408
+ struct ww_acquire_ctx *acquire_ctx);
409
+void drm_gem_unlock_reservations(struct drm_gem_object **objs, int count,
410
+ struct ww_acquire_ctx *acquire_ctx);
411
+int drm_gem_fence_array_add(struct xarray *fence_array,
412
+ struct dma_fence *fence);
413
+int drm_gem_fence_array_add_implicit(struct xarray *fence_array,
414
+ struct drm_gem_object *obj,
415
+ bool write);
290416 int drm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
291417 u32 handle, u64 *offset);
292418 int drm_gem_dumb_destroy(struct drm_file *file,