Lines Matching refs:job

136  * Mark the doorbell as unregistered and reset job queue pointers.
138 * and FW loses job queue state. The next time job queue is used it
181 static int ivpu_cmdq_push_job(struct ivpu_cmdq *cmdq, struct ivpu_job *job)
183 struct ivpu_device *vdev = job->vdev;
189 /* Check if there is space left in job queue */
192 job->file_priv->ctx.id, job->engine_idx, cmdq->db_id, header->head, tail);
196 entry = &cmdq->jobq->job[tail];
197 entry->batch_buf_addr = job->cmd_buf_vpu_addr;
198 entry->job_id = job->job_id;
252 static void ivpu_job_destroy(struct ivpu_job *job)
254 struct ivpu_device *vdev = job->vdev;
258 job->job_id, job->file_priv->ctx.id, job->engine_idx);
260 for (i = 0; i < job->bo_count; i++)
261 if (job->bos[i])
262 drm_gem_object_put(&job->bos[i]->base.base);
264 dma_fence_put(job->done_fence);
265 ivpu_file_priv_put(&job->file_priv);
266 kfree(job);
273 struct ivpu_job *job;
275 job = kzalloc(struct_size(job, bos, bo_count), GFP_KERNEL);
276 if (!job)
279 job->vdev = vdev;
280 job->engine_idx = engine_idx;
281 job->bo_count = bo_count;
282 job->done_fence = ivpu_fence_create(vdev);
283 if (!job->done_fence) {
288 job->file_priv = ivpu_file_priv_get(file_priv);
290 ivpu_dbg(vdev, JOB, "Job created: ctx %2d engine %d", file_priv->ctx.id, job->engine_idx);
291 return job;
294 kfree(job);
300 struct ivpu_job *job;
302 job = xa_erase(&vdev->submitted_jobs_xa, job_id);
303 if (!job)
306 if (job->file_priv->has_mmu_faults)
309 job->bos[CMD_BUF_IDX]->job_status = job_status;
310 dma_fence_signal(job->done_fence);
313 job->job_id, job->file_priv->ctx.id, job->engine_idx, job_status);
315 ivpu_job_destroy(job);
324 struct ivpu_job *job;
327 xa_for_each(&vdev->submitted_jobs_xa, id, job)
331 static int ivpu_job_submit(struct ivpu_job *job)
333 struct ivpu_file_priv *file_priv = job->file_priv;
334 struct ivpu_device *vdev = job->vdev;
345 cmdq = ivpu_cmdq_acquire(job->file_priv, job->engine_idx);
347 ivpu_warn_ratelimited(vdev, "Failed get job queue, ctx %d engine %d\n",
348 file_priv->ctx.id, job->engine_idx);
357 ret = __xa_alloc(&vdev->submitted_jobs_xa, &job->job_id, job, job_id_range, GFP_KERNEL);
365 ret = ivpu_cmdq_push_job(cmdq, job);
379 job->job_id, file_priv->ctx.id, job->engine_idx,
380 job->cmd_buf_vpu_addr, cmdq->jobq->header.tail);
387 ivpu_job_signal_and_destroy(vdev, job->job_id, VPU_JSM_STATUS_SUCCESS);
392 __xa_erase(&vdev->submitted_jobs_xa, job->job_id);
402 ivpu_job_prepare_bos_for_submit(struct drm_file *file, struct ivpu_job *job, u32 *buf_handles,
419 job->bos[i] = to_ivpu_bo(obj);
421 ret = ivpu_bo_pin(job->bos[i]);
426 bo = job->bos[CMD_BUF_IDX];
437 job->cmd_buf_vpu_addr = bo->vpu_addr + commands_offset;
439 ret = drm_gem_lock_reservations((struct drm_gem_object **)job->bos, buf_count,
447 ret = dma_resv_reserve_fences(job->bos[i]->base.base.resv, 1);
456 dma_resv_add_fence(job->bos[i]->base.base.resv, job->done_fence, usage);
460 drm_gem_unlock_reservations((struct drm_gem_object **)job->bos, buf_count, &acquire_ctx);
472 struct ivpu_job *job;
514 job = ivpu_job_create(file_priv, params->engine, params->buffer_count);
515 if (!job) {
516 ivpu_err(vdev, "Failed to create job\n");
521 ret = ivpu_job_prepare_bos_for_submit(file, job, buf_handles, params->buffer_count,
524 ivpu_err(vdev, "Failed to prepare job: %d\n", ret);
529 ret = ivpu_job_submit(job);
539 dma_fence_signal(job->done_fence);
541 ivpu_job_destroy(job);