Lines Matching refs:job

133  * Mark the doorbell as unregistered and reset job queue pointers.
135 * and FW looses job queue state. The next time job queue is used it
180 static int ivpu_cmdq_push_job(struct ivpu_cmdq *cmdq, struct ivpu_job *job)
182 struct ivpu_device *vdev = job->vdev;
188 /* Check if there is space left in job queue */
191 job->file_priv->ctx.id, job->engine_idx, cmdq->db_id, header->head, tail);
195 entry = &cmdq->jobq->job[tail];
196 entry->batch_buf_addr = job->cmd_buf_vpu_addr;
197 entry->job_id = job->job_id;
249 static void job_get(struct ivpu_job *job, struct ivpu_job **link)
251 struct ivpu_device *vdev = job->vdev;
253 kref_get(&job->ref);
254 *link = job;
256 ivpu_dbg(vdev, KREF, "Job get: id %u refcount %u\n", job->job_id, kref_read(&job->ref));
261 struct ivpu_job *job = container_of(ref, struct ivpu_job, ref);
262 struct ivpu_device *vdev = job->vdev;
265 for (i = 0; i < job->bo_count; i++)
266 if (job->bos[i])
267 drm_gem_object_put(&job->bos[i]->base);
269 dma_fence_put(job->done_fence);
270 ivpu_file_priv_put(&job->file_priv);
272 ivpu_dbg(vdev, KREF, "Job released: id %u\n", job->job_id);
273 kfree(job);
279 static void job_put(struct ivpu_job *job)
281 struct ivpu_device *vdev = job->vdev;
283 ivpu_dbg(vdev, KREF, "Job put: id %u refcount %u\n", job->job_id, kref_read(&job->ref));
284 kref_put(&job->ref, job_release);
291 struct ivpu_job *job;
298 job = kzalloc(struct_size(job, bos, bo_count), GFP_KERNEL);
299 if (!job)
302 kref_init(&job->ref);
304 job->vdev = vdev;
305 job->engine_idx = engine_idx;
306 job->bo_count = bo_count;
307 job->done_fence = ivpu_fence_create(vdev);
308 if (!job->done_fence) {
313 job->file_priv = ivpu_file_priv_get(file_priv);
315 ivpu_dbg(vdev, JOB, "Job created: ctx %2d engine %d", file_priv->ctx.id, job->engine_idx);
317 return job;
320 kfree(job);
328 struct ivpu_job *job;
330 job = xa_erase(&vdev->submitted_jobs_xa, job_id);
331 if (!job)
334 if (job->file_priv->has_mmu_faults)
337 job->bos[CMD_BUF_IDX]->job_status = job_status;
338 dma_fence_signal(job->done_fence);
341 job->job_id, job->file_priv->ctx.id, job->engine_idx, job_status);
343 job_put(job);
357 ivpu_err(vdev, "Failed to finish job %d: %d\n", payload->job_id, ret);
362 struct ivpu_job *job;
365 xa_for_each(&vdev->submitted_jobs_xa, id, job)
369 static int ivpu_direct_job_submission(struct ivpu_job *job)
371 struct ivpu_file_priv *file_priv = job->file_priv;
372 struct ivpu_device *vdev = job->vdev;
379 cmdq = ivpu_cmdq_acquire(job->file_priv, job->engine_idx);
381 ivpu_warn(vdev, "Failed get job queue, ctx %d engine %d\n",
382 file_priv->ctx.id, job->engine_idx);
390 job_get(job, &job);
391 ret = xa_alloc(&vdev->submitted_jobs_xa, &job->job_id, job, job_id_range, GFP_KERNEL);
393 ivpu_warn_ratelimited(vdev, "Failed to allocate job id: %d\n", ret);
397 ret = ivpu_cmdq_push_job(cmdq, job);
402 job->job_id, job->cmd_buf_vpu_addr, file_priv->ctx.id,
403 job->engine_idx, cmdq->jobq->header.tail);
406 ivpu_job_done(vdev, job->job_id, VPU_JSM_STATUS_SUCCESS);
417 xa_erase(&vdev->submitted_jobs_xa, job->job_id);
419 job_put(job);
426 ivpu_job_prepare_bos_for_submit(struct drm_file *file, struct ivpu_job *job, u32 *buf_handles,
443 job->bos[i] = to_ivpu_bo(obj);
445 ret = ivpu_bo_pin(job->bos[i]);
450 bo = job->bos[CMD_BUF_IDX];
461 job->cmd_buf_vpu_addr = bo->vpu_addr + commands_offset;
463 ret = drm_gem_lock_reservations((struct drm_gem_object **)job->bos, buf_count,
471 ret = dma_resv_reserve_fences(job->bos[i]->base.resv, 1);
480 dma_resv_add_fence(job->bos[i]->base.resv, job->done_fence, usage);
484 drm_gem_unlock_reservations((struct drm_gem_object **)job->bos, buf_count, &acquire_ctx);
496 struct ivpu_job *job;
535 job = ivpu_create_job(file_priv, params->engine, params->buffer_count);
536 if (!job) {
537 ivpu_err(vdev, "Failed to create job\n");
542 ret = ivpu_job_prepare_bos_for_submit(file, job, buf_handles, params->buffer_count,
545 ivpu_err(vdev, "Failed to prepare job, ret %d\n", ret);
549 ret = ivpu_direct_job_submission(job);
551 dma_fence_signal(job->done_fence);
552 ivpu_err(vdev, "Failed to submit job to the HW, ret %d\n", ret);
556 job_put(job);
607 ivpu_err(vdev, "Failed to start job completion thread\n");