Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(c) 2017 Intel Corporation
3 : : */
4 : :
5 : : #ifndef _IAVF_RXTX_H_
6 : : #define _IAVF_RXTX_H_
7 : :
8 : : /* In QLEN must be whole number of 32 descriptors. */
9 : : #define IAVF_ALIGN_RING_DESC 32
10 : : #define IAVF_MIN_RING_DESC 64
11 : : #define IAVF_MAX_RING_DESC 4096
12 : : #define IAVF_DMA_MEM_ALIGN 4096
13 : : /* Base address of the HW descriptor ring should be 128B aligned. */
14 : : #define IAVF_RING_BASE_ALIGN 128
15 : :
16 : : /* used for Rx Bulk Allocate */
17 : : #define IAVF_RX_MAX_BURST 32
18 : :
19 : : /* Max data buffer size must be 16K - 128 bytes */
20 : : #define IAVF_RX_MAX_DATA_BUF_SIZE (16 * 1024 - 128)
21 : :
22 : : /* used for Vector PMD */
23 : : #define IAVF_VPMD_RX_MAX_BURST 32
24 : : #define IAVF_VPMD_TX_MAX_BURST 32
25 : : #define IAVF_RXQ_REARM_THRESH 32
26 : : #define IAVF_VPMD_DESCS_PER_LOOP 4
27 : : #define IAVF_VPMD_TX_MAX_FREE_BUF 64
28 : :
29 : : #define IAVF_TX_NO_VECTOR_FLAGS ( \
30 : : RTE_ETH_TX_OFFLOAD_VLAN_INSERT | \
31 : : RTE_ETH_TX_OFFLOAD_QINQ_INSERT | \
32 : : RTE_ETH_TX_OFFLOAD_MULTI_SEGS | \
33 : : RTE_ETH_TX_OFFLOAD_TCP_TSO | \
34 : : RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO | \
35 : : RTE_ETH_TX_OFFLOAD_GRE_TNL_TSO | \
36 : : RTE_ETH_TX_OFFLOAD_IPIP_TNL_TSO | \
37 : : RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO | \
38 : : RTE_ETH_TX_OFFLOAD_SECURITY)
39 : :
40 : : #define IAVF_TX_VECTOR_OFFLOAD ( \
41 : : RTE_ETH_TX_OFFLOAD_IPV4_CKSUM | \
42 : : RTE_ETH_TX_OFFLOAD_SCTP_CKSUM | \
43 : : RTE_ETH_TX_OFFLOAD_UDP_CKSUM | \
44 : : RTE_ETH_TX_OFFLOAD_TCP_CKSUM)
45 : :
46 : : #define IAVF_TX_VECTOR_OFFLOAD_CTX ( \
47 : : RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM | \
48 : : RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM)
49 : :
50 : : #define IAVF_RX_VECTOR_OFFLOAD ( \
51 : : RTE_ETH_RX_OFFLOAD_CHECKSUM | \
52 : : RTE_ETH_RX_OFFLOAD_SCTP_CKSUM | \
53 : : RTE_ETH_RX_OFFLOAD_VLAN | \
54 : : RTE_ETH_RX_OFFLOAD_RSS_HASH | \
55 : : RTE_ETH_RX_OFFLOAD_TIMESTAMP)
56 : :
57 : : /**
58 : : * According to the vlan capabilities returned by the driver and FW, the vlan tci
59 : : * needs to be inserted to the L2TAG1 or L2TAG2 fields.
60 : : * If L2TAG1, it should be inserted to the L2TAG1 field in data desc.
61 : : * If L2TAG2, it should be inserted to the L2TAG2 field in ctx desc.
62 : : * Besides, tunneling parameters and other fields need be configured in ctx desc
63 : : * if the outer checksum offload is enabled.
64 : : */
65 : :
66 : : #define IAVF_VECTOR_PATH 0
67 : : #define IAVF_VECTOR_OFFLOAD_PATH 1
68 : : #define IAVF_VECTOR_CTX_OFFLOAD_PATH 2
69 : : #define IAVF_VECTOR_CTX_PATH 3
70 : :
71 : : #define DEFAULT_TX_RS_THRESH 32
72 : : #define DEFAULT_TX_FREE_THRESH 32
73 : :
74 : : #define IAVF_MIN_TSO_MSS 256
75 : : #define IAVF_MAX_TSO_MSS 9668
76 : : #define IAVF_TSO_MAX_SEG UINT8_MAX
77 : : #define IAVF_TX_MAX_MTU_SEG 8
78 : :
79 : : #define IAVF_TX_MIN_PKT_LEN 17
80 : :
81 : : #define IAVF_TX_CKSUM_OFFLOAD_MASK ( \
82 : : RTE_MBUF_F_TX_IP_CKSUM | \
83 : : RTE_MBUF_F_TX_L4_MASK | \
84 : : RTE_MBUF_F_TX_TCP_SEG | \
85 : : RTE_MBUF_F_TX_UDP_SEG | \
86 : : RTE_MBUF_F_TX_OUTER_IP_CKSUM | \
87 : : RTE_MBUF_F_TX_OUTER_UDP_CKSUM)
88 : :
89 : : #define IAVF_TX_OFFLOAD_MASK ( \
90 : : RTE_MBUF_F_TX_OUTER_IPV6 | \
91 : : RTE_MBUF_F_TX_OUTER_IPV4 | \
92 : : RTE_MBUF_F_TX_IPV6 | \
93 : : RTE_MBUF_F_TX_IPV4 | \
94 : : RTE_MBUF_F_TX_VLAN | \
95 : : RTE_MBUF_F_TX_IP_CKSUM | \
96 : : RTE_MBUF_F_TX_L4_MASK | \
97 : : RTE_MBUF_F_TX_TCP_SEG | \
98 : : RTE_MBUF_F_TX_UDP_SEG | \
99 : : RTE_MBUF_F_TX_TUNNEL_MASK | \
100 : : RTE_MBUF_F_TX_OUTER_IP_CKSUM | \
101 : : RTE_MBUF_F_TX_OUTER_UDP_CKSUM | \
102 : : RTE_MBUF_F_TX_SEC_OFFLOAD)
103 : :
104 : : #define IAVF_TX_OFFLOAD_NOTSUP_MASK \
105 : : (RTE_MBUF_F_TX_OFFLOAD_MASK ^ IAVF_TX_OFFLOAD_MASK)
106 : :
107 : : /* HW requires that TX buffer size ranges from 1B up to (16K-1)B. */
108 : : #define IAVF_MAX_DATA_PER_TXD \
109 : : (IAVF_TXD_QW1_TX_BUF_SZ_MASK >> IAVF_TXD_QW1_TX_BUF_SZ_SHIFT)
110 : :
111 : : #define IAVF_TX_LLDP_DYNFIELD "intel_pmd_dynfield_tx_lldp"
112 : : #define IAVF_CHECK_TX_LLDP(m) \
113 : : ((rte_pmd_iavf_tx_lldp_dynfield_offset > 0) && \
114 : : (*RTE_MBUF_DYNFIELD((m), \
115 : : rte_pmd_iavf_tx_lldp_dynfield_offset, \
116 : : uint8_t *)))
117 : :
118 : : extern uint64_t iavf_timestamp_dynflag;
119 : : extern int iavf_timestamp_dynfield_offset;
120 : : extern int rte_pmd_iavf_tx_lldp_dynfield_offset;
121 : :
122 : : /**
123 : : * Rx Flex Descriptors
124 : : * These descriptors are used instead of the legacy version descriptors
125 : : */
126 : : union iavf_16b_rx_flex_desc {
127 : : struct {
128 : : __le64 pkt_addr; /* Packet buffer address */
129 : : __le64 hdr_addr; /* Header buffer address */
130 : : /* bit 0 of hdr_addr is DD bit */
131 : : } read;
132 : : struct {
133 : : /* Qword 0 */
134 : : u8 rxdid; /* descriptor builder profile ID */
135 : : u8 mir_id_umb_cast; /* mirror=[5:0], umb=[7:6] */
136 : : __le16 ptype_flex_flags0; /* ptype=[9:0], ff0=[15:10] */
137 : : __le16 pkt_len; /* [15:14] are reserved */
138 : : __le16 hdr_len_sph_flex_flags1; /* header=[10:0] */
139 : : /* sph=[11:11] */
140 : : /* ff1/ext=[15:12] */
141 : :
142 : : /* Qword 1 */
143 : : __le16 status_error0;
144 : : __le16 l2tag1;
145 : : __le16 flex_meta0;
146 : : __le16 flex_meta1;
147 : : } wb; /* writeback */
148 : : };
149 : :
150 : : union iavf_32b_rx_flex_desc {
151 : : struct {
152 : : __le64 pkt_addr; /* Packet buffer address */
153 : : __le64 hdr_addr; /* Header buffer address */
154 : : /* bit 0 of hdr_addr is DD bit */
155 : : __le64 rsvd1;
156 : : __le64 rsvd2;
157 : : } read;
158 : : struct {
159 : : /* Qword 0 */
160 : : u8 rxdid; /* descriptor builder profile ID */
161 : : u8 mir_id_umb_cast; /* mirror=[5:0], umb=[7:6] */
162 : : __le16 ptype_flex_flags0; /* ptype=[9:0], ff0=[15:10] */
163 : : __le16 pkt_len; /* [15:14] are reserved */
164 : : __le16 hdr_len_sph_flex_flags1; /* header=[10:0] */
165 : : /* sph=[11:11] */
166 : : /* ff1/ext=[15:12] */
167 : :
168 : : /* Qword 1 */
169 : : __le16 status_error0;
170 : : __le16 l2tag1;
171 : : __le16 flex_meta0;
172 : : __le16 flex_meta1;
173 : :
174 : : /* Qword 2 */
175 : : __le16 status_error1;
176 : : u8 flex_flags2;
177 : : u8 time_stamp_low;
178 : : __le16 l2tag2_1st;
179 : : __le16 l2tag2_2nd;
180 : :
181 : : /* Qword 3 */
182 : : __le16 flex_meta2;
183 : : __le16 flex_meta3;
184 : : union {
185 : : struct {
186 : : __le16 flex_meta4;
187 : : __le16 flex_meta5;
188 : : } flex;
189 : : __le32 ts_high;
190 : : } flex_ts;
191 : : } wb; /* writeback */
192 : : };
193 : :
194 : : /* HW desc structure, both 16-byte and 32-byte types are supported */
195 : : #ifdef RTE_LIBRTE_IAVF_16BYTE_RX_DESC
196 : : #define iavf_rx_desc iavf_16byte_rx_desc
197 : : #define iavf_rx_flex_desc iavf_16b_rx_flex_desc
198 : : #else
199 : : #define iavf_rx_desc iavf_32byte_rx_desc
200 : : #define iavf_rx_flex_desc iavf_32b_rx_flex_desc
201 : : #endif
202 : :
203 : : typedef void (*iavf_rxd_to_pkt_fields_t)(struct iavf_rx_queue *rxq,
204 : : struct rte_mbuf *mb,
205 : : volatile union iavf_rx_flex_desc *rxdp);
206 : :
207 : : struct iavf_rxq_ops {
208 : : void (*release_mbufs)(struct iavf_rx_queue *rxq);
209 : : };
210 : :
211 : : struct iavf_txq_ops {
212 : : void (*release_mbufs)(struct iavf_tx_queue *txq);
213 : : };
214 : :
215 : :
216 : : struct iavf_rx_queue_stats {
217 : : uint64_t reserved;
218 : : struct iavf_ipsec_crypto_stats ipsec_crypto;
219 : : };
220 : :
221 : : /* Structure associated with each Rx queue. */
222 : : struct iavf_rx_queue {
223 : : struct rte_mempool *mp; /* mbuf pool to populate Rx ring */
224 : : const struct rte_memzone *mz; /* memzone for Rx ring */
225 : : volatile union iavf_rx_desc *rx_ring; /* Rx ring virtual address */
226 : : uint64_t rx_ring_phys_addr; /* Rx ring DMA address */
227 : : struct rte_mbuf **sw_ring; /* address of SW ring */
228 : : uint16_t nb_rx_desc; /* ring length */
229 : : uint16_t rx_tail; /* current value of tail */
230 : : volatile uint8_t *qrx_tail; /* register address of tail */
231 : : uint16_t rx_free_thresh; /* max free RX desc to hold */
232 : : uint16_t nb_rx_hold; /* number of held free RX desc */
233 : : struct rte_mbuf *pkt_first_seg; /* first segment of current packet */
234 : : struct rte_mbuf *pkt_last_seg; /* last segment of current packet */
235 : : struct rte_mbuf fake_mbuf; /* dummy mbuf */
236 : : uint8_t rxdid;
237 : : uint8_t rel_mbufs_type;
238 : :
239 : : /* used for VPMD */
240 : : uint16_t rxrearm_nb; /* number of remaining to be re-armed */
241 : : uint16_t rxrearm_start; /* the idx we start the re-arming from */
242 : : uint64_t mbuf_initializer; /* value to init mbufs */
243 : :
244 : : /* for rx bulk */
245 : : uint16_t rx_nb_avail; /* number of staged packets ready */
246 : : uint16_t rx_next_avail; /* index of next staged packets */
247 : : uint16_t rx_free_trigger; /* triggers rx buffer allocation */
248 : : struct rte_mbuf *rx_stage[IAVF_RX_MAX_BURST * 2]; /* store mbuf */
249 : :
250 : : uint16_t port_id; /* device port ID */
251 : : uint8_t crc_len; /* 0 if CRC stripped, 4 otherwise */
252 : : uint8_t fdir_enabled; /* 0 if FDIR disabled, 1 when enabled */
253 : : uint16_t queue_id; /* Rx queue index */
254 : : uint16_t rx_buf_len; /* The packet buffer size */
255 : : uint16_t rx_hdr_len; /* The header buffer size */
256 : : uint16_t max_pkt_len; /* Maximum packet length */
257 : : struct iavf_vsi *vsi; /**< the VSI this queue belongs to */
258 : :
259 : : bool q_set; /* if rx queue has been configured */
260 : : bool rx_deferred_start; /* don't start this queue in dev start */
261 : : const struct iavf_rxq_ops *ops;
262 : : uint8_t rx_flags;
263 : : #define IAVF_RX_FLAGS_VLAN_TAG_LOC_L2TAG1 BIT(0)
264 : : #define IAVF_RX_FLAGS_VLAN_TAG_LOC_L2TAG2_2 BIT(1)
265 : : uint8_t proto_xtr; /* protocol extraction type */
266 : : uint64_t xtr_ol_flag;
267 : : /* flexible descriptor metadata extraction offload flag */
268 : : struct iavf_rx_queue_stats stats;
269 : : uint64_t offloads;
270 : : uint64_t phc_time;
271 : : uint64_t hw_time_update;
272 : : };
273 : :
274 : : struct iavf_tx_entry {
275 : : struct rte_mbuf *mbuf;
276 : : uint16_t next_id;
277 : : uint16_t last_id;
278 : : };
279 : :
280 : : struct iavf_tx_vec_entry {
281 : : struct rte_mbuf *mbuf;
282 : : };
283 : :
284 : : /* Structure associated with each TX queue. */
285 : : struct iavf_tx_queue {
286 : : const struct rte_memzone *mz; /* memzone for Tx ring */
287 : : volatile struct iavf_tx_desc *tx_ring; /* Tx ring virtual address */
288 : : uint64_t tx_ring_phys_addr; /* Tx ring DMA address */
289 : : struct iavf_tx_entry *sw_ring; /* address array of SW ring */
290 : : uint16_t nb_tx_desc; /* ring length */
291 : : uint16_t tx_tail; /* current value of tail */
292 : : volatile uint8_t *qtx_tail; /* register address of tail */
293 : : /* number of used desc since RS bit set */
294 : : uint16_t nb_used;
295 : : uint16_t nb_free;
296 : : uint16_t last_desc_cleaned; /* last desc have been cleaned*/
297 : : uint16_t free_thresh;
298 : : uint16_t rs_thresh;
299 : : uint8_t rel_mbufs_type;
300 : : struct iavf_vsi *vsi; /**< the VSI this queue belongs to */
301 : :
302 : : uint16_t port_id;
303 : : uint16_t queue_id;
304 : : uint64_t offloads;
305 : : uint16_t next_dd; /* next to set RS, for VPMD */
306 : : uint16_t next_rs; /* next to check DD, for VPMD */
307 : : uint16_t ipsec_crypto_pkt_md_offset;
308 : :
309 : : uint64_t mbuf_errors;
310 : :
311 : : bool q_set; /* if rx queue has been configured */
312 : : bool tx_deferred_start; /* don't start this queue in dev start */
313 : : const struct iavf_txq_ops *ops;
314 : : #define IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG1 BIT(0)
315 : : #define IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG2 BIT(1)
316 : : uint8_t vlan_flag;
317 : : uint8_t tc;
318 : : uint8_t use_ctx:1; /* if use the ctx desc, a packet needs two descriptors */
319 : : };
320 : :
321 : : /* Offload features */
322 : : union iavf_tx_offload {
323 : : uint64_t data;
324 : : struct {
325 : : uint64_t l2_len:7; /* L2 (MAC) Header Length. */
326 : : uint64_t l3_len:9; /* L3 (IP) Header Length. */
327 : : uint64_t l4_len:8; /* L4 Header Length. */
328 : : uint64_t tso_segsz:16; /* TCP TSO segment size */
329 : : /* uint64_t unused : 24; */
330 : : };
331 : : };
332 : :
333 : : /* Rx Flex Descriptor
334 : : * RxDID Profile ID 16-21
335 : : * Flex-field 0: RSS hash lower 16-bits
336 : : * Flex-field 1: RSS hash upper 16-bits
337 : : * Flex-field 2: Flow ID lower 16-bits
338 : : * Flex-field 3: Flow ID upper 16-bits
339 : : * Flex-field 4: AUX0
340 : : * Flex-field 5: AUX1
341 : : */
342 : : struct iavf_32b_rx_flex_desc_comms {
343 : : /* Qword 0 */
344 : : u8 rxdid;
345 : : u8 mir_id_umb_cast;
346 : : __le16 ptype_flexi_flags0;
347 : : __le16 pkt_len;
348 : : __le16 hdr_len_sph_flex_flags1;
349 : :
350 : : /* Qword 1 */
351 : : __le16 status_error0;
352 : : __le16 l2tag1;
353 : : __le32 rss_hash;
354 : :
355 : : /* Qword 2 */
356 : : __le16 status_error1;
357 : : u8 flexi_flags2;
358 : : u8 ts_low;
359 : : __le16 l2tag2_1st;
360 : : __le16 l2tag2_2nd;
361 : :
362 : : /* Qword 3 */
363 : : __le32 flow_id;
364 : : union {
365 : : struct {
366 : : __le16 aux0;
367 : : __le16 aux1;
368 : : } flex;
369 : : __le32 ts_high;
370 : : } flex_ts;
371 : : };
372 : :
373 : : /* Rx Flex Descriptor
374 : : * RxDID Profile ID 22-23 (swap Hash and FlowID)
375 : : * Flex-field 0: Flow ID lower 16-bits
376 : : * Flex-field 1: Flow ID upper 16-bits
377 : : * Flex-field 2: RSS hash lower 16-bits
378 : : * Flex-field 3: RSS hash upper 16-bits
379 : : * Flex-field 4: AUX0
380 : : * Flex-field 5: AUX1
381 : : */
382 : : struct iavf_32b_rx_flex_desc_comms_ovs {
383 : : /* Qword 0 */
384 : : u8 rxdid;
385 : : u8 mir_id_umb_cast;
386 : : __le16 ptype_flexi_flags0;
387 : : __le16 pkt_len;
388 : : __le16 hdr_len_sph_flex_flags1;
389 : :
390 : : /* Qword 1 */
391 : : __le16 status_error0;
392 : : __le16 l2tag1;
393 : : __le32 flow_id;
394 : :
395 : : /* Qword 2 */
396 : : __le16 status_error1;
397 : : u8 flexi_flags2;
398 : : u8 ts_low;
399 : : __le16 l2tag2_1st;
400 : : __le16 l2tag2_2nd;
401 : :
402 : : /* Qword 3 */
403 : : __le32 rss_hash;
404 : : union {
405 : : struct {
406 : : __le16 aux0;
407 : : __le16 aux1;
408 : : } flex;
409 : : __le32 ts_high;
410 : : } flex_ts;
411 : : };
412 : :
413 : : /* Rx Flex Descriptor
414 : : * RxDID Profile ID 24 Inline IPsec
415 : : * Flex-field 0: RSS hash lower 16-bits
416 : : * Flex-field 1: RSS hash upper 16-bits
417 : : * Flex-field 2: Flow ID lower 16-bits
418 : : * Flex-field 3: Flow ID upper 16-bits
419 : : * Flex-field 4: Inline IPsec SAID lower 16-bits
420 : : * Flex-field 5: Inline IPsec SAID upper 16-bits
421 : : */
422 : : struct iavf_32b_rx_flex_desc_comms_ipsec {
423 : : /* Qword 0 */
424 : : u8 rxdid;
425 : : u8 mir_id_umb_cast;
426 : : __le16 ptype_flexi_flags0;
427 : : __le16 pkt_len;
428 : : __le16 hdr_len_sph_flex_flags1;
429 : :
430 : : /* Qword 1 */
431 : : __le16 status_error0;
432 : : __le16 l2tag1;
433 : : __le32 rss_hash;
434 : :
435 : : /* Qword 2 */
436 : : __le16 status_error1;
437 : : u8 flexi_flags2;
438 : : u8 ts_low;
439 : : __le16 l2tag2_1st;
440 : : __le16 l2tag2_2nd;
441 : :
442 : : /* Qword 3 */
443 : : __le32 flow_id;
444 : : __le32 ipsec_said;
445 : : };
446 : :
447 : : enum iavf_rxtx_rel_mbufs_type {
448 : : IAVF_REL_MBUFS_DEFAULT = 0,
449 : : IAVF_REL_MBUFS_SSE_VEC = 1,
450 : : IAVF_REL_MBUFS_AVX512_VEC = 2,
451 : : };
452 : :
453 : : /* Receive Flex Descriptor profile IDs: There are a total
454 : : * of 64 profiles where profile IDs 0/1 are for legacy; and
455 : : * profiles 2-63 are flex profiles that can be programmed
456 : : * with a specific metadata (profile 7 reserved for HW)
457 : : */
458 : : enum iavf_rxdid {
459 : : IAVF_RXDID_LEGACY_0 = 0,
460 : : IAVF_RXDID_LEGACY_1 = 1,
461 : : IAVF_RXDID_FLEX_NIC = 2,
462 : : IAVF_RXDID_FLEX_NIC_2 = 6,
463 : : IAVF_RXDID_HW = 7,
464 : : IAVF_RXDID_COMMS_GENERIC = 16,
465 : : IAVF_RXDID_COMMS_AUX_VLAN = 17,
466 : : IAVF_RXDID_COMMS_AUX_IPV4 = 18,
467 : : IAVF_RXDID_COMMS_AUX_IPV6 = 19,
468 : : IAVF_RXDID_COMMS_AUX_IPV6_FLOW = 20,
469 : : IAVF_RXDID_COMMS_AUX_TCP = 21,
470 : : IAVF_RXDID_COMMS_OVS_1 = 22,
471 : : IAVF_RXDID_COMMS_OVS_2 = 23,
472 : : IAVF_RXDID_COMMS_IPSEC_CRYPTO = 24,
473 : : IAVF_RXDID_COMMS_AUX_IP_OFFSET = 25,
474 : : IAVF_RXDID_LAST = 63,
475 : : };
476 : :
477 : : enum iavf_rx_flex_desc_status_error_0_bits {
478 : : /* Note: These are predefined bit offsets */
479 : : IAVF_RX_FLEX_DESC_STATUS0_DD_S = 0,
480 : : IAVF_RX_FLEX_DESC_STATUS0_EOF_S,
481 : : IAVF_RX_FLEX_DESC_STATUS0_HBO_S,
482 : : IAVF_RX_FLEX_DESC_STATUS0_L3L4P_S,
483 : : IAVF_RX_FLEX_DESC_STATUS0_XSUM_IPE_S,
484 : : IAVF_RX_FLEX_DESC_STATUS0_XSUM_L4E_S,
485 : : IAVF_RX_FLEX_DESC_STATUS0_XSUM_EIPE_S,
486 : : IAVF_RX_FLEX_DESC_STATUS0_XSUM_EUDPE_S,
487 : : IAVF_RX_FLEX_DESC_STATUS0_LPBK_S,
488 : : IAVF_RX_FLEX_DESC_STATUS0_IPV6EXADD_S,
489 : : IAVF_RX_FLEX_DESC_STATUS0_RXE_S,
490 : : IAVF_RX_FLEX_DESC_STATUS0_CRCP_S,
491 : : IAVF_RX_FLEX_DESC_STATUS0_RSS_VALID_S,
492 : : IAVF_RX_FLEX_DESC_STATUS0_L2TAG1P_S,
493 : : IAVF_RX_FLEX_DESC_STATUS0_XTRMD0_VALID_S,
494 : : IAVF_RX_FLEX_DESC_STATUS0_XTRMD1_VALID_S,
495 : : IAVF_RX_FLEX_DESC_STATUS0_LAST /* this entry must be last!!! */
496 : : };
497 : :
498 : : enum iavf_rx_flex_desc_status_error_1_bits {
499 : : /* Note: These are predefined bit offsets */
500 : : /* Bits 3:0 are reserved for inline ipsec status */
501 : : IAVF_RX_FLEX_DESC_STATUS1_IPSEC_CRYPTO_STATUS_0 = 0,
502 : : IAVF_RX_FLEX_DESC_STATUS1_IPSEC_CRYPTO_STATUS_1,
503 : : IAVF_RX_FLEX_DESC_STATUS1_IPSEC_CRYPTO_STATUS_2,
504 : : IAVF_RX_FLEX_DESC_STATUS1_IPSEC_CRYPTO_STATUS_3,
505 : : IAVF_RX_FLEX_DESC_STATUS1_NAT_S,
506 : : IAVF_RX_FLEX_DESC_STATUS1_IPSEC_CRYPTO_PROCESSED,
507 : : /* [10:6] reserved */
508 : : IAVF_RX_FLEX_DESC_STATUS1_L2TAG2P_S = 11,
509 : : IAVF_RX_FLEX_DESC_STATUS1_XTRMD2_VALID_S = 12,
510 : : IAVF_RX_FLEX_DESC_STATUS1_XTRMD3_VALID_S = 13,
511 : : IAVF_RX_FLEX_DESC_STATUS1_XTRMD4_VALID_S = 14,
512 : : IAVF_RX_FLEX_DESC_STATUS1_XTRMD5_VALID_S = 15,
513 : : IAVF_RX_FLEX_DESC_STATUS1_LAST /* this entry must be last!!! */
514 : : };
515 : :
516 : : #define IAVF_RX_FLEX_DESC_IPSEC_CRYPTO_STATUS_MASK ( \
517 : : BIT(IAVF_RX_FLEX_DESC_STATUS1_IPSEC_CRYPTO_STATUS_0) | \
518 : : BIT(IAVF_RX_FLEX_DESC_STATUS1_IPSEC_CRYPTO_STATUS_1) | \
519 : : BIT(IAVF_RX_FLEX_DESC_STATUS1_IPSEC_CRYPTO_STATUS_2) | \
520 : : BIT(IAVF_RX_FLEX_DESC_STATUS1_IPSEC_CRYPTO_STATUS_3))
521 : :
522 : : enum iavf_rx_flex_desc_ipsec_crypto_status {
523 : : IAVF_IPSEC_CRYPTO_STATUS_SUCCESS = 0,
524 : : IAVF_IPSEC_CRYPTO_STATUS_SAD_MISS,
525 : : IAVF_IPSEC_CRYPTO_STATUS_NOT_PROCESSED,
526 : : IAVF_IPSEC_CRYPTO_STATUS_ICV_CHECK_FAIL,
527 : : IAVF_IPSEC_CRYPTO_STATUS_LENGTH_ERR,
528 : : /* Reserved */
529 : : IAVF_IPSEC_CRYPTO_STATUS_MISC_ERR = 0xF
530 : : };
531 : :
532 : :
533 : :
534 : : #define IAVF_TXD_DATA_QW1_DTYPE_SHIFT (0)
535 : : #define IAVF_TXD_DATA_QW1_DTYPE_MASK (0xFUL << IAVF_TXD_QW1_DTYPE_SHIFT)
536 : :
537 : : #define IAVF_TXD_DATA_QW1_CMD_SHIFT (4)
538 : : #define IAVF_TXD_DATA_QW1_CMD_MASK (0x3FFUL << IAVF_TXD_DATA_QW1_CMD_SHIFT)
539 : :
540 : : #define IAVF_TXD_DATA_QW1_OFFSET_SHIFT (16)
541 : : #define IAVF_TXD_DATA_QW1_OFFSET_MASK (0x3FFFFULL << \
542 : : IAVF_TXD_DATA_QW1_OFFSET_SHIFT)
543 : :
544 : : #define IAVF_TXD_DATA_QW1_OFFSET_MACLEN_SHIFT (IAVF_TXD_DATA_QW1_OFFSET_SHIFT)
545 : : #define IAVF_TXD_DATA_QW1_OFFSET_MACLEN_MASK \
546 : : (0x7FUL << IAVF_TXD_DATA_QW1_OFFSET_MACLEN_SHIFT)
547 : :
548 : : #define IAVF_TXD_DATA_QW1_OFFSET_IPLEN_SHIFT \
549 : : (IAVF_TXD_DATA_QW1_OFFSET_SHIFT + IAVF_TX_DESC_LENGTH_IPLEN_SHIFT)
550 : : #define IAVF_TXD_DATA_QW1_OFFSET_IPLEN_MASK \
551 : : (0x7FUL << IAVF_TXD_DATA_QW1_OFFSET_IPLEN_SHIFT)
552 : :
553 : : #define IAVF_TXD_DATA_QW1_OFFSET_L4LEN_SHIFT \
554 : : (IAVF_TXD_DATA_QW1_OFFSET_SHIFT + IAVF_TX_DESC_LENGTH_L4_FC_LEN_SHIFT)
555 : : #define IAVF_TXD_DATA_QW1_OFFSET_L4LEN_MASK \
556 : : (0xFUL << IAVF_TXD_DATA_QW1_OFFSET_L4LEN_SHIFT)
557 : :
558 : : #define IAVF_TXD_DATA_QW1_MACLEN_MASK \
559 : : (0x7FUL << IAVF_TX_DESC_LENGTH_MACLEN_SHIFT)
560 : : #define IAVF_TXD_DATA_QW1_IPLEN_MASK \
561 : : (0x7FUL << IAVF_TX_DESC_LENGTH_IPLEN_SHIFT)
562 : : #define IAVF_TXD_DATA_QW1_L4LEN_MASK \
563 : : (0xFUL << IAVF_TX_DESC_LENGTH_L4_FC_LEN_SHIFT)
564 : : #define IAVF_TXD_DATA_QW1_FCLEN_MASK \
565 : : (0xFUL << IAVF_TX_DESC_LENGTH_L4_FC_LEN_SHIFT)
566 : :
567 : : #define IAVF_TXD_DATA_QW1_TX_BUF_SZ_SHIFT (34)
568 : : #define IAVF_TXD_DATA_QW1_TX_BUF_SZ_MASK \
569 : : (0x3FFFULL << IAVF_TXD_DATA_QW1_TX_BUF_SZ_SHIFT)
570 : :
571 : : #define IAVF_TXD_DATA_QW1_L2TAG1_SHIFT (48)
572 : : #define IAVF_TXD_DATA_QW1_L2TAG1_MASK \
573 : : (0xFFFFULL << IAVF_TXD_DATA_QW1_L2TAG1_SHIFT)
574 : :
575 : : #define IAVF_TXD_CTX_QW1_IPSEC_PARAMS_CIPHERBLK_SHIFT (11)
576 : : #define IAVF_TXD_CTX_QW1_IPSEC_PARAMS_CIPHERBLK_MASK \
577 : : (0x7UL << IAVF_TXD_CTX_QW1_IPSEC_PARAMS_CIPHERBLK_SHIFT)
578 : :
579 : : #define IAVF_TXD_CTX_QW1_IPSEC_PARAMS_ICVLEN_SHIFT (14)
580 : : #define IAVF_TXD_CTX_QW1_IPSEC_PARAMS_ICVLEN_MASK \
581 : : (0xFUL << IAVF_TXD_CTX_QW1_IPSEC_PARAMS_ICVLEN_SHIFT)
582 : :
583 : : #define IAVF_TXD_CTX_QW1_SEG_PARAMS_TLEN_SHIFT (30)
584 : : #define IAVF_TXD_CTX_QW1_SEG_PARAMS_TLEN_MASK \
585 : : (0x3FFFFUL << IAVF_TXD_CTX_QW1_SEG_PARAMS_TLEN_SHIFT)
586 : :
587 : : #define IAVF_TXD_CTX_QW1_TSYNC_PARAMS_TLEN_SHIFT (30)
588 : : #define IAVF_TXD_CTX_QW1_TSYNC_PARAMS_TLEN_MASK \
589 : : (0x3FUL << IAVF_TXD_CTX_QW1_SEG_PARAMS_TLEN_SHIFT)
590 : :
591 : : #define IAVF_TXD_CTX_QW1_SEG_PARAMS_MSS_SHIFT (50)
592 : : #define IAVF_TXD_CTX_QW1_SEG_PARAMS_MSS_MASK \
593 : : (0x3FFFUL << IAVF_TXD_CTX_QW1_SEG_PARAMS_MSS_SHIFT)
594 : :
595 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_EIPT_SHIFT (0)
596 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_EIPT_MASK (0x3UL)
597 : :
598 : : enum iavf_tx_ctx_desc_tunnel_external_ip_type {
599 : : IAVF_TX_CTX_DESC_EIPT_NONE,
600 : : IAVF_TX_CTX_DESC_EIPT_IPV6,
601 : : IAVF_TX_CTX_DESC_EIPT_IPV4_NO_CHECKSUM_OFFLOAD,
602 : : IAVF_TX_CTX_DESC_EIPT_IPV4_CHECKSUM_OFFLOAD
603 : : };
604 : :
605 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_EIPLEN_SHIFT (2)
606 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_EIPLEN_MASK (0x7FUL)
607 : :
608 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_L4TUNT_SHIFT (9)
609 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_L4TUNT_MASK (0x3UL)
610 : :
611 : : enum iavf_tx_ctx_desc_tunnel_l4_tunnel_type {
612 : : IAVF_TX_CTX_DESC_L4_TUN_TYP_NO_UDP_GRE,
613 : : IAVF_TX_CTX_DESC_L4_TUN_TYP_UDP,
614 : : IAVF_TX_CTX_DESC_L4_TUN_TYP_GRE
615 : : };
616 : :
617 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_EIP_NOINC_SHIFT (11)
618 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_EIP_NOINC_MASK (0x1UL)
619 : :
620 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_L4TUNLEN_SHIFT (12)
621 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_L4TUNLEN_MASK (0x7FUL)
622 : :
623 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_DECTTL_SHIFT (19)
624 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_DECTTL_MASK (0xFUL)
625 : :
626 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_L4T_CS_SHIFT (23)
627 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_L4T_CS_MASK (0x1UL)
628 : :
629 : : #define IAVF_TXD_CTX_QW0_L2TAG2_PARAM (32)
630 : : #define IAVF_TXD_CTX_QW0_L2TAG2_MASK (0xFFFFUL)
631 : :
632 : :
633 : : #define IAVF_RX_FLEX_DESC_IPSEC_CRYPTO_SAID_MASK (0xFFFFF)
634 : :
635 : : /* for iavf_32b_rx_flex_desc.ptype_flex_flags0 member */
636 : : #define IAVF_RX_FLEX_DESC_PTYPE_M (0x3FF) /* 10-bits */
637 : :
638 : :
639 : : /* for iavf_32b_rx_flex_desc.ptype_flex_flags0 member */
640 : : #define IAVF_RX_FLEX_DESC_PTYPE_M (0x3FF) /* 10-bits */
641 : :
642 : : /* for iavf_32b_rx_flex_desc.pkt_len member */
643 : : #define IAVF_RX_FLX_DESC_PKT_LEN_M (0x3FFF) /* 14-bits */
644 : :
645 : : int iavf_dev_rx_queue_setup(struct rte_eth_dev *dev,
646 : : uint16_t queue_idx,
647 : : uint16_t nb_desc,
648 : : unsigned int socket_id,
649 : : const struct rte_eth_rxconf *rx_conf,
650 : : struct rte_mempool *mp);
651 : :
652 : : int iavf_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id);
653 : : int iavf_dev_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id);
654 : : void iavf_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid);
655 : :
656 : : int iavf_dev_tx_queue_setup(struct rte_eth_dev *dev,
657 : : uint16_t queue_idx,
658 : : uint16_t nb_desc,
659 : : unsigned int socket_id,
660 : : const struct rte_eth_txconf *tx_conf);
661 : : int iavf_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id);
662 : : int iavf_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id);
663 : : int iavf_dev_tx_done_cleanup(void *txq, uint32_t free_cnt);
664 : : void iavf_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid);
665 : : void iavf_stop_queues(struct rte_eth_dev *dev);
666 : : uint16_t iavf_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
667 : : uint16_t nb_pkts);
668 : : uint16_t iavf_recv_pkts_flex_rxd(void *rx_queue,
669 : : struct rte_mbuf **rx_pkts,
670 : : uint16_t nb_pkts);
671 : : uint16_t iavf_recv_scattered_pkts(void *rx_queue,
672 : : struct rte_mbuf **rx_pkts,
673 : : uint16_t nb_pkts);
674 : : uint16_t iavf_recv_scattered_pkts_flex_rxd(void *rx_queue,
675 : : struct rte_mbuf **rx_pkts,
676 : : uint16_t nb_pkts);
677 : : uint16_t iavf_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
678 : : uint16_t nb_pkts);
679 : : uint16_t iavf_prep_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
680 : : uint16_t nb_pkts);
681 : : void iavf_set_rx_function(struct rte_eth_dev *dev);
682 : : void iavf_set_tx_function(struct rte_eth_dev *dev);
683 : : void iavf_dev_rxq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
684 : : struct rte_eth_rxq_info *qinfo);
685 : : void iavf_dev_txq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
686 : : struct rte_eth_txq_info *qinfo);
687 : : uint32_t iavf_dev_rxq_count(void *rx_queue);
688 : : int iavf_dev_rx_desc_status(void *rx_queue, uint16_t offset);
689 : : int iavf_dev_tx_desc_status(void *tx_queue, uint16_t offset);
690 : :
691 : : uint16_t iavf_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
692 : : uint16_t nb_pkts);
693 : : uint16_t iavf_recv_pkts_vec_flex_rxd(void *rx_queue, struct rte_mbuf **rx_pkts,
694 : : uint16_t nb_pkts);
695 : : uint16_t iavf_recv_scattered_pkts_vec(void *rx_queue,
696 : : struct rte_mbuf **rx_pkts,
697 : : uint16_t nb_pkts);
698 : : uint16_t iavf_recv_scattered_pkts_vec_flex_rxd(void *rx_queue,
699 : : struct rte_mbuf **rx_pkts,
700 : : uint16_t nb_pkts);
701 : : uint16_t iavf_xmit_fixed_burst_vec(void *tx_queue, struct rte_mbuf **tx_pkts,
702 : : uint16_t nb_pkts);
703 : : uint16_t iavf_recv_pkts_vec_avx2(void *rx_queue, struct rte_mbuf **rx_pkts,
704 : : uint16_t nb_pkts);
705 : : uint16_t iavf_recv_pkts_vec_avx2_offload(void *rx_queue, struct rte_mbuf **rx_pkts,
706 : : uint16_t nb_pkts);
707 : : uint16_t iavf_recv_pkts_vec_avx2_flex_rxd(void *rx_queue,
708 : : struct rte_mbuf **rx_pkts,
709 : : uint16_t nb_pkts);
710 : : uint16_t iavf_recv_pkts_vec_avx2_flex_rxd_offload(void *rx_queue,
711 : : struct rte_mbuf **rx_pkts,
712 : : uint16_t nb_pkts);
713 : : uint16_t iavf_recv_scattered_pkts_vec_avx2(void *rx_queue,
714 : : struct rte_mbuf **rx_pkts,
715 : : uint16_t nb_pkts);
716 : : uint16_t iavf_recv_scattered_pkts_vec_avx2_offload(void *rx_queue,
717 : : struct rte_mbuf **rx_pkts,
718 : : uint16_t nb_pkts);
719 : : uint16_t iavf_recv_scattered_pkts_vec_avx2_flex_rxd(void *rx_queue,
720 : : struct rte_mbuf **rx_pkts,
721 : : uint16_t nb_pkts);
722 : : uint16_t iavf_recv_scattered_pkts_vec_avx2_flex_rxd_offload(void *rx_queue,
723 : : struct rte_mbuf **rx_pkts,
724 : : uint16_t nb_pkts);
725 : : uint16_t iavf_xmit_pkts_vec(void *tx_queue, struct rte_mbuf **tx_pkts,
726 : : uint16_t nb_pkts);
727 : : uint16_t iavf_xmit_pkts_vec_avx2(void *tx_queue, struct rte_mbuf **tx_pkts,
728 : : uint16_t nb_pkts);
729 : : uint16_t iavf_xmit_pkts_vec_avx2_offload(void *tx_queue, struct rte_mbuf **tx_pkts,
730 : : uint16_t nb_pkts);
731 : : int iavf_get_monitor_addr(void *rx_queue, struct rte_power_monitor_cond *pmc);
732 : : int iavf_rx_vec_dev_check(struct rte_eth_dev *dev);
733 : : int iavf_tx_vec_dev_check(struct rte_eth_dev *dev);
734 : : int iavf_rxq_vec_setup(struct iavf_rx_queue *rxq);
735 : : int iavf_txq_vec_setup(struct iavf_tx_queue *txq);
736 : : uint16_t iavf_recv_pkts_vec_avx512(void *rx_queue, struct rte_mbuf **rx_pkts,
737 : : uint16_t nb_pkts);
738 : : uint16_t iavf_recv_pkts_vec_avx512_offload(void *rx_queue,
739 : : struct rte_mbuf **rx_pkts,
740 : : uint16_t nb_pkts);
741 : : uint16_t iavf_recv_pkts_vec_avx512_flex_rxd(void *rx_queue,
742 : : struct rte_mbuf **rx_pkts,
743 : : uint16_t nb_pkts);
744 : : uint16_t iavf_recv_pkts_vec_avx512_flex_rxd_offload(void *rx_queue,
745 : : struct rte_mbuf **rx_pkts,
746 : : uint16_t nb_pkts);
747 : : uint16_t iavf_recv_scattered_pkts_vec_avx512(void *rx_queue,
748 : : struct rte_mbuf **rx_pkts,
749 : : uint16_t nb_pkts);
750 : : uint16_t iavf_recv_scattered_pkts_vec_avx512_offload(void *rx_queue,
751 : : struct rte_mbuf **rx_pkts,
752 : : uint16_t nb_pkts);
753 : : uint16_t iavf_recv_scattered_pkts_vec_avx512_flex_rxd(void *rx_queue,
754 : : struct rte_mbuf **rx_pkts,
755 : : uint16_t nb_pkts);
756 : : uint16_t iavf_recv_scattered_pkts_vec_avx512_flex_rxd_offload(void *rx_queue,
757 : : struct rte_mbuf **rx_pkts,
758 : : uint16_t nb_pkts);
759 : : uint16_t iavf_xmit_pkts_vec_avx512(void *tx_queue, struct rte_mbuf **tx_pkts,
760 : : uint16_t nb_pkts);
761 : : uint16_t iavf_xmit_pkts_vec_avx512_offload(void *tx_queue,
762 : : struct rte_mbuf **tx_pkts,
763 : : uint16_t nb_pkts);
764 : : uint16_t iavf_xmit_pkts_vec_avx512_ctx_offload(void *tx_queue, struct rte_mbuf **tx_pkts,
765 : : uint16_t nb_pkts);
766 : : uint16_t iavf_xmit_pkts_vec_avx512_ctx(void *tx_queue, struct rte_mbuf **tx_pkts,
767 : : uint16_t nb_pkts);
768 : : int iavf_txq_vec_setup_avx512(struct iavf_tx_queue *txq);
769 : :
770 : : uint8_t iavf_proto_xtr_type_to_rxdid(uint8_t xtr_type);
771 : :
772 : : void iavf_set_default_ptype_table(struct rte_eth_dev *dev);
773 : : void iavf_tx_queue_release_mbufs_avx512(struct iavf_tx_queue *txq);
774 : : void iavf_rx_queue_release_mbufs_sse(struct iavf_rx_queue *rxq);
775 : : void iavf_tx_queue_release_mbufs_sse(struct iavf_tx_queue *txq);
776 : :
777 : : static inline
778 : : void iavf_dump_rx_descriptor(struct iavf_rx_queue *rxq,
779 : : const volatile void *desc,
780 : : uint16_t rx_id)
781 : : {
782 : : #ifdef RTE_LIBRTE_IAVF_16BYTE_RX_DESC
783 : : const volatile union iavf_16byte_rx_desc *rx_desc = desc;
784 : :
785 : : printf("Queue %d Rx_desc %d: QW0: 0x%016"PRIx64" QW1: 0x%016"PRIx64"\n",
786 : : rxq->queue_id, rx_id, rx_desc->read.pkt_addr,
787 : : rx_desc->read.hdr_addr);
788 : : #else
789 : : const volatile union iavf_32byte_rx_desc *rx_desc = desc;
790 : :
791 : : printf("Queue %d Rx_desc %d: QW0: 0x%016"PRIx64" QW1: 0x%016"PRIx64
792 : : " QW2: 0x%016"PRIx64" QW3: 0x%016"PRIx64"\n", rxq->queue_id,
793 : : rx_id, rx_desc->read.pkt_addr, rx_desc->read.hdr_addr,
794 : : rx_desc->read.rsvd1, rx_desc->read.rsvd2);
795 : : #endif
796 : : }
797 : :
798 : : /* All the descriptors are 16 bytes, so just use one of them
799 : : * to print the qwords
800 : : */
801 : : static inline
802 : : void iavf_dump_tx_descriptor(const struct iavf_tx_queue *txq,
803 : : const volatile void *desc, uint16_t tx_id)
804 : : {
805 : : const char *name;
806 : : const volatile struct iavf_tx_desc *tx_desc = desc;
807 : : enum iavf_tx_desc_dtype_value type;
808 : :
809 : :
810 : : type = (enum iavf_tx_desc_dtype_value)
811 : : rte_le_to_cpu_64(tx_desc->cmd_type_offset_bsz &
812 : : rte_cpu_to_le_64(IAVF_TXD_DATA_QW1_DTYPE_MASK));
813 : : switch (type) {
814 : : case IAVF_TX_DESC_DTYPE_DATA:
815 : : name = "Tx_data_desc";
816 : : break;
817 : : case IAVF_TX_DESC_DTYPE_CONTEXT:
818 : : name = "Tx_context_desc";
819 : : break;
820 : : case IAVF_TX_DESC_DTYPE_IPSEC:
821 : : name = "Tx_IPsec_desc";
822 : : break;
823 : : default:
824 : : name = "unknown_desc";
825 : : break;
826 : : }
827 : :
828 : : printf("Queue %d %s %d: QW0: 0x%016"PRIx64" QW1: 0x%016"PRIx64"\n",
829 : : txq->queue_id, name, tx_id, tx_desc->buffer_addr,
830 : : tx_desc->cmd_type_offset_bsz);
831 : : }
832 : :
833 : : #define FDIR_PROC_ENABLE_PER_QUEUE(ad, on) do { \
834 : : int i; \
835 : : for (i = 0; i < (ad)->dev_data->nb_rx_queues; i++) { \
836 : : struct iavf_rx_queue *rxq = (ad)->dev_data->rx_queues[i]; \
837 : : if (!rxq) \
838 : : continue; \
839 : : rxq->fdir_enabled = on; \
840 : : } \
841 : : PMD_DRV_LOG(DEBUG, "FDIR processing on RX set to %d", on); \
842 : : } while (0)
843 : :
844 : : /* Enable/disable flow director Rx processing in data path. */
845 : : static inline
846 : 0 : void iavf_fdir_rx_proc_enable(struct iavf_adapter *ad, bool on)
847 : : {
848 [ # # ]: 0 : if (on) {
849 : : /* enable flow director processing */
850 [ # # # # ]: 0 : FDIR_PROC_ENABLE_PER_QUEUE(ad, on);
851 : 0 : ad->fdir_ref_cnt++;
852 : : } else {
853 [ # # ]: 0 : if (ad->fdir_ref_cnt >= 1) {
854 : 0 : ad->fdir_ref_cnt--;
855 : :
856 [ # # ]: 0 : if (ad->fdir_ref_cnt == 0)
857 [ # # # # ]: 0 : FDIR_PROC_ENABLE_PER_QUEUE(ad, on);
858 : : }
859 : : }
860 : 0 : }
861 : :
862 : : static inline
863 : : uint64_t iavf_tstamp_convert_32b_64b(uint64_t time, uint32_t in_timestamp)
864 : : {
865 : : const uint64_t mask = 0xFFFFFFFF;
866 : : uint32_t delta;
867 : : uint64_t ns;
868 : :
869 : 0 : delta = (in_timestamp - (uint32_t)(time & mask));
870 [ # # # # : 0 : if (delta > (mask / 2)) {
# # ]
871 : 0 : delta = ((uint32_t)(time & mask) - in_timestamp);
872 : 0 : ns = time - delta;
873 : : } else {
874 : 0 : ns = time + delta;
875 : : }
876 : :
877 : : return ns;
878 : : }
879 : :
880 : : #ifdef RTE_LIBRTE_IAVF_DEBUG_DUMP_DESC
881 : : #define IAVF_DUMP_RX_DESC(rxq, desc, rx_id) \
882 : : iavf_dump_rx_descriptor(rxq, desc, rx_id)
883 : : #define IAVF_DUMP_TX_DESC(txq, desc, tx_id) \
884 : : iavf_dump_tx_descriptor(txq, desc, tx_id)
885 : : #else
886 : : #define IAVF_DUMP_RX_DESC(rxq, desc, rx_id) do { } while (0)
887 : : #define IAVF_DUMP_TX_DESC(txq, desc, tx_id) do { } while (0)
888 : : #endif
889 : :
890 : : #endif /* _IAVF_RXTX_H_ */
|