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