Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec
[platform/kernel/linux-starfive.git] / drivers / misc / bcm-vk / bcm_vk_msg.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright 2018-2020 Broadcom.
4  */
5
6 #ifndef BCM_VK_MSG_H
7 #define BCM_VK_MSG_H
8
9 #include <uapi/linux/misc/bcm_vk.h>
10 #include "bcm_vk_sg.h"
11
12 /* Single message queue control structure */
13 struct bcm_vk_msgq {
14         u16 type;       /* queue type */
15         u16 num;        /* queue number */
16         u32 start;      /* offset in BAR1 where the queue memory starts */
17
18         u32 rd_idx; /* read idx */
19         u32 wr_idx; /* write idx */
20
21         u32 size;       /*
22                          * size, which is in number of 16byte blocks,
23                          * to align with the message data structure.
24                          */
25         u32 nxt;        /*
26                          * nxt offset to the next msg queue struct.
27                          * This is to provide flexibity for alignment purposes.
28                          */
29
30 /* Least significant 16 bits in below field hold doorbell register offset */
31 #define DB_SHIFT 16
32
33         u32 db_offset; /* queue doorbell register offset in BAR0 */
34
35         u32 rsvd;
36 };
37
38 /*
39  * Structure to record static info from the msgq sync.  We keep local copy
40  * for some of these variables for both performance + checking purpose.
41  */
42 struct bcm_vk_sync_qinfo {
43         void __iomem *q_start;
44         u32 q_size;
45         u32 q_mask;
46         u32 q_low;
47         u32 q_db_offset;
48 };
49
50 #define VK_MSGQ_MAX_NR 4 /* Maximum number of message queues */
51
52 /*
53  * message block - basic unit in the message where a message's size is always
54  *                 N x sizeof(basic_block)
55  */
56 struct vk_msg_blk {
57         u8 function_id;
58 #define VK_FID_TRANS_BUF        5
59 #define VK_FID_SHUTDOWN         8
60 #define VK_FID_INIT             9
61         u8 size; /* size of the message in number of vk_msg_blk's */
62         u16 trans_id; /* transport id, queue & msg_id */
63         u32 context_id;
64 #define VK_NEW_CTX              0
65         u32 cmd;
66 #define VK_CMD_PLANES_MASK      0x000f /* number of planes to up/download */
67 #define VK_CMD_UPLOAD           0x0400 /* memory transfer to vk */
68 #define VK_CMD_DOWNLOAD         0x0500 /* memory transfer from vk */
69 #define VK_CMD_MASK             0x0f00 /* command mask */
70         u32 arg;
71 };
72
73 /* vk_msg_blk is 16 bytes fixed */
74 #define VK_MSGQ_BLK_SIZE   (sizeof(struct vk_msg_blk))
75 /* shift for fast division of basic msg blk size */
76 #define VK_MSGQ_BLK_SZ_SHIFT 4
77
78 /* use msg_id 0 for any simplex host2vk communication */
79 #define VK_SIMPLEX_MSG_ID 0
80
81 /* context per session opening of sysfs */
82 struct bcm_vk_ctx {
83         struct list_head node; /* use for linkage in Hash Table */
84         unsigned int idx;
85         bool in_use;
86         pid_t pid;
87         u32 hash_idx;
88         u32 q_num; /* queue number used by the stream */
89         struct miscdevice *miscdev;
90         atomic_t pend_cnt; /* number of items pending to be read from host */
91         atomic_t dma_cnt; /* any dma transaction outstanding */
92         wait_queue_head_t rd_wq;
93 };
94
95 /* pid hash table entry */
96 struct bcm_vk_ht_entry {
97         struct list_head head;
98 };
99
100 #define VK_DMA_MAX_ADDRS 4 /* Max 4 DMA Addresses */
101 /* structure for house keeping a single work entry */
102 struct bcm_vk_wkent {
103         struct list_head node; /* for linking purpose */
104         struct bcm_vk_ctx *ctx;
105
106         /* Store up to 4 dma pointers */
107         struct bcm_vk_dma dma[VK_DMA_MAX_ADDRS];
108
109         u32 to_h_blks; /* response */
110         struct vk_msg_blk *to_h_msg;
111
112         /*
113          * put the to_v_msg at the end so that we could simply append to_v msg
114          * to the end of the allocated block
115          */
116         u32 usr_msg_id;
117         u32 to_v_blks;
118         u32 seq_num;
119         struct vk_msg_blk to_v_msg[];
120 };
121
122 /* queue stats counters */
123 struct bcm_vk_qs_cnts {
124         u32 cnt; /* general counter, used to limit output */
125         u32 acc_sum;
126         u32 max_occ; /* max during a sampling period */
127         u32 max_abs; /* the abs max since reset */
128 };
129
130 /* control channel structure for either to_v or to_h communication */
131 struct bcm_vk_msg_chan {
132         u32 q_nr;
133         /* Mutex to access msgq */
134         struct mutex msgq_mutex;
135         /* pointing to BAR locations */
136         struct bcm_vk_msgq __iomem *msgq[VK_MSGQ_MAX_NR];
137         /* Spinlock to access pending queue */
138         spinlock_t pendq_lock;
139         /* for temporary storing pending items, one for each queue */
140         struct list_head pendq[VK_MSGQ_MAX_NR];
141         /* static queue info from the sync */
142         struct bcm_vk_sync_qinfo sync_qinfo[VK_MSGQ_MAX_NR];
143 };
144
145 /* totol number of message q allowed by the driver */
146 #define VK_MSGQ_PER_CHAN_MAX    3
147 #define VK_MSGQ_NUM_DEFAULT     (VK_MSGQ_PER_CHAN_MAX - 1)
148
149 /* total number of supported ctx, 32 ctx each for 5 components */
150 #define VK_CMPT_CTX_MAX         (32 * 5)
151
152 /* hash table defines to store the opened FDs */
153 #define VK_PID_HT_SHIFT_BIT     7 /* 128 */
154 #define VK_PID_HT_SZ            BIT(VK_PID_HT_SHIFT_BIT)
155
156 /* The following are offsets of DDR info provided by the vk card */
157 #define VK_BAR0_SEG_SIZE        (4 * SZ_1K) /* segment size for BAR0 */
158
159 /* shutdown types supported */
160 #define VK_SHUTDOWN_PID         1
161 #define VK_SHUTDOWN_GRACEFUL    2
162
163 #endif