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