Lines Matching full:fence
3 * Parts ported from amdgpu (fence wait code).
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
57 * to an already signaled fence depending on whether the
63 * the syncobj, the syncobj's fence is replaced with a fence which will be
67 * struct &dma_fence_chain pointing to the DRM driver's fence and also
68 * pointing to the previous fence that was in the syncobj. The new struct
69 * &dma_fence_chain fence replace the syncobj's fence and will be signaled by
71 * fence previously in the syncobj.
74 * time the work is enqueued, it waits on the syncobj's fence before
75 * submitting the work to hardware. That fence is either :
77 * - The syncobj's current fence if the syncobj is considered as a binary
82 * If the syncobj's fence is NULL or not present in the syncobj's timeline,
85 * With binary syncobj, all manipulation of the syncobjs's fence happens in
86 * terms of the current fence at the time the ioctl is called by userspace
91 * setting its pointer to a fence which is already signaled.
93 * With a timeline syncobj, all manipulation of the synobj's fence happens in
104 * syncobj's fence when signaling).
114 * Otherwise, it returns once at least one syncobj fence has been signaled
115 * and the index of a signaled fence is written back to the client.
118 * fence in a syncobj, if &DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT is set,
120 * fence and then wait on that fence.
122 * syncobjs in the array has a NULL fence, -EINVAL will be returned.
123 * Assuming the syncobj starts off with a NULL fence, this allows a client
127 * This requirement is inherited from the Vulkan fence API.
134 * fence to materialize on the timeline without waiting for the fence to be
167 * import/export the syncobj's current fence from/to a &sync_file.
169 * sycnobj's fence at the time of export and any later signal or reset
171 * When a sync file is imported into a syncobj, the syncobj's fence is set
172 * to the fence wrapped by that sync file.
187 * point 0 to mean take/replace the fence in the syncobj.
191 #include <linux/dma-fence-unwrap.h>
212 struct dma_fence *fence; member
222 struct dma_fence *fence; member
263 struct dma_fence *fence; in drm_syncobj_fence_add_wait() local
265 if (wait->fence) in drm_syncobj_fence_add_wait()
269 /* We've already tried once to get a fence and failed. Now that we in drm_syncobj_fence_add_wait()
271 * callback when a fence has already been set. in drm_syncobj_fence_add_wait()
273 fence = dma_fence_get(rcu_dereference_protected(syncobj->fence, 1)); in drm_syncobj_fence_add_wait()
274 if (!fence || dma_fence_chain_find_seqno(&fence, wait->point)) { in drm_syncobj_fence_add_wait()
275 dma_fence_put(fence); in drm_syncobj_fence_add_wait()
277 } else if (!fence) { in drm_syncobj_fence_add_wait()
278 wait->fence = dma_fence_get_stub(); in drm_syncobj_fence_add_wait()
280 wait->fence = fence; in drm_syncobj_fence_add_wait()
300 dma_fence_put(entry->fence); in syncobj_eventfd_entry_free()
322 * @fence: fence to encapsulate in the chain node
329 struct dma_fence *fence, in drm_syncobj_add_point() argument
336 dma_fence_get(fence); in drm_syncobj_add_point()
344 dma_fence_chain_init(chain, prev, fence, point); in drm_syncobj_add_point()
345 rcu_assign_pointer(syncobj->fence, &chain->base); in drm_syncobj_add_point()
354 dma_fence_chain_for_each(fence, prev); in drm_syncobj_add_point()
360 * drm_syncobj_replace_fence - replace fence in a sync object.
361 * @syncobj: Sync object to replace fence in
362 * @fence: fence to install in sync file.
364 * This replaces the fence on a sync object.
367 struct dma_fence *fence) in drm_syncobj_replace_fence() argument
373 if (fence) in drm_syncobj_replace_fence()
374 dma_fence_get(fence); in drm_syncobj_replace_fence()
378 old_fence = rcu_dereference_protected(syncobj->fence, in drm_syncobj_replace_fence()
380 rcu_assign_pointer(syncobj->fence, fence); in drm_syncobj_replace_fence()
382 if (fence != old_fence) { in drm_syncobj_replace_fence()
396 * drm_syncobj_assign_null_handle - assign a stub fence to the sync object
397 * @syncobj: sync object to assign the fence on
399 * Assign a already signaled stub fence to the sync object.
403 struct dma_fence *fence = dma_fence_allocate_private_stub(ktime_get()); in drm_syncobj_assign_null_handle() local
405 if (!fence) in drm_syncobj_assign_null_handle()
408 drm_syncobj_replace_fence(syncobj, fence); in drm_syncobj_assign_null_handle()
409 dma_fence_put(fence); in drm_syncobj_assign_null_handle()
416 * drm_syncobj_find_fence - lookup and reference the fence in a sync object
421 * @fence: out parameter for the fence
426 * Returns 0 on success or a negative error value on failure. On success @fence
427 * contains a reference to the fence, which must be released by calling
432 struct dma_fence **fence) in drm_syncobj_find_fence() argument
451 *fence = drm_syncobj_fence_get(syncobj); in drm_syncobj_find_fence()
453 if (*fence) { in drm_syncobj_find_fence()
454 ret = dma_fence_chain_find_seqno(fence, point); in drm_syncobj_find_fence()
458 * fence. To make sure the recipient gets in drm_syncobj_find_fence()
459 * signalled, use a new fence instead. in drm_syncobj_find_fence()
461 if (!*fence) in drm_syncobj_find_fence()
462 *fence = dma_fence_get_stub(); in drm_syncobj_find_fence()
466 dma_fence_put(*fence); in drm_syncobj_find_fence()
481 if (wait.fence) { in drm_syncobj_find_fence()
499 *fence = wait.fence; in drm_syncobj_find_fence()
537 * @fence: if non-NULL, the syncobj will represent this fence
546 struct dma_fence *fence) in drm_syncobj_create() argument
568 if (fence) in drm_syncobj_create()
569 drm_syncobj_replace_fence(syncobj, fence); in drm_syncobj_create()
741 struct dma_fence *fence = sync_file_get_fence(fd); in drm_syncobj_import_sync_file_fence() local
744 if (!fence) in drm_syncobj_import_sync_file_fence()
749 dma_fence_put(fence); in drm_syncobj_import_sync_file_fence()
753 drm_syncobj_replace_fence(syncobj, fence); in drm_syncobj_import_sync_file_fence()
754 dma_fence_put(fence); in drm_syncobj_import_sync_file_fence()
763 struct dma_fence *fence; in drm_syncobj_export_sync_file() local
770 ret = drm_syncobj_find_fence(file_private, handle, 0, 0, &fence); in drm_syncobj_export_sync_file()
774 sync_file = sync_file_create(fence); in drm_syncobj_export_sync_file()
776 dma_fence_put(fence); in drm_syncobj_export_sync_file()
915 struct dma_fence *fence, *tmp; in drm_syncobj_transfer_to_timeline() local
929 fence = dma_fence_unwrap_merge(tmp); in drm_syncobj_transfer_to_timeline()
931 if (!fence) { in drm_syncobj_transfer_to_timeline()
942 drm_syncobj_add_point(timeline_syncobj, chain, fence, args->dst_point); in drm_syncobj_transfer_to_timeline()
944 dma_fence_put(fence); in drm_syncobj_transfer_to_timeline()
956 struct dma_fence *fence; in drm_syncobj_transfer_to_binary() local
963 args->src_point, args->flags, &fence); in drm_syncobj_transfer_to_binary()
966 drm_syncobj_replace_fence(binary_syncobj, fence); in drm_syncobj_transfer_to_binary()
967 dma_fence_put(fence); in drm_syncobj_transfer_to_binary()
994 static void syncobj_wait_fence_func(struct dma_fence *fence, in syncobj_wait_fence_func() argument
1006 struct dma_fence *fence; in syncobj_wait_syncobj_func() local
1009 fence = rcu_dereference_protected(syncobj->fence, in syncobj_wait_syncobj_func()
1011 dma_fence_get(fence); in syncobj_wait_syncobj_func()
1012 if (!fence || dma_fence_chain_find_seqno(&fence, wait->point)) { in syncobj_wait_syncobj_func()
1013 dma_fence_put(fence); in syncobj_wait_syncobj_func()
1015 } else if (!fence) { in syncobj_wait_syncobj_func()
1016 wait->fence = dma_fence_get_stub(); in syncobj_wait_syncobj_func()
1018 wait->fence = fence; in syncobj_wait_syncobj_func()
1033 struct dma_fence *fence; in drm_syncobj_array_wait_timeout() local
1060 * a syncobj with a missing fence and then never have the chance of in drm_syncobj_array_wait_timeout()
1065 struct dma_fence *fence; in drm_syncobj_array_wait_timeout() local
1069 fence = drm_syncobj_fence_get(syncobjs[i]); in drm_syncobj_array_wait_timeout()
1070 if (!fence || dma_fence_chain_find_seqno(&fence, points[i])) { in drm_syncobj_array_wait_timeout()
1071 dma_fence_put(fence); in drm_syncobj_array_wait_timeout()
1080 if (fence) in drm_syncobj_array_wait_timeout()
1081 entries[i].fence = fence; in drm_syncobj_array_wait_timeout()
1083 entries[i].fence = dma_fence_get_stub(); in drm_syncobj_array_wait_timeout()
1086 dma_fence_is_signaled(entries[i].fence)) { in drm_syncobj_array_wait_timeout()
1100 * fence is signaled prior to fence->ops->enable_signaling() being in drm_syncobj_array_wait_timeout()
1115 fence = entries[i].fence; in drm_syncobj_array_wait_timeout()
1116 if (!fence) in drm_syncobj_array_wait_timeout()
1120 dma_fence_is_signaled(fence) || in drm_syncobj_array_wait_timeout()
1122 dma_fence_add_callback(fence, in drm_syncobj_array_wait_timeout()
1125 /* The fence has been signaled */ in drm_syncobj_array_wait_timeout()
1159 dma_fence_remove_callback(entries[i].fence, in drm_syncobj_array_wait_timeout()
1161 dma_fence_put(entries[i].fence); in drm_syncobj_array_wait_timeout()
1361 static void syncobj_eventfd_entry_fence_func(struct dma_fence *fence, in syncobj_eventfd_entry_fence_func() argument
1376 struct dma_fence *fence; in syncobj_eventfd_entry_func() local
1379 fence = dma_fence_get(rcu_dereference_protected(syncobj->fence, 1)); in syncobj_eventfd_entry_func()
1380 ret = dma_fence_chain_find_seqno(&fence, entry->point); in syncobj_eventfd_entry_func()
1381 if (ret != 0 || !fence) { in syncobj_eventfd_entry_func()
1382 dma_fence_put(fence); in syncobj_eventfd_entry_func()
1387 entry->fence = fence; in syncobj_eventfd_entry_func()
1393 ret = dma_fence_add_callback(fence, &entry->fence_cb, in syncobj_eventfd_entry_func()
1570 struct dma_fence *fence = dma_fence_get_stub(); in drm_syncobj_timeline_signal_ioctl() local
1573 fence, points[i]); in drm_syncobj_timeline_signal_ioctl()
1574 dma_fence_put(fence); in drm_syncobj_timeline_signal_ioctl()
1613 struct dma_fence *fence; in drm_syncobj_query_ioctl() local
1616 fence = drm_syncobj_fence_get(syncobjs[i]); in drm_syncobj_query_ioctl()
1617 chain = to_dma_fence_chain(fence); in drm_syncobj_query_ioctl()
1620 dma_fence_get(fence); in drm_syncobj_query_ioctl()
1624 point = fence->seqno; in drm_syncobj_query_ioctl()
1626 dma_fence_chain_for_each(iter, fence) { in drm_syncobj_query_ioctl()
1627 if (iter->context != fence->context) { in drm_syncobj_query_ioctl()
1644 dma_fence_put(fence); in drm_syncobj_query_ioctl()