History

drm: introduce sync objects (v4)

Sync objects are new toplevel drm object, that contain a pointer to a fence. This fence can be updated via command submission ioctls via drivers. There is also a generic wait obj API modelled on the vulkan wait API (with code modelled on some amdgpu code). These objects can be converted to an opaque fd that can be passes between processes. v2: rename reference/unreference to put/get (Chris) fix leaked reference (David Zhou) drop mutex in favour of cmpxchg (Chris) v3: cleanups from danvet, rebase on drm_fops rename check fd_flags is 0 in ioctls. v4: export find/free, change replace fence to take a syncobj. In order to support lookup first, replace later semantics which seem in the end to be cleaner.

Dave Airlie committed 9 years ago

Commit e9083421 parent c9f072611 files · +552 −1Browse files

Unified · Split

11 files
  1. Documentation/gpu/drm-internals.rst +3 −0
  2. Documentation/gpu/drm-mm.rst +12 −0
  3. drivers/gpu/drm/Makefile +2 −1
  4. drivers/gpu/drm/drm_file.c +8 −0
  5. drivers/gpu/drm/drm_internal.h +13 −0
  6. drivers/gpu/drm/drm_ioctl.c +12 −0
  7. drivers/gpu/drm/drm_syncobj.c +382 −0
  8. include/drm/drm_drv.h +1 −0
  9. include/drm/drm_file.h +5 −0
  10. include/drm/drm_syncobj.h +90 −0
  11. include/uapi/drm/drm.h +24 −0
Documentation/gpu/drm-internals.rst+3−0
@@ -98,6 +98,9 @@ DRIVER_ATOMIC · 97 unmodified lines
98 implement appropriate obj->atomic_get_property() vfuncs for any98 implement appropriate obj->atomic_get_property() vfuncs for any
99 modeset objects with driver specific properties.99 modeset objects with driver specific properties.
100 100
101DRIVER_SYNCOBJ
102 Driver support drm sync objects.
103
101Major, Minor and Patchlevel104Major, Minor and Patchlevel
102~~~~~~~~~~~~~~~~~~~~~~~~~~~105~~~~~~~~~~~~~~~~~~~~~~~~~~~
103 106
Documentation/gpu/drm-mm.rst+12−0
@@ -484,3 +484,15 @@ DRM Cache Handling · 483 unmodified lines
484 484
485.. kernel-doc:: drivers/gpu/drm/drm_cache.c485.. kernel-doc:: drivers/gpu/drm/drm_cache.c
486 :export:486 :export:
487
488DRM Sync Objects
489===========================
490
491.. kernel-doc:: drivers/gpu/drm/drm_syncobj.c
492 :doc: Overview
493
494.. kernel-doc:: include/drm/drm_syncobj.h
495 :export:
496
497.. kernel-doc:: drivers/gpu/drm/drm_syncobj.c
498 :export:
drivers/gpu/drm/Makefile+2−1
@@ -16,7 +16,8 @@ drm-y := drm_auth.o drm_bufs.o drm_cache.o \ · 15 unmodified lines
16 drm_framebuffer.o drm_connector.o drm_blend.o \16 drm_framebuffer.o drm_connector.o drm_blend.o \
17 drm_encoder.o drm_mode_object.o drm_property.o \17 drm_encoder.o drm_mode_object.o drm_property.o \
18 drm_plane.o drm_color_mgmt.o drm_print.o \18 drm_plane.o drm_color_mgmt.o drm_print.o \
19 drm_dumb_buffers.o drm_mode_config.o drm_vblank.o19 drm_dumb_buffers.o drm_mode_config.o drm_vblank.o \
20 drm_syncobj.o
20 21
21drm-$(CONFIG_DRM_LIB_RANDOM) += lib/drm_random.o22drm-$(CONFIG_DRM_LIB_RANDOM) += lib/drm_random.o
22drm-$(CONFIG_DRM_VM) += drm_vm.o23drm-$(CONFIG_DRM_VM) += drm_vm.o
drivers/gpu/drm/drm_file.c+8−0
@@ -229,6 +229,9 @@ static int drm_open_helper(struct file *filp, struct drm_minor *minor) · 228 unmodified lines
229 if (drm_core_check_feature(dev, DRIVER_GEM))229 if (drm_core_check_feature(dev, DRIVER_GEM))
230 drm_gem_open(dev, priv);230 drm_gem_open(dev, priv);
231 231
232 if (drm_core_check_feature(dev, DRIVER_SYNCOBJ))
233 drm_syncobj_open(priv);
234
232 if (drm_core_check_feature(dev, DRIVER_PRIME))235 if (drm_core_check_feature(dev, DRIVER_PRIME))
233 drm_prime_init_file_private(&priv->prime);236 drm_prime_init_file_private(&priv->prime);
234 237
@@ -276,6 +279,8 @@ out_close: · 41 unmodified lines
276out_prime_destroy:279out_prime_destroy:
277 if (drm_core_check_feature(dev, DRIVER_PRIME))280 if (drm_core_check_feature(dev, DRIVER_PRIME))
278 drm_prime_destroy_file_private(&priv->prime);281 drm_prime_destroy_file_private(&priv->prime);
282 if (drm_core_check_feature(dev, DRIVER_SYNCOBJ))
283 drm_syncobj_release(priv);
279 if (drm_core_check_feature(dev, DRIVER_GEM))284 if (drm_core_check_feature(dev, DRIVER_GEM))
280 drm_gem_release(dev, priv);285 drm_gem_release(dev, priv);
281 put_pid(priv->pid);286 put_pid(priv->pid);
@@ -398,6 +403,9 @@ int drm_release(struct inode *inode, struct file *filp) · 116 unmodified lines
398 drm_property_destroy_user_blobs(dev, file_priv);403 drm_property_destroy_user_blobs(dev, file_priv);
399 }404 }
400 405
406 if (drm_core_check_feature(dev, DRIVER_SYNCOBJ))
407 drm_syncobj_release(file_priv);
408
401 if (drm_core_check_feature(dev, DRIVER_GEM))409 if (drm_core_check_feature(dev, DRIVER_GEM))
402 drm_gem_release(dev, file_priv);410 drm_gem_release(dev, file_priv);
403 411
drivers/gpu/drm/drm_internal.h+13−0
@@ -143,4 +143,17 @@ static inline int drm_debugfs_crtc_crc_add(struct drm_crtc *crtc) · 142 unmodified lines
143{143{
144 return 0;144 return 0;
145}145}
146
146#endif147#endif
148
149/* drm_syncobj.c */
150void drm_syncobj_open(struct drm_file *file_private);
151void drm_syncobj_release(struct drm_file *file_private);
152int drm_syncobj_create_ioctl(struct drm_device *dev, void *data,
153 struct drm_file *file_private);
154int drm_syncobj_destroy_ioctl(struct drm_device *dev, void *data,
155 struct drm_file *file_private);
156int drm_syncobj_handle_to_fd_ioctl(struct drm_device *dev, void *data,
157 struct drm_file *file_private);
158int drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data,
159 struct drm_file *file_private);
drivers/gpu/drm/drm_ioctl.c+12−0
@@ -241,6 +241,9 @@ static int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_ · 240 unmodified lines
241 req->value |= dev->driver->prime_fd_to_handle ? DRM_PRIME_CAP_IMPORT : 0;241 req->value |= dev->driver->prime_fd_to_handle ? DRM_PRIME_CAP_IMPORT : 0;
242 req->value |= dev->driver->prime_handle_to_fd ? DRM_PRIME_CAP_EXPORT : 0;242 req->value |= dev->driver->prime_handle_to_fd ? DRM_PRIME_CAP_EXPORT : 0;
243 return 0;243 return 0;
244 case DRM_CAP_SYNCOBJ:
245 req->value = drm_core_check_feature(dev, DRIVER_SYNCOBJ);
246 return 0;
244 }247 }
245 248
246 /* Other caps only work with KMS drivers */249 /* Other caps only work with KMS drivers */
@@ -645,6 +648,15 @@ static const struct drm_ioctl_desc drm_ioctls[] = { · 398 unmodified lines
645 DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATOMIC, drm_mode_atomic_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),648 DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATOMIC, drm_mode_atomic_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
646 DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATEPROPBLOB, drm_mode_createblob_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),649 DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATEPROPBLOB, drm_mode_createblob_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
647 DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROYPROPBLOB, drm_mode_destroyblob_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),650 DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROYPROPBLOB, drm_mode_destroyblob_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
651
652 DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_CREATE, drm_syncobj_create_ioctl,
653 DRM_UNLOCKED|DRM_RENDER_ALLOW),
654 DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_DESTROY, drm_syncobj_destroy_ioctl,
655 DRM_UNLOCKED|DRM_RENDER_ALLOW),
656 DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD, drm_syncobj_handle_to_fd_ioctl,
657 DRM_UNLOCKED|DRM_RENDER_ALLOW),
658 DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, drm_syncobj_fd_to_handle_ioctl,
659 DRM_UNLOCKED|DRM_RENDER_ALLOW),
648};660};
649 661
650#define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )662#define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )
drivers/gpu/drm/drm_syncobj.c+382−0
@@ -0,0 +1,382 @@
1/*
2 * Copyright 2017 Red Hat
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 *
23 * Authors:
24 *
25 */
26
27/**
28 * DOC: Overview
29 *
30 * DRM synchronisation objects (syncobj) are a persistent objects,
31 * that contain an optional fence. The fence can be updated with a new
32 * fence, or be NULL.
33 *
34 * syncobj's can be export to fd's and back, these fd's are opaque and
35 * have no other use case, except passing the syncobj between processes.
36 *
37 * Their primary use-case is to implement Vulkan fences and semaphores.
38 *
39 * syncobj have a kref reference count, but also have an optional file.
40 * The file is only created once the syncobj is exported.
41 * The file takes a reference on the kref.
42 */
43
44#include <drm/drmP.h>
45#include <linux/file.h>
46#include <linux/fs.h>
47#include <linux/anon_inodes.h>
48
49#include "drm_internal.h"
50#include <drm/drm_syncobj.h>
51
52/**
53 * drm_syncobj_find - lookup and reference a sync object.
54 * @file_private: drm file private pointer
55 * @handle: sync object handle to lookup.
56 *
57 * Returns a reference to the syncobj pointed to by handle or NULL.
58 */
59struct drm_syncobj *drm_syncobj_find(struct drm_file *file_private,
60 u32 handle)
61{
62 struct drm_syncobj *syncobj;
63
64 spin_lock(&file_private->syncobj_table_lock);
65
66 /* Check if we currently have a reference on the object */
67 syncobj = idr_find(&file_private->syncobj_idr, handle);
68 if (syncobj)
69 drm_syncobj_get(syncobj);
70
71 spin_unlock(&file_private->syncobj_table_lock);
72
73 return syncobj;
74}
75EXPORT_SYMBOL(drm_syncobj_find);
76
77/**
78 * drm_syncobj_replace_fence - replace fence in a sync object.
79 * @file_private: drm file private pointer.
80 * @syncobj: Sync object to replace fence in
81 * @fence: fence to install in sync file.
82 *
83 * This replaces the fence on a sync object.
84 */
85void drm_syncobj_replace_fence(struct drm_file *file_private,
86 struct drm_syncobj *syncobj,
87 struct dma_fence *fence)
88{
89 struct dma_fence *old_fence = NULL;
90
91 if (fence)
92 dma_fence_get(fence);
93 old_fence = xchg(&syncobj->fence, fence);
94
95 dma_fence_put(old_fence);
96}
97EXPORT_SYMBOL(drm_syncobj_replace_fence);
98
99int drm_syncobj_fence_get(struct drm_file *file_private,
100 u32 handle,
101 struct dma_fence **fence)
102{
103 struct drm_syncobj *syncobj = drm_syncobj_find(file_private, handle);
104 int ret = 0;
105
106 if (!syncobj)
107 return -ENOENT;
108
109 *fence = dma_fence_get(syncobj->fence);
110 if (!*fence) {
111 ret = -EINVAL;
112 }
113 drm_syncobj_put(syncobj);
114 return ret;
115}
116EXPORT_SYMBOL(drm_syncobj_fence_get);
117
118/**
119 * drm_syncobj_free - free a sync object.
120 * @kref: kref to free.
121 *
122 * Only to be called from kref_put in drm_syncobj_put.
123 */
124void drm_syncobj_free(struct kref *kref)
125{
126 struct drm_syncobj *syncobj = container_of(kref,
127 struct drm_syncobj,
128 refcount);
129 dma_fence_put(syncobj->fence);
130 kfree(syncobj);
131}
132EXPORT_SYMBOL(drm_syncobj_free);
133
134static int drm_syncobj_create(struct drm_file *file_private,
135 u32 *handle)
136{
137 int ret;
138 struct drm_syncobj *syncobj;
139
140 syncobj = kzalloc(sizeof(struct drm_syncobj), GFP_KERNEL);
141 if (!syncobj)
142 return -ENOMEM;
143
144 kref_init(&syncobj->refcount);
145
146 idr_preload(GFP_KERNEL);
147 spin_lock(&file_private->syncobj_table_lock);
148 ret = idr_alloc(&file_private->syncobj_idr, syncobj, 1, 0, GFP_NOWAIT);
149 spin_unlock(&file_private->syncobj_table_lock);
150
151 idr_preload_end();
152
153 if (ret < 0) {
154 drm_syncobj_put(syncobj);
155 return ret;
156 }
157
158 *handle = ret;
159 return 0;
160}
161
162static int drm_syncobj_destroy(struct drm_file *file_private,
163 u32 handle)
164{
165 struct drm_syncobj *syncobj;
166
167 spin_lock(&file_private->syncobj_table_lock);
168 syncobj = idr_remove(&file_private->syncobj_idr, handle);
169 spin_unlock(&file_private->syncobj_table_lock);
170
171 if (!syncobj)
172 return -EINVAL;
173
174 drm_syncobj_put(syncobj);
175 return 0;
176}
177
178static int drm_syncobj_file_release(struct inode *inode, struct file *file)
179{
180 struct drm_syncobj *syncobj = file->private_data;
181
182 drm_syncobj_put(syncobj);
183 return 0;
184}
185
186static const struct file_operations drm_syncobj_file_fops = {
187 .release = drm_syncobj_file_release,
188};
189
190static int drm_syncobj_alloc_file(struct drm_syncobj *syncobj)
191{
192 struct file *file = anon_inode_getfile("syncobj_file",
193 &drm_syncobj_file_fops,
194 syncobj, 0);
195 if (IS_ERR(file))
196 return PTR_ERR(file);
197
198 drm_syncobj_get(syncobj);
199 if (cmpxchg(&syncobj->file, NULL, file)) {
200 /* lost the race */
201 fput(file);
202 }
203
204 return 0;
205}
206
207static int drm_syncobj_handle_to_fd(struct drm_file *file_private,
208 u32 handle, int *p_fd)
209{
210 struct drm_syncobj *syncobj = drm_syncobj_find(file_private, handle);
211 int ret;
212 int fd;
213
214 if (!syncobj)
215 return -EINVAL;
216
217 fd = get_unused_fd_flags(O_CLOEXEC);
218 if (fd < 0) {
219 drm_syncobj_put(syncobj);
220 return fd;
221 }
222
223 if (!syncobj->file) {
224 ret = drm_syncobj_alloc_file(syncobj);
225 if (ret)
226 goto out_put_fd;
227 }
228 fd_install(fd, syncobj->file);
229 drm_syncobj_put(syncobj);
230 *p_fd = fd;
231 return 0;
232out_put_fd:
233 put_unused_fd(fd);
234 drm_syncobj_put(syncobj);
235 return ret;
236}
237
238static struct drm_syncobj *drm_syncobj_fdget(int fd)
239{
240 struct file *file = fget(fd);
241
242 if (!file)
243 return NULL;
244 if (file->f_op != &drm_syncobj_file_fops)
245 goto err;
246
247 return file->private_data;
248err:
249 fput(file);
250 return NULL;
251};
252
253static int drm_syncobj_fd_to_handle(struct drm_file *file_private,
254 int fd, u32 *handle)
255{
256 struct drm_syncobj *syncobj = drm_syncobj_fdget(fd);
257 int ret;
258
259 if (!syncobj)
260 return -EINVAL;
261
262 /* take a reference to put in the idr */
263 drm_syncobj_get(syncobj);
264
265 idr_preload(GFP_KERNEL);
266 spin_lock(&file_private->syncobj_table_lock);
267 ret = idr_alloc(&file_private->syncobj_idr, syncobj, 1, 0, GFP_NOWAIT);
268 spin_unlock(&file_private->syncobj_table_lock);
269 idr_preload_end();
270
271 if (ret < 0) {
272 fput(syncobj->file);
273 return ret;
274 }
275 *handle = ret;
276 return 0;
277}
278
279/**
280 * drm_syncobj_open - initalizes syncobj file-private structures at devnode open time
281 * @dev: drm_device which is being opened by userspace
282 * @file_private: drm file-private structure to set up
283 *
284 * Called at device open time, sets up the structure for handling refcounting
285 * of sync objects.
286 */
287void
288drm_syncobj_open(struct drm_file *file_private)
289{
290 idr_init(&file_private->syncobj_idr);
291 spin_lock_init(&file_private->syncobj_table_lock);
292}
293
294static int
295drm_syncobj_release_handle(int id, void *ptr, void *data)
296{
297 struct drm_syncobj *syncobj = ptr;
298
299 drm_syncobj_put(syncobj);
300 return 0;
301}
302
303/**
304 * drm_syncobj_release - release file-private sync object resources
305 * @dev: drm_device which is being closed by userspace
306 * @file_private: drm file-private structure to clean up
307 *
308 * Called at close time when the filp is going away.
309 *
310 * Releases any remaining references on objects by this filp.
311 */
312void
313drm_syncobj_release(struct drm_file *file_private)
314{
315 idr_for_each(&file_private->syncobj_idr,
316 &drm_syncobj_release_handle, file_private);
317 idr_destroy(&file_private->syncobj_idr);
318}
319
320int
321drm_syncobj_create_ioctl(struct drm_device *dev, void *data,
322 struct drm_file *file_private)
323{
324 struct drm_syncobj_create *args = data;
325
326 if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
327 return -ENODEV;
328
329 /* no valid flags yet */
330 if (args->flags)
331 return -EINVAL;
332
333 return drm_syncobj_create(file_private,
334 &args->handle);
335}
336
337int
338drm_syncobj_destroy_ioctl(struct drm_device *dev, void *data,
339 struct drm_file *file_private)
340{
341 struct drm_syncobj_destroy *args = data;
342
343 if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
344 return -ENODEV;
345
346 /* make sure padding is empty */
347 if (args->pad)
348 return -EINVAL;
349 return drm_syncobj_destroy(file_private, args->handle);
350}
351
352int
353drm_syncobj_handle_to_fd_ioctl(struct drm_device *dev, void *data,
354 struct drm_file *file_private)
355{
356 struct drm_syncobj_handle *args = data;
357
358 if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
359 return -ENODEV;
360
361 if (args->pad || args->flags)
362 return -EINVAL;
363
364 return drm_syncobj_handle_to_fd(file_private, args->handle,
365 &args->fd);
366}
367
368int
369drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data,
370 struct drm_file *file_private)
371{
372 struct drm_syncobj_handle *args = data;
373
374 if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
375 return -ENODEV;
376
377 if (args->pad || args->flags)
378 return -EINVAL;
379
380 return drm_syncobj_fd_to_handle(file_private, args->fd,
381 &args->handle);
382}
include/drm/drm_drv.h+1−0
@@ -53,6 +53,7 @@ struct drm_mode_create_dumb; · 52 unmodified lines
53#define DRIVER_RENDER 0x800053#define DRIVER_RENDER 0x8000
54#define DRIVER_ATOMIC 0x1000054#define DRIVER_ATOMIC 0x10000
55#define DRIVER_KMS_LEGACY_CONTEXT 0x2000055#define DRIVER_KMS_LEGACY_CONTEXT 0x20000
56#define DRIVER_SYNCOBJ 0x40000
56 57
57/**58/**
58 * struct drm_driver - DRM driver structure59 * struct drm_driver - DRM driver structure
include/drm/drm_file.h+5−0
@@ -232,6 +232,11 @@ struct drm_file { · 231 unmodified lines
232 /** @table_lock: Protects @object_idr. */232 /** @table_lock: Protects @object_idr. */
233 spinlock_t table_lock;233 spinlock_t table_lock;
234 234
235 /** @syncobj_idr: Mapping of sync object handles to object pointers. */
236 struct idr syncobj_idr;
237 /** @syncobj_table_lock: Protects @syncobj_idr. */
238 spinlock_t syncobj_table_lock;
239
235 /** @filp: Pointer to the core file structure. */240 /** @filp: Pointer to the core file structure. */
236 struct file *filp;241 struct file *filp;
237 242
include/drm/drm_syncobj.h+90−0
@@ -0,0 +1,90 @@
1/*
2 * Copyright © 2017 Red Hat
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 *
23 * Authors:
24 *
25 */
26#ifndef __DRM_SYNCOBJ_H__
27#define __DRM_SYNCOBJ_H__
28
29#include "linux/dma-fence.h"
30
31/**
32 * struct drm_syncobj - sync object.
33 *
34 * This structure defines a generic sync object which wraps a dma fence.
35 */
36struct drm_syncobj {
37 /**
38 * @refcount:
39 *
40 * Reference count of this object.
41 */
42 struct kref refcount;
43 /**
44 * @fence:
45 * NULL or a pointer to the fence bound to this object.
46 */
47 struct dma_fence *fence;
48 /**
49 * @file:
50 * a file backing for this syncobj.
51 */
52 struct file *file;
53};
54
55void drm_syncobj_free(struct kref *kref);
56
57/**
58 * drm_syncobj_get - acquire a syncobj reference
59 * @obj: sync object
60 *
61 * This acquires additional reference to @obj. It is illegal to call this
62 * without already holding a reference. No locks required.
63 */
64static inline void
65drm_syncobj_get(struct drm_syncobj *obj)
66{
67 kref_get(&obj->refcount);
68}
69
70/**
71 * drm_syncobj_put - release a reference to a sync object.
72 * @obj: sync object.
73 */
74static inline void
75drm_syncobj_put(struct drm_syncobj *obj)
76{
77 kref_put(&obj->refcount, drm_syncobj_free);
78}
79
80struct drm_syncobj *drm_syncobj_find(struct drm_file *file_private,
81 u32 handle);
82void drm_syncobj_replace_fence(struct drm_file *file_private,
83 struct drm_syncobj *syncobj,
84 struct dma_fence *fence);
85int drm_syncobj_fence_get(struct drm_file *file_private,
86 u32 handle,
87 struct dma_fence **fence);
88void drm_syncobj_free(struct kref *kref);
89
90#endif
include/uapi/drm/drm.h+24−0
@@ -648,6 +648,7 @@ struct drm_gem_open { · 647 unmodified lines
648#define DRM_CAP_ADDFB2_MODIFIERS 0x10648#define DRM_CAP_ADDFB2_MODIFIERS 0x10
649#define DRM_CAP_PAGE_FLIP_TARGET 0x11649#define DRM_CAP_PAGE_FLIP_TARGET 0x11
650#define DRM_CAP_CRTC_IN_VBLANK_EVENT 0x12650#define DRM_CAP_CRTC_IN_VBLANK_EVENT 0x12
651#define DRM_CAP_SYNCOBJ 0x13
651 652
652/** DRM_IOCTL_GET_CAP ioctl argument type */653/** DRM_IOCTL_GET_CAP ioctl argument type */
653struct drm_get_cap {654struct drm_get_cap {
@@ -697,6 +698,24 @@ struct drm_prime_handle { · 43 unmodified lines
697 __s32 fd;698 __s32 fd;
698};699};
699 700
701struct drm_syncobj_create {
702 __u32 handle;
703 __u32 flags;
704};
705
706struct drm_syncobj_destroy {
707 __u32 handle;
708 __u32 pad;
709};
710
711struct drm_syncobj_handle {
712 __u32 handle;
713 __u32 flags;
714
715 __s32 fd;
716 __u32 pad;
717};
718
700#if defined(__cplusplus)719#if defined(__cplusplus)
701}720}
702#endif721#endif
@@ -815,6 +834,11 @@ extern "C" { · 112 unmodified lines
815#define DRM_IOCTL_MODE_CREATEPROPBLOB DRM_IOWR(0xBD, struct drm_mode_create_blob)834#define DRM_IOCTL_MODE_CREATEPROPBLOB DRM_IOWR(0xBD, struct drm_mode_create_blob)
816#define DRM_IOCTL_MODE_DESTROYPROPBLOB DRM_IOWR(0xBE, struct drm_mode_destroy_blob)835#define DRM_IOCTL_MODE_DESTROYPROPBLOB DRM_IOWR(0xBE, struct drm_mode_destroy_blob)
817 836
837#define DRM_IOCTL_SYNCOBJ_CREATE DRM_IOWR(0xBF, struct drm_syncobj_create)
838#define DRM_IOCTL_SYNCOBJ_DESTROY DRM_IOWR(0xC0, struct drm_syncobj_destroy)
839#define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD DRM_IOWR(0xC1, struct drm_syncobj_handle)
840#define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE DRM_IOWR(0xC2, struct drm_syncobj_handle)
841
818/**842/**
819 * Device specific ioctls should only be in their respective headers843 * Device specific ioctls should only be in their respective headers
820 * The device specific ioctl range is from 0x40 to 0x9f.844 * The device specific ioctl range is from 0x40 to 0x9f.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t