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()
188 if (submit->flags & ETNA_SUBMIT_NO_IMPLICIT) in submit_fence_sync()
206 static void submit_attach_object_fences(struct etnaviv_gem_submit *submit) in submit_attach_object_fences() argument
210 for (i = 0; i < submit->nr_bos; i++) { in submit_attach_object_fences()
211 struct drm_gem_object *obj = &submit->bos[i].obj->base; in submit_attach_object_fences()
213 if (submit->bos[i].flags & ETNA_SUBMIT_BO_WRITE) in submit_attach_object_fences()
215 submit->out_fence); in submit_attach_object_fences()
218 submit->out_fence); in submit_attach_object_fences()
220 submit_unlock_object(submit, i); in submit_attach_object_fences()
224 static int submit_pin_objects(struct etnaviv_gem_submit *submit) in submit_pin_objects() argument
228 for (i = 0; i < submit->nr_bos; i++) { in submit_pin_objects()
229 struct etnaviv_gem_object *etnaviv_obj = submit->bos[i].obj; in submit_pin_objects()
233 submit->mmu_context, in submit_pin_objects()
234 submit->bos[i].va); in submit_pin_objects()
240 if ((submit->flags & ETNA_SUBMIT_SOFTPIN) && in submit_pin_objects()
241 submit->bos[i].va != mapping->iova) { in submit_pin_objects()
248 submit->bos[i].flags |= BO_PINNED; in submit_pin_objects()
249 submit->bos[i].mapping = mapping; in submit_pin_objects()
255 static int submit_bo(struct etnaviv_gem_submit *submit, u32 idx, in submit_bo() argument
258 if (idx >= submit->nr_bos) { in submit_bo()
260 idx, submit->nr_bos); in submit_bo()
264 *bo = &submit->bos[idx]; in submit_bo()
270 static int submit_reloc(struct etnaviv_gem_submit *submit, void *stream, in submit_reloc() argument
279 if ((submit->flags & ETNA_SUBMIT_SOFTPIN) && nr_relocs != 0) in submit_reloc()
307 ret = submit_bo(submit, r->reloc_idx, &bo); in submit_reloc()
324 static int submit_perfmon_validate(struct etnaviv_gem_submit *submit, in submit_perfmon_validate() argument
329 for (i = 0; i < submit->nr_pmrs; i++) { in submit_perfmon_validate()
334 ret = submit_bo(submit, r->read_idx, &bo); in submit_perfmon_validate()
359 submit->pmrs[i].flags = r->flags; in submit_perfmon_validate()
360 submit->pmrs[i].domain = r->domain; in submit_perfmon_validate()
361 submit->pmrs[i].signal = r->signal; in submit_perfmon_validate()
362 submit->pmrs[i].sequence = r->sequence; in submit_perfmon_validate()
363 submit->pmrs[i].offset = r->read_offset; in submit_perfmon_validate()
364 submit->pmrs[i].bo_vma = etnaviv_gem_vmap(&bo->obj->base); in submit_perfmon_validate()
372 struct etnaviv_gem_submit *submit = in submit_cleanup() local
376 if (submit->runtime_resumed) in submit_cleanup()
377 pm_runtime_put_autosuspend(submit->gpu->dev); in submit_cleanup()
379 if (submit->cmdbuf.suballoc) in submit_cleanup()
380 etnaviv_cmdbuf_free(&submit->cmdbuf); in submit_cleanup()
382 if (submit->mmu_context) in submit_cleanup()
383 etnaviv_iommu_context_put(submit->mmu_context); in submit_cleanup()
385 if (submit->prev_mmu_context) in submit_cleanup()
386 etnaviv_iommu_context_put(submit->prev_mmu_context); in submit_cleanup()
388 for (i = 0; i < submit->nr_bos; i++) { in submit_cleanup()
389 struct etnaviv_gem_object *etnaviv_obj = submit->bos[i].obj; in submit_cleanup()
392 if (submit->bos[i].flags & BO_PINNED) { in submit_cleanup()
393 etnaviv_gem_mapping_unreference(submit->bos[i].mapping); in submit_cleanup()
395 submit->bos[i].mapping = NULL; in submit_cleanup()
396 submit->bos[i].flags &= ~BO_PINNED; in submit_cleanup()
400 submit_unlock_object(submit, i); in submit_cleanup()
404 wake_up_all(&submit->gpu->fence_event); in submit_cleanup()
406 if (submit->in_fence) in submit_cleanup()
407 dma_fence_put(submit->in_fence); in submit_cleanup()
408 if (submit->out_fence) { in submit_cleanup()
410 mutex_lock(&submit->gpu->fence_lock); in submit_cleanup()
411 idr_remove(&submit->gpu->fence_idr, submit->out_fence_id); in submit_cleanup()
412 mutex_unlock(&submit->gpu->fence_lock); in submit_cleanup()
413 dma_fence_put(submit->out_fence); in submit_cleanup()
415 kfree(submit->pmrs); in submit_cleanup()
416 kfree(submit); in submit_cleanup()
419 void etnaviv_submit_put(struct etnaviv_gem_submit *submit) in etnaviv_submit_put() argument
421 kref_put(&submit->refcount, submit_cleanup); in etnaviv_submit_put()
433 struct etnaviv_gem_submit *submit; in etnaviv_ioctl_gem_submit() local
523 submit = submit_create(dev, gpu, args->nr_bos, args->nr_pmrs); in etnaviv_ioctl_gem_submit()
524 if (!submit) { in etnaviv_ioctl_gem_submit()
529 ret = etnaviv_cmdbuf_init(priv->cmdbuf_suballoc, &submit->cmdbuf, in etnaviv_ioctl_gem_submit()
534 submit->ctx = file->driver_priv; in etnaviv_ioctl_gem_submit()
535 submit->mmu_context = etnaviv_iommu_context_get(submit->ctx->mmu); in etnaviv_ioctl_gem_submit()
536 submit->exec_state = args->exec_state; in etnaviv_ioctl_gem_submit()
537 submit->flags = args->flags; in etnaviv_ioctl_gem_submit()
539 ret = submit_lookup_objects(submit, file, bos, args->nr_bos); in etnaviv_ioctl_gem_submit()
551 submit->in_fence = sync_file_get_fence(args->fence_fd); in etnaviv_ioctl_gem_submit()
552 if (!submit->in_fence) { in etnaviv_ioctl_gem_submit()
558 ret = submit_pin_objects(submit); in etnaviv_ioctl_gem_submit()
562 ret = submit_reloc(submit, stream, args->stream_size / 4, in etnaviv_ioctl_gem_submit()
567 ret = submit_perfmon_validate(submit, args->exec_state, pmrs); in etnaviv_ioctl_gem_submit()
571 memcpy(submit->cmdbuf.vaddr, stream, args->stream_size); in etnaviv_ioctl_gem_submit()
573 ret = submit_lock_objects(submit, &ticket); in etnaviv_ioctl_gem_submit()
577 ret = submit_fence_sync(submit); in etnaviv_ioctl_gem_submit()
581 ret = etnaviv_sched_push_job(&ctx->sched_entity[args->pipe], submit); in etnaviv_ioctl_gem_submit()
585 submit_attach_object_fences(submit); in etnaviv_ioctl_gem_submit()
594 sync_file = sync_file_create(submit->out_fence); in etnaviv_ioctl_gem_submit()
603 args->fence = submit->out_fence_id; in etnaviv_ioctl_gem_submit()
606 etnaviv_submit_put(submit); in etnaviv_ioctl_gem_submit()