Lines Matching refs:submit
35 struct msm_gem_submit *submit; in submit_create() local
39 sz = struct_size(submit, bos, nr_bos) + in submit_create()
40 ((u64)nr_cmds * sizeof(submit->cmd[0])); in submit_create()
45 submit = kzalloc(sz, GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY); in submit_create()
46 if (!submit) in submit_create()
49 ret = drm_sched_job_init(&submit->base, queue->entity, queue); in submit_create()
51 kfree(submit); in submit_create()
55 xa_init_flags(&submit->deps, XA_FLAGS_ALLOC); in submit_create()
57 kref_init(&submit->ref); in submit_create()
58 submit->dev = dev; in submit_create()
59 submit->aspace = queue->ctx->aspace; in submit_create()
60 submit->gpu = gpu; in submit_create()
61 submit->cmd = (void *)&submit->bos[nr_bos]; in submit_create()
62 submit->queue = queue; in submit_create()
63 submit->ring = gpu->rb[queue->ring_nr]; in submit_create()
64 submit->fault_dumped = false; in submit_create()
66 INIT_LIST_HEAD(&submit->node); in submit_create()
68 return submit; in submit_create()
73 struct msm_gem_submit *submit = in __msm_gem_submit_destroy() local
79 if (submit->fence_id) { in __msm_gem_submit_destroy()
80 mutex_lock(&submit->queue->lock); in __msm_gem_submit_destroy()
81 idr_remove(&submit->queue->fence_idr, submit->fence_id); in __msm_gem_submit_destroy()
82 mutex_unlock(&submit->queue->lock); in __msm_gem_submit_destroy()
85 xa_for_each (&submit->deps, index, fence) { in __msm_gem_submit_destroy()
89 xa_destroy(&submit->deps); in __msm_gem_submit_destroy()
91 dma_fence_put(submit->user_fence); in __msm_gem_submit_destroy()
92 dma_fence_put(submit->hw_fence); in __msm_gem_submit_destroy()
94 put_pid(submit->pid); in __msm_gem_submit_destroy()
95 msm_submitqueue_put(submit->queue); in __msm_gem_submit_destroy()
97 for (i = 0; i < submit->nr_cmds; i++) in __msm_gem_submit_destroy()
98 kfree(submit->cmd[i].relocs); in __msm_gem_submit_destroy()
100 kfree(submit); in __msm_gem_submit_destroy()
103 static int submit_lookup_objects(struct msm_gem_submit *submit, in submit_lookup_objects() argument
117 submit->bos[i].flags = 0; in submit_lookup_objects()
136 submit->bos[i].handle = submit_bo.handle; in submit_lookup_objects()
137 submit->bos[i].flags = submit_bo.flags; in submit_lookup_objects()
139 submit->bos[i].iova = submit_bo.presumed; in submit_lookup_objects()
150 obj = idr_find(&file->object_idr, submit->bos[i].handle); in submit_lookup_objects()
152 DRM_ERROR("invalid handle %u at index %u\n", submit->bos[i].handle, i); in submit_lookup_objects()
159 submit->bos[i].obj = to_msm_bo(obj); in submit_lookup_objects()
166 submit->nr_bos = i; in submit_lookup_objects()
171 static int submit_lookup_cmds(struct msm_gem_submit *submit, in submit_lookup_cmds() argument
207 submit->cmd[i].type = submit_cmd.type; in submit_lookup_cmds()
208 submit->cmd[i].size = submit_cmd.size / 4; in submit_lookup_cmds()
209 submit->cmd[i].offset = submit_cmd.submit_offset / 4; in submit_lookup_cmds()
210 submit->cmd[i].idx = submit_cmd.submit_idx; in submit_lookup_cmds()
211 submit->cmd[i].nr_relocs = submit_cmd.nr_relocs; in submit_lookup_cmds()
222 submit->cmd[i].relocs = kmalloc(sz, GFP_KERNEL); in submit_lookup_cmds()
223 ret = copy_from_user(submit->cmd[i].relocs, userptr, sz); in submit_lookup_cmds()
238 static void submit_cleanup_bo(struct msm_gem_submit *submit, int i, in submit_cleanup_bo() argument
241 struct drm_gem_object *obj = &submit->bos[i].obj->base; in submit_cleanup_bo()
242 unsigned flags = submit->bos[i].flags & cleanup_flags; in submit_cleanup_bo()
245 msm_gem_unpin_iova_locked(obj, submit->aspace); in submit_cleanup_bo()
253 submit->bos[i].flags &= ~cleanup_flags; in submit_cleanup_bo()
256 static void submit_unlock_unpin_bo(struct msm_gem_submit *submit, int i) in submit_unlock_unpin_bo() argument
258 submit_cleanup_bo(submit, i, BO_PINNED | BO_ACTIVE | BO_LOCKED); in submit_unlock_unpin_bo()
260 if (!(submit->bos[i].flags & BO_VALID)) in submit_unlock_unpin_bo()
261 submit->bos[i].iova = 0; in submit_unlock_unpin_bo()
265 static int submit_lock_objects(struct msm_gem_submit *submit) in submit_lock_objects() argument
270 for (i = 0; i < submit->nr_bos; i++) { in submit_lock_objects()
271 struct msm_gem_object *msm_obj = submit->bos[i].obj; in submit_lock_objects()
278 if (!(submit->bos[i].flags & BO_LOCKED)) { in submit_lock_objects()
280 &submit->ticket); in submit_lock_objects()
283 submit->bos[i].flags |= BO_LOCKED; in submit_lock_objects()
287 ww_acquire_done(&submit->ticket); in submit_lock_objects()
294 submit->bos[i].handle, i); in submit_lock_objects()
299 submit_unlock_unpin_bo(submit, i); in submit_lock_objects()
302 submit_unlock_unpin_bo(submit, slow_locked); in submit_lock_objects()
305 struct msm_gem_object *msm_obj = submit->bos[contended].obj; in submit_lock_objects()
308 &submit->ticket); in submit_lock_objects()
310 submit->bos[contended].flags |= BO_LOCKED; in submit_lock_objects()
325 static int submit_fence_sync(struct msm_gem_submit *submit, bool no_implicit) in submit_fence_sync() argument
329 for (i = 0; i < submit->nr_bos; i++) { in submit_fence_sync()
330 struct drm_gem_object *obj = &submit->bos[i].obj->base; in submit_fence_sync()
331 bool write = submit->bos[i].flags & MSM_SUBMIT_BO_WRITE; in submit_fence_sync()
347 ret = drm_gem_fence_array_add_implicit(&submit->deps, obj, in submit_fence_sync()
356 static int submit_pin_objects(struct msm_gem_submit *submit) in submit_pin_objects() argument
360 submit->valid = true; in submit_pin_objects()
367 for (i = 0; i < submit->nr_bos; i++) { in submit_pin_objects()
368 struct drm_gem_object *obj = &submit->bos[i].obj->base; in submit_pin_objects()
370 msm_gem_active_get(obj, submit->gpu); in submit_pin_objects()
371 submit->bos[i].flags |= BO_ACTIVE; in submit_pin_objects()
374 for (i = 0; i < submit->nr_bos; i++) { in submit_pin_objects()
375 struct drm_gem_object *obj = &submit->bos[i].obj->base; in submit_pin_objects()
380 submit->aspace, &iova); in submit_pin_objects()
385 submit->bos[i].flags |= BO_PINNED; in submit_pin_objects()
387 if (iova == submit->bos[i].iova) { in submit_pin_objects()
388 submit->bos[i].flags |= BO_VALID; in submit_pin_objects()
390 submit->bos[i].iova = iova; in submit_pin_objects()
392 submit->bos[i].flags &= ~BO_VALID; in submit_pin_objects()
393 submit->valid = false; in submit_pin_objects()
400 static void submit_attach_object_fences(struct msm_gem_submit *submit) in submit_attach_object_fences() argument
404 for (i = 0; i < submit->nr_bos; i++) { in submit_attach_object_fences()
405 struct drm_gem_object *obj = &submit->bos[i].obj->base; in submit_attach_object_fences()
407 if (submit->bos[i].flags & MSM_SUBMIT_BO_WRITE) in submit_attach_object_fences()
408 dma_resv_add_excl_fence(obj->resv, submit->user_fence); in submit_attach_object_fences()
409 else if (submit->bos[i].flags & MSM_SUBMIT_BO_READ) in submit_attach_object_fences()
410 dma_resv_add_shared_fence(obj->resv, submit->user_fence); in submit_attach_object_fences()
414 static int submit_bo(struct msm_gem_submit *submit, uint32_t idx, in submit_bo() argument
417 if (idx >= submit->nr_bos) { in submit_bo()
419 idx, submit->nr_bos); in submit_bo()
424 *obj = submit->bos[idx].obj; in submit_bo()
426 *iova = submit->bos[idx].iova; in submit_bo()
428 *valid = !!(submit->bos[idx].flags & BO_VALID); in submit_bo()
434 static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *obj, in submit_reloc() argument
483 ret = submit_bo(submit, submit_reloc.reloc_idx, NULL, &iova, &valid); in submit_reloc()
512 static void submit_cleanup(struct msm_gem_submit *submit, bool error) in submit_cleanup() argument
520 for (i = 0; i < submit->nr_bos; i++) { in submit_cleanup()
521 struct msm_gem_object *msm_obj = submit->bos[i].obj; in submit_cleanup()
522 submit_cleanup_bo(submit, i, cleanup_flags); in submit_cleanup()
528 void msm_submit_retire(struct msm_gem_submit *submit) in msm_submit_retire() argument
532 for (i = 0; i < submit->nr_bos; i++) { in msm_submit_retire()
533 struct drm_gem_object *obj = &submit->bos[i].obj->base; in msm_submit_retire()
536 submit_cleanup_bo(submit, i, BO_PINNED | BO_ACTIVE); in msm_submit_retire()
548 static struct drm_syncobj **msm_parse_deps(struct msm_gem_submit *submit, in msm_parse_deps() argument
577 !drm_core_check_feature(submit->dev, DRIVER_SYNCOBJ_TIMELINE)) { in msm_parse_deps()
592 ret = drm_gem_fence_array_add(&submit->deps, fence); in msm_parse_deps()
723 struct msm_gem_submit *submit = NULL; in msm_ioctl_gem_submit() local
779 submit = submit_create(dev, gpu, queue, args->nr_bos, in msm_ioctl_gem_submit()
781 if (IS_ERR(submit)) { in msm_ioctl_gem_submit()
782 ret = PTR_ERR(submit); in msm_ioctl_gem_submit()
786 submit->pid = pid; in msm_ioctl_gem_submit()
787 submit->ident = submitid; in msm_ioctl_gem_submit()
790 submit->in_rb = true; in msm_ioctl_gem_submit()
802 ret = drm_gem_fence_array_add(&submit->deps, in_fence); in msm_ioctl_gem_submit()
808 syncobjs_to_reset = msm_parse_deps(submit, file, in msm_ioctl_gem_submit()
829 ret = submit_lookup_objects(submit, args, file); in msm_ioctl_gem_submit()
833 ret = submit_lookup_cmds(submit, args, file); in msm_ioctl_gem_submit()
838 ww_acquire_init(&submit->ticket, &reservation_ww_class); in msm_ioctl_gem_submit()
840 ret = submit_lock_objects(submit); in msm_ioctl_gem_submit()
844 ret = submit_fence_sync(submit, !!(args->flags & MSM_SUBMIT_NO_IMPLICIT)); in msm_ioctl_gem_submit()
848 ret = submit_pin_objects(submit); in msm_ioctl_gem_submit()
856 ret = submit_bo(submit, submit->cmd[i].idx, in msm_ioctl_gem_submit()
861 if (!submit->cmd[i].size || in msm_ioctl_gem_submit()
862 ((submit->cmd[i].size + submit->cmd[i].offset) > in msm_ioctl_gem_submit()
864 DRM_ERROR("invalid cmdstream size: %u\n", submit->cmd[i].size * 4); in msm_ioctl_gem_submit()
869 submit->cmd[i].iova = iova + (submit->cmd[i].offset * 4); in msm_ioctl_gem_submit()
871 if (submit->valid) in msm_ioctl_gem_submit()
874 ret = submit_reloc(submit, msm_obj, submit->cmd[i].offset * 4, in msm_ioctl_gem_submit()
875 submit->cmd[i].nr_relocs, submit->cmd[i].relocs); in msm_ioctl_gem_submit()
880 submit->nr_cmds = i; in msm_ioctl_gem_submit()
882 submit->user_fence = dma_fence_get(&submit->base.s_fence->finished); in msm_ioctl_gem_submit()
888 submit->fence_id = idr_alloc_cyclic(&queue->fence_idr, in msm_ioctl_gem_submit()
889 submit->user_fence, 0, INT_MAX, GFP_KERNEL); in msm_ioctl_gem_submit()
890 if (submit->fence_id < 0) { in msm_ioctl_gem_submit()
891 ret = submit->fence_id = 0; in msm_ioctl_gem_submit()
892 submit->fence_id = 0; in msm_ioctl_gem_submit()
897 struct sync_file *sync_file = sync_file_create(submit->user_fence); in msm_ioctl_gem_submit()
906 submit_attach_object_fences(submit); in msm_ioctl_gem_submit()
909 msm_gem_submit_get(submit); in msm_ioctl_gem_submit()
911 drm_sched_entity_push_job(&submit->base, queue->entity); in msm_ioctl_gem_submit()
913 args->fence = submit->fence_id; in msm_ioctl_gem_submit()
917 submit->user_fence); in msm_ioctl_gem_submit()
921 submit_cleanup(submit, !!ret); in msm_ioctl_gem_submit()
923 ww_acquire_fini(&submit->ticket); in msm_ioctl_gem_submit()
928 if (submit) in msm_ioctl_gem_submit()
929 msm_gem_submit_put(submit); in msm_ioctl_gem_submit()