Lines Matching full:job
112 static int panfrost_job_get_slot(struct panfrost_job *job) in panfrost_job_get_slot() argument
118 if (job->requirements & PANFROST_JD_REQ_FS) in panfrost_job_get_slot()
123 if (job->requirements & PANFROST_JD_REQ_ONLY_COMPUTE) { in panfrost_job_get_slot()
124 if ((job->requirements & PANFROST_JD_REQ_CORE_GRP_MASK) && in panfrost_job_get_slot()
125 (job->pfdev->features.nr_core_groups == 2)) in panfrost_job_get_slot()
127 if (panfrost_has_hw_issue(job->pfdev, HW_ISSUE_8987)) in panfrost_job_get_slot()
151 static void panfrost_job_hw_submit(struct panfrost_job *job, int js) in panfrost_job_hw_submit() argument
153 struct panfrost_device *pfdev = job->pfdev; in panfrost_job_hw_submit()
155 u64 jc_head = job->jc; in panfrost_job_hw_submit()
168 cfg = panfrost_mmu_as_get(pfdev, job->file_priv->mmu); in panfrost_job_hw_submit()
173 panfrost_job_write_affinity(pfdev, job->requirements, js); in panfrost_job_hw_submit()
190 job_write(pfdev, JS_FLUSH_ID_NEXT(js), job->flush_id); in panfrost_job_hw_submit()
194 job, js, jc_head); in panfrost_job_hw_submit()
219 int panfrost_job_push(struct panfrost_job *job) in panfrost_job_push() argument
221 struct panfrost_device *pfdev = job->pfdev; in panfrost_job_push()
222 int slot = panfrost_job_get_slot(job); in panfrost_job_push()
223 struct drm_sched_entity *entity = &job->file_priv->sched_entity[slot]; in panfrost_job_push()
229 ret = drm_gem_lock_reservations(job->bos, job->bo_count, in panfrost_job_push()
236 ret = drm_sched_job_init(&job->base, entity, NULL); in panfrost_job_push()
242 job->render_done_fence = dma_fence_get(&job->base.s_fence->finished); in panfrost_job_push()
244 kref_get(&job->refcount); /* put by scheduler job completion */ in panfrost_job_push()
246 panfrost_acquire_object_fences(job->bos, job->bo_count, in panfrost_job_push()
247 job->implicit_fences); in panfrost_job_push()
249 drm_sched_entity_push_job(&job->base, entity); in panfrost_job_push()
253 panfrost_attach_object_fences(job->bos, job->bo_count, in panfrost_job_push()
254 job->render_done_fence); in panfrost_job_push()
257 drm_gem_unlock_reservations(job->bos, job->bo_count, &acquire_ctx); in panfrost_job_push()
264 struct panfrost_job *job = container_of(ref, struct panfrost_job, in panfrost_job_cleanup() local
268 if (job->in_fences) { in panfrost_job_cleanup()
269 for (i = 0; i < job->in_fence_count; i++) in panfrost_job_cleanup()
270 dma_fence_put(job->in_fences[i]); in panfrost_job_cleanup()
271 kvfree(job->in_fences); in panfrost_job_cleanup()
273 if (job->implicit_fences) { in panfrost_job_cleanup()
274 for (i = 0; i < job->bo_count; i++) in panfrost_job_cleanup()
275 dma_fence_put(job->implicit_fences[i]); in panfrost_job_cleanup()
276 kvfree(job->implicit_fences); in panfrost_job_cleanup()
278 dma_fence_put(job->done_fence); in panfrost_job_cleanup()
279 dma_fence_put(job->render_done_fence); in panfrost_job_cleanup()
281 if (job->mappings) { in panfrost_job_cleanup()
282 for (i = 0; i < job->bo_count; i++) { in panfrost_job_cleanup()
283 if (!job->mappings[i]) in panfrost_job_cleanup()
286 atomic_dec(&job->mappings[i]->obj->gpu_usecount); in panfrost_job_cleanup()
287 panfrost_gem_mapping_put(job->mappings[i]); in panfrost_job_cleanup()
289 kvfree(job->mappings); in panfrost_job_cleanup()
292 if (job->bos) { in panfrost_job_cleanup()
293 for (i = 0; i < job->bo_count; i++) in panfrost_job_cleanup()
294 drm_gem_object_put(job->bos[i]); in panfrost_job_cleanup()
296 kvfree(job->bos); in panfrost_job_cleanup()
299 kfree(job); in panfrost_job_cleanup()
302 void panfrost_job_put(struct panfrost_job *job) in panfrost_job_put() argument
304 kref_put(&job->refcount, panfrost_job_cleanup); in panfrost_job_put()
309 struct panfrost_job *job = to_panfrost_job(sched_job); in panfrost_job_free() local
313 panfrost_job_put(job); in panfrost_job_free()
319 struct panfrost_job *job = to_panfrost_job(sched_job); in panfrost_job_dependency() local
324 for (i = 0; i < job->in_fence_count; i++) { in panfrost_job_dependency()
325 if (job->in_fences[i]) { in panfrost_job_dependency()
326 fence = job->in_fences[i]; in panfrost_job_dependency()
327 job->in_fences[i] = NULL; in panfrost_job_dependency()
333 for (i = 0; i < job->bo_count; i++) { in panfrost_job_dependency()
334 if (job->implicit_fences[i]) { in panfrost_job_dependency()
335 fence = job->implicit_fences[i]; in panfrost_job_dependency()
336 job->implicit_fences[i] = NULL; in panfrost_job_dependency()
346 struct panfrost_job *job = to_panfrost_job(sched_job); in panfrost_job_run() local
347 struct panfrost_device *pfdev = job->pfdev; in panfrost_job_run()
348 int slot = panfrost_job_get_slot(job); in panfrost_job_run()
351 if (unlikely(job->base.s_fence->finished.error)) in panfrost_job_run()
354 pfdev->jobs[slot] = job; in panfrost_job_run()
360 if (job->done_fence) in panfrost_job_run()
361 dma_fence_put(job->done_fence); in panfrost_job_run()
362 job->done_fence = dma_fence_get(fence); in panfrost_job_run()
364 panfrost_job_hw_submit(job, slot); in panfrost_job_run()
437 struct panfrost_job *job = to_panfrost_job(sched_job); in panfrost_job_timedout() local
438 struct panfrost_device *pfdev = job->pfdev; in panfrost_job_timedout()
439 int js = panfrost_job_get_slot(job); in panfrost_job_timedout()
445 if (dma_fence_is_signaled(job->done_fence)) in panfrost_job_timedout()
519 struct panfrost_job *job; in panfrost_job_irq_handler() local
522 job = pfdev->jobs[j]; in panfrost_job_irq_handler()
523 /* Only NULL if job timeout occurred */ in panfrost_job_irq_handler()
524 if (job) { in panfrost_job_irq_handler()
527 panfrost_mmu_as_put(pfdev, job->file_priv->mmu); in panfrost_job_irq_handler()
530 dma_fence_signal_locked(job->done_fence); in panfrost_job_irq_handler()
556 * handler is in flight, it might have removed the bad job in panfrost_reset()
557 * from the list, and we'll lose this job if the reset handler in panfrost_reset()
566 * the job without making sure the timeout handler is not in panfrost_reset()
608 irq = platform_get_irq_byname(to_platform_device(pfdev->dev), "job"); in panfrost_job_init()
613 IRQF_SHARED, KBUILD_MODNAME "-job", pfdev); in panfrost_job_init()
615 dev_err(pfdev->dev, "failed to request job irq"); in panfrost_job_init()