xref: /aosp_15_r20/external/igt-gpu-tools/lib/igt_syncobj.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2017 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker  *
4*d83cc019SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker  *
11*d83cc019SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker  * Software.
14*d83cc019SAndroid Build Coastguard Worker  *
15*d83cc019SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*d83cc019SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*d83cc019SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker  */
23*d83cc019SAndroid Build Coastguard Worker 
24*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
25*d83cc019SAndroid Build Coastguard Worker #include <xf86drm.h>
26*d83cc019SAndroid Build Coastguard Worker 
27*d83cc019SAndroid Build Coastguard Worker #include "igt.h"
28*d83cc019SAndroid Build Coastguard Worker #include "igt_syncobj.h"
29*d83cc019SAndroid Build Coastguard Worker 
30*d83cc019SAndroid Build Coastguard Worker /**
31*d83cc019SAndroid Build Coastguard Worker  * SECTION:igt_syncobj
32*d83cc019SAndroid Build Coastguard Worker  * @short_description: Library with syncobj helpers
33*d83cc019SAndroid Build Coastguard Worker  * @title: syncobj
34*d83cc019SAndroid Build Coastguard Worker  * @include: igt_syncobj.h
35*d83cc019SAndroid Build Coastguard Worker  *
36*d83cc019SAndroid Build Coastguard Worker  * This library contains helpers for sync object tests.
37*d83cc019SAndroid Build Coastguard Worker  */
38*d83cc019SAndroid Build Coastguard Worker 
39*d83cc019SAndroid Build Coastguard Worker static int
__syncobj_create(int fd,uint32_t * handle,uint32_t flags)40*d83cc019SAndroid Build Coastguard Worker __syncobj_create(int fd, uint32_t *handle, uint32_t flags)
41*d83cc019SAndroid Build Coastguard Worker {
42*d83cc019SAndroid Build Coastguard Worker 	struct drm_syncobj_create create = { 0 };
43*d83cc019SAndroid Build Coastguard Worker 	int err = 0;
44*d83cc019SAndroid Build Coastguard Worker 
45*d83cc019SAndroid Build Coastguard Worker 	create.flags = flags;
46*d83cc019SAndroid Build Coastguard Worker 	if (drmIoctl(fd, DRM_IOCTL_SYNCOBJ_CREATE, &create))
47*d83cc019SAndroid Build Coastguard Worker 		err = -errno;
48*d83cc019SAndroid Build Coastguard Worker 	*handle = create.handle;
49*d83cc019SAndroid Build Coastguard Worker 	return err;
50*d83cc019SAndroid Build Coastguard Worker }
51*d83cc019SAndroid Build Coastguard Worker 
52*d83cc019SAndroid Build Coastguard Worker /**
53*d83cc019SAndroid Build Coastguard Worker  * syncobj_create
54*d83cc019SAndroid Build Coastguard Worker  * @fd: The DRM file descriptor
55*d83cc019SAndroid Build Coastguard Worker  * @flags: Flags to pass syncobj create
56*d83cc019SAndroid Build Coastguard Worker  *
57*d83cc019SAndroid Build Coastguard Worker  * Create a syncobj with the flags.
58*d83cc019SAndroid Build Coastguard Worker  *
59*d83cc019SAndroid Build Coastguard Worker  * Returns: A newly created syncobj
60*d83cc019SAndroid Build Coastguard Worker  */
61*d83cc019SAndroid Build Coastguard Worker uint32_t
syncobj_create(int fd,uint32_t flags)62*d83cc019SAndroid Build Coastguard Worker syncobj_create(int fd, uint32_t flags)
63*d83cc019SAndroid Build Coastguard Worker {
64*d83cc019SAndroid Build Coastguard Worker 	uint32_t handle;
65*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(__syncobj_create(fd, &handle, flags), 0);
66*d83cc019SAndroid Build Coastguard Worker 	igt_assert(handle);
67*d83cc019SAndroid Build Coastguard Worker 	return handle;
68*d83cc019SAndroid Build Coastguard Worker }
69*d83cc019SAndroid Build Coastguard Worker 
70*d83cc019SAndroid Build Coastguard Worker static int
__syncobj_destroy(int fd,uint32_t handle)71*d83cc019SAndroid Build Coastguard Worker __syncobj_destroy(int fd, uint32_t handle)
72*d83cc019SAndroid Build Coastguard Worker {
73*d83cc019SAndroid Build Coastguard Worker 	struct drm_syncobj_destroy destroy = { 0 };
74*d83cc019SAndroid Build Coastguard Worker 	int err = 0;
75*d83cc019SAndroid Build Coastguard Worker 
76*d83cc019SAndroid Build Coastguard Worker 	destroy.handle = handle;
77*d83cc019SAndroid Build Coastguard Worker 	if (drmIoctl(fd, DRM_IOCTL_SYNCOBJ_DESTROY, &destroy))
78*d83cc019SAndroid Build Coastguard Worker 		err = -errno;
79*d83cc019SAndroid Build Coastguard Worker 	return err;
80*d83cc019SAndroid Build Coastguard Worker }
81*d83cc019SAndroid Build Coastguard Worker 
82*d83cc019SAndroid Build Coastguard Worker /**
83*d83cc019SAndroid Build Coastguard Worker  * syncobj_destroy:
84*d83cc019SAndroid Build Coastguard Worker  * @fd: The DRM file descriptor
85*d83cc019SAndroid Build Coastguard Worker  * @handle: The handle to the syncobj to destroy
86*d83cc019SAndroid Build Coastguard Worker  * Destroy a syncobj.
87*d83cc019SAndroid Build Coastguard Worker  */
88*d83cc019SAndroid Build Coastguard Worker void
syncobj_destroy(int fd,uint32_t handle)89*d83cc019SAndroid Build Coastguard Worker syncobj_destroy(int fd, uint32_t handle)
90*d83cc019SAndroid Build Coastguard Worker {
91*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(__syncobj_destroy(fd, handle), 0);
92*d83cc019SAndroid Build Coastguard Worker }
93*d83cc019SAndroid Build Coastguard Worker 
94*d83cc019SAndroid Build Coastguard Worker int
__syncobj_handle_to_fd(int fd,struct drm_syncobj_handle * args)95*d83cc019SAndroid Build Coastguard Worker __syncobj_handle_to_fd(int fd, struct drm_syncobj_handle *args)
96*d83cc019SAndroid Build Coastguard Worker {
97*d83cc019SAndroid Build Coastguard Worker 	int err = 0;
98*d83cc019SAndroid Build Coastguard Worker 	if (drmIoctl(fd, DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD, args))
99*d83cc019SAndroid Build Coastguard Worker 		err = -errno;
100*d83cc019SAndroid Build Coastguard Worker 	return err;
101*d83cc019SAndroid Build Coastguard Worker }
102*d83cc019SAndroid Build Coastguard Worker 
103*d83cc019SAndroid Build Coastguard Worker /**
104*d83cc019SAndroid Build Coastguard Worker  * syncobj_handle_to_fd:
105*d83cc019SAndroid Build Coastguard Worker  * @fd: The DRM file descriptor
106*d83cc019SAndroid Build Coastguard Worker  * @handle: Handle to syncobj
107*d83cc019SAndroid Build Coastguard Worker  * @flags: Flags to handle to fd ioctl.
108*d83cc019SAndroid Build Coastguard Worker  *
109*d83cc019SAndroid Build Coastguard Worker  * Convert a syncobj handle to an fd using the flags.
110*d83cc019SAndroid Build Coastguard Worker  *
111*d83cc019SAndroid Build Coastguard Worker  * Returns: a file descriptor (either syncobj or sync_file.
112*d83cc019SAndroid Build Coastguard Worker  */
113*d83cc019SAndroid Build Coastguard Worker int
syncobj_handle_to_fd(int fd,uint32_t handle,uint32_t flags)114*d83cc019SAndroid Build Coastguard Worker syncobj_handle_to_fd(int fd, uint32_t handle, uint32_t flags)
115*d83cc019SAndroid Build Coastguard Worker {
116*d83cc019SAndroid Build Coastguard Worker 	struct drm_syncobj_handle args = { 0 };
117*d83cc019SAndroid Build Coastguard Worker 	args.handle = handle;
118*d83cc019SAndroid Build Coastguard Worker 	args.flags = flags;
119*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(__syncobj_handle_to_fd(fd, &args), 0);
120*d83cc019SAndroid Build Coastguard Worker 	igt_assert(args.fd >= 0);
121*d83cc019SAndroid Build Coastguard Worker 	return args.fd;
122*d83cc019SAndroid Build Coastguard Worker }
123*d83cc019SAndroid Build Coastguard Worker 
124*d83cc019SAndroid Build Coastguard Worker int
__syncobj_fd_to_handle(int fd,struct drm_syncobj_handle * args)125*d83cc019SAndroid Build Coastguard Worker __syncobj_fd_to_handle(int fd, struct drm_syncobj_handle *args)
126*d83cc019SAndroid Build Coastguard Worker {
127*d83cc019SAndroid Build Coastguard Worker 	int err = 0;
128*d83cc019SAndroid Build Coastguard Worker 	if (drmIoctl(fd, DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, args))
129*d83cc019SAndroid Build Coastguard Worker 		err = -errno;
130*d83cc019SAndroid Build Coastguard Worker 	return err;
131*d83cc019SAndroid Build Coastguard Worker }
132*d83cc019SAndroid Build Coastguard Worker 
133*d83cc019SAndroid Build Coastguard Worker /**
134*d83cc019SAndroid Build Coastguard Worker  * syncobj_fd_to_handle:
135*d83cc019SAndroid Build Coastguard Worker  * @fd: The DRM file descriptor
136*d83cc019SAndroid Build Coastguard Worker  * @syncobj_fd: syncobj fd to convert
137*d83cc019SAndroid Build Coastguard Worker  * @flags: Flags to the syncobj fd to handle ioctl.
138*d83cc019SAndroid Build Coastguard Worker  *
139*d83cc019SAndroid Build Coastguard Worker  * Convert a syncobj fd a syncobj handle using the flags.
140*d83cc019SAndroid Build Coastguard Worker  *
141*d83cc019SAndroid Build Coastguard Worker  * Returns: a syncobj handle.
142*d83cc019SAndroid Build Coastguard Worker  */
143*d83cc019SAndroid Build Coastguard Worker uint32_t
syncobj_fd_to_handle(int fd,int syncobj_fd,uint32_t flags)144*d83cc019SAndroid Build Coastguard Worker syncobj_fd_to_handle(int fd, int syncobj_fd, uint32_t flags)
145*d83cc019SAndroid Build Coastguard Worker {
146*d83cc019SAndroid Build Coastguard Worker 	struct drm_syncobj_handle args = { 0 };
147*d83cc019SAndroid Build Coastguard Worker 	args.fd = syncobj_fd;
148*d83cc019SAndroid Build Coastguard Worker 	args.flags = flags;
149*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(__syncobj_fd_to_handle(fd, &args), 0);
150*d83cc019SAndroid Build Coastguard Worker 	igt_assert(args.handle > 0);
151*d83cc019SAndroid Build Coastguard Worker 	return args.handle;
152*d83cc019SAndroid Build Coastguard Worker }
153*d83cc019SAndroid Build Coastguard Worker 
154*d83cc019SAndroid Build Coastguard Worker /**
155*d83cc019SAndroid Build Coastguard Worker  * syncobj_import_sync_file:
156*d83cc019SAndroid Build Coastguard Worker  * @fd: The DRM file descriptor
157*d83cc019SAndroid Build Coastguard Worker  * @handle: Handle to the syncobt to import file into
158*d83cc019SAndroid Build Coastguard Worker  * @sync_file: The sync_file fd to import state from.
159*d83cc019SAndroid Build Coastguard Worker  *
160*d83cc019SAndroid Build Coastguard Worker  * Import a sync_file fd into a syncobj handle.
161*d83cc019SAndroid Build Coastguard Worker  */
162*d83cc019SAndroid Build Coastguard Worker void
syncobj_import_sync_file(int fd,uint32_t handle,int sync_file)163*d83cc019SAndroid Build Coastguard Worker syncobj_import_sync_file(int fd, uint32_t handle, int sync_file)
164*d83cc019SAndroid Build Coastguard Worker {
165*d83cc019SAndroid Build Coastguard Worker 	struct drm_syncobj_handle args = { 0 };
166*d83cc019SAndroid Build Coastguard Worker 	args.handle = handle;
167*d83cc019SAndroid Build Coastguard Worker 	args.fd = sync_file;
168*d83cc019SAndroid Build Coastguard Worker 	args.flags = DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE;
169*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(__syncobj_fd_to_handle(fd, &args), 0);
170*d83cc019SAndroid Build Coastguard Worker }
171*d83cc019SAndroid Build Coastguard Worker 
172*d83cc019SAndroid Build Coastguard Worker int
__syncobj_wait(int fd,struct local_syncobj_wait * args)173*d83cc019SAndroid Build Coastguard Worker __syncobj_wait(int fd, struct local_syncobj_wait *args)
174*d83cc019SAndroid Build Coastguard Worker {
175*d83cc019SAndroid Build Coastguard Worker 	int err = 0;
176*d83cc019SAndroid Build Coastguard Worker 	if (drmIoctl(fd, LOCAL_IOCTL_SYNCOBJ_WAIT, args))
177*d83cc019SAndroid Build Coastguard Worker 		err = -errno;
178*d83cc019SAndroid Build Coastguard Worker 	return err;
179*d83cc019SAndroid Build Coastguard Worker }
180*d83cc019SAndroid Build Coastguard Worker 
181*d83cc019SAndroid Build Coastguard Worker int
syncobj_wait_err(int fd,uint32_t * handles,uint32_t count,uint64_t abs_timeout_nsec,uint32_t flags)182*d83cc019SAndroid Build Coastguard Worker syncobj_wait_err(int fd, uint32_t *handles, uint32_t count,
183*d83cc019SAndroid Build Coastguard Worker 		 uint64_t abs_timeout_nsec, uint32_t flags)
184*d83cc019SAndroid Build Coastguard Worker {
185*d83cc019SAndroid Build Coastguard Worker 	struct local_syncobj_wait wait;
186*d83cc019SAndroid Build Coastguard Worker 
187*d83cc019SAndroid Build Coastguard Worker 	wait.handles = to_user_pointer(handles);
188*d83cc019SAndroid Build Coastguard Worker 	wait.timeout_nsec = abs_timeout_nsec;
189*d83cc019SAndroid Build Coastguard Worker 	wait.count_handles = count;
190*d83cc019SAndroid Build Coastguard Worker 	wait.flags = flags;
191*d83cc019SAndroid Build Coastguard Worker 	wait.first_signaled = 0;
192*d83cc019SAndroid Build Coastguard Worker 	wait.pad = 0;
193*d83cc019SAndroid Build Coastguard Worker 
194*d83cc019SAndroid Build Coastguard Worker 	return __syncobj_wait(fd, &wait);
195*d83cc019SAndroid Build Coastguard Worker }
196*d83cc019SAndroid Build Coastguard Worker 
197*d83cc019SAndroid Build Coastguard Worker /**
198*d83cc019SAndroid Build Coastguard Worker  * syncobj_wait:
199*d83cc019SAndroid Build Coastguard Worker  * @fd: The DRM file descriptor
200*d83cc019SAndroid Build Coastguard Worker  * @handles: List of syncobj handles to wait for.
201*d83cc019SAndroid Build Coastguard Worker  * @count: Count of handles
202*d83cc019SAndroid Build Coastguard Worker  * @abs_timeout_nsec: Absolute wait timeout in nanoseconds.
203*d83cc019SAndroid Build Coastguard Worker  * @flags: Wait ioctl flags.
204*d83cc019SAndroid Build Coastguard Worker  * @first_signaled: Returned handle for first signaled syncobj.
205*d83cc019SAndroid Build Coastguard Worker  *
206*d83cc019SAndroid Build Coastguard Worker  * Waits in the kernel for any/all the requested syncobjs
207*d83cc019SAndroid Build Coastguard Worker  * using the timeout and flags.
208*d83cc019SAndroid Build Coastguard Worker  * Returns: bool value - false = timedout, true = signaled
209*d83cc019SAndroid Build Coastguard Worker  */
210*d83cc019SAndroid Build Coastguard Worker bool
syncobj_wait(int fd,uint32_t * handles,uint32_t count,uint64_t abs_timeout_nsec,uint32_t flags,uint32_t * first_signaled)211*d83cc019SAndroid Build Coastguard Worker syncobj_wait(int fd, uint32_t *handles, uint32_t count,
212*d83cc019SAndroid Build Coastguard Worker 	     uint64_t abs_timeout_nsec, uint32_t flags,
213*d83cc019SAndroid Build Coastguard Worker 	     uint32_t *first_signaled)
214*d83cc019SAndroid Build Coastguard Worker {
215*d83cc019SAndroid Build Coastguard Worker 	struct local_syncobj_wait wait;
216*d83cc019SAndroid Build Coastguard Worker 	int ret;
217*d83cc019SAndroid Build Coastguard Worker 
218*d83cc019SAndroid Build Coastguard Worker 	wait.handles = to_user_pointer(handles);
219*d83cc019SAndroid Build Coastguard Worker 	wait.timeout_nsec = abs_timeout_nsec;
220*d83cc019SAndroid Build Coastguard Worker 	wait.count_handles = count;
221*d83cc019SAndroid Build Coastguard Worker 	wait.flags = flags;
222*d83cc019SAndroid Build Coastguard Worker 	wait.first_signaled = 0;
223*d83cc019SAndroid Build Coastguard Worker 	wait.pad = 0;
224*d83cc019SAndroid Build Coastguard Worker 
225*d83cc019SAndroid Build Coastguard Worker 	ret = __syncobj_wait(fd, &wait);
226*d83cc019SAndroid Build Coastguard Worker 	if (ret == -ETIME)
227*d83cc019SAndroid Build Coastguard Worker 		return false;
228*d83cc019SAndroid Build Coastguard Worker 
229*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(ret, 0);
230*d83cc019SAndroid Build Coastguard Worker 	if (first_signaled)
231*d83cc019SAndroid Build Coastguard Worker 		*first_signaled = wait.first_signaled;
232*d83cc019SAndroid Build Coastguard Worker 
233*d83cc019SAndroid Build Coastguard Worker 	return true;
234*d83cc019SAndroid Build Coastguard Worker }
235*d83cc019SAndroid Build Coastguard Worker 
236*d83cc019SAndroid Build Coastguard Worker static int
__syncobj_reset(int fd,uint32_t * handles,uint32_t count)237*d83cc019SAndroid Build Coastguard Worker __syncobj_reset(int fd, uint32_t *handles, uint32_t count)
238*d83cc019SAndroid Build Coastguard Worker {
239*d83cc019SAndroid Build Coastguard Worker 	struct local_syncobj_array array = { 0 };
240*d83cc019SAndroid Build Coastguard Worker 	int err = 0;
241*d83cc019SAndroid Build Coastguard Worker 
242*d83cc019SAndroid Build Coastguard Worker 	array.handles = to_user_pointer(handles);
243*d83cc019SAndroid Build Coastguard Worker 	array.count_handles = count;
244*d83cc019SAndroid Build Coastguard Worker 	if (drmIoctl(fd, LOCAL_IOCTL_SYNCOBJ_RESET, &array))
245*d83cc019SAndroid Build Coastguard Worker 		err = -errno;
246*d83cc019SAndroid Build Coastguard Worker 	return err;
247*d83cc019SAndroid Build Coastguard Worker }
248*d83cc019SAndroid Build Coastguard Worker 
249*d83cc019SAndroid Build Coastguard Worker /**
250*d83cc019SAndroid Build Coastguard Worker  * syncobj_reset:
251*d83cc019SAndroid Build Coastguard Worker  * @fd: The DRM file descriptor.
252*d83cc019SAndroid Build Coastguard Worker  * @handles: Array of syncobj handles to reset
253*d83cc019SAndroid Build Coastguard Worker  * @count: Count of syncobj handles.
254*d83cc019SAndroid Build Coastguard Worker  *
255*d83cc019SAndroid Build Coastguard Worker  * Reset state of a set of syncobjs.
256*d83cc019SAndroid Build Coastguard Worker  */
257*d83cc019SAndroid Build Coastguard Worker void
syncobj_reset(int fd,uint32_t * handles,uint32_t count)258*d83cc019SAndroid Build Coastguard Worker syncobj_reset(int fd, uint32_t *handles, uint32_t count)
259*d83cc019SAndroid Build Coastguard Worker {
260*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(__syncobj_reset(fd, handles, count), 0);
261*d83cc019SAndroid Build Coastguard Worker }
262*d83cc019SAndroid Build Coastguard Worker 
263*d83cc019SAndroid Build Coastguard Worker static int
__syncobj_signal(int fd,uint32_t * handles,uint32_t count)264*d83cc019SAndroid Build Coastguard Worker __syncobj_signal(int fd, uint32_t *handles, uint32_t count)
265*d83cc019SAndroid Build Coastguard Worker {
266*d83cc019SAndroid Build Coastguard Worker 	struct local_syncobj_array array = { 0 };
267*d83cc019SAndroid Build Coastguard Worker 	int err = 0;
268*d83cc019SAndroid Build Coastguard Worker 
269*d83cc019SAndroid Build Coastguard Worker 	array.handles = to_user_pointer(handles);
270*d83cc019SAndroid Build Coastguard Worker 	array.count_handles = count;
271*d83cc019SAndroid Build Coastguard Worker 	if (drmIoctl(fd, LOCAL_IOCTL_SYNCOBJ_SIGNAL, &array))
272*d83cc019SAndroid Build Coastguard Worker 		err = -errno;
273*d83cc019SAndroid Build Coastguard Worker 	return err;
274*d83cc019SAndroid Build Coastguard Worker }
275*d83cc019SAndroid Build Coastguard Worker 
276*d83cc019SAndroid Build Coastguard Worker /**
277*d83cc019SAndroid Build Coastguard Worker  * syncobj_signal:
278*d83cc019SAndroid Build Coastguard Worker  * @fd: The DRM file descriptor.
279*d83cc019SAndroid Build Coastguard Worker  * @handles: Array of syncobj handles to signal
280*d83cc019SAndroid Build Coastguard Worker  * @count: Count of syncobj handles.
281*d83cc019SAndroid Build Coastguard Worker  *
282*d83cc019SAndroid Build Coastguard Worker  * Signal a set of syncobjs.
283*d83cc019SAndroid Build Coastguard Worker  */
284*d83cc019SAndroid Build Coastguard Worker void
syncobj_signal(int fd,uint32_t * handles,uint32_t count)285*d83cc019SAndroid Build Coastguard Worker syncobj_signal(int fd, uint32_t *handles, uint32_t count)
286*d83cc019SAndroid Build Coastguard Worker {
287*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(__syncobj_signal(fd, handles, count), 0);
288*d83cc019SAndroid Build Coastguard Worker }
289