4 * Copyright (C) 2012 Google, Inc.
6 * This program is distributed in the hope that it will be useful,
7 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 * GNU General Public License for more details.
16 #include <linux/types.h>
17 #include <linux/kref.h>
18 #include <linux/ktime.h>
19 #include <linux/list.h>
20 #include <linux/spinlock.h>
21 #include <linux/fence.h>
23 #include "uapi/sync.h"
29 * struct sync_timeline_ops - sync object implementation ops
30 * @driver_name: name of the implementation
31 * @has_signaled: returns:
32 * 1 if pt has signaled
33 * 0 if pt has not signaled
35 * @timeline_value_str: fill str with the value of the sync_timeline's counter
36 * @fence_value_str: fill str with the value of the fence
38 struct sync_timeline_ops {
39 const char *driver_name;
42 int (*has_signaled)(struct fence *fence);
45 void (*timeline_value_str)(struct sync_timeline *timeline, char *str,
49 void (*fence_value_str)(struct fence *fence, char *str, int size);
53 * struct sync_timeline - sync object
54 * @kref: reference count on fence.
55 * @ops: ops that define the implementation of the sync_timeline
56 * @name: name of the sync_timeline. Useful for debugging
57 * @destroyed: set when sync_timeline is destroyed
58 * @child_list_head: list of children sync_pts for this sync_timeline
59 * @child_list_lock: lock protecting @child_list_head, destroyed, and
61 * @active_list_head: list of active (unsignaled/errored) sync_pts
62 * @sync_timeline_list: membership in global sync_timeline_list
64 struct sync_timeline {
66 const struct sync_timeline_ops *ops;
69 /* protected by child_list_lock */
73 struct list_head child_list_head;
74 spinlock_t child_list_lock;
76 struct list_head active_list_head;
78 #ifdef CONFIG_DEBUG_FS
79 struct list_head sync_timeline_list;
83 static inline struct sync_timeline *fence_parent(struct fence *fence)
85 return container_of(fence->lock, struct sync_timeline,
92 struct sync_file *sync_file;
96 * struct sync_file - sync file to export to the userspace
97 * @file: file representing this fence
98 * @kref: reference count on fence.
99 * @name: name of sync_file. Useful for debugging
100 * @sync_file_list: membership in global file list
101 * @num_fences number of sync_pts in the fence
102 * @wq: wait queue for fence signaling
103 * @status: 0: signaled, >0:active, <0: error
104 * @cbs: sync_pts callback information
110 #ifdef CONFIG_DEBUG_FS
111 struct list_head sync_file_list;
115 wait_queue_head_t wq;
118 struct sync_file_cb cbs[];
122 * API for sync_timeline implementers
126 * sync_timeline_create() - creates a sync object
127 * @ops: specifies the implementation ops for the object
128 * @size: size to allocate for this obj
129 * @name: sync_timeline name
131 * Creates a new sync_timeline which will use the implementation specified by
132 * @ops. @size bytes will be allocated allowing for implementation specific
133 * data to be kept after the generic sync_timeline struct. Returns the
134 * sync_timeline object or NULL in case of error.
136 struct sync_timeline *sync_timeline_create(const struct sync_timeline_ops *ops,
137 int size, const char *name);
140 * sync_timeline_destroy() - destroys a sync object
141 * @obj: sync_timeline to destroy
143 * A sync implementation should call this when the @obj is going away
144 * (i.e. module unload.) @obj won't actually be freed until all its children
147 void sync_timeline_destroy(struct sync_timeline *obj);
150 * sync_timeline_signal() - signal a status change on a sync_timeline
151 * @obj: sync_timeline to signal
153 * A sync implementation should call this any time one of it's fences
154 * has signaled or has an error condition.
156 void sync_timeline_signal(struct sync_timeline *obj);
159 * sync_pt_create() - creates a sync pt
160 * @parent: fence's parent sync_timeline
161 * @size: size to allocate for this pt
163 * Creates a new fence as a child of @parent. @size bytes will be
164 * allocated allowing for implementation specific data to be kept after
165 * the generic sync_timeline struct. Returns the fence object or
166 * NULL in case of error.
168 struct fence *sync_pt_create(struct sync_timeline *parent, int size);
171 * sync_fence_create() - creates a sync fence
172 * @name: name of fence to create
173 * @fence: fence to add to the sync_fence
175 * Creates a sync_file containg @fence. Once this is called, the sync_file
176 * takes ownership of @fence.
178 struct sync_file *sync_file_create(const char *name, struct fence *fence);
181 * API for sync_file consumers
185 * sync_file_merge() - merge two sync_files
186 * @name: name of new fence
190 * Creates a new sync_file which contains copies of all the fences in both
191 * @a and @b. @a and @b remain valid, independent sync_file. Returns the
192 * new merged sync_file or NULL in case of error.
194 struct sync_file *sync_file_merge(const char *name,
195 struct sync_file *a, struct sync_file *b);
198 * sync_file_fdget() - get a sync_file from an fd
199 * @fd: fd referencing a fence
201 * Ensures @fd references a valid sync_file, increments the refcount of the
202 * backing file. Returns the sync_file or NULL in case of error.
204 struct sync_file *sync_file_fdget(int fd);
207 * sync_file_put() - puts a reference of a sync_file
208 * @sync_file: sync_file to put
210 * Puts a reference on @sync_fence. If this is the last reference, the
211 * sync_fil and all it's sync_pts will be freed
213 void sync_file_put(struct sync_file *sync_file);
216 * sync_file_install() - installs a sync_file into a file descriptor
217 * @sync_file: sync_file to install
218 * @fd: file descriptor in which to install the fence
220 * Installs @sync_file into @fd. @fd's should be acquired through
221 * get_unused_fd_flags(O_CLOEXEC).
223 void sync_file_install(struct sync_file *sync_file, int fd);
225 #ifdef CONFIG_DEBUG_FS
227 void sync_timeline_debug_add(struct sync_timeline *obj);
228 void sync_timeline_debug_remove(struct sync_timeline *obj);
229 void sync_file_debug_add(struct sync_file *fence);
230 void sync_file_debug_remove(struct sync_file *fence);
231 void sync_dump(void);
234 # define sync_timeline_debug_add(obj)
235 # define sync_timeline_debug_remove(obj)
236 # define sync_file_debug_add(fence)
237 # define sync_file_debug_remove(fence)
241 #endif /* _LINUX_SYNC_H */