Commit | Line | Data |
---|---|---|
e9083420 DA |
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 | ||
dd7ece7f | 29 | #include <linux/dma-fence.h> |
44f8a139 | 30 | #include <linux/dma-fence-chain.h> |
dd7ece7f JN |
31 | |
32 | struct drm_file; | |
e9083420 DA |
33 | |
34 | /** | |
35 | * struct drm_syncobj - sync object. | |
36 | * | |
131280a1 | 37 | * This structure defines a generic sync object which wraps a &dma_fence. |
e9083420 DA |
38 | */ |
39 | struct drm_syncobj { | |
40 | /** | |
924fe8df | 41 | * @refcount: Reference count of this object. |
e9083420 DA |
42 | */ |
43 | struct kref refcount; | |
44 | /** | |
131280a1 EA |
45 | * @fence: |
46 | * NULL or a pointer to the fence bound to this object. | |
47 | * | |
48 | * This field should not be used directly. Use drm_syncobj_fence_get() | |
49 | * and drm_syncobj_replace_fence() instead. | |
9c19fb10 | 50 | */ |
131280a1 | 51 | struct dma_fence __rcu *fence; |
48197bc5 | 52 | /** |
131280a1 | 53 | * @cb_list: List of callbacks to call when the &fence gets replaced. |
48197bc5 | 54 | */ |
9c19fb10 JE |
55 | struct list_head cb_list; |
56 | /** | |
131280a1 | 57 | * @lock: Protects &cb_list and write-locks &fence. |
43cf1fc0 | 58 | */ |
131280a1 | 59 | spinlock_t lock; |
e9083420 | 60 | /** |
924fe8df | 61 | * @file: A file backing for this syncobj. |
e9083420 DA |
62 | */ |
63 | struct file *file; | |
64 | }; | |
65 | ||
66 | void drm_syncobj_free(struct kref *kref); | |
67 | ||
68 | /** | |
69 | * drm_syncobj_get - acquire a syncobj reference | |
70 | * @obj: sync object | |
71 | * | |
924fe8df | 72 | * This acquires an additional reference to @obj. It is illegal to call this |
e9083420 DA |
73 | * without already holding a reference. No locks required. |
74 | */ | |
75 | static inline void | |
76 | drm_syncobj_get(struct drm_syncobj *obj) | |
77 | { | |
78 | kref_get(&obj->refcount); | |
79 | } | |
80 | ||
81 | /** | |
82 | * drm_syncobj_put - release a reference to a sync object. | |
83 | * @obj: sync object. | |
84 | */ | |
85 | static inline void | |
86 | drm_syncobj_put(struct drm_syncobj *obj) | |
87 | { | |
88 | kref_put(&obj->refcount, drm_syncobj_free); | |
89 | } | |
90 | ||
131280a1 EA |
91 | /** |
92 | * drm_syncobj_fence_get - get a reference to a fence in a sync object | |
93 | * @syncobj: sync object. | |
94 | * | |
95 | * This acquires additional reference to &drm_syncobj.fence contained in @obj, | |
96 | * if not NULL. It is illegal to call this without already holding a reference. | |
97 | * No locks required. | |
98 | * | |
99 | * Returns: | |
100 | * Either the fence of @obj or NULL if there's none. | |
101 | */ | |
102 | static inline struct dma_fence * | |
103 | drm_syncobj_fence_get(struct drm_syncobj *syncobj) | |
104 | { | |
105 | struct dma_fence *fence; | |
106 | ||
107 | rcu_read_lock(); | |
108 | fence = dma_fence_get_rcu_safe(&syncobj->fence); | |
109 | rcu_read_unlock(); | |
110 | ||
111 | return fence; | |
112 | } | |
113 | ||
e9083420 DA |
114 | struct drm_syncobj *drm_syncobj_find(struct drm_file *file_private, |
115 | u32 handle); | |
44f8a139 CK |
116 | void drm_syncobj_add_point(struct drm_syncobj *syncobj, |
117 | struct dma_fence_chain *chain, | |
118 | struct dma_fence *fence, | |
119 | uint64_t point); | |
0b258ed1 | 120 | void drm_syncobj_replace_fence(struct drm_syncobj *syncobj, |
e9083420 | 121 | struct dma_fence *fence); |
afaf5923 | 122 | int drm_syncobj_find_fence(struct drm_file *file_private, |
649fdce2 | 123 | u32 handle, u64 point, u64 flags, |
afaf5923 | 124 | struct dma_fence **fence); |
e9083420 | 125 | void drm_syncobj_free(struct kref *kref); |
1321fd2c MO |
126 | int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags, |
127 | struct dma_fence *fence); | |
128 | int drm_syncobj_get_handle(struct drm_file *file_private, | |
129 | struct drm_syncobj *syncobj, u32 *handle); | |
684fd0af | 130 | int drm_syncobj_get_fd(struct drm_syncobj *syncobj, int *p_fd); |
e9083420 DA |
131 | |
132 | #endif |