xref: /openbmc/linux/drivers/accel/ivpu/ivpu_job.h (revision fa0dadde)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2020-2023 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 - Object representing device queue used to send jobs.
19  * @jobq:	   Pointer to job queue memory shared with the device
20  * @mem:           Memory allocated for the job queue, shared with device
21  * @entry_count    Number of job entries in the queue
22  * @db_id:	   Doorbell assigned to this job queue
23  * @db_registered: True if doorbell is registered in device
24  */
25 struct ivpu_cmdq {
26 	struct vpu_job_queue *jobq;
27 	struct ivpu_bo *mem;
28 	u32 entry_count;
29 	u32 db_id;
30 	bool db_registered;
31 };
32 
33 /**
34  * struct ivpu_job - KMD object that represents batchbuffer / DMA buffer.
35  * Each batch / DMA buffer is a job to be submitted and executed by the VPU FW.
36  * This is a unit of execution, and be tracked by the job_id for
37  * any status reporting from VPU FW through IPC JOB RET/DONE message.
38  * @file_priv:		  The client that submitted this job
39  * @job_id:		  Job ID for KMD tracking and job status reporting from VPU FW
40  * @status:		  Status of the Job from IPC JOB RET/DONE message
41  * @batch_buffer:	  CPU vaddr points to the batch buffer memory allocated for the job
42  * @submit_status_offset: Offset within batch buffer where job completion handler
43 			  will update the job status
44  */
45 struct ivpu_job {
46 	struct kref ref;
47 	struct ivpu_device *vdev;
48 	struct ivpu_file_priv *file_priv;
49 	struct dma_fence *done_fence;
50 	u64 cmd_buf_vpu_addr;
51 	u32 job_id;
52 	u32 engine_idx;
53 	size_t bo_count;
54 	struct ivpu_bo *bos[];
55 };
56 
57 int ivpu_submit_ioctl(struct drm_device *dev, void *data, struct drm_file *file);
58 
59 void ivpu_cmdq_release_all(struct ivpu_file_priv *file_priv);
60 void ivpu_cmdq_reset_all_contexts(struct ivpu_device *vdev);
61 
62 int ivpu_job_done_thread_init(struct ivpu_device *vdev);
63 void ivpu_job_done_thread_fini(struct ivpu_device *vdev);
64 
65 void ivpu_jobs_abort_all(struct ivpu_device *vdev);
66 
67 #endif /* __IVPU_JOB_H__ */
68