Lines Matching full: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()
94 job->state = NOUVEAU_JOB_INITIALIZED; in nouveau_job_init()
99 kfree(job->out_sync.chains); in nouveau_job_init()
101 kfree(job->out_sync.objs); in nouveau_job_init()
103 kfree(job->out_sync.data); in nouveau_job_init()
105 kfree(job->in_sync.data); in nouveau_job_init()
110 nouveau_job_fini(struct nouveau_job *job) in nouveau_job_fini() argument
112 dma_fence_put(job->done_fence); in nouveau_job_fini()
113 drm_sched_job_cleanup(&job->base); in nouveau_job_fini()
115 job->ops->free(job); in nouveau_job_fini()
119 nouveau_job_done(struct nouveau_job *job) in nouveau_job_done() argument
121 struct nouveau_sched *sched = job->sched; in nouveau_job_done()
123 spin_lock(&sched->job.list.lock); in nouveau_job_done()
124 list_del(&job->entry); in nouveau_job_done()
125 spin_unlock(&sched->job.list.lock); in nouveau_job_done()
127 wake_up(&sched->job.wq); in nouveau_job_done()
131 nouveau_job_free(struct nouveau_job *job) in nouveau_job_free() argument
133 kfree(job->in_sync.data); in nouveau_job_free()
134 kfree(job->out_sync.data); in nouveau_job_free()
135 kfree(job->out_sync.objs); in nouveau_job_free()
136 kfree(job->out_sync.chains); in nouveau_job_free()
140 sync_find_fence(struct nouveau_job *job, in sync_find_fence() argument
155 ret = drm_syncobj_find_fence(job->file_priv, in sync_find_fence()
165 nouveau_job_add_deps(struct nouveau_job *job) in nouveau_job_add_deps() argument
170 for (i = 0; i < job->in_sync.count; i++) { in nouveau_job_add_deps()
171 struct drm_nouveau_sync *sync = &job->in_sync.data[i]; in nouveau_job_add_deps()
173 ret = sync_find_fence(job, sync, &in_fence); in nouveau_job_add_deps()
175 NV_PRINTK(warn, job->cli, in nouveau_job_add_deps()
181 ret = drm_sched_job_add_dependency(&job->base, in_fence); in nouveau_job_add_deps()
190 nouveau_job_fence_attach_cleanup(struct nouveau_job *job) in nouveau_job_fence_attach_cleanup() argument
194 for (i = 0; i < job->out_sync.count; i++) { in nouveau_job_fence_attach_cleanup()
195 struct drm_syncobj *obj = job->out_sync.objs[i]; in nouveau_job_fence_attach_cleanup()
196 struct dma_fence_chain *chain = job->out_sync.chains[i]; in nouveau_job_fence_attach_cleanup()
207 nouveau_job_fence_attach_prepare(struct nouveau_job *job) in nouveau_job_fence_attach_prepare() argument
211 for (i = 0; i < job->out_sync.count; i++) { in nouveau_job_fence_attach_prepare()
212 struct drm_nouveau_sync *sync = &job->out_sync.data[i]; in nouveau_job_fence_attach_prepare()
213 struct drm_syncobj **pobj = &job->out_sync.objs[i]; in nouveau_job_fence_attach_prepare()
214 struct dma_fence_chain **pchain = &job->out_sync.chains[i]; in nouveau_job_fence_attach_prepare()
223 *pobj = drm_syncobj_find(job->file_priv, sync->handle); in nouveau_job_fence_attach_prepare()
225 NV_PRINTK(warn, job->cli, in nouveau_job_fence_attach_prepare()
244 nouveau_job_fence_attach_cleanup(job); in nouveau_job_fence_attach_prepare()
249 nouveau_job_fence_attach(struct nouveau_job *job) in nouveau_job_fence_attach() argument
251 struct dma_fence *fence = job->done_fence; in nouveau_job_fence_attach()
254 for (i = 0; i < job->out_sync.count; i++) { in nouveau_job_fence_attach()
255 struct drm_nouveau_sync *sync = &job->out_sync.data[i]; in nouveau_job_fence_attach()
256 struct drm_syncobj **pobj = &job->out_sync.objs[i]; in nouveau_job_fence_attach()
257 struct dma_fence_chain **pchain = &job->out_sync.chains[i]; in nouveau_job_fence_attach()
274 nouveau_job_submit(struct nouveau_job *job) in nouveau_job_submit() argument
276 struct nouveau_sched *sched = job->sched; in nouveau_job_submit()
279 .vm = &nouveau_cli_uvmm(job->cli)->base, in nouveau_job_submit()
285 ret = nouveau_job_add_deps(job); in nouveau_job_submit()
289 ret = nouveau_job_fence_attach_prepare(job); in nouveau_job_submit()
293 /* Make sure the job appears on the sched_entity's queue in the same in nouveau_job_submit()
301 if (job->ops->submit) { in nouveau_job_submit()
302 ret = job->ops->submit(job, &vm_exec); in nouveau_job_submit()
307 /* Submit was successful; add the job to the schedulers job list. */ in nouveau_job_submit()
308 spin_lock(&sched->job.list.lock); in nouveau_job_submit()
309 list_add(&job->entry, &sched->job.list.head); in nouveau_job_submit()
310 spin_unlock(&sched->job.list.lock); in nouveau_job_submit()
312 drm_sched_job_arm(&job->base); in nouveau_job_submit()
313 job->done_fence = dma_fence_get(&job->base.s_fence->finished); in nouveau_job_submit()
314 if (job->sync) in nouveau_job_submit()
315 done_fence = dma_fence_get(job->done_fence); in nouveau_job_submit()
317 if (job->ops->armed_submit) in nouveau_job_submit()
318 job->ops->armed_submit(job, &vm_exec); in nouveau_job_submit()
320 nouveau_job_fence_attach(job); in nouveau_job_submit()
322 /* Set job state before pushing the job to the scheduler, in nouveau_job_submit()
323 * such that we do not overwrite the job state set in run(). in nouveau_job_submit()
325 job->state = NOUVEAU_JOB_SUBMIT_SUCCESS; in nouveau_job_submit()
327 drm_sched_entity_push_job(&job->base); in nouveau_job_submit()
340 nouveau_job_fence_attach_cleanup(job); in nouveau_job_submit()
342 job->state = NOUVEAU_JOB_SUBMIT_FAILED; in nouveau_job_submit()
347 nouveau_job_run(struct nouveau_job *job) in nouveau_job_run() argument
351 fence = job->ops->run(job); in nouveau_job_run()
353 job->state = NOUVEAU_JOB_RUN_FAILED; in nouveau_job_run()
355 job->state = NOUVEAU_JOB_RUN_SUCCESS; in nouveau_job_run()
363 struct nouveau_job *job = to_nouveau_job(sched_job); in nouveau_sched_run_job() local
365 return nouveau_job_run(job); in nouveau_sched_run_job()
372 struct nouveau_job *job = to_nouveau_job(sched_job); in nouveau_sched_timedout_job() local
377 if (job->ops->timeout) in nouveau_sched_timedout_job()
378 stat = job->ops->timeout(job); in nouveau_sched_timedout_job()
380 NV_PRINTK(warn, job->cli, "Generic job timeout.\n"); in nouveau_sched_timedout_job()
390 struct nouveau_job *job = to_nouveau_job(sched_job); in nouveau_sched_free_job() local
392 nouveau_job_fini(job); in nouveau_sched_free_job()
442 spin_lock_init(&sched->job.list.lock); in nouveau_sched_init()
443 INIT_LIST_HEAD(&sched->job.list.head); in nouveau_sched_init()
444 init_waitqueue_head(&sched->job.wq); in nouveau_sched_init()
486 wait_event(sched->job.wq, list_empty(&sched->job.list.head)); in nouveau_sched_fini()