xref: /dpdk/drivers/net/octeontx/octeontx_rxtx.c (revision 7f4116bdbb1cb08519b867bb27e577b4e01bed0f)
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>
12ffc905f3SFerruh Yigit #include <rte_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
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 }
43*7f4116bdSHarman Kalra 
44*7f4116bdSHarman Kalra #define T(name, f1, sz, flags)					\
45*7f4116bdSHarman Kalra static uint16_t __rte_noinline	__rte_hot				\
46*7f4116bdSHarman Kalra octeontx_xmit_pkts_ ##name(void *tx_queue,				\
47*7f4116bdSHarman Kalra 			struct rte_mbuf **tx_pkts, uint16_t pkts)	\
48*7f4116bdSHarman Kalra {									\
49*7f4116bdSHarman Kalra 	uint64_t cmd[(sz)];						\
50*7f4116bdSHarman Kalra 									\
51*7f4116bdSHarman Kalra 	return __octeontx_xmit_pkts(tx_queue, tx_pkts, pkts, cmd,	\
52*7f4116bdSHarman Kalra 				    flags);				\
53*7f4116bdSHarman Kalra }
54*7f4116bdSHarman Kalra 
55*7f4116bdSHarman Kalra OCCTX_TX_FASTPATH_MODES
56*7f4116bdSHarman Kalra #undef T
57*7f4116bdSHarman Kalra 
58*7f4116bdSHarman Kalra void __rte_hot
59*7f4116bdSHarman Kalra octeontx_set_tx_function(struct rte_eth_dev *dev)
60*7f4116bdSHarman Kalra {
61*7f4116bdSHarman Kalra 	struct octeontx_nic *nic = octeontx_pmd_priv(dev);
62*7f4116bdSHarman Kalra 
63*7f4116bdSHarman Kalra 	const eth_tx_burst_t tx_burst_func[2] = {
64*7f4116bdSHarman Kalra #define T(name, f0, sz, flags)			\
65*7f4116bdSHarman Kalra 	[f0] =  octeontx_xmit_pkts_ ##name,
66*7f4116bdSHarman Kalra 
67*7f4116bdSHarman Kalra OCCTX_TX_FASTPATH_MODES
68*7f4116bdSHarman Kalra #undef T
69*7f4116bdSHarman Kalra 	};
70*7f4116bdSHarman Kalra 
71*7f4116bdSHarman Kalra 	dev->tx_pkt_burst = tx_burst_func
72*7f4116bdSHarman Kalra 		[!!(nic->tx_offload_flags & OCCTX_TX_MULTI_SEG_F)];
73*7f4116bdSHarman Kalra }
74