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