File Index
Files and directories
Sign in
FILE

hinic_hw_wqe.h

File preview with syntax highlighting.

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