Lines Matching refs:job
26 nouveau_job_init(struct nouveau_job *job, in nouveau_job_init() argument
32 INIT_LIST_HEAD(&job->entry); in nouveau_job_init()
34 job->file_priv = args->file_priv; in nouveau_job_init()
35 job->cli = nouveau_cli(args->file_priv); in nouveau_job_init()
36 job->sched = sched; in nouveau_job_init()
38 job->sync = args->sync; in nouveau_job_init()
39 job->resv_usage = args->resv_usage; in nouveau_job_init()
41 job->ops = args->ops; in nouveau_job_init()
43 job->in_sync.count = args->in_sync.count; in nouveau_job_init()
44 if (job->in_sync.count) { in nouveau_job_init()
45 if (job->sync) in nouveau_job_init()
48 job->in_sync.data = kmemdup(args->in_sync.s, in nouveau_job_init()
52 if (!job->in_sync.data) in nouveau_job_init()
56 job->out_sync.count = args->out_sync.count; in nouveau_job_init()
57 if (job->out_sync.count) { in nouveau_job_init()
58 if (job->sync) { in nouveau_job_init()
63 job->out_sync.data = kmemdup(args->out_sync.s, in nouveau_job_init()
67 if (!job->out_sync.data) { in nouveau_job_init()
72 job->out_sync.objs = kcalloc(job->out_sync.count, in nouveau_job_init()
73 sizeof(*job->out_sync.objs), in nouveau_job_init()
75 if (!job->out_sync.objs) { in nouveau_job_init()
80 job->out_sync.chains = kcalloc(job->out_sync.count, in nouveau_job_init()
81 sizeof(*job->out_sync.chains), in nouveau_job_init()
83 if (!job->out_sync.chains) { in nouveau_job_init()
89 ret = drm_sched_job_init(&job->base, &sched->entity, in nouveau_job_init()
91 job->file_priv->client_id); in nouveau_job_init()
95 job->state = NOUVEAU_JOB_INITIALIZED; in nouveau_job_init()
100 kfree(job->out_sync.chains); in nouveau_job_init()
102 kfree(job->out_sync.objs); in nouveau_job_init()
104 kfree(job->out_sync.data); in nouveau_job_init()
106 kfree(job->in_sync.data); in nouveau_job_init()
111 nouveau_job_fini(struct nouveau_job *job) in nouveau_job_fini() argument
113 dma_fence_put(job->done_fence); in nouveau_job_fini()
114 drm_sched_job_cleanup(&job->base); in nouveau_job_fini()
116 job->ops->free(job); in nouveau_job_fini()
120 nouveau_job_done(struct nouveau_job *job) in nouveau_job_done() argument
122 struct nouveau_sched *sched = job->sched; in nouveau_job_done()
124 spin_lock(&sched->job.list.lock); in nouveau_job_done()
125 list_del(&job->entry); in nouveau_job_done()
126 spin_unlock(&sched->job.list.lock); in nouveau_job_done()
128 wake_up(&sched->job.wq); in nouveau_job_done()
132 nouveau_job_free(struct nouveau_job *job) in nouveau_job_free() argument
134 kfree(job->in_sync.data); in nouveau_job_free()
135 kfree(job->out_sync.data); in nouveau_job_free()
136 kfree(job->out_sync.objs); in nouveau_job_free()
137 kfree(job->out_sync.chains); in nouveau_job_free()
141 sync_find_fence(struct nouveau_job *job, in sync_find_fence() argument
156 ret = drm_syncobj_find_fence(job->file_priv, in sync_find_fence()
166 nouveau_job_add_deps(struct nouveau_job *job) in nouveau_job_add_deps() argument
171 for (i = 0; i < job->in_sync.count; i++) { in nouveau_job_add_deps()
172 struct drm_nouveau_sync *sync = &job->in_sync.data[i]; in nouveau_job_add_deps()
174 ret = sync_find_fence(job, sync, &in_fence); in nouveau_job_add_deps()
176 NV_PRINTK(warn, job->cli, in nouveau_job_add_deps()
182 ret = drm_sched_job_add_dependency(&job->base, in_fence); in nouveau_job_add_deps()
191 nouveau_job_fence_attach_cleanup(struct nouveau_job *job) in nouveau_job_fence_attach_cleanup() argument
195 for (i = 0; i < job->out_sync.count; i++) { in nouveau_job_fence_attach_cleanup()
196 struct drm_syncobj *obj = job->out_sync.objs[i]; in nouveau_job_fence_attach_cleanup()
197 struct dma_fence_chain *chain = job->out_sync.chains[i]; in nouveau_job_fence_attach_cleanup()
208 nouveau_job_fence_attach_prepare(struct nouveau_job *job) in nouveau_job_fence_attach_prepare() argument
212 for (i = 0; i < job->out_sync.count; i++) { in nouveau_job_fence_attach_prepare()
213 struct drm_nouveau_sync *sync = &job->out_sync.data[i]; in nouveau_job_fence_attach_prepare()
214 struct drm_syncobj **pobj = &job->out_sync.objs[i]; in nouveau_job_fence_attach_prepare()
215 struct dma_fence_chain **pchain = &job->out_sync.chains[i]; in nouveau_job_fence_attach_prepare()
224 *pobj = drm_syncobj_find(job->file_priv, sync->handle); in nouveau_job_fence_attach_prepare()
226 NV_PRINTK(warn, job->cli, in nouveau_job_fence_attach_prepare()
245 nouveau_job_fence_attach_cleanup(job); in nouveau_job_fence_attach_prepare()
250 nouveau_job_fence_attach(struct nouveau_job *job) in nouveau_job_fence_attach() argument
252 struct dma_fence *fence = job->done_fence; in nouveau_job_fence_attach()
255 for (i = 0; i < job->out_sync.count; i++) { in nouveau_job_fence_attach()
256 struct drm_nouveau_sync *sync = &job->out_sync.data[i]; in nouveau_job_fence_attach()
257 struct drm_syncobj **pobj = &job->out_sync.objs[i]; in nouveau_job_fence_attach()
258 struct dma_fence_chain **pchain = &job->out_sync.chains[i]; in nouveau_job_fence_attach()
275 nouveau_job_submit(struct nouveau_job *job) in nouveau_job_submit() argument
277 struct nouveau_sched *sched = job->sched; in nouveau_job_submit()
280 .vm = &nouveau_cli_uvmm(job->cli)->base, in nouveau_job_submit()
286 ret = nouveau_job_add_deps(job); in nouveau_job_submit()
290 ret = nouveau_job_fence_attach_prepare(job); in nouveau_job_submit()
302 if (job->ops->submit) { in nouveau_job_submit()
303 ret = job->ops->submit(job, &vm_exec); in nouveau_job_submit()
309 spin_lock(&sched->job.list.lock); in nouveau_job_submit()
310 list_add(&job->entry, &sched->job.list.head); in nouveau_job_submit()
311 spin_unlock(&sched->job.list.lock); in nouveau_job_submit()
313 drm_sched_job_arm(&job->base); in nouveau_job_submit()
314 job->done_fence = dma_fence_get(&job->base.s_fence->finished); in nouveau_job_submit()
315 if (job->sync) in nouveau_job_submit()
316 done_fence = dma_fence_get(job->done_fence); in nouveau_job_submit()
318 if (job->ops->armed_submit) in nouveau_job_submit()
319 job->ops->armed_submit(job, &vm_exec); in nouveau_job_submit()
321 nouveau_job_fence_attach(job); in nouveau_job_submit()
326 job->state = NOUVEAU_JOB_SUBMIT_SUCCESS; in nouveau_job_submit()
328 drm_sched_entity_push_job(&job->base); in nouveau_job_submit()
341 nouveau_job_fence_attach_cleanup(job); in nouveau_job_submit()
343 job->state = NOUVEAU_JOB_SUBMIT_FAILED; in nouveau_job_submit()
348 nouveau_job_run(struct nouveau_job *job) in nouveau_job_run() argument
352 fence = job->ops->run(job); in nouveau_job_run()
354 job->state = NOUVEAU_JOB_RUN_FAILED; in nouveau_job_run()
356 job->state = NOUVEAU_JOB_RUN_SUCCESS; in nouveau_job_run()
364 struct nouveau_job *job = to_nouveau_job(sched_job); in nouveau_sched_run_job() local
366 return nouveau_job_run(job); in nouveau_sched_run_job()
373 struct nouveau_job *job = to_nouveau_job(sched_job); in nouveau_sched_timedout_job() local
378 if (job->ops->timeout) in nouveau_sched_timedout_job()
379 stat = job->ops->timeout(job); in nouveau_sched_timedout_job()
381 NV_PRINTK(warn, job->cli, "Generic job timeout.\n"); in nouveau_sched_timedout_job()
391 struct nouveau_job *job = to_nouveau_job(sched_job); in nouveau_sched_free_job() local
393 nouveau_job_fini(job); in nouveau_sched_free_job()
449 spin_lock_init(&sched->job.list.lock); in nouveau_sched_init()
450 INIT_LIST_HEAD(&sched->job.list.head); in nouveau_sched_init()
451 init_waitqueue_head(&sched->job.wq); in nouveau_sched_init()
493 wait_event(sched->job.wq, list_empty(&sched->job.list.head)); in nouveau_sched_fini()