xref: /linux/drivers/accel/ivpu/ivpu_job.h (revision 74ba587f402d5501af2c85e50cf1e4044263b6ca)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2020-2025 Intel Corporation
4  */
5 
6 #ifndef __IVPU_JOB_H__
7 #define __IVPU_JOB_H__
8 
9 #include <linux/kref.h>
10 #include <linux/idr.h>
11 
12 #include "ivpu_gem.h"
13 
14 struct ivpu_device;
15 struct ivpu_file_priv;
16 
17 /**
18  * struct ivpu_cmdq - Represents a command queue for submitting jobs to the VPU.
19  * Tracks queue memory, preemption buffers, and metadata for job management.
20  * @jobq:                Pointer to job queue memory shared with the device
21  * @primary_preempt_buf: Primary preemption buffer for this queue (optional)
22  * @secondary_preempt_buf: Secondary preemption buffer for this queue (optional)
23  * @mem:                 Memory allocated for the job queue, shared with device
24  * @entry_count:         Number of job entries in the queue
25  * @id:                  Unique command queue ID
26  * @db_id:               Doorbell ID assigned to this job queue
27  * @priority:            Priority level of the command queue
28  * @is_legacy:           True if this is a legacy command queue
29  */
30 struct ivpu_cmdq {
31 	struct vpu_job_queue *jobq;
32 	struct ivpu_bo *primary_preempt_buf;
33 	struct ivpu_bo *secondary_preempt_buf;
34 	struct ivpu_bo *mem;
35 	u32 entry_count;
36 	u32 id;
37 	u32 db_id;
38 	u8 priority;
39 	bool is_legacy;
40 };
41 
42 /**
43  * struct ivpu_job - Representing a batch or DMA buffer submitted to the VPU.
44  * Each job is a unit of execution, tracked by job_id for status reporting from VPU FW.
45  * The structure holds all resources and metadata needed for job submission, execution,
46  * and completion handling.
47  * @vdev:                Pointer to the VPU device
48  * @file_priv:           The client context that submitted this job
49  * @done_fence:          Fence signaled when job completes
50  * @cmd_buf_vpu_addr:    VPU address of the command buffer for this job
51  * @cmdq_id:             Command queue ID used for submission
52  * @job_id:              Unique job ID for tracking and status reporting
53  * @engine_idx:          Engine index for job execution
54  * @job_status:          Status reported by firmware for this job
55  * @primary_preempt_buf: Primary preemption buffer for job
56  * @secondary_preempt_buf: Secondary preemption buffer for job (optional)
57  * @bo_count:            Number of buffer objects associated with this job
58  * @bos:                 Array of buffer objects used by the job (batch buffer is at index 0)
59  */
60 struct ivpu_job {
61 	struct ivpu_device *vdev;
62 	struct ivpu_file_priv *file_priv;
63 	struct dma_fence *done_fence;
64 	u64 cmd_buf_vpu_addr;
65 	u32 cmdq_id;
66 	u32 job_id;
67 	u32 engine_idx;
68 	u32 job_status;
69 	struct ivpu_bo *primary_preempt_buf;
70 	struct ivpu_bo *secondary_preempt_buf;
71 	size_t bo_count;
72 	struct ivpu_bo *bos[] __counted_by(bo_count);
73 };
74 
75 int ivpu_submit_ioctl(struct drm_device *dev, void *data, struct drm_file *file);
76 int ivpu_cmdq_create_ioctl(struct drm_device *dev, void *data, struct drm_file *file);
77 int ivpu_cmdq_destroy_ioctl(struct drm_device *dev, void *data, struct drm_file *file);
78 int ivpu_cmdq_submit_ioctl(struct drm_device *dev, void *data, struct drm_file *file);
79 
80 void ivpu_context_abort_locked(struct ivpu_file_priv *file_priv);
81 
82 void ivpu_cmdq_release_all_locked(struct ivpu_file_priv *file_priv);
83 void ivpu_cmdq_reset_all_contexts(struct ivpu_device *vdev);
84 void ivpu_cmdq_abort_all_jobs(struct ivpu_device *vdev, u32 ctx_id, u32 cmdq_id);
85 
86 void ivpu_job_done_consumer_init(struct ivpu_device *vdev);
87 void ivpu_job_done_consumer_fini(struct ivpu_device *vdev);
88 bool ivpu_job_handle_engine_error(struct ivpu_device *vdev, u32 job_id, u32 job_status);
89 void ivpu_context_abort_work_fn(struct work_struct *work);
90 
91 void ivpu_jobs_abort_all(struct ivpu_device *vdev);
92 
93 #endif /* __IVPU_JOB_H__ */
94