Lines Matching refs:submit

34 	struct etnaviv_gem_submit *submit;  in submit_create()  local
35 size_t sz = size_vstruct(nr_bos, sizeof(submit->bos[0]), sizeof(*submit)); in submit_create()
37 submit = kzalloc(sz, GFP_KERNEL); in submit_create()
38 if (!submit) in submit_create()
41 submit->pmrs = kcalloc(nr_pmrs, sizeof(struct etnaviv_perfmon_request), in submit_create()
43 if (!submit->pmrs) { in submit_create()
44 kfree(submit); in submit_create()
47 submit->nr_pmrs = nr_pmrs; in submit_create()
49 submit->gpu = gpu; in submit_create()
50 kref_init(&submit->refcount); in submit_create()
52 return submit; in submit_create()
55 static int submit_lookup_objects(struct etnaviv_gem_submit *submit, in submit_lookup_objects() argument
74 submit->bos[i].flags = bo->flags; in submit_lookup_objects()
75 if (submit->flags & ETNA_SUBMIT_SOFTPIN) { in submit_lookup_objects()
81 submit->bos[i].va = bo->presumed; in submit_lookup_objects()
101 submit->bos[i].obj = to_etnaviv_bo(obj); in submit_lookup_objects()
105 submit->nr_bos = i; in submit_lookup_objects()
111 static void submit_unlock_object(struct etnaviv_gem_submit *submit, int i) in submit_unlock_object() argument
113 if (submit->bos[i].flags & BO_LOCKED) { in submit_unlock_object()
114 struct drm_gem_object *obj = &submit->bos[i].obj->base; in submit_unlock_object()
117 submit->bos[i].flags &= ~BO_LOCKED; in submit_unlock_object()
121 static int submit_lock_objects(struct etnaviv_gem_submit *submit, in submit_lock_objects() argument
127 for (i = 0; i < submit->nr_bos; i++) { in submit_lock_objects()
128 struct drm_gem_object *obj = &submit->bos[i].obj->base; in submit_lock_objects()
135 if (!(submit->bos[i].flags & BO_LOCKED)) { in submit_lock_objects()
142 submit->bos[i].flags |= BO_LOCKED; in submit_lock_objects()
152 submit_unlock_object(submit, i); in submit_lock_objects()
155 submit_unlock_object(submit, slow_locked); in submit_lock_objects()
160 obj = &submit->bos[contended].obj->base; in submit_lock_objects()
165 submit->bos[contended].flags |= BO_LOCKED; in submit_lock_objects()
174 static int submit_fence_sync(struct etnaviv_gem_submit *submit) in submit_fence_sync() argument
178 for (i = 0; i < submit->nr_bos; i++) { in submit_fence_sync()
179 struct etnaviv_gem_submit_bo *bo = &submit->bos[i]; in submit_fence_sync()
186 if (submit->flags & ETNA_SUBMIT_NO_IMPLICIT) in submit_fence_sync()
189 ret = drm_sched_job_add_implicit_dependencies(&submit->sched_job, in submit_fence_sync()
199 static void submit_attach_object_fences(struct etnaviv_gem_submit *submit) in submit_attach_object_fences() argument
203 for (i = 0; i < submit->nr_bos; i++) { in submit_attach_object_fences()
204 struct drm_gem_object *obj = &submit->bos[i].obj->base; in submit_attach_object_fences()
205 bool write = submit->bos[i].flags & ETNA_SUBMIT_BO_WRITE; in submit_attach_object_fences()
207 dma_resv_add_fence(obj->resv, submit->out_fence, write ? in submit_attach_object_fences()
209 submit_unlock_object(submit, i); in submit_attach_object_fences()
213 static int submit_pin_objects(struct etnaviv_gem_submit *submit) in submit_pin_objects() argument
217 for (i = 0; i < submit->nr_bos; i++) { in submit_pin_objects()
218 struct etnaviv_gem_object *etnaviv_obj = submit->bos[i].obj; in submit_pin_objects()
222 submit->mmu_context, in submit_pin_objects()
223 submit->bos[i].va); in submit_pin_objects()
229 if ((submit->flags & ETNA_SUBMIT_SOFTPIN) && in submit_pin_objects()
230 submit->bos[i].va != mapping->iova) { in submit_pin_objects()
237 submit->bos[i].flags |= BO_PINNED; in submit_pin_objects()
238 submit->bos[i].mapping = mapping; in submit_pin_objects()
244 static int submit_bo(struct etnaviv_gem_submit *submit, u32 idx, in submit_bo() argument
247 if (idx >= submit->nr_bos) { in submit_bo()
249 idx, submit->nr_bos); in submit_bo()
253 *bo = &submit->bos[idx]; in submit_bo()
259 static int submit_reloc(struct etnaviv_gem_submit *submit, void *stream, in submit_reloc() argument
268 if ((submit->flags & ETNA_SUBMIT_SOFTPIN) && nr_relocs != 0) in submit_reloc()
296 ret = submit_bo(submit, r->reloc_idx, &bo); in submit_reloc()
313 static int submit_perfmon_validate(struct etnaviv_gem_submit *submit, in submit_perfmon_validate() argument
318 for (i = 0; i < submit->nr_pmrs; i++) { in submit_perfmon_validate()
323 ret = submit_bo(submit, r->read_idx, &bo); in submit_perfmon_validate()
348 submit->pmrs[i].flags = r->flags; in submit_perfmon_validate()
349 submit->pmrs[i].domain = r->domain; in submit_perfmon_validate()
350 submit->pmrs[i].signal = r->signal; in submit_perfmon_validate()
351 submit->pmrs[i].sequence = r->sequence; in submit_perfmon_validate()
352 submit->pmrs[i].offset = r->read_offset; in submit_perfmon_validate()
353 submit->pmrs[i].bo_vma = etnaviv_gem_vmap(&bo->obj->base); in submit_perfmon_validate()
361 struct etnaviv_gem_submit *submit = in submit_cleanup() local
365 if (submit->cmdbuf.suballoc) in submit_cleanup()
366 etnaviv_cmdbuf_free(&submit->cmdbuf); in submit_cleanup()
368 if (submit->mmu_context) in submit_cleanup()
369 etnaviv_iommu_context_put(submit->mmu_context); in submit_cleanup()
371 if (submit->prev_mmu_context) in submit_cleanup()
372 etnaviv_iommu_context_put(submit->prev_mmu_context); in submit_cleanup()
374 for (i = 0; i < submit->nr_bos; i++) { in submit_cleanup()
375 struct etnaviv_gem_object *etnaviv_obj = submit->bos[i].obj; in submit_cleanup()
378 if (submit->bos[i].flags & BO_PINNED) { in submit_cleanup()
379 etnaviv_gem_mapping_unreference(submit->bos[i].mapping); in submit_cleanup()
381 submit->bos[i].mapping = NULL; in submit_cleanup()
382 submit->bos[i].flags &= ~BO_PINNED; in submit_cleanup()
386 submit_unlock_object(submit, i); in submit_cleanup()
390 wake_up_all(&submit->gpu->fence_event); in submit_cleanup()
392 if (submit->out_fence) { in submit_cleanup()
397 xa_erase(&submit->gpu->user_fences, submit->out_fence_id); in submit_cleanup()
398 dma_fence_put(submit->out_fence); in submit_cleanup()
401 put_pid(submit->pid); in submit_cleanup()
403 kfree(submit->pmrs); in submit_cleanup()
404 kfree(submit); in submit_cleanup()
407 void etnaviv_submit_put(struct etnaviv_gem_submit *submit) in etnaviv_submit_put() argument
409 kref_put(&submit->refcount, submit_cleanup); in etnaviv_submit_put()
421 struct etnaviv_gem_submit *submit; in etnaviv_ioctl_gem_submit() local
518 submit = submit_create(dev, gpu, args->nr_bos, args->nr_pmrs); in etnaviv_ioctl_gem_submit()
519 if (!submit) { in etnaviv_ioctl_gem_submit()
524 submit->pid = pid; in etnaviv_ioctl_gem_submit()
526 ret = etnaviv_cmdbuf_init(priv->cmdbuf_suballoc, &submit->cmdbuf, in etnaviv_ioctl_gem_submit()
531 submit->ctx = file->driver_priv; in etnaviv_ioctl_gem_submit()
532 submit->mmu_context = etnaviv_iommu_context_get(submit->ctx->mmu); in etnaviv_ioctl_gem_submit()
533 submit->exec_state = args->exec_state; in etnaviv_ioctl_gem_submit()
534 submit->flags = args->flags; in etnaviv_ioctl_gem_submit()
536 ret = drm_sched_job_init(&submit->sched_job, in etnaviv_ioctl_gem_submit()
538 submit->ctx); in etnaviv_ioctl_gem_submit()
542 ret = submit_lookup_objects(submit, file, bos, args->nr_bos); in etnaviv_ioctl_gem_submit()
560 ret = drm_sched_job_add_dependency(&submit->sched_job, in etnaviv_ioctl_gem_submit()
566 ret = submit_pin_objects(submit); in etnaviv_ioctl_gem_submit()
570 ret = submit_reloc(submit, stream, args->stream_size / 4, in etnaviv_ioctl_gem_submit()
575 ret = submit_perfmon_validate(submit, args->exec_state, pmrs); in etnaviv_ioctl_gem_submit()
579 memcpy(submit->cmdbuf.vaddr, stream, args->stream_size); in etnaviv_ioctl_gem_submit()
581 ret = submit_lock_objects(submit, &ticket); in etnaviv_ioctl_gem_submit()
585 ret = submit_fence_sync(submit); in etnaviv_ioctl_gem_submit()
589 ret = etnaviv_sched_push_job(submit); in etnaviv_ioctl_gem_submit()
593 submit_attach_object_fences(submit); in etnaviv_ioctl_gem_submit()
602 sync_file = sync_file_create(submit->out_fence); in etnaviv_ioctl_gem_submit()
616 args->fence = submit->out_fence_id; in etnaviv_ioctl_gem_submit()
620 drm_sched_job_cleanup(&submit->sched_job); in etnaviv_ioctl_gem_submit()
622 etnaviv_submit_put(submit); in etnaviv_ioctl_gem_submit()