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 : : /* IAVF does not support 16-byte descriptors */
9 : : #ifdef RTE_NET_INTEL_USE_16BYTE_DESC
10 : : #undef RTE_NET_INTEL_USE_16BYTE_DESC
11 : : #endif
12 : :
13 : : #include "../common/rx.h"
14 : : #include "../common/tx.h"
15 : :
16 : : /* In QLEN must be whole number of 32 descriptors. */
17 : : #define IAVF_ALIGN_RING_DESC 32
18 : : #define IAVF_MIN_RING_DESC 64
19 : : #define IAVF_MAX_RING_DESC 4096
20 : : #define IAVF_DMA_MEM_ALIGN 4096
21 : : /* Base address of the HW descriptor ring should be 128B aligned. */
22 : : #define IAVF_RING_BASE_ALIGN 128
23 : :
24 : : /* used for Rx Bulk Allocate */
25 : : #define IAVF_RX_MAX_BURST CI_RX_MAX_BURST
26 : :
27 : : /* Max data buffer size must be 16K - 128 bytes */
28 : : #define IAVF_RX_MAX_DATA_BUF_SIZE (16 * 1024 - 128)
29 : :
30 : : /* used for Vector PMD */
31 : : #define IAVF_VPMD_RX_BURST CI_VPMD_RX_BURST
32 : : #define IAVF_VPMD_TX_BURST 32
33 : : #define IAVF_VPMD_RXQ_REARM_THRESH CI_VPMD_RX_REARM_THRESH
34 : : #define IAVF_VPMD_DESCS_PER_LOOP CI_VPMD_DESCS_PER_LOOP
35 : : #define IAVF_VPMD_DESCS_PER_LOOP_WIDE CI_VPMD_DESCS_PER_LOOP_WIDE
36 : : #define IAVF_VPMD_TX_MAX_FREE_BUF 64
37 : :
38 : : /* basic scalar path */
39 : : #define IAVF_TX_SCALAR_OFFLOADS ( \
40 : : RTE_ETH_TX_OFFLOAD_VLAN_INSERT | \
41 : : RTE_ETH_TX_OFFLOAD_IPV4_CKSUM | \
42 : : RTE_ETH_TX_OFFLOAD_UDP_CKSUM | \
43 : : RTE_ETH_TX_OFFLOAD_TCP_CKSUM | \
44 : : RTE_ETH_TX_OFFLOAD_SCTP_CKSUM | \
45 : : RTE_ETH_TX_OFFLOAD_TCP_TSO | \
46 : : RTE_ETH_TX_OFFLOAD_UDP_TSO | \
47 : : RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM | \
48 : : RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO | \
49 : : RTE_ETH_TX_OFFLOAD_QINQ_INSERT | \
50 : : RTE_ETH_TX_OFFLOAD_GRE_TNL_TSO | \
51 : : RTE_ETH_TX_OFFLOAD_IPIP_TNL_TSO | \
52 : : RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO | \
53 : : RTE_ETH_TX_OFFLOAD_MULTI_SEGS | \
54 : : RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE | \
55 : : RTE_ETH_TX_OFFLOAD_SECURITY | \
56 : : RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM)
57 : : /* basic vector path */
58 : : #define IAVF_TX_VECTOR_OFFLOADS RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE
59 : : /* offload vector path */
60 : : #define IAVF_TX_VECTOR_OFFLOAD_OFFLOADS ( \
61 : : IAVF_TX_VECTOR_OFFLOADS | \
62 : : RTE_ETH_TX_OFFLOAD_VLAN_INSERT | \
63 : : RTE_ETH_TX_OFFLOAD_IPV4_CKSUM | \
64 : : RTE_ETH_TX_OFFLOAD_SCTP_CKSUM | \
65 : : RTE_ETH_TX_OFFLOAD_UDP_CKSUM | \
66 : : RTE_ETH_TX_OFFLOAD_TCP_CKSUM)
67 : : /* offload vector path with context descriptor */
68 : : #define IAVF_TX_VECTOR_CTX_OFFLOAD_OFFLOADS ( \
69 : : IAVF_TX_VECTOR_OFFLOADS | \
70 : : IAVF_TX_VECTOR_OFFLOAD_OFFLOADS | \
71 : : RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM | \
72 : : RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM | \
73 : : RTE_ETH_TX_OFFLOAD_QINQ_INSERT)
74 : :
75 : : /* basic scalar path */
76 : : #define IAVF_RX_SCALAR_OFFLOADS ( \
77 : : RTE_ETH_RX_OFFLOAD_VLAN_STRIP | \
78 : : RTE_ETH_RX_OFFLOAD_QINQ_STRIP | \
79 : : RTE_ETH_RX_OFFLOAD_IPV4_CKSUM | \
80 : : RTE_ETH_RX_OFFLOAD_UDP_CKSUM | \
81 : : RTE_ETH_RX_OFFLOAD_TCP_CKSUM | \
82 : : RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM | \
83 : : RTE_ETH_RX_OFFLOAD_SCATTER | \
84 : : RTE_ETH_RX_OFFLOAD_VLAN_FILTER | \
85 : : RTE_ETH_RX_OFFLOAD_VLAN_EXTEND | \
86 : : RTE_ETH_RX_OFFLOAD_RSS_HASH | \
87 : : RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM | \
88 : : RTE_ETH_RX_OFFLOAD_KEEP_CRC)
89 : : /* scalar path that uses the flex rx desc */
90 : : #define IAVF_RX_SCALAR_FLEX_OFFLOADS ( \
91 : : IAVF_RX_SCALAR_OFFLOADS | \
92 : : RTE_ETH_RX_OFFLOAD_TIMESTAMP | \
93 : : RTE_ETH_RX_OFFLOAD_SECURITY)
94 : : /* basic vector paths */
95 : : #define IAVF_RX_VECTOR_OFFLOADS ( \
96 : : RTE_ETH_RX_OFFLOAD_KEEP_CRC | \
97 : : RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM | \
98 : : RTE_ETH_RX_OFFLOAD_SCATTER)
99 : : /* vector paths that use the flex rx desc */
100 : : #define IAVF_RX_VECTOR_FLEX_OFFLOADS ( \
101 : : IAVF_RX_VECTOR_OFFLOADS | \
102 : : RTE_ETH_RX_OFFLOAD_SECURITY)
103 : : /* vector offload paths */
104 : : #define IAVF_RX_VECTOR_OFFLOAD_OFFLOADS ( \
105 : : IAVF_RX_VECTOR_OFFLOADS | \
106 : : RTE_ETH_RX_OFFLOAD_CHECKSUM | \
107 : : RTE_ETH_RX_OFFLOAD_SCTP_CKSUM | \
108 : : RTE_ETH_RX_OFFLOAD_VLAN | \
109 : : RTE_ETH_RX_OFFLOAD_RSS_HASH)
110 : : /* vector offload paths that use the flex rx desc */
111 : : #define IAVF_RX_VECTOR_OFFLOAD_FLEX_OFFLOADS ( \
112 : : IAVF_RX_VECTOR_OFFLOAD_OFFLOADS | \
113 : : RTE_ETH_RX_OFFLOAD_TIMESTAMP | \
114 : : RTE_ETH_RX_OFFLOAD_SECURITY)
115 : :
116 : : /**
117 : : * According to the vlan capabilities returned by the driver and FW, the vlan tci
118 : : * needs to be inserted to the L2TAG1 or L2TAG2 fields.
119 : : * If L2TAG1, it should be inserted to the L2TAG1 field in data desc.
120 : : * If L2TAG2, it should be inserted to the L2TAG2 field in ctx desc.
121 : : * Besides, tunneling parameters and other fields need be configured in ctx desc
122 : : * if the outer checksum offload is enabled.
123 : : */
124 : :
125 : : #define IAVF_VECTOR_PATH 0
126 : : #define IAVF_VECTOR_OFFLOAD_PATH 1
127 : : #define IAVF_VECTOR_CTX_OFFLOAD_PATH 2
128 : : #define IAVF_VECTOR_CTX_PATH 3
129 : :
130 : : #define DEFAULT_TX_RS_THRESH 32
131 : : #define DEFAULT_TX_FREE_THRESH 32
132 : :
133 : : #define IAVF_MIN_TSO_MSS 256
134 : : #define IAVF_MAX_TSO_MSS 9668
135 : : #define IAVF_TSO_MAX_SEG UINT8_MAX
136 : : #define IAVF_TX_MAX_MTU_SEG 8
137 : :
138 : : #define IAVF_TX_MIN_PKT_LEN 17
139 : :
140 : : #define IAVF_TX_OFFLOAD_MASK ( \
141 : : RTE_MBUF_F_TX_OUTER_IPV6 | \
142 : : RTE_MBUF_F_TX_OUTER_IPV4 | \
143 : : RTE_MBUF_F_TX_IPV6 | \
144 : : RTE_MBUF_F_TX_IPV4 | \
145 : : RTE_MBUF_F_TX_VLAN | \
146 : : RTE_MBUF_F_TX_IP_CKSUM | \
147 : : RTE_MBUF_F_TX_L4_MASK | \
148 : : RTE_MBUF_F_TX_TCP_SEG | \
149 : : RTE_MBUF_F_TX_UDP_SEG | \
150 : : RTE_MBUF_F_TX_TUNNEL_MASK | \
151 : : RTE_MBUF_F_TX_OUTER_IP_CKSUM | \
152 : : RTE_MBUF_F_TX_OUTER_UDP_CKSUM | \
153 : : RTE_MBUF_F_TX_SEC_OFFLOAD)
154 : :
155 : : #define IAVF_TX_OFFLOAD_NOTSUP_MASK \
156 : : (RTE_MBUF_F_TX_OFFLOAD_MASK ^ IAVF_TX_OFFLOAD_MASK)
157 : :
158 : : #define IAVF_TX_LLDP_DYNFIELD "intel_pmd_dynfield_tx_lldp"
159 : :
160 : : /* LLDP Tx modes */
161 : : #define IAVF_LLDP_DISABLED 0
162 : : #define IAVF_LLDP_PTYPE 1
163 : : #define IAVF_LLDP_DYNFIELD 2
164 : :
165 : : #define IAVF_CHECK_TX_LLDP(m, lldp_mode) \
166 : : ((lldp_mode) && \
167 : : ((((lldp_mode) == IAVF_LLDP_PTYPE) && \
168 : : ((m)->packet_type & RTE_PTYPE_L2_MASK) == RTE_PTYPE_L2_ETHER_LLDP) || \
169 : : (((lldp_mode) == IAVF_LLDP_DYNFIELD) && \
170 : : *RTE_MBUF_DYNFIELD((m), rte_pmd_iavf_tx_lldp_dynfield_offset, uint8_t *))))
171 : :
172 : : extern uint64_t iavf_timestamp_dynflag;
173 : : extern int iavf_timestamp_dynfield_offset;
174 : : extern int rte_pmd_iavf_tx_lldp_dynfield_offset;
175 : :
176 : : typedef void (*iavf_rxd_to_pkt_fields_t)(struct ci_rx_queue *rxq,
177 : : struct rte_mbuf *mb,
178 : : volatile union ci_rx_flex_desc *rxdp);
179 : :
180 : : struct iavf_rxq_ops {
181 : : void (*release_mbufs)(struct ci_rx_queue *rxq);
182 : : };
183 : :
184 : : struct iavf_txq_ops {
185 : : void (*release_mbufs)(struct ci_tx_queue *txq);
186 : : };
187 : :
188 : :
189 : : struct iavf_rx_queue_stats {
190 : : uint64_t reserved;
191 : : struct iavf_ipsec_crypto_stats ipsec_crypto;
192 : : };
193 : :
194 : : /* Rx Flex Descriptor
195 : : * RxDID Profile ID 16-21
196 : : * Flex-field 0: RSS hash lower 16-bits
197 : : * Flex-field 1: RSS hash upper 16-bits
198 : : * Flex-field 2: Flow ID lower 16-bits
199 : : * Flex-field 3: Flow ID upper 16-bits
200 : : * Flex-field 4: AUX0
201 : : * Flex-field 5: AUX1
202 : : */
203 : : struct iavf_32b_rx_flex_desc_comms {
204 : : /* Qword 0 */
205 : : u8 rxdid;
206 : : u8 mir_id_umb_cast;
207 : : __le16 ptype_flexi_flags0;
208 : : __le16 pkt_len;
209 : : __le16 hdr_len_sph_flex_flags1;
210 : :
211 : : /* Qword 1 */
212 : : __le16 status_error0;
213 : : __le16 l2tag1;
214 : : __le32 rss_hash;
215 : :
216 : : /* Qword 2 */
217 : : __le16 status_error1;
218 : : u8 flexi_flags2;
219 : : u8 ts_low;
220 : : __le16 l2tag2_1st;
221 : : __le16 l2tag2_2nd;
222 : :
223 : : /* Qword 3 */
224 : : __le32 flow_id;
225 : : union {
226 : : struct {
227 : : __le16 aux0;
228 : : __le16 aux1;
229 : : } flex;
230 : : __le32 ts_high;
231 : : } flex_ts;
232 : : };
233 : :
234 : : /* Rx Flex Descriptor
235 : : * RxDID Profile ID 22-23 (swap Hash and FlowID)
236 : : * Flex-field 0: Flow ID lower 16-bits
237 : : * Flex-field 1: Flow ID upper 16-bits
238 : : * Flex-field 2: RSS hash lower 16-bits
239 : : * Flex-field 3: RSS hash upper 16-bits
240 : : * Flex-field 4: AUX0
241 : : * Flex-field 5: AUX1
242 : : */
243 : : struct iavf_32b_rx_flex_desc_comms_ovs {
244 : : /* Qword 0 */
245 : : u8 rxdid;
246 : : u8 mir_id_umb_cast;
247 : : __le16 ptype_flexi_flags0;
248 : : __le16 pkt_len;
249 : : __le16 hdr_len_sph_flex_flags1;
250 : :
251 : : /* Qword 1 */
252 : : __le16 status_error0;
253 : : __le16 l2tag1;
254 : : __le32 flow_id;
255 : :
256 : : /* Qword 2 */
257 : : __le16 status_error1;
258 : : u8 flexi_flags2;
259 : : u8 ts_low;
260 : : __le16 l2tag2_1st;
261 : : __le16 l2tag2_2nd;
262 : :
263 : : /* Qword 3 */
264 : : __le32 rss_hash;
265 : : union {
266 : : struct {
267 : : __le16 aux0;
268 : : __le16 aux1;
269 : : } flex;
270 : : __le32 ts_high;
271 : : } flex_ts;
272 : : };
273 : :
274 : : /* Rx Flex Descriptor
275 : : * RxDID Profile ID 24 Inline IPsec
276 : : * Flex-field 0: RSS hash lower 16-bits
277 : : * Flex-field 1: RSS hash upper 16-bits
278 : : * Flex-field 2: Flow ID lower 16-bits
279 : : * Flex-field 3: Flow ID upper 16-bits
280 : : * Flex-field 4: Inline IPsec SAID lower 16-bits
281 : : * Flex-field 5: Inline IPsec SAID upper 16-bits
282 : : */
283 : : struct iavf_32b_rx_flex_desc_comms_ipsec {
284 : : /* Qword 0 */
285 : : u8 rxdid;
286 : : u8 mir_id_umb_cast;
287 : : __le16 ptype_flexi_flags0;
288 : : __le16 pkt_len;
289 : : __le16 hdr_len_sph_flex_flags1;
290 : :
291 : : /* Qword 1 */
292 : : __le16 status_error0;
293 : : __le16 l2tag1;
294 : : __le32 rss_hash;
295 : :
296 : : /* Qword 2 */
297 : : __le16 status_error1;
298 : : u8 flexi_flags2;
299 : : u8 ts_low;
300 : : __le16 l2tag2_1st;
301 : : __le16 l2tag2_2nd;
302 : :
303 : : /* Qword 3 */
304 : : __le32 flow_id;
305 : : __le32 ipsec_said;
306 : : };
307 : :
308 : : enum iavf_rxtx_rel_mbufs_type {
309 : : IAVF_REL_MBUFS_DEFAULT = 0,
310 : : IAVF_REL_MBUFS_VEC = 1,
311 : : IAVF_REL_MBUFS_NEON_VEC = 2,
312 : : };
313 : :
314 : : /* Receive Flex Descriptor profile IDs: There are a total
315 : : * of 64 profiles where profile IDs 0/1 are for legacy; and
316 : : * profiles 2-63 are flex profiles that can be programmed
317 : : * with a specific metadata (profile 7 reserved for HW)
318 : : */
319 : : enum iavf_rxdid {
320 : : IAVF_RXDID_LEGACY_0 = 0,
321 : : IAVF_RXDID_LEGACY_1 = 1,
322 : : IAVF_RXDID_FLEX_NIC = 2,
323 : : IAVF_RXDID_FLEX_NIC_2 = 6,
324 : : IAVF_RXDID_HW = 7,
325 : : IAVF_RXDID_COMMS_GENERIC = 16,
326 : : IAVF_RXDID_COMMS_AUX_VLAN = 17,
327 : : IAVF_RXDID_COMMS_AUX_IPV4 = 18,
328 : : IAVF_RXDID_COMMS_AUX_IPV6 = 19,
329 : : IAVF_RXDID_COMMS_AUX_IPV6_FLOW = 20,
330 : : IAVF_RXDID_COMMS_AUX_TCP = 21,
331 : : IAVF_RXDID_COMMS_OVS_1 = 22,
332 : : IAVF_RXDID_COMMS_OVS_2 = 23,
333 : : IAVF_RXDID_COMMS_IPSEC_CRYPTO = 24,
334 : : IAVF_RXDID_COMMS_AUX_IP_OFFSET = 25,
335 : : IAVF_RXDID_LAST = 63,
336 : : };
337 : :
338 : : enum iavf_rx_flex_desc_status_error_0_bits {
339 : : /* Note: These are predefined bit offsets */
340 : : IAVF_RX_FLEX_DESC_STATUS0_DD_S = 0,
341 : : IAVF_RX_FLEX_DESC_STATUS0_EOF_S,
342 : : IAVF_RX_FLEX_DESC_STATUS0_HBO_S,
343 : : IAVF_RX_FLEX_DESC_STATUS0_L3L4P_S,
344 : : IAVF_RX_FLEX_DESC_STATUS0_XSUM_IPE_S,
345 : : IAVF_RX_FLEX_DESC_STATUS0_XSUM_L4E_S,
346 : : IAVF_RX_FLEX_DESC_STATUS0_XSUM_EIPE_S,
347 : : IAVF_RX_FLEX_DESC_STATUS0_XSUM_EUDPE_S,
348 : : IAVF_RX_FLEX_DESC_STATUS0_LPBK_S,
349 : : IAVF_RX_FLEX_DESC_STATUS0_IPV6EXADD_S,
350 : : IAVF_RX_FLEX_DESC_STATUS0_RXE_S,
351 : : IAVF_RX_FLEX_DESC_STATUS0_CRCP_S,
352 : : IAVF_RX_FLEX_DESC_STATUS0_RSS_VALID_S,
353 : : IAVF_RX_FLEX_DESC_STATUS0_L2TAG1P_S,
354 : : IAVF_RX_FLEX_DESC_STATUS0_XTRMD0_VALID_S,
355 : : IAVF_RX_FLEX_DESC_STATUS0_XTRMD1_VALID_S,
356 : : IAVF_RX_FLEX_DESC_STATUS0_LAST /* this entry must be last!!! */
357 : : };
358 : :
359 : : enum iavf_rx_flex_desc_status_error_1_bits {
360 : : /* Note: These are predefined bit offsets */
361 : : /* Bits 3:0 are reserved for inline ipsec status */
362 : : IAVF_RX_FLEX_DESC_STATUS1_IPSEC_CRYPTO_STATUS_0 = 0,
363 : : IAVF_RX_FLEX_DESC_STATUS1_IPSEC_CRYPTO_STATUS_1,
364 : : IAVF_RX_FLEX_DESC_STATUS1_IPSEC_CRYPTO_STATUS_2,
365 : : IAVF_RX_FLEX_DESC_STATUS1_IPSEC_CRYPTO_STATUS_3,
366 : : IAVF_RX_FLEX_DESC_STATUS1_NAT_S,
367 : : IAVF_RX_FLEX_DESC_STATUS1_IPSEC_CRYPTO_PROCESSED,
368 : : /* [10:6] reserved */
369 : : IAVF_RX_FLEX_DESC_STATUS1_L2TAG2P_S = 11,
370 : : IAVF_RX_FLEX_DESC_STATUS1_XTRMD2_VALID_S = 12,
371 : : IAVF_RX_FLEX_DESC_STATUS1_XTRMD3_VALID_S = 13,
372 : : IAVF_RX_FLEX_DESC_STATUS1_XTRMD4_VALID_S = 14,
373 : : IAVF_RX_FLEX_DESC_STATUS1_XTRMD5_VALID_S = 15,
374 : : IAVF_RX_FLEX_DESC_STATUS1_LAST /* this entry must be last!!! */
375 : : };
376 : :
377 : : #define IAVF_RX_FLEX_DESC_IPSEC_CRYPTO_STATUS_MASK ( \
378 : : BIT(IAVF_RX_FLEX_DESC_STATUS1_IPSEC_CRYPTO_STATUS_0) | \
379 : : BIT(IAVF_RX_FLEX_DESC_STATUS1_IPSEC_CRYPTO_STATUS_1) | \
380 : : BIT(IAVF_RX_FLEX_DESC_STATUS1_IPSEC_CRYPTO_STATUS_2) | \
381 : : BIT(IAVF_RX_FLEX_DESC_STATUS1_IPSEC_CRYPTO_STATUS_3))
382 : :
383 : : enum iavf_rx_flex_desc_ipsec_crypto_status {
384 : : IAVF_IPSEC_CRYPTO_STATUS_SUCCESS = 0,
385 : : IAVF_IPSEC_CRYPTO_STATUS_SAD_MISS,
386 : : IAVF_IPSEC_CRYPTO_STATUS_NOT_PROCESSED,
387 : : IAVF_IPSEC_CRYPTO_STATUS_ICV_CHECK_FAIL,
388 : : IAVF_IPSEC_CRYPTO_STATUS_LENGTH_ERR,
389 : : /* Reserved */
390 : : IAVF_IPSEC_CRYPTO_STATUS_MISC_ERR = 0xF
391 : : };
392 : :
393 : :
394 : :
395 : : #define IAVF_TXD_DATA_QW1_DTYPE_SHIFT (0)
396 : : #define IAVF_TXD_DATA_QW1_DTYPE_MASK (0xFUL << CI_TXD_QW1_DTYPE_S)
397 : :
398 : : #define IAVF_TXD_DATA_QW1_CMD_SHIFT (4)
399 : : #define IAVF_TXD_DATA_QW1_CMD_MASK (0x3FFUL << IAVF_TXD_DATA_QW1_CMD_SHIFT)
400 : :
401 : : #define IAVF_TXD_DATA_QW1_OFFSET_SHIFT (16)
402 : : #define IAVF_TXD_DATA_QW1_OFFSET_MASK (0x3FFFFULL << \
403 : : IAVF_TXD_DATA_QW1_OFFSET_SHIFT)
404 : :
405 : : #define IAVF_TXD_DATA_QW1_OFFSET_MACLEN_SHIFT (IAVF_TXD_DATA_QW1_OFFSET_SHIFT)
406 : : #define IAVF_TXD_DATA_QW1_OFFSET_MACLEN_MASK \
407 : : (0x7FUL << IAVF_TXD_DATA_QW1_OFFSET_MACLEN_SHIFT)
408 : :
409 : : #define IAVF_TXD_DATA_QW1_OFFSET_IPLEN_SHIFT \
410 : : (IAVF_TXD_DATA_QW1_OFFSET_SHIFT + IAVF_TX_DESC_LENGTH_IPLEN_SHIFT)
411 : : #define IAVF_TXD_DATA_QW1_OFFSET_IPLEN_MASK \
412 : : (0x7FUL << IAVF_TXD_DATA_QW1_OFFSET_IPLEN_SHIFT)
413 : :
414 : : #define IAVF_TXD_DATA_QW1_OFFSET_L4LEN_SHIFT \
415 : : (IAVF_TXD_DATA_QW1_OFFSET_SHIFT + IAVF_TX_DESC_LENGTH_L4_FC_LEN_SHIFT)
416 : : #define IAVF_TXD_DATA_QW1_OFFSET_L4LEN_MASK \
417 : : (0xFUL << IAVF_TXD_DATA_QW1_OFFSET_L4LEN_SHIFT)
418 : :
419 : : #define IAVF_TXD_DATA_QW1_MACLEN_MASK \
420 : : (0x7FUL << IAVF_TX_DESC_LENGTH_MACLEN_SHIFT)
421 : : #define IAVF_TXD_DATA_QW1_IPLEN_MASK \
422 : : (0x7FUL << IAVF_TX_DESC_LENGTH_IPLEN_SHIFT)
423 : : #define IAVF_TXD_DATA_QW1_L4LEN_MASK \
424 : : (0xFUL << IAVF_TX_DESC_LENGTH_L4_FC_LEN_SHIFT)
425 : : #define IAVF_TXD_DATA_QW1_FCLEN_MASK \
426 : : (0xFUL << IAVF_TX_DESC_LENGTH_L4_FC_LEN_SHIFT)
427 : :
428 : : #define IAVF_TXD_DATA_QW1_TX_BUF_SZ_SHIFT (34)
429 : : #define IAVF_TXD_DATA_QW1_TX_BUF_SZ_MASK \
430 : : (0x3FFFULL << IAVF_TXD_DATA_QW1_TX_BUF_SZ_SHIFT)
431 : :
432 : : #define IAVF_TXD_DATA_QW1_L2TAG1_SHIFT (48)
433 : : #define IAVF_TXD_DATA_QW1_L2TAG1_MASK \
434 : : (0xFFFFULL << IAVF_TXD_DATA_QW1_L2TAG1_SHIFT)
435 : :
436 : : #define IAVF_TXD_CTX_QW1_IPSEC_PARAMS_CIPHERBLK_SHIFT (11)
437 : : #define IAVF_TXD_CTX_QW1_IPSEC_PARAMS_CIPHERBLK_MASK \
438 : : (0x7UL << IAVF_TXD_CTX_QW1_IPSEC_PARAMS_CIPHERBLK_SHIFT)
439 : :
440 : : #define IAVF_TXD_CTX_QW1_IPSEC_PARAMS_ICVLEN_SHIFT (14)
441 : : #define IAVF_TXD_CTX_QW1_IPSEC_PARAMS_ICVLEN_MASK \
442 : : (0xFUL << IAVF_TXD_CTX_QW1_IPSEC_PARAMS_ICVLEN_SHIFT)
443 : :
444 : : #define IAVF_TXD_CTX_QW1_SEG_PARAMS_TLEN_SHIFT (30)
445 : : #define IAVF_TXD_CTX_QW1_SEG_PARAMS_TLEN_MASK \
446 : : (0x3FFFFUL << IAVF_TXD_CTX_QW1_SEG_PARAMS_TLEN_SHIFT)
447 : :
448 : : #define IAVF_TXD_CTX_QW1_TSYNC_PARAMS_TLEN_SHIFT (30)
449 : : #define IAVF_TXD_CTX_QW1_TSYNC_PARAMS_TLEN_MASK \
450 : : (0x3FUL << IAVF_TXD_CTX_QW1_SEG_PARAMS_TLEN_SHIFT)
451 : :
452 : : #define IAVF_TXD_CTX_QW1_SEG_PARAMS_MSS_SHIFT (50)
453 : : #define IAVF_TXD_CTX_QW1_SEG_PARAMS_MSS_MASK \
454 : : (0x3FFFUL << IAVF_TXD_CTX_QW1_SEG_PARAMS_MSS_SHIFT)
455 : :
456 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_EIPT_SHIFT (0)
457 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_EIPT_MASK (0x3UL)
458 : :
459 : : enum iavf_tx_ctx_desc_tunnel_external_ip_type {
460 : : IAVF_TX_CTX_DESC_EIPT_NONE,
461 : : IAVF_TX_CTX_DESC_EIPT_IPV6,
462 : : IAVF_TX_CTX_DESC_EIPT_IPV4_NO_CHECKSUM_OFFLOAD,
463 : : IAVF_TX_CTX_DESC_EIPT_IPV4_CHECKSUM_OFFLOAD
464 : : };
465 : :
466 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_EIPLEN_SHIFT (2)
467 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_EIPLEN_MASK (0x7FUL)
468 : :
469 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_L4TUNT_SHIFT (9)
470 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_L4TUNT_MASK (0x3UL)
471 : :
472 : : enum iavf_tx_ctx_desc_tunnel_l4_tunnel_type {
473 : : IAVF_TX_CTX_DESC_L4_TUN_TYP_NO_UDP_GRE,
474 : : IAVF_TX_CTX_DESC_L4_TUN_TYP_UDP,
475 : : IAVF_TX_CTX_DESC_L4_TUN_TYP_GRE
476 : : };
477 : :
478 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_EIP_NOINC_SHIFT (11)
479 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_EIP_NOINC_MASK (0x1UL)
480 : :
481 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_L4TUNLEN_SHIFT (12)
482 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_L4TUNLEN_MASK (0x7FUL)
483 : :
484 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_DECTTL_SHIFT (19)
485 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_DECTTL_MASK (0xFUL)
486 : :
487 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_L4T_CS_SHIFT (23)
488 : : #define IAVF_TXD_CTX_QW0_TUN_PARAMS_L4T_CS_MASK (0x1UL)
489 : :
490 : : #define IAVF_TXD_CTX_QW0_L2TAG2_PARAM (32)
491 : : #define IAVF_TXD_CTX_QW0_L2TAG2_MASK (0xFFFFUL)
492 : :
493 : :
494 : : #define IAVF_RX_FLEX_DESC_IPSEC_CRYPTO_SAID_MASK (0xFFFFF)
495 : :
496 : : /* for iavf_32b_rx_flex_desc.ptype_flex_flags0 member */
497 : : #define IAVF_RX_FLEX_DESC_PTYPE_M (0x3FF) /* 10-bits */
498 : :
499 : :
500 : : /* for iavf_32b_rx_flex_desc.ptype_flex_flags0 member */
501 : : #define IAVF_RX_FLEX_DESC_PTYPE_M (0x3FF) /* 10-bits */
502 : :
503 : : /* for iavf_32b_rx_flex_desc.pkt_len member */
504 : : #define IAVF_RX_FLX_DESC_PKT_LEN_M (0x3FFF) /* 14-bits */
505 : :
506 : : /* Valid indicator bit for the time_stamp_low field */
507 : : #define IAVF_RX_FLX_DESC_TS_VALID (0x1UL)
508 : :
509 : : int iavf_dev_rx_queue_setup(struct rte_eth_dev *dev,
510 : : uint16_t queue_idx,
511 : : uint16_t nb_desc,
512 : : unsigned int socket_id,
513 : : const struct rte_eth_rxconf *rx_conf,
514 : : struct rte_mempool *mp);
515 : :
516 : : int iavf_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id);
517 : : int iavf_dev_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id);
518 : : void iavf_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid);
519 : : int iavf_rx_burst_mode_get(struct rte_eth_dev *dev, uint16_t queue_id,
520 : : struct rte_eth_burst_mode *mode);
521 : : int iavf_tx_burst_mode_get(struct rte_eth_dev *dev, uint16_t queue_id,
522 : : struct rte_eth_burst_mode *mode);
523 : : int iavf_dev_tx_queue_setup(struct rte_eth_dev *dev,
524 : : uint16_t queue_idx,
525 : : uint16_t nb_desc,
526 : : unsigned int socket_id,
527 : : const struct rte_eth_txconf *tx_conf);
528 : : int iavf_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id);
529 : : int iavf_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id);
530 : : int iavf_dev_tx_done_cleanup(void *txq, uint32_t free_cnt);
531 : : void iavf_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid);
532 : : void iavf_stop_queues(struct rte_eth_dev *dev);
533 : : uint16_t iavf_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
534 : : uint16_t nb_pkts);
535 : : uint16_t iavf_recv_pkts_flex_rxd(void *rx_queue,
536 : : struct rte_mbuf **rx_pkts,
537 : : uint16_t nb_pkts);
538 : : uint16_t iavf_recv_scattered_pkts(void *rx_queue,
539 : : struct rte_mbuf **rx_pkts,
540 : : uint16_t nb_pkts);
541 : : uint16_t iavf_recv_scattered_pkts_flex_rxd(void *rx_queue,
542 : : struct rte_mbuf **rx_pkts,
543 : : uint16_t nb_pkts);
544 : : uint16_t iavf_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
545 : : uint16_t nb_pkts);
546 : : uint16_t iavf_prep_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
547 : : uint16_t nb_pkts);
548 : : void iavf_set_rx_function(struct rte_eth_dev *dev);
549 : : void iavf_set_tx_function(struct rte_eth_dev *dev);
550 : : void iavf_dev_rxq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
551 : : struct rte_eth_rxq_info *qinfo);
552 : : void iavf_dev_txq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
553 : : struct rte_eth_txq_info *qinfo);
554 : : int iavf_dev_rxq_count(void *rx_queue);
555 : : int iavf_dev_rx_desc_status(void *rx_queue, uint16_t offset);
556 : : int iavf_dev_tx_desc_status(void *tx_queue, uint16_t offset);
557 : :
558 : : uint16_t iavf_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
559 : : uint16_t nb_pkts);
560 : : uint16_t iavf_recv_pkts_vec_flex_rxd(void *rx_queue, struct rte_mbuf **rx_pkts,
561 : : uint16_t nb_pkts);
562 : : uint16_t iavf_recv_scattered_pkts_vec(void *rx_queue,
563 : : struct rte_mbuf **rx_pkts,
564 : : uint16_t nb_pkts);
565 : : uint16_t iavf_recv_scattered_pkts_vec_flex_rxd(void *rx_queue,
566 : : struct rte_mbuf **rx_pkts,
567 : : uint16_t nb_pkts);
568 : : uint16_t iavf_recv_pkts_vec_avx2(void *rx_queue, struct rte_mbuf **rx_pkts,
569 : : uint16_t nb_pkts);
570 : : uint16_t iavf_recv_pkts_vec_avx2_offload(void *rx_queue, struct rte_mbuf **rx_pkts,
571 : : uint16_t nb_pkts);
572 : : uint16_t iavf_recv_pkts_vec_avx2_flex_rxd(void *rx_queue,
573 : : struct rte_mbuf **rx_pkts,
574 : : uint16_t nb_pkts);
575 : : uint16_t iavf_recv_pkts_vec_avx2_flex_rxd_offload(void *rx_queue,
576 : : struct rte_mbuf **rx_pkts,
577 : : uint16_t nb_pkts);
578 : : uint16_t iavf_recv_scattered_pkts_vec_avx2(void *rx_queue,
579 : : struct rte_mbuf **rx_pkts,
580 : : uint16_t nb_pkts);
581 : : uint16_t iavf_recv_scattered_pkts_vec_avx2_offload(void *rx_queue,
582 : : struct rte_mbuf **rx_pkts,
583 : : uint16_t nb_pkts);
584 : : uint16_t iavf_recv_scattered_pkts_vec_avx2_flex_rxd(void *rx_queue,
585 : : struct rte_mbuf **rx_pkts,
586 : : uint16_t nb_pkts);
587 : : uint16_t iavf_recv_scattered_pkts_vec_avx2_flex_rxd_offload(void *rx_queue,
588 : : struct rte_mbuf **rx_pkts,
589 : : uint16_t nb_pkts);
590 : : uint16_t iavf_xmit_pkts_vec(void *tx_queue, struct rte_mbuf **tx_pkts,
591 : : uint16_t nb_pkts);
592 : : uint16_t iavf_xmit_pkts_vec_avx2(void *tx_queue, struct rte_mbuf **tx_pkts,
593 : : uint16_t nb_pkts);
594 : : uint16_t iavf_xmit_pkts_vec_avx2_offload(void *tx_queue, struct rte_mbuf **tx_pkts,
595 : : uint16_t nb_pkts);
596 : : uint16_t iavf_xmit_pkts_vec_avx2_ctx(void *tx_queue, struct rte_mbuf **tx_pkts,
597 : : uint16_t nb_pkts);
598 : : uint16_t iavf_xmit_pkts_vec_avx2_ctx_offload(void *tx_queue, struct rte_mbuf **tx_pkts,
599 : : uint16_t nb_pkts);
600 : : int iavf_get_monitor_addr(void *rx_queue, struct rte_power_monitor_cond *pmc);
601 : : int iavf_rx_vec_dev_check(struct rte_eth_dev *dev);
602 : : int iavf_tx_vec_dev_check(struct rte_eth_dev *dev);
603 : : int iavf_rxq_vec_setup(struct ci_rx_queue *rxq);
604 : : uint16_t iavf_recv_pkts_vec_avx512(void *rx_queue, struct rte_mbuf **rx_pkts,
605 : : uint16_t nb_pkts);
606 : : uint16_t iavf_recv_pkts_vec_avx512_offload(void *rx_queue,
607 : : struct rte_mbuf **rx_pkts,
608 : : uint16_t nb_pkts);
609 : : uint16_t iavf_recv_pkts_vec_avx512_flex_rxd(void *rx_queue,
610 : : struct rte_mbuf **rx_pkts,
611 : : uint16_t nb_pkts);
612 : : uint16_t iavf_recv_pkts_vec_avx512_flex_rxd_offload(void *rx_queue,
613 : : struct rte_mbuf **rx_pkts,
614 : : uint16_t nb_pkts);
615 : : uint16_t iavf_recv_scattered_pkts_vec_avx512(void *rx_queue,
616 : : struct rte_mbuf **rx_pkts,
617 : : uint16_t nb_pkts);
618 : : uint16_t iavf_recv_scattered_pkts_vec_avx512_offload(void *rx_queue,
619 : : struct rte_mbuf **rx_pkts,
620 : : uint16_t nb_pkts);
621 : : uint16_t iavf_recv_scattered_pkts_vec_avx512_flex_rxd(void *rx_queue,
622 : : struct rte_mbuf **rx_pkts,
623 : : uint16_t nb_pkts);
624 : : uint16_t iavf_recv_scattered_pkts_vec_avx512_flex_rxd_offload(void *rx_queue,
625 : : struct rte_mbuf **rx_pkts,
626 : : uint16_t nb_pkts);
627 : : uint16_t iavf_xmit_pkts_vec_avx512(void *tx_queue, struct rte_mbuf **tx_pkts,
628 : : uint16_t nb_pkts);
629 : : uint16_t iavf_xmit_pkts_vec_avx512_offload(void *tx_queue,
630 : : struct rte_mbuf **tx_pkts,
631 : : uint16_t nb_pkts);
632 : : uint16_t iavf_xmit_pkts_vec_avx512_ctx_offload(void *tx_queue, struct rte_mbuf **tx_pkts,
633 : : uint16_t nb_pkts);
634 : : uint16_t iavf_xmit_pkts_vec_avx512_ctx(void *tx_queue, struct rte_mbuf **tx_pkts,
635 : : uint16_t nb_pkts);
636 : : int iavf_txq_vec_setup_avx512(struct ci_tx_queue *txq);
637 : :
638 : : uint8_t iavf_proto_xtr_type_to_rxdid(uint8_t xtr_type);
639 : :
640 : : void iavf_set_default_ptype_table(struct rte_eth_dev *dev);
641 : : void iavf_rx_queue_release_mbufs_vec(struct ci_rx_queue *rxq);
642 : : void iavf_rx_queue_release_mbufs_neon(struct ci_rx_queue *rxq);
643 : : enum rte_vect_max_simd iavf_get_max_simd_bitwidth(void);
644 : :
645 : : static inline
646 : : void iavf_dump_rx_descriptor(struct ci_rx_queue *rxq,
647 : : const volatile void *desc,
648 : : uint16_t rx_id)
649 : : {
650 : : const volatile union ci_rx_desc *rx_desc = desc;
651 : :
652 : : printf("Queue %d Rx_desc %d: QW0: 0x%016"PRIx64" QW1: 0x%016"PRIx64
653 : : " QW2: 0x%016"PRIx64" QW3: 0x%016"PRIx64"\n", rxq->queue_id,
654 : : rx_id, rx_desc->read.pkt_addr, rx_desc->read.hdr_addr,
655 : : rx_desc->read.rsvd1, rx_desc->read.rsvd2);
656 : : }
657 : :
658 : : /* All the descriptors are 16 bytes, so just use one of them
659 : : * to print the qwords
660 : : */
661 : : static inline
662 : : void iavf_dump_tx_descriptor(const struct ci_tx_queue *txq,
663 : : const volatile void *desc, uint16_t tx_id)
664 : : {
665 : : const char *name;
666 : : const volatile struct ci_tx_desc *tx_desc = desc;
667 : : enum iavf_tx_desc_dtype_value type;
668 : :
669 : :
670 : : type = (enum iavf_tx_desc_dtype_value)
671 : : rte_le_to_cpu_64(tx_desc->cmd_type_offset_bsz &
672 : : rte_cpu_to_le_64(IAVF_TXD_DATA_QW1_DTYPE_MASK));
673 : : switch (type) {
674 : : case CI_TX_DESC_DTYPE_DATA:
675 : : name = "Tx_data_desc";
676 : : break;
677 : : case IAVF_TX_DESC_DTYPE_CONTEXT:
678 : : name = "Tx_context_desc";
679 : : break;
680 : : case IAVF_TX_DESC_DTYPE_IPSEC:
681 : : name = "Tx_IPsec_desc";
682 : : break;
683 : : default:
684 : : name = "unknown_desc";
685 : : break;
686 : : }
687 : :
688 : : printf("Queue %d %s %d: QW0: 0x%016"PRIx64" QW1: 0x%016"PRIx64"\n",
689 : : txq->queue_id, name, tx_id, tx_desc->buffer_addr,
690 : : tx_desc->cmd_type_offset_bsz);
691 : : }
692 : :
693 : : #define FDIR_PROC_ENABLE_PER_QUEUE(ad, on) do { \
694 : : int i; \
695 : : for (i = 0; i < (ad)->dev_data->nb_rx_queues; i++) { \
696 : : struct ci_rx_queue *rxq = (ad)->dev_data->rx_queues[i]; \
697 : : if (!rxq) \
698 : : continue; \
699 : : rxq->fdir_enabled = on; \
700 : : } \
701 : : PMD_DRV_LOG(DEBUG, "FDIR processing on RX set to %d", on); \
702 : : } while (0)
703 : :
704 : : /* Enable/disable flow director Rx processing in data path. */
705 : : static inline
706 : 0 : void iavf_fdir_rx_proc_enable(struct iavf_adapter *ad, bool on)
707 : : {
708 [ # # ]: 0 : if (on) {
709 : : /* enable flow director processing */
710 [ # # # # ]: 0 : FDIR_PROC_ENABLE_PER_QUEUE(ad, on);
711 : 0 : ad->fdir_ref_cnt++;
712 : : } else {
713 [ # # ]: 0 : if (ad->fdir_ref_cnt >= 1) {
714 : 0 : ad->fdir_ref_cnt--;
715 : :
716 [ # # ]: 0 : if (ad->fdir_ref_cnt == 0)
717 [ # # # # ]: 0 : FDIR_PROC_ENABLE_PER_QUEUE(ad, on);
718 : : }
719 : : }
720 : 0 : }
721 : :
722 : : static inline
723 : : uint64_t iavf_tstamp_convert_32b_64b(uint64_t time, uint32_t in_timestamp)
724 : : {
725 : : const uint64_t mask = 0xFFFFFFFF;
726 : : uint32_t delta;
727 : : uint64_t ns;
728 : :
729 : 0 : delta = (in_timestamp - (uint32_t)(time & mask));
730 [ # # # # : 0 : if (delta > (mask / 2)) {
# # ]
731 : 0 : delta = ((uint32_t)(time & mask) - in_timestamp);
732 : 0 : ns = time - delta;
733 : : } else {
734 : 0 : ns = time + delta;
735 : : }
736 : :
737 : : return ns;
738 : : }
739 : :
740 : : #ifdef RTE_LIBRTE_IAVF_DEBUG_DUMP_DESC
741 : : #define IAVF_DUMP_RX_DESC(rxq, desc, rx_id) \
742 : : iavf_dump_rx_descriptor(rxq, desc, rx_id)
743 : : #define IAVF_DUMP_TX_DESC(txq, desc, tx_id) \
744 : : iavf_dump_tx_descriptor(txq, desc, tx_id)
745 : : #else
746 : : #define IAVF_DUMP_RX_DESC(rxq, desc, rx_id) do { } while (0)
747 : : #define IAVF_DUMP_TX_DESC(txq, desc, tx_id) do { } while (0)
748 : : #endif
749 : :
750 : : #endif /* _IAVF_RXTX_H_ */
|