xref: /dpdk/drivers/net/octeontx/octeontx_rxtx.c (revision df96fd0d73955bdc7ca3909e772ff2ad903249c6)
1aaf4363eSJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause
2aaf4363eSJerin Jacob  * Copyright(c) 2017 Cavium, Inc
39e747589SJerin Jacob  */
49e747589SJerin Jacob 
59e747589SJerin Jacob #include <stdint.h>
69e747589SJerin Jacob #include <stdio.h>
79e747589SJerin Jacob #include <stdlib.h>
89e747589SJerin Jacob #include <unistd.h>
99e747589SJerin Jacob 
109e747589SJerin Jacob #include <rte_atomic.h>
119e747589SJerin Jacob #include <rte_common.h>
12*df96fd0dSBruce Richardson #include <ethdev_driver.h>
139e747589SJerin Jacob #include <rte_ether.h>
149e747589SJerin Jacob #include <rte_log.h>
159e747589SJerin Jacob #include <rte_mbuf.h>
169e747589SJerin Jacob #include <rte_prefetch.h>
179e747589SJerin Jacob 
189e747589SJerin Jacob #include "octeontx_ethdev.h"
199e747589SJerin Jacob #include "octeontx_rxtx.h"
209e747589SJerin Jacob #include "octeontx_logs.h"
219e747589SJerin Jacob 
22e3866e73SThomas Monjalon uint16_t __rte_hot
octeontx_recv_pkts(void * rx_queue,struct rte_mbuf ** rx_pkts,uint16_t nb_pkts)232d2c7918SJerin Jacob octeontx_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
242d2c7918SJerin Jacob {
252d2c7918SJerin Jacob 	struct octeontx_rxq *rxq;
262d2c7918SJerin Jacob 	struct rte_event ev;
272d2c7918SJerin Jacob 	size_t count;
282d2c7918SJerin Jacob 	uint16_t valid_event;
292d2c7918SJerin Jacob 
302d2c7918SJerin Jacob 	rxq = rx_queue;
312d2c7918SJerin Jacob 	count = 0;
322d2c7918SJerin Jacob 	while (count < nb_pkts) {
332d2c7918SJerin Jacob 		valid_event = rte_event_dequeue_burst(rxq->evdev,
342d2c7918SJerin Jacob 							rxq->ev_ports, &ev,
352d2c7918SJerin Jacob 							1, 0);
362d2c7918SJerin Jacob 		if (!valid_event)
372d2c7918SJerin Jacob 			break;
38d0d65498SPavan Nikhilesh 		rx_pkts[count++] = ev.mbuf;
392d2c7918SJerin Jacob 	}
402d2c7918SJerin Jacob 
412d2c7918SJerin Jacob 	return count; /* return number of pkts received */
422d2c7918SJerin Jacob }
437f4116bdSHarman Kalra 
44100f6992SHarman Kalra #define T(name, f3, f2, f1, f0, sz, flags)				\
457f4116bdSHarman Kalra static uint16_t __rte_noinline	__rte_hot				\
467f4116bdSHarman Kalra octeontx_xmit_pkts_ ##name(void *tx_queue,				\
477f4116bdSHarman Kalra 			struct rte_mbuf **tx_pkts, uint16_t pkts)	\
487f4116bdSHarman Kalra {									\
497f4116bdSHarman Kalra 	uint64_t cmd[(sz)];						\
507f4116bdSHarman Kalra 									\
517f4116bdSHarman Kalra 	return __octeontx_xmit_pkts(tx_queue, tx_pkts, pkts, cmd,	\
527f4116bdSHarman Kalra 				    flags);				\
537f4116bdSHarman Kalra }
547f4116bdSHarman Kalra 
557f4116bdSHarman Kalra OCCTX_TX_FASTPATH_MODES
567f4116bdSHarman Kalra #undef T
577f4116bdSHarman Kalra 
587f4116bdSHarman Kalra void __rte_hot
octeontx_set_tx_function(struct rte_eth_dev * dev)597f4116bdSHarman Kalra octeontx_set_tx_function(struct rte_eth_dev *dev)
607f4116bdSHarman Kalra {
617f4116bdSHarman Kalra 	struct octeontx_nic *nic = octeontx_pmd_priv(dev);
627f4116bdSHarman Kalra 
63100f6992SHarman Kalra 	const eth_tx_burst_t tx_burst_func[2][2][2][2] = {
64100f6992SHarman Kalra #define T(name, f3, f2, f1, f0, sz, flags)			\
65100f6992SHarman Kalra 	[f3][f2][f1][f0] =  octeontx_xmit_pkts_ ##name,
667f4116bdSHarman Kalra 
677f4116bdSHarman Kalra OCCTX_TX_FASTPATH_MODES
687f4116bdSHarman Kalra #undef T
697f4116bdSHarman Kalra 	};
707f4116bdSHarman Kalra 
717f4116bdSHarman Kalra 	dev->tx_pkt_burst = tx_burst_func
725cbe1848SHarman Kalra 		[!!(nic->tx_offload_flags & OCCTX_TX_OFFLOAD_MBUF_NOFF_F)]
73100f6992SHarman Kalra 		[!!(nic->tx_offload_flags & OCCTX_TX_OFFLOAD_OL3_OL4_CSUM_F)]
74100f6992SHarman Kalra 		[!!(nic->tx_offload_flags & OCCTX_TX_OFFLOAD_L3_L4_CSUM_F)]
757f4116bdSHarman Kalra 		[!!(nic->tx_offload_flags & OCCTX_TX_MULTI_SEG_F)];
767f4116bdSHarman Kalra }
77