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