Lines Matching +full:reference +full:- +full:sync
36 * Their primary use-case is to implement Vulkan fences and semaphores.
39 * - Creation and destruction of syncobjs
40 * - Import and export of syncobjs to/from a syncobj file descriptor
41 * - Import and export a syncobj's underlying fence to/from a sync file
42 * - Reset a syncobj (set its fence to NULL)
43 * - Signal a syncobj (set a trivially signaled fence)
44 * - Wait for a syncobj's fence to appear and be signaled
50 * - Signal a given point on the timeline
51 * - Wait for a given point to appear and/or be signaled
52 * - Import and export from/to a given point of a timeline
77 * - The syncobj's current fence if the syncobj is considered as a binary
79 * - The struct &dma_fence associated with a given point if the syncobj is
87 * regardless of whether that operation is an immediate host-side operation
107 * Host-side wait on syncobjs
108 * --------------------------
111 * host-side wait on all of the syncobj fences simultaneously.
119 * the host-side wait will first wait for the syncobj to receive a non-NULL
122 * syncobjs in the array has a NULL fence, -EINVAL will be returned.
135 * handles as well as an array of u64 points and does a host-side wait on all
141 * requirement is inherited from the wait-before-signal behavior required by
150 * -------------------------
160 * result of importing those file descriptors own a reference to the
163 * The syncobj is freed only once the last reference is dropped.
164 * Unlike dma-buf, importing a syncobj creates a new handle (with its own
165 * reference) for every import instead of de-duplicating.
166 * The primary use-case of this persistent import/export is for shared
173 * When a syncobj is exported to a sync file, that sync file wraps the
175 * operations on the syncobj will not affect the exported sync file.
176 * When a sync file is imported into a syncobj, the syncobj's fence is set
177 * to the fence wrapped by that sync file.
178 * Because sync files are immutable, resetting or signaling the syncobj
179 * will not affect any sync files whose fences have been imported into the
184 * -----------------------------------------------------
196 #include <linux/dma-fence-unwrap.h>
241 * drm_syncobj_find - lookup and reference a sync object.
243 * @handle: sync object handle to lookup.
245 * Returns a reference to the syncobj pointed to by handle or NULL. The
246 * reference must be released by calling drm_syncobj_put().
253 xa_lock(&file_private->syncobj_xa); in drm_syncobj_find()
255 /* Check if we currently have a reference on the object */ in drm_syncobj_find()
256 syncobj = xa_load(&file_private->syncobj_xa, handle); in drm_syncobj_find()
260 xa_unlock(&file_private->syncobj_xa); in drm_syncobj_find()
271 if (wait->fence) in drm_syncobj_fence_add_wait()
274 spin_lock(&syncobj->lock); in drm_syncobj_fence_add_wait()
279 fence = dma_fence_get(rcu_dereference_protected(syncobj->fence, 1)); in drm_syncobj_fence_add_wait()
280 if (!fence || dma_fence_chain_find_seqno(&fence, wait->point)) { in drm_syncobj_fence_add_wait()
282 list_add_tail(&wait->node, &syncobj->cb_list); in drm_syncobj_fence_add_wait()
284 wait->fence = dma_fence_get_stub(); in drm_syncobj_fence_add_wait()
286 wait->fence = fence; in drm_syncobj_fence_add_wait()
288 spin_unlock(&syncobj->lock); in drm_syncobj_fence_add_wait()
294 if (!wait->node.next) in drm_syncobj_remove_wait()
297 spin_lock(&syncobj->lock); in drm_syncobj_remove_wait()
298 list_del_init(&wait->node); in drm_syncobj_remove_wait()
299 spin_unlock(&syncobj->lock); in drm_syncobj_remove_wait()
305 eventfd_ctx_put(entry->ev_fd_ctx); in syncobj_eventfd_entry_free()
306 dma_fence_put(entry->fence); in syncobj_eventfd_entry_free()
310 list_del(&entry->node); in syncobj_eventfd_entry_free()
318 spin_lock(&syncobj->lock); in drm_syncobj_add_eventfd()
319 list_add_tail(&entry->node, &syncobj->ev_fd_list); in drm_syncobj_add_eventfd()
321 spin_unlock(&syncobj->lock); in drm_syncobj_add_eventfd()
325 * drm_syncobj_add_point - add new timeline point to the syncobj
326 * @syncobj: sync object to add timeline point do
344 spin_lock(&syncobj->lock); in drm_syncobj_add_point()
348 if (prev && prev->seqno >= point) in drm_syncobj_add_point()
351 rcu_assign_pointer(syncobj->fence, &chain->base); in drm_syncobj_add_point()
353 list_for_each_entry_safe(wait_cur, wait_tmp, &syncobj->cb_list, node) in drm_syncobj_add_point()
355 list_for_each_entry_safe(ev_fd_cur, ev_fd_tmp, &syncobj->ev_fd_list, node) in drm_syncobj_add_point()
357 spin_unlock(&syncobj->lock); in drm_syncobj_add_point()
366 * drm_syncobj_replace_fence - replace fence in a sync object.
367 * @syncobj: Sync object to replace fence in
368 * @fence: fence to install in sync file.
370 * This replaces the fence on a sync object.
382 spin_lock(&syncobj->lock); in drm_syncobj_replace_fence()
384 old_fence = rcu_dereference_protected(syncobj->fence, in drm_syncobj_replace_fence()
385 lockdep_is_held(&syncobj->lock)); in drm_syncobj_replace_fence()
386 rcu_assign_pointer(syncobj->fence, fence); in drm_syncobj_replace_fence()
389 list_for_each_entry_safe(wait_cur, wait_tmp, &syncobj->cb_list, node) in drm_syncobj_replace_fence()
391 list_for_each_entry_safe(ev_fd_cur, ev_fd_tmp, &syncobj->ev_fd_list, node) in drm_syncobj_replace_fence()
395 spin_unlock(&syncobj->lock); in drm_syncobj_replace_fence()
402 * drm_syncobj_assign_null_handle - assign a stub fence to the sync object
403 * @syncobj: sync object to assign the fence on
405 * Assign a already signaled stub fence to the sync object.
412 return -ENOMEM; in drm_syncobj_assign_null_handle()
422 * drm_syncobj_find_fence - lookup and reference the fence in a sync object
424 * @handle: sync object handle to lookup.
433 * contains a reference to the fence, which must be released by calling
446 return -ENOENT; in drm_syncobj_find_fence()
449 ret = -EINVAL; in drm_syncobj_find_fence()
479 ret = -EINVAL; in drm_syncobj_find_fence()
497 ret = -ETIME; in drm_syncobj_find_fence()
502 ret = -ERESTARTSYS; in drm_syncobj_find_fence()
523 * drm_syncobj_free - free a sync object.
537 list_for_each_entry_safe(ev_fd_cur, ev_fd_tmp, &syncobj->ev_fd_list, node) in drm_syncobj_free()
545 * drm_syncobj_create - create a new syncobj
548 * @fence: if non-NULL, the syncobj will represent this fence
550 * This is the first function to create a sync object. After creating, drivers
564 return -ENOMEM; in drm_syncobj_create()
566 kref_init(&syncobj->refcount); in drm_syncobj_create()
567 INIT_LIST_HEAD(&syncobj->cb_list); in drm_syncobj_create()
568 INIT_LIST_HEAD(&syncobj->ev_fd_list); in drm_syncobj_create()
569 spin_lock_init(&syncobj->lock); in drm_syncobj_create()
588 * drm_syncobj_get_handle - get a handle from a syncobj
590 * @syncobj: Sync object to export
593 * Exports a sync object created with drm_syncobj_create() as a handle on
603 /* take a reference to put in the xarray */ in drm_syncobj_get_handle()
606 ret = xa_alloc(&file_private->syncobj_xa, handle, syncobj, xa_limit_32b, in drm_syncobj_get_handle()
635 syncobj = xa_erase(&file_private->syncobj_xa, handle); in drm_syncobj_destroy()
637 return -EINVAL; in drm_syncobj_destroy()
645 struct drm_syncobj *syncobj = file->private_data; in drm_syncobj_file_release()
656 * drm_syncobj_get_fd - get a file descriptor from a syncobj
657 * @syncobj: Sync object to export
660 * Exports a sync object created with drm_syncobj_create() as a file descriptor.
696 return -EINVAL; in drm_syncobj_handle_to_fd()
711 return -EINVAL; in drm_syncobj_fd_to_handle()
713 if (fd_file(f)->f_op != &drm_syncobj_file_fops) in drm_syncobj_fd_to_handle()
714 return -EINVAL; in drm_syncobj_fd_to_handle()
716 /* take a reference to put in the xarray */ in drm_syncobj_fd_to_handle()
717 syncobj = fd_file(f)->private_data; in drm_syncobj_fd_to_handle()
720 ret = xa_alloc(&file_private->syncobj_xa, handle, syncobj, xa_limit_32b, in drm_syncobj_fd_to_handle()
735 return -EINVAL; in drm_syncobj_import_sync_file_fence()
740 return -ENOENT; in drm_syncobj_import_sync_file_fence()
747 return -ENOMEM; in drm_syncobj_import_sync_file_fence()
779 ret = -EINVAL; in drm_syncobj_export_sync_file()
783 fd_install(fd, sync_file->file); in drm_syncobj_export_sync_file()
792 * drm_syncobj_open - initializes syncobj file-private structures at devnode open time
793 * @file_private: drm file-private structure to set up
796 * of sync objects.
801 xa_init_flags(&file_private->syncobj_xa, XA_FLAGS_ALLOC1); in drm_syncobj_open()
805 * drm_syncobj_release - release file-private sync object resources
806 * @file_private: drm file-private structure to clean up
818 xa_for_each(&file_private->syncobj_xa, handle, syncobj) in drm_syncobj_release()
820 xa_destroy(&file_private->syncobj_xa); in drm_syncobj_release()
830 return -EOPNOTSUPP; in drm_syncobj_create_ioctl()
833 if (args->flags & ~DRM_SYNCOBJ_CREATE_SIGNALED) in drm_syncobj_create_ioctl()
834 return -EINVAL; in drm_syncobj_create_ioctl()
837 &args->handle, args->flags); in drm_syncobj_create_ioctl()
847 return -EOPNOTSUPP; in drm_syncobj_destroy_ioctl()
850 if (args->pad) in drm_syncobj_destroy_ioctl()
851 return -EINVAL; in drm_syncobj_destroy_ioctl()
852 return drm_syncobj_destroy(file_private, args->handle); in drm_syncobj_destroy_ioctl()
865 return -EOPNOTSUPP; in drm_syncobj_handle_to_fd_ioctl()
867 if (args->pad) in drm_syncobj_handle_to_fd_ioctl()
868 return -EINVAL; in drm_syncobj_handle_to_fd_ioctl()
870 if (args->flags & ~valid_flags) in drm_syncobj_handle_to_fd_ioctl()
871 return -EINVAL; in drm_syncobj_handle_to_fd_ioctl()
873 if (args->flags & DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_TIMELINE) in drm_syncobj_handle_to_fd_ioctl()
874 point = args->point; in drm_syncobj_handle_to_fd_ioctl()
876 if (args->flags & DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE) in drm_syncobj_handle_to_fd_ioctl()
877 return drm_syncobj_export_sync_file(file_private, args->handle, in drm_syncobj_handle_to_fd_ioctl()
878 point, &args->fd); in drm_syncobj_handle_to_fd_ioctl()
880 if (args->point) in drm_syncobj_handle_to_fd_ioctl()
881 return -EINVAL; in drm_syncobj_handle_to_fd_ioctl()
883 return drm_syncobj_handle_to_fd(file_private, args->handle, in drm_syncobj_handle_to_fd_ioctl()
884 &args->fd); in drm_syncobj_handle_to_fd_ioctl()
897 return -EOPNOTSUPP; in drm_syncobj_fd_to_handle_ioctl()
899 if (args->pad) in drm_syncobj_fd_to_handle_ioctl()
900 return -EINVAL; in drm_syncobj_fd_to_handle_ioctl()
902 if (args->flags & ~valid_flags) in drm_syncobj_fd_to_handle_ioctl()
903 return -EINVAL; in drm_syncobj_fd_to_handle_ioctl()
905 if (args->flags & DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_TIMELINE) in drm_syncobj_fd_to_handle_ioctl()
906 point = args->point; in drm_syncobj_fd_to_handle_ioctl()
908 if (args->flags & DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE) in drm_syncobj_fd_to_handle_ioctl()
910 args->fd, in drm_syncobj_fd_to_handle_ioctl()
911 args->handle, in drm_syncobj_fd_to_handle_ioctl()
914 if (args->point) in drm_syncobj_fd_to_handle_ioctl()
915 return -EINVAL; in drm_syncobj_fd_to_handle_ioctl()
917 return drm_syncobj_fd_to_handle(file_private, args->fd, in drm_syncobj_fd_to_handle_ioctl()
918 &args->handle); in drm_syncobj_fd_to_handle_ioctl()
929 timeline_syncobj = drm_syncobj_find(file_private, args->dst_handle); in drm_syncobj_transfer_to_timeline()
931 return -ENOENT; in drm_syncobj_transfer_to_timeline()
933 ret = drm_syncobj_find_fence(file_private, args->src_handle, in drm_syncobj_transfer_to_timeline()
934 args->src_point, args->flags, in drm_syncobj_transfer_to_timeline()
942 ret = -ENOMEM; in drm_syncobj_transfer_to_timeline()
948 ret = -ENOMEM; in drm_syncobj_transfer_to_timeline()
952 drm_syncobj_add_point(timeline_syncobj, chain, fence, args->dst_point); in drm_syncobj_transfer_to_timeline()
969 binary_syncobj = drm_syncobj_find(file_private, args->dst_handle); in drm_syncobj_transfer_to_binary()
971 return -ENOENT; in drm_syncobj_transfer_to_binary()
972 ret = drm_syncobj_find_fence(file_private, args->src_handle, in drm_syncobj_transfer_to_binary()
973 args->src_point, args->flags, &fence); in drm_syncobj_transfer_to_binary()
991 return -EOPNOTSUPP; in drm_syncobj_transfer_ioctl()
993 if (args->pad) in drm_syncobj_transfer_ioctl()
994 return -EINVAL; in drm_syncobj_transfer_ioctl()
996 if (args->dst_point) in drm_syncobj_transfer_ioctl()
1010 wake_up_process(wait->task); in syncobj_wait_fence_func()
1019 fence = rcu_dereference_protected(syncobj->fence, in syncobj_wait_syncobj_func()
1020 lockdep_is_held(&syncobj->lock)); in syncobj_wait_syncobj_func()
1022 if (!fence || dma_fence_chain_find_seqno(&fence, wait->point)) { in syncobj_wait_syncobj_func()
1026 wait->fence = dma_fence_get_stub(); in syncobj_wait_syncobj_func()
1028 wait->fence = fence; in syncobj_wait_syncobj_func()
1031 wake_up_process(wait->task); in syncobj_wait_syncobj_func()
1032 list_del_init(&wait->node); in syncobj_wait_syncobj_func()
1056 return -ENOMEM; in drm_syncobj_array_wait_timeout()
1063 timeout = -EFAULT; in drm_syncobj_array_wait_timeout()
1069 timeout = -ENOMEM; in drm_syncobj_array_wait_timeout()
1072 /* Walk the list of sync objects and initialize entries. We do in drm_syncobj_array_wait_timeout()
1073 * this up-front so that we can properly return -EINVAL if there is in drm_syncobj_array_wait_timeout()
1075 * returning -EINVAL again. in drm_syncobj_array_wait_timeout()
1090 timeout = -EINVAL; in drm_syncobj_array_wait_timeout()
1115 * fence is signaled prior to fence->ops->enable_signaling() being in drm_syncobj_array_wait_timeout()
1165 timeout = -ETIME; in drm_syncobj_array_wait_timeout()
1170 timeout = -ERESTARTSYS; in drm_syncobj_array_wait_timeout()
1197 * drm_timeout_abs_to_jiffies - calculate jiffies timeout from absolute value
1208 /* make 0 timeout means poll - absolute 0 doesn't seem valid */ in drm_timeout_abs_to_jiffies()
1222 if (timeout_jiffies64 >= MAX_SCHEDULE_TIMEOUT - 1) in drm_timeout_abs_to_jiffies()
1223 return MAX_SCHEDULE_TIMEOUT - 1; in drm_timeout_abs_to_jiffies()
1240 timeout = drm_timeout_abs_to_jiffies(wait->timeout_nsec); in drm_syncobj_array_wait()
1243 wait->count_handles, in drm_syncobj_array_wait()
1244 wait->flags, in drm_syncobj_array_wait()
1249 wait->first_signaled = first; in drm_syncobj_array_wait()
1251 timeout = drm_timeout_abs_to_jiffies(timeline_wait->timeout_nsec); in drm_syncobj_array_wait()
1253 u64_to_user_ptr(timeline_wait->points), in drm_syncobj_array_wait()
1254 timeline_wait->count_handles, in drm_syncobj_array_wait()
1255 timeline_wait->flags, in drm_syncobj_array_wait()
1260 timeline_wait->first_signaled = first; in drm_syncobj_array_wait()
1276 return -ENOMEM; in drm_syncobj_array_find()
1280 ret = -EFAULT; in drm_syncobj_array_find()
1286 ret = -ENOMEM; in drm_syncobj_array_find()
1293 ret = -ENOENT; in drm_syncobj_array_find()
1303 while (i-- > 0) in drm_syncobj_array_find()
1333 return -EOPNOTSUPP; in drm_syncobj_wait_ioctl()
1339 if (args->flags & ~possible_flags) in drm_syncobj_wait_ioctl()
1340 return -EINVAL; in drm_syncobj_wait_ioctl()
1342 if (args->count_handles == 0) in drm_syncobj_wait_ioctl()
1346 u64_to_user_ptr(args->handles), in drm_syncobj_wait_ioctl()
1347 args->count_handles, in drm_syncobj_wait_ioctl()
1352 if (args->flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_DEADLINE) { in drm_syncobj_wait_ioctl()
1353 t = ns_to_ktime(args->deadline_nsec); in drm_syncobj_wait_ioctl()
1360 drm_syncobj_array_free(syncobjs, args->count_handles); in drm_syncobj_wait_ioctl()
1376 return -EOPNOTSUPP; in drm_syncobj_timeline_wait_ioctl()
1383 if (args->flags & ~possible_flags) in drm_syncobj_timeline_wait_ioctl()
1384 return -EINVAL; in drm_syncobj_timeline_wait_ioctl()
1386 if (args->count_handles == 0) in drm_syncobj_timeline_wait_ioctl()
1390 u64_to_user_ptr(args->handles), in drm_syncobj_timeline_wait_ioctl()
1391 args->count_handles, in drm_syncobj_timeline_wait_ioctl()
1396 if (args->flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_DEADLINE) { in drm_syncobj_timeline_wait_ioctl()
1397 t = ns_to_ktime(args->deadline_nsec); in drm_syncobj_timeline_wait_ioctl()
1404 drm_syncobj_array_free(syncobjs, args->count_handles); in drm_syncobj_timeline_wait_ioctl()
1415 eventfd_signal(entry->ev_fd_ctx); in syncobj_eventfd_entry_fence_func()
1427 fence = dma_fence_get(rcu_dereference_protected(syncobj->fence, 1)); in syncobj_eventfd_entry_func()
1431 ret = dma_fence_chain_find_seqno(&fence, entry->point); in syncobj_eventfd_entry_func()
1445 list_del_init(&entry->node); in syncobj_eventfd_entry_func()
1446 entry->fence = fence; in syncobj_eventfd_entry_func()
1448 if (entry->flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE) { in syncobj_eventfd_entry_func()
1449 eventfd_signal(entry->ev_fd_ctx); in syncobj_eventfd_entry_func()
1452 ret = dma_fence_add_callback(fence, &entry->fence_cb, in syncobj_eventfd_entry_func()
1454 if (ret == -ENOENT) { in syncobj_eventfd_entry_func()
1455 eventfd_signal(entry->ev_fd_ctx); in syncobj_eventfd_entry_func()
1472 return -EOPNOTSUPP; in drm_syncobj_eventfd_ioctl()
1474 if (args->flags & ~DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE) in drm_syncobj_eventfd_ioctl()
1475 return -EINVAL; in drm_syncobj_eventfd_ioctl()
1477 if (args->pad) in drm_syncobj_eventfd_ioctl()
1478 return -EINVAL; in drm_syncobj_eventfd_ioctl()
1480 syncobj = drm_syncobj_find(file_private, args->handle); in drm_syncobj_eventfd_ioctl()
1482 return -ENOENT; in drm_syncobj_eventfd_ioctl()
1484 ev_fd_ctx = eventfd_ctx_fdget(args->fd); in drm_syncobj_eventfd_ioctl()
1492 ret = -ENOMEM; in drm_syncobj_eventfd_ioctl()
1495 entry->syncobj = syncobj; in drm_syncobj_eventfd_ioctl()
1496 entry->ev_fd_ctx = ev_fd_ctx; in drm_syncobj_eventfd_ioctl()
1497 entry->point = args->point; in drm_syncobj_eventfd_ioctl()
1498 entry->flags = args->flags; in drm_syncobj_eventfd_ioctl()
1522 return -EOPNOTSUPP; in drm_syncobj_reset_ioctl()
1524 if (args->pad != 0) in drm_syncobj_reset_ioctl()
1525 return -EINVAL; in drm_syncobj_reset_ioctl()
1527 if (args->count_handles == 0) in drm_syncobj_reset_ioctl()
1528 return -EINVAL; in drm_syncobj_reset_ioctl()
1531 u64_to_user_ptr(args->handles), in drm_syncobj_reset_ioctl()
1532 args->count_handles, in drm_syncobj_reset_ioctl()
1537 for (i = 0; i < args->count_handles; i++) in drm_syncobj_reset_ioctl()
1540 drm_syncobj_array_free(syncobjs, args->count_handles); in drm_syncobj_reset_ioctl()
1555 return -EOPNOTSUPP; in drm_syncobj_signal_ioctl()
1557 if (args->pad != 0) in drm_syncobj_signal_ioctl()
1558 return -EINVAL; in drm_syncobj_signal_ioctl()
1560 if (args->count_handles == 0) in drm_syncobj_signal_ioctl()
1561 return -EINVAL; in drm_syncobj_signal_ioctl()
1564 u64_to_user_ptr(args->handles), in drm_syncobj_signal_ioctl()
1565 args->count_handles, in drm_syncobj_signal_ioctl()
1570 for (i = 0; i < args->count_handles; i++) { in drm_syncobj_signal_ioctl()
1576 drm_syncobj_array_free(syncobjs, args->count_handles); in drm_syncobj_signal_ioctl()
1593 return -EOPNOTSUPP; in drm_syncobj_timeline_signal_ioctl()
1595 if (args->flags != 0) in drm_syncobj_timeline_signal_ioctl()
1596 return -EINVAL; in drm_syncobj_timeline_signal_ioctl()
1598 if (args->count_handles == 0) in drm_syncobj_timeline_signal_ioctl()
1599 return -EINVAL; in drm_syncobj_timeline_signal_ioctl()
1602 u64_to_user_ptr(args->handles), in drm_syncobj_timeline_signal_ioctl()
1603 args->count_handles, in drm_syncobj_timeline_signal_ioctl()
1608 points = kmalloc_array(args->count_handles, sizeof(*points), in drm_syncobj_timeline_signal_ioctl()
1611 ret = -ENOMEM; in drm_syncobj_timeline_signal_ioctl()
1614 if (!u64_to_user_ptr(args->points)) { in drm_syncobj_timeline_signal_ioctl()
1615 memset(points, 0, args->count_handles * sizeof(uint64_t)); in drm_syncobj_timeline_signal_ioctl()
1616 } else if (copy_from_user(points, u64_to_user_ptr(args->points), in drm_syncobj_timeline_signal_ioctl()
1617 sizeof(uint64_t) * args->count_handles)) { in drm_syncobj_timeline_signal_ioctl()
1618 ret = -EFAULT; in drm_syncobj_timeline_signal_ioctl()
1622 chains = kmalloc_objs(*chains, args->count_handles); in drm_syncobj_timeline_signal_ioctl()
1624 ret = -ENOMEM; in drm_syncobj_timeline_signal_ioctl()
1627 for (i = 0; i < args->count_handles; i++) { in drm_syncobj_timeline_signal_ioctl()
1632 ret = -ENOMEM; in drm_syncobj_timeline_signal_ioctl()
1637 for (i = 0; i < args->count_handles; i++) { in drm_syncobj_timeline_signal_ioctl()
1649 drm_syncobj_array_free(syncobjs, args->count_handles); in drm_syncobj_timeline_signal_ioctl()
1659 uint64_t __user *points = u64_to_user_ptr(args->points); in drm_syncobj_query_ioctl()
1664 return -EOPNOTSUPP; in drm_syncobj_query_ioctl()
1666 if (args->flags & ~DRM_SYNCOBJ_QUERY_FLAGS_LAST_SUBMITTED) in drm_syncobj_query_ioctl()
1667 return -EINVAL; in drm_syncobj_query_ioctl()
1669 if (args->count_handles == 0) in drm_syncobj_query_ioctl()
1670 return -EINVAL; in drm_syncobj_query_ioctl()
1673 u64_to_user_ptr(args->handles), in drm_syncobj_query_ioctl()
1674 args->count_handles, in drm_syncobj_query_ioctl()
1679 for (i = 0; i < args->count_handles; i++) { in drm_syncobj_query_ioctl()
1690 if (args->flags & in drm_syncobj_query_ioctl()
1692 point = fence->seqno; in drm_syncobj_query_ioctl()
1695 if (iter->context != fence->context) { in drm_syncobj_query_ioctl()
1705 last_signaled->seqno : in drm_syncobj_query_ioctl()
1706 to_dma_fence_chain(last_signaled)->prev_seqno; in drm_syncobj_query_ioctl()
1714 ret = ret ? -EFAULT : 0; in drm_syncobj_query_ioctl()
1718 drm_syncobj_array_free(syncobjs, args->count_handles); in drm_syncobj_query_ioctl()