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