xref: /dpdk/drivers/net/cnxk/cn9k_rx_select.c (revision eabbac98af1345157e07c431e18543296c37c355)
15169508aSPavan Nikhilesh /* SPDX-License-Identifier: BSD-3-Clause
25169508aSPavan Nikhilesh  * Copyright(C) 2021 Marvell.
35169508aSPavan Nikhilesh  */
45169508aSPavan Nikhilesh 
55169508aSPavan Nikhilesh #include "cn9k_ethdev.h"
65169508aSPavan Nikhilesh #include "cn9k_rx.h"
75169508aSPavan Nikhilesh 
87d9b1d44SJerin Jacob static __rte_used void
pick_rx_func(struct rte_eth_dev * eth_dev,const eth_rx_burst_t rx_burst[NIX_RX_OFFLOAD_MAX])95169508aSPavan Nikhilesh pick_rx_func(struct rte_eth_dev *eth_dev,
105169508aSPavan Nikhilesh 	     const eth_rx_burst_t rx_burst[NIX_RX_OFFLOAD_MAX])
115169508aSPavan Nikhilesh {
125169508aSPavan Nikhilesh 	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
135169508aSPavan Nikhilesh 
145169508aSPavan Nikhilesh 	/* [TSP] [MARK] [VLAN] [CKSUM] [PTYPE] [RSS] */
155169508aSPavan Nikhilesh 	eth_dev->rx_pkt_burst =
165169508aSPavan Nikhilesh 		rx_burst[dev->rx_offload_flags & (NIX_RX_OFFLOAD_MAX - 1)];
175169508aSPavan Nikhilesh 
183cebc8f3SSatheesh Paul 	if (eth_dev->data->dev_started)
193cebc8f3SSatheesh Paul 		rte_eth_fp_ops[eth_dev->data->port_id].rx_pkt_burst =
203cebc8f3SSatheesh Paul 			eth_dev->rx_pkt_burst;
215169508aSPavan Nikhilesh }
225169508aSPavan Nikhilesh 
237d9b1d44SJerin Jacob #if defined(RTE_ARCH_ARM64)
24*eabbac98SPavan Nikhilesh static void
cn9k_eth_set_rx_tmplt_func(struct rte_eth_dev * eth_dev)25*eabbac98SPavan Nikhilesh cn9k_eth_set_rx_tmplt_func(struct rte_eth_dev *eth_dev)
26*eabbac98SPavan Nikhilesh {
27*eabbac98SPavan Nikhilesh #if !defined(CNXK_DIS_TMPLT_FUNC)
285169508aSPavan Nikhilesh 	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
295169508aSPavan Nikhilesh 
305169508aSPavan Nikhilesh 	const eth_rx_burst_t nix_eth_rx_burst[NIX_RX_OFFLOAD_MAX] = {
315169508aSPavan Nikhilesh #define R(name, flags)[flags] = cn9k_nix_recv_pkts_##name,
325169508aSPavan Nikhilesh 
335169508aSPavan Nikhilesh 		NIX_RX_FASTPATH_MODES
345169508aSPavan Nikhilesh #undef R
355169508aSPavan Nikhilesh 	};
365169508aSPavan Nikhilesh 
375169508aSPavan Nikhilesh 	const eth_rx_burst_t nix_eth_rx_burst_mseg[NIX_RX_OFFLOAD_MAX] = {
385169508aSPavan Nikhilesh #define R(name, flags)[flags] = cn9k_nix_recv_pkts_mseg_##name,
395169508aSPavan Nikhilesh 
405169508aSPavan Nikhilesh 		NIX_RX_FASTPATH_MODES
415169508aSPavan Nikhilesh #undef R
425169508aSPavan Nikhilesh 	};
435169508aSPavan Nikhilesh 
445169508aSPavan Nikhilesh 	const eth_rx_burst_t nix_eth_rx_vec_burst[NIX_RX_OFFLOAD_MAX] = {
455169508aSPavan Nikhilesh #define R(name, flags)[flags] = cn9k_nix_recv_pkts_vec_##name,
465169508aSPavan Nikhilesh 
475169508aSPavan Nikhilesh 		NIX_RX_FASTPATH_MODES
485169508aSPavan Nikhilesh #undef R
495169508aSPavan Nikhilesh 	};
505169508aSPavan Nikhilesh 
515169508aSPavan Nikhilesh 	const eth_rx_burst_t nix_eth_rx_vec_burst_mseg[NIX_RX_OFFLOAD_MAX] = {
525169508aSPavan Nikhilesh #define R(name, flags)[flags] = cn9k_nix_recv_pkts_vec_mseg_##name,
535169508aSPavan Nikhilesh 
545169508aSPavan Nikhilesh 		NIX_RX_FASTPATH_MODES
555169508aSPavan Nikhilesh #undef R
565169508aSPavan Nikhilesh 	};
575169508aSPavan Nikhilesh 
585169508aSPavan Nikhilesh 	/* Copy multi seg version with no offload for tear down sequence */
595169508aSPavan Nikhilesh 	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
605169508aSPavan Nikhilesh 		dev->rx_pkt_burst_no_offload = nix_eth_rx_burst_mseg[0];
615169508aSPavan Nikhilesh 
625169508aSPavan Nikhilesh 	if (dev->scalar_ena) {
635169508aSPavan Nikhilesh 		if (dev->rx_offloads & RTE_ETH_RX_OFFLOAD_SCATTER)
645169508aSPavan Nikhilesh 			return pick_rx_func(eth_dev, nix_eth_rx_burst_mseg);
655169508aSPavan Nikhilesh 		return pick_rx_func(eth_dev, nix_eth_rx_burst);
665169508aSPavan Nikhilesh 	}
675169508aSPavan Nikhilesh 
685169508aSPavan Nikhilesh 	if (dev->rx_offloads & RTE_ETH_RX_OFFLOAD_SCATTER)
695169508aSPavan Nikhilesh 		return pick_rx_func(eth_dev, nix_eth_rx_vec_burst_mseg);
705169508aSPavan Nikhilesh 	return pick_rx_func(eth_dev, nix_eth_rx_vec_burst);
717d9b1d44SJerin Jacob #else
727d9b1d44SJerin Jacob 	RTE_SET_USED(eth_dev);
737d9b1d44SJerin Jacob #endif
745169508aSPavan Nikhilesh }
75*eabbac98SPavan Nikhilesh 
76*eabbac98SPavan Nikhilesh static void
cn9k_eth_set_rx_blk_func(struct rte_eth_dev * eth_dev)77*eabbac98SPavan Nikhilesh cn9k_eth_set_rx_blk_func(struct rte_eth_dev *eth_dev)
78*eabbac98SPavan Nikhilesh {
79*eabbac98SPavan Nikhilesh #if defined(CNXK_DIS_TMPLT_FUNC)
80*eabbac98SPavan Nikhilesh 	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
81*eabbac98SPavan Nikhilesh 
82*eabbac98SPavan Nikhilesh 	/* Copy multi seg version with no offload for tear down sequence */
83*eabbac98SPavan Nikhilesh 	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
84*eabbac98SPavan Nikhilesh 		dev->rx_pkt_burst_no_offload = cn9k_nix_recv_pkts_all_offload;
85*eabbac98SPavan Nikhilesh 
86*eabbac98SPavan Nikhilesh 	if (dev->scalar_ena) {
87*eabbac98SPavan Nikhilesh 		eth_dev->rx_pkt_burst = cn9k_nix_recv_pkts_all_offload;
88*eabbac98SPavan Nikhilesh 		if (dev->rx_offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP)
89*eabbac98SPavan Nikhilesh 			eth_dev->rx_pkt_burst = cn9k_nix_recv_pkts_all_offload_tst;
90*eabbac98SPavan Nikhilesh 	} else {
91*eabbac98SPavan Nikhilesh 		eth_dev->rx_pkt_burst = cn9k_nix_recv_pkts_vec_all_offload;
92*eabbac98SPavan Nikhilesh 		if (dev->rx_offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP)
93*eabbac98SPavan Nikhilesh 			eth_dev->rx_pkt_burst = cn9k_nix_recv_pkts_vec_all_offload_tst;
94*eabbac98SPavan Nikhilesh 	}
95*eabbac98SPavan Nikhilesh 
96*eabbac98SPavan Nikhilesh 	if (eth_dev->data->dev_started)
97*eabbac98SPavan Nikhilesh 		rte_eth_fp_ops[eth_dev->data->port_id].rx_pkt_burst = eth_dev->rx_pkt_burst;
98*eabbac98SPavan Nikhilesh #else
99*eabbac98SPavan Nikhilesh 	RTE_SET_USED(eth_dev);
100*eabbac98SPavan Nikhilesh #endif
101*eabbac98SPavan Nikhilesh }
102*eabbac98SPavan Nikhilesh #endif
103*eabbac98SPavan Nikhilesh 
104*eabbac98SPavan Nikhilesh void
cn9k_eth_set_rx_function(struct rte_eth_dev * eth_dev)105*eabbac98SPavan Nikhilesh cn9k_eth_set_rx_function(struct rte_eth_dev *eth_dev)
106*eabbac98SPavan Nikhilesh {
107*eabbac98SPavan Nikhilesh #if defined(RTE_ARCH_ARM64)
108*eabbac98SPavan Nikhilesh 	cn9k_eth_set_rx_blk_func(eth_dev);
109*eabbac98SPavan Nikhilesh 	cn9k_eth_set_rx_tmplt_func(eth_dev);
110*eabbac98SPavan Nikhilesh 
111*eabbac98SPavan Nikhilesh 	rte_atomic_thread_fence(rte_memory_order_release);
112*eabbac98SPavan Nikhilesh #else
113*eabbac98SPavan Nikhilesh 	RTE_SET_USED(eth_dev);
114*eabbac98SPavan Nikhilesh #endif
115*eabbac98SPavan Nikhilesh }
116