xref: /openbmc/linux/drivers/net/ethernet/huawei/hinic/hinic_hw_wqe.h (revision 023e41632e065d49bcbe31b3c4b336217f96a271)
1 /*
2  * Huawei HiNIC PCI Express Linux driver
3  * Copyright(c) 2017 Huawei Technologies Co., Ltd
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms and conditions of the GNU General Public License,
7  * version 2, as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * for more details.
13  *
14  */
15 
16 #ifndef HINIC_HW_WQE_H
17 #define HINIC_HW_WQE_H
18 
19 #include "hinic_common.h"
20 
21 #define HINIC_CMDQ_CTRL_PI_SHIFT                        0
22 #define HINIC_CMDQ_CTRL_CMD_SHIFT                       16
23 #define HINIC_CMDQ_CTRL_MOD_SHIFT                       24
24 #define HINIC_CMDQ_CTRL_ACK_TYPE_SHIFT                  29
25 #define HINIC_CMDQ_CTRL_HW_BUSY_BIT_SHIFT               31
26 
27 #define HINIC_CMDQ_CTRL_PI_MASK                         0xFFFF
28 #define HINIC_CMDQ_CTRL_CMD_MASK                        0xFF
29 #define HINIC_CMDQ_CTRL_MOD_MASK                        0x1F
30 #define HINIC_CMDQ_CTRL_ACK_TYPE_MASK                   0x3
31 #define HINIC_CMDQ_CTRL_HW_BUSY_BIT_MASK                0x1
32 
33 #define HINIC_CMDQ_CTRL_SET(val, member)                        \
34 			(((u32)(val) & HINIC_CMDQ_CTRL_##member##_MASK) \
35 			 << HINIC_CMDQ_CTRL_##member##_SHIFT)
36 
37 #define HINIC_CMDQ_CTRL_GET(val, member)                        \
38 			(((val) >> HINIC_CMDQ_CTRL_##member##_SHIFT) \
39 			 & HINIC_CMDQ_CTRL_##member##_MASK)
40 
41 #define HINIC_CMDQ_WQE_HEADER_BUFDESC_LEN_SHIFT         0
42 #define HINIC_CMDQ_WQE_HEADER_COMPLETE_FMT_SHIFT        15
43 #define HINIC_CMDQ_WQE_HEADER_DATA_FMT_SHIFT            22
44 #define HINIC_CMDQ_WQE_HEADER_COMPLETE_REQ_SHIFT        23
45 #define HINIC_CMDQ_WQE_HEADER_COMPLETE_SECT_LEN_SHIFT   27
46 #define HINIC_CMDQ_WQE_HEADER_CTRL_LEN_SHIFT            29
47 #define HINIC_CMDQ_WQE_HEADER_TOGGLED_WRAPPED_SHIFT     31
48 
49 #define HINIC_CMDQ_WQE_HEADER_BUFDESC_LEN_MASK          0xFF
50 #define HINIC_CMDQ_WQE_HEADER_COMPLETE_FMT_MASK         0x1
51 #define HINIC_CMDQ_WQE_HEADER_DATA_FMT_MASK             0x1
52 #define HINIC_CMDQ_WQE_HEADER_COMPLETE_REQ_MASK         0x1
53 #define HINIC_CMDQ_WQE_HEADER_COMPLETE_SECT_LEN_MASK    0x3
54 #define HINIC_CMDQ_WQE_HEADER_CTRL_LEN_MASK             0x3
55 #define HINIC_CMDQ_WQE_HEADER_TOGGLED_WRAPPED_MASK      0x1
56 
57 #define HINIC_CMDQ_WQE_HEADER_SET(val, member)                  \
58 			(((u32)(val) & HINIC_CMDQ_WQE_HEADER_##member##_MASK) \
59 			 << HINIC_CMDQ_WQE_HEADER_##member##_SHIFT)
60 
61 #define HINIC_CMDQ_WQE_HEADER_GET(val, member)                  \
62 			(((val) >> HINIC_CMDQ_WQE_HEADER_##member##_SHIFT) \
63 			 & HINIC_CMDQ_WQE_HEADER_##member##_MASK)
64 
65 #define HINIC_SQ_CTRL_BUFDESC_SECT_LEN_SHIFT           0
66 #define HINIC_SQ_CTRL_TASKSECT_LEN_SHIFT               16
67 #define HINIC_SQ_CTRL_DATA_FORMAT_SHIFT                22
68 #define HINIC_SQ_CTRL_LEN_SHIFT                        29
69 
70 #define HINIC_SQ_CTRL_BUFDESC_SECT_LEN_MASK            0xFF
71 #define HINIC_SQ_CTRL_TASKSECT_LEN_MASK                0x1F
72 #define HINIC_SQ_CTRL_DATA_FORMAT_MASK                 0x1
73 #define HINIC_SQ_CTRL_LEN_MASK                         0x3
74 
75 #define HINIC_SQ_CTRL_QUEUE_INFO_PLDOFF_SHIFT          2
76 #define HINIC_SQ_CTRL_QUEUE_INFO_UFO_SHIFT             10
77 #define HINIC_SQ_CTRL_QUEUE_INFO_TSO_SHIFT             11
78 #define HINIC_SQ_CTRL_QUEUE_INFO_TCPUDP_CS_SHIFT       12
79 #define HINIC_SQ_CTRL_QUEUE_INFO_MSS_SHIFT             13
80 #define HINIC_SQ_CTRL_QUEUE_INFO_SCTP_SHIFT            27
81 #define HINIC_SQ_CTRL_QUEUE_INFO_UC_SHIFT              28
82 #define HINIC_SQ_CTRL_QUEUE_INFO_PRI_SHIFT             29
83 
84 #define HINIC_SQ_CTRL_QUEUE_INFO_PLDOFF_MASK           0xFF
85 #define HINIC_SQ_CTRL_QUEUE_INFO_UFO_MASK              0x1
86 #define HINIC_SQ_CTRL_QUEUE_INFO_TSO_MASK              0x1
87 #define HINIC_SQ_CTRL_QUEUE_INFO_TCPUDP_CS_MASK	       0x1
88 #define HINIC_SQ_CTRL_QUEUE_INFO_MSS_MASK              0x3FFF
89 #define HINIC_SQ_CTRL_QUEUE_INFO_SCTP_MASK             0x1
90 #define HINIC_SQ_CTRL_QUEUE_INFO_UC_MASK               0x1
91 #define HINIC_SQ_CTRL_QUEUE_INFO_PRI_MASK              0x7
92 
93 #define HINIC_SQ_CTRL_SET(val, member)          \
94 		(((u32)(val) & HINIC_SQ_CTRL_##member##_MASK) \
95 		 << HINIC_SQ_CTRL_##member##_SHIFT)
96 
97 #define HINIC_SQ_CTRL_GET(val, member)          \
98 		(((val) >> HINIC_SQ_CTRL_##member##_SHIFT) \
99 		 & HINIC_SQ_CTRL_##member##_MASK)
100 
101 #define HINIC_SQ_CTRL_CLEAR(val, member)	\
102 		((u32)(val) & (~(HINIC_SQ_CTRL_##member##_MASK \
103 		 << HINIC_SQ_CTRL_##member##_SHIFT)))
104 
105 #define HINIC_SQ_TASK_INFO0_L2HDR_LEN_SHIFT     0
106 #define HINIC_SQ_TASK_INFO0_L4_OFFLOAD_SHIFT    8
107 #define HINIC_SQ_TASK_INFO0_INNER_L3TYPE_SHIFT  10
108 #define HINIC_SQ_TASK_INFO0_VLAN_OFFLOAD_SHIFT  12
109 #define HINIC_SQ_TASK_INFO0_PARSE_FLAG_SHIFT    13
110 /* 1 bit reserved */
111 #define HINIC_SQ_TASK_INFO0_TSO_FLAG_SHIFT      15
112 #define HINIC_SQ_TASK_INFO0_VLAN_TAG_SHIFT      16
113 
114 #define HINIC_SQ_TASK_INFO0_L2HDR_LEN_MASK      0xFF
115 #define HINIC_SQ_TASK_INFO0_L4_OFFLOAD_MASK     0x3
116 #define HINIC_SQ_TASK_INFO0_INNER_L3TYPE_MASK   0x3
117 #define HINIC_SQ_TASK_INFO0_VLAN_OFFLOAD_MASK   0x1
118 #define HINIC_SQ_TASK_INFO0_PARSE_FLAG_MASK     0x1
119 /* 1 bit reserved */
120 #define HINIC_SQ_TASK_INFO0_TSO_FLAG_MASK       0x1
121 #define HINIC_SQ_TASK_INFO0_VLAN_TAG_MASK       0xFFFF
122 
123 #define HINIC_SQ_TASK_INFO0_SET(val, member)    \
124 		(((u32)(val) & HINIC_SQ_TASK_INFO0_##member##_MASK) <<  \
125 		 HINIC_SQ_TASK_INFO0_##member##_SHIFT)
126 
127 /* 8 bits reserved */
128 #define HINIC_SQ_TASK_INFO1_MEDIA_TYPE_SHIFT    8
129 #define HINIC_SQ_TASK_INFO1_INNER_L4LEN_SHIFT   16
130 #define HINIC_SQ_TASK_INFO1_INNER_L3LEN_SHIFT   24
131 
132 /* 8 bits reserved */
133 #define HINIC_SQ_TASK_INFO1_MEDIA_TYPE_MASK     0xFF
134 #define HINIC_SQ_TASK_INFO1_INNER_L4LEN_MASK    0xFF
135 #define HINIC_SQ_TASK_INFO1_INNER_L3LEN_MASK    0xFF
136 
137 #define HINIC_SQ_TASK_INFO1_SET(val, member)    \
138 		(((u32)(val) & HINIC_SQ_TASK_INFO1_##member##_MASK) <<  \
139 		 HINIC_SQ_TASK_INFO1_##member##_SHIFT)
140 
141 #define HINIC_SQ_TASK_INFO2_TUNNEL_L4LEN_SHIFT  0
142 #define HINIC_SQ_TASK_INFO2_OUTER_L3LEN_SHIFT   8
143 #define HINIC_SQ_TASK_INFO2_TUNNEL_L4TYPE_SHIFT 16
144 /* 1 bit reserved */
145 #define HINIC_SQ_TASK_INFO2_OUTER_L3TYPE_SHIFT  24
146 /* 8 bits reserved */
147 
148 #define HINIC_SQ_TASK_INFO2_TUNNEL_L4LEN_MASK   0xFF
149 #define HINIC_SQ_TASK_INFO2_OUTER_L3LEN_MASK    0xFF
150 #define HINIC_SQ_TASK_INFO2_TUNNEL_L4TYPE_MASK  0x7
151 /* 1 bit reserved */
152 #define HINIC_SQ_TASK_INFO2_OUTER_L3TYPE_MASK   0x3
153 /* 8 bits reserved */
154 
155 #define HINIC_SQ_TASK_INFO2_SET(val, member)    \
156 		(((u32)(val) & HINIC_SQ_TASK_INFO2_##member##_MASK) <<  \
157 		 HINIC_SQ_TASK_INFO2_##member##_SHIFT)
158 
159 /* 31 bits reserved */
160 #define HINIC_SQ_TASK_INFO4_L2TYPE_SHIFT        31
161 
162 /* 31 bits reserved */
163 #define HINIC_SQ_TASK_INFO4_L2TYPE_MASK         0x1
164 
165 #define HINIC_SQ_TASK_INFO4_SET(val, member)    \
166 		(((u32)(val) & HINIC_SQ_TASK_INFO4_##member##_MASK) << \
167 		 HINIC_SQ_TASK_INFO4_##member##_SHIFT)
168 
169 #define HINIC_RQ_CQE_STATUS_RXDONE_SHIFT        31
170 
171 #define HINIC_RQ_CQE_STATUS_RXDONE_MASK         0x1
172 
173 #define HINIC_RQ_CQE_STATUS_CSUM_ERR_SHIFT	0
174 
175 #define HINIC_RQ_CQE_STATUS_CSUM_ERR_MASK	0xFFFFU
176 
177 #define HINIC_RQ_CQE_STATUS_GET(val, member)    \
178 		(((val) >> HINIC_RQ_CQE_STATUS_##member##_SHIFT) & \
179 		 HINIC_RQ_CQE_STATUS_##member##_MASK)
180 
181 #define HINIC_RQ_CQE_STATUS_CLEAR(val, member)  \
182 		((val) & (~(HINIC_RQ_CQE_STATUS_##member##_MASK << \
183 		 HINIC_RQ_CQE_STATUS_##member##_SHIFT)))
184 
185 #define HINIC_RQ_CQE_SGE_LEN_SHIFT              16
186 
187 #define HINIC_RQ_CQE_SGE_LEN_MASK               0xFFFF
188 
189 #define HINIC_RQ_CQE_SGE_GET(val, member)       \
190 		(((val) >> HINIC_RQ_CQE_SGE_##member##_SHIFT) & \
191 		 HINIC_RQ_CQE_SGE_##member##_MASK)
192 
193 #define HINIC_RQ_CTRL_BUFDESC_SECT_LEN_SHIFT    0
194 #define HINIC_RQ_CTRL_COMPLETE_FORMAT_SHIFT     15
195 #define HINIC_RQ_CTRL_COMPLETE_LEN_SHIFT        27
196 #define HINIC_RQ_CTRL_LEN_SHIFT                 29
197 
198 #define HINIC_RQ_CTRL_BUFDESC_SECT_LEN_MASK     0xFF
199 #define HINIC_RQ_CTRL_COMPLETE_FORMAT_MASK      0x1
200 #define HINIC_RQ_CTRL_COMPLETE_LEN_MASK         0x3
201 #define HINIC_RQ_CTRL_LEN_MASK                  0x3
202 
203 #define HINIC_RQ_CTRL_SET(val, member)          \
204 		(((u32)(val) & HINIC_RQ_CTRL_##member##_MASK) << \
205 		 HINIC_RQ_CTRL_##member##_SHIFT)
206 
207 #define HINIC_SQ_WQE_SIZE(nr_sges)              \
208 		(sizeof(struct hinic_sq_ctrl) + \
209 		 sizeof(struct hinic_sq_task) + \
210 		 (nr_sges) * sizeof(struct hinic_sq_bufdesc))
211 
212 #define HINIC_SCMD_DATA_LEN                     16
213 
214 #define HINIC_MAX_SQ_BUFDESCS                   17
215 
216 #define HINIC_SQ_WQE_MAX_SIZE                   320
217 #define HINIC_RQ_WQE_SIZE                       32
218 
219 #define HINIC_MSS_DEFAULT		        0x3E00
220 #define HINIC_MSS_MIN		                0x50
221 
222 enum hinic_l4offload_type {
223 	HINIC_L4_OFF_DISABLE            = 0,
224 	HINIC_TCP_OFFLOAD_ENABLE        = 1,
225 	HINIC_SCTP_OFFLOAD_ENABLE       = 2,
226 	HINIC_UDP_OFFLOAD_ENABLE        = 3,
227 };
228 
229 enum hinic_vlan_offload {
230 	HINIC_VLAN_OFF_DISABLE = 0,
231 	HINIC_VLAN_OFF_ENABLE  = 1,
232 };
233 
234 enum hinic_pkt_parsed {
235 	HINIC_PKT_NOT_PARSED = 0,
236 	HINIC_PKT_PARSED     = 1,
237 };
238 
239 enum hinic_l3_offload_type {
240 	L3TYPE_UNKNOWN = 0,
241 	IPV6_PKT = 1,
242 	IPV4_PKT_NO_CHKSUM_OFFLOAD = 2,
243 	IPV4_PKT_WITH_CHKSUM_OFFLOAD = 3,
244 };
245 
246 enum hinic_l4_offload_type {
247 	OFFLOAD_DISABLE     = 0,
248 	TCP_OFFLOAD_ENABLE  = 1,
249 	SCTP_OFFLOAD_ENABLE = 2,
250 	UDP_OFFLOAD_ENABLE  = 3,
251 };
252 
253 enum hinic_l4_tunnel_type {
254 	NOT_TUNNEL,
255 	TUNNEL_UDP_NO_CSUM,
256 	TUNNEL_UDP_CSUM,
257 };
258 
259 enum hinic_outer_l3type {
260 	HINIC_OUTER_L3TYPE_UNKNOWN              = 0,
261 	HINIC_OUTER_L3TYPE_IPV6                 = 1,
262 	HINIC_OUTER_L3TYPE_IPV4_NO_CHKSUM       = 2,
263 	HINIC_OUTER_L3TYPE_IPV4_CHKSUM          = 3,
264 };
265 
266 enum hinic_media_type {
267 	HINIC_MEDIA_UNKNOWN = 0,
268 };
269 
270 enum hinic_l2type {
271 	HINIC_L2TYPE_ETH = 0,
272 };
273 
274 enum hinc_tunnel_l4type {
275 	HINIC_TUNNEL_L4TYPE_UNKNOWN = 0,
276 };
277 
278 struct hinic_cmdq_header {
279 	u32     header_info;
280 	u32     saved_data;
281 };
282 
283 struct hinic_status {
284 	u32 status_info;
285 };
286 
287 struct hinic_ctrl {
288 	u32 ctrl_info;
289 };
290 
291 struct hinic_sge_resp {
292 	struct hinic_sge        sge;
293 	u32                     rsvd;
294 };
295 
296 struct hinic_cmdq_completion {
297 	/* HW Format */
298 	union {
299 		struct hinic_sge_resp   sge_resp;
300 		u64                     direct_resp;
301 	};
302 };
303 
304 struct hinic_scmd_bufdesc {
305 	u32     buf_len;
306 	u32     rsvd;
307 	u8      data[HINIC_SCMD_DATA_LEN];
308 };
309 
310 struct hinic_lcmd_bufdesc {
311 	struct hinic_sge        sge;
312 	u32                     rsvd1;
313 	u64                     rsvd2;
314 	u64                     rsvd3;
315 };
316 
317 struct hinic_cmdq_wqe_scmd {
318 	struct hinic_cmdq_header        header;
319 	u64                             rsvd;
320 	struct hinic_status             status;
321 	struct hinic_ctrl               ctrl;
322 	struct hinic_cmdq_completion    completion;
323 	struct hinic_scmd_bufdesc       buf_desc;
324 };
325 
326 struct hinic_cmdq_wqe_lcmd {
327 	struct hinic_cmdq_header        header;
328 	struct hinic_status             status;
329 	struct hinic_ctrl               ctrl;
330 	struct hinic_cmdq_completion    completion;
331 	struct hinic_lcmd_bufdesc       buf_desc;
332 };
333 
334 struct hinic_cmdq_direct_wqe {
335 	struct hinic_cmdq_wqe_scmd      wqe_scmd;
336 };
337 
338 struct hinic_cmdq_wqe {
339 	/* HW Format */
340 	union {
341 		struct hinic_cmdq_direct_wqe    direct_wqe;
342 		struct hinic_cmdq_wqe_lcmd      wqe_lcmd;
343 	};
344 };
345 
346 struct hinic_sq_ctrl {
347 	u32     ctrl_info;
348 	u32     queue_info;
349 };
350 
351 struct hinic_sq_task {
352 	u32     pkt_info0;
353 	u32     pkt_info1;
354 	u32     pkt_info2;
355 	u32     ufo_v6_identify;
356 	u32     pkt_info4;
357 	u32     zero_pad;
358 };
359 
360 struct hinic_sq_bufdesc {
361 	struct hinic_sge sge;
362 	u32     rsvd;
363 };
364 
365 struct hinic_sq_wqe {
366 	struct hinic_sq_ctrl            ctrl;
367 	struct hinic_sq_task            task;
368 	struct hinic_sq_bufdesc         buf_descs[HINIC_MAX_SQ_BUFDESCS];
369 };
370 
371 struct hinic_rq_cqe {
372 	u32     status;
373 	u32     len;
374 
375 	u32     rsvd2;
376 	u32     rsvd3;
377 	u32     rsvd4;
378 	u32     rsvd5;
379 	u32     rsvd6;
380 	u32     rsvd7;
381 };
382 
383 struct hinic_rq_ctrl {
384 	u32     ctrl_info;
385 };
386 
387 struct hinic_rq_cqe_sect {
388 	struct hinic_sge        sge;
389 	u32                     rsvd;
390 };
391 
392 struct hinic_rq_bufdesc {
393 	u32     hi_addr;
394 	u32     lo_addr;
395 };
396 
397 struct hinic_rq_wqe {
398 	struct hinic_rq_ctrl            ctrl;
399 	u32                             rsvd;
400 	struct hinic_rq_cqe_sect        cqe_sect;
401 	struct hinic_rq_bufdesc         buf_desc;
402 };
403 
404 struct hinic_hw_wqe {
405 	/* HW Format */
406 	union {
407 		struct hinic_cmdq_wqe   cmdq_wqe;
408 		struct hinic_sq_wqe     sq_wqe;
409 		struct hinic_rq_wqe     rq_wqe;
410 	};
411 };
412 
413 #endif
414