xref: /OK3568_Linux_fs/kernel/drivers/rknpu/include/rknpu_job.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) Rockchip Electronics Co.Ltd
4  * Author: Felix Zeng <felix.zeng@rock-chips.com>
5  */
6 
7 #ifndef __LINUX_RKNPU_JOB_H_
8 #define __LINUX_RKNPU_JOB_H_
9 
10 #include <linux/spinlock.h>
11 #include <linux/dma-fence.h>
12 #include <linux/irq.h>
13 
14 #include <drm/drm_device.h>
15 
16 #include "rknpu_ioctl.h"
17 
18 #define RKNPU_MAX_CORES 3
19 
20 #define RKNPU_JOB_DONE (1 << 0)
21 #define RKNPU_JOB_ASYNC (1 << 1)
22 #define RKNPU_JOB_DETACHED (1 << 2)
23 
24 #define RKNPU_CORE_AUTO_MASK 0x00
25 #define RKNPU_CORE0_MASK 0x01
26 #define RKNPU_CORE1_MASK 0x02
27 #define RKNPU_CORE2_MASK 0x04
28 
29 struct rknpu_job {
30 	struct rknpu_device *rknpu_dev;
31 	struct list_head head[RKNPU_MAX_CORES];
32 	struct work_struct cleanup_work;
33 	bool in_queue[RKNPU_MAX_CORES];
34 	bool irq_entry[RKNPU_MAX_CORES];
35 	unsigned int flags;
36 	int ret;
37 	struct rknpu_submit *args;
38 	bool args_owner;
39 	struct rknpu_task *first_task;
40 	struct rknpu_task *last_task;
41 	uint32_t int_mask[RKNPU_MAX_CORES];
42 	uint32_t int_status[RKNPU_MAX_CORES];
43 	struct dma_fence *fence;
44 	ktime_t timestamp;
45 	uint32_t use_core_num;
46 	atomic_t run_count;
47 	atomic_t interrupt_count;
48 	ktime_t hw_recoder_time;
49 };
50 
51 irqreturn_t rknpu_core0_irq_handler(int irq, void *data);
52 irqreturn_t rknpu_core1_irq_handler(int irq, void *data);
53 irqreturn_t rknpu_core2_irq_handler(int irq, void *data);
54 
55 #ifdef CONFIG_ROCKCHIP_RKNPU_DRM_GEM
56 int rknpu_submit_ioctl(struct drm_device *dev, void *data,
57 		       struct drm_file *file_priv);
58 #endif
59 #ifdef CONFIG_ROCKCHIP_RKNPU_DMA_HEAP
60 int rknpu_submit_ioctl(struct rknpu_device *rknpu_dev, unsigned long data);
61 #endif
62 
63 int rknpu_get_hw_version(struct rknpu_device *rknpu_dev, uint32_t *version);
64 
65 int rknpu_get_bw_priority(struct rknpu_device *rknpu_dev, uint32_t *priority,
66 			  uint32_t *expect, uint32_t *tw);
67 
68 int rknpu_set_bw_priority(struct rknpu_device *rknpu_dev, uint32_t priority,
69 			  uint32_t expect, uint32_t tw);
70 
71 int rknpu_clear_rw_amount(struct rknpu_device *rknpu_dev);
72 
73 int rknpu_get_rw_amount(struct rknpu_device *rknpu_dev, uint32_t *dt_wr,
74 			uint32_t *dt_rd, uint32_t *wd_rd);
75 
76 int rknpu_get_total_rw_amount(struct rknpu_device *rknpu_dev, uint32_t *amount);
77 
78 #endif /* __LINUX_RKNPU_JOB_H_ */
79