Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright(C) 2021 Marvell. 3 : : */ 4 : : 5 : : #include "cn9k_ethdev.h" 6 : : #include "cn9k_rx.h" 7 : : 8 : : #if defined(RTE_ARCH_ARM64) && !defined(CNXK_DIS_TMPLT_FUNC) 9 : : static void 10 : : pick_rx_func(struct rte_eth_dev *eth_dev, 11 : : const eth_rx_burst_t rx_burst[NIX_RX_OFFLOAD_MAX]) 12 : : { 13 : : struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev); 14 : : 15 : : /* [TSP] [MARK] [VLAN] [CKSUM] [PTYPE] [RSS] */ 16 : : eth_dev->rx_pkt_burst = 17 : : rx_burst[dev->rx_offload_flags & (NIX_RX_OFFLOAD_MAX - 1)]; 18 : : 19 : : if (eth_dev->data->dev_started) 20 : : rte_eth_fp_ops[eth_dev->data->port_id].rx_pkt_burst = 21 : : eth_dev->rx_pkt_burst; 22 : : } 23 : : #endif 24 : : 25 : : #if defined(RTE_ARCH_ARM64) 26 : : static void 27 : : cn9k_eth_set_rx_tmplt_func(struct rte_eth_dev *eth_dev) 28 : : { 29 : : #if !defined(CNXK_DIS_TMPLT_FUNC) 30 : : struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev); 31 : : 32 : : const eth_rx_burst_t nix_eth_rx_burst[NIX_RX_OFFLOAD_MAX] = { 33 : : #define R(name, flags)[flags] = cn9k_nix_recv_pkts_##name, 34 : : 35 : : NIX_RX_FASTPATH_MODES 36 : : #undef R 37 : : }; 38 : : 39 : : const eth_rx_burst_t nix_eth_rx_burst_mseg[NIX_RX_OFFLOAD_MAX] = { 40 : : #define R(name, flags)[flags] = cn9k_nix_recv_pkts_mseg_##name, 41 : : 42 : : NIX_RX_FASTPATH_MODES 43 : : #undef R 44 : : }; 45 : : 46 : : const eth_rx_burst_t nix_eth_rx_vec_burst[NIX_RX_OFFLOAD_MAX] = { 47 : : #define R(name, flags)[flags] = cn9k_nix_recv_pkts_vec_##name, 48 : : 49 : : NIX_RX_FASTPATH_MODES 50 : : #undef R 51 : : }; 52 : : 53 : : const eth_rx_burst_t nix_eth_rx_vec_burst_mseg[NIX_RX_OFFLOAD_MAX] = { 54 : : #define R(name, flags)[flags] = cn9k_nix_recv_pkts_vec_mseg_##name, 55 : : 56 : : NIX_RX_FASTPATH_MODES 57 : : #undef R 58 : : }; 59 : : 60 : : /* Copy multi seg version with no offload for tear down sequence */ 61 : : if (rte_eal_process_type() == RTE_PROC_PRIMARY) 62 : : dev->rx_pkt_burst_no_offload = nix_eth_rx_burst_mseg[0]; 63 : : 64 : : if (dev->scalar_ena) { 65 : : if (dev->rx_offloads & RTE_ETH_RX_OFFLOAD_SCATTER) 66 : : return pick_rx_func(eth_dev, nix_eth_rx_burst_mseg); 67 : : return pick_rx_func(eth_dev, nix_eth_rx_burst); 68 : : } 69 : : 70 : : if (dev->rx_offloads & RTE_ETH_RX_OFFLOAD_SCATTER) 71 : : return pick_rx_func(eth_dev, nix_eth_rx_vec_burst_mseg); 72 : : return pick_rx_func(eth_dev, nix_eth_rx_vec_burst); 73 : : #else 74 : : RTE_SET_USED(eth_dev); 75 : : #endif 76 : : } 77 : : 78 : : static void 79 : : cn9k_eth_set_rx_blk_func(struct rte_eth_dev *eth_dev) 80 : : { 81 : : #if defined(CNXK_DIS_TMPLT_FUNC) 82 : : struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev); 83 : : 84 : : /* Copy multi seg version with no offload for tear down sequence */ 85 : : if (rte_eal_process_type() == RTE_PROC_PRIMARY) 86 : : dev->rx_pkt_burst_no_offload = cn9k_nix_recv_pkts_all_offload; 87 : : 88 : : if (dev->scalar_ena) { 89 : : eth_dev->rx_pkt_burst = cn9k_nix_recv_pkts_all_offload; 90 : : if (dev->rx_offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP) 91 : : eth_dev->rx_pkt_burst = cn9k_nix_recv_pkts_all_offload_tst; 92 : : } else { 93 : : eth_dev->rx_pkt_burst = cn9k_nix_recv_pkts_vec_all_offload; 94 : : if (dev->rx_offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP) 95 : : eth_dev->rx_pkt_burst = cn9k_nix_recv_pkts_vec_all_offload_tst; 96 : : } 97 : : 98 : : if (eth_dev->data->dev_started) 99 : : rte_eth_fp_ops[eth_dev->data->port_id].rx_pkt_burst = eth_dev->rx_pkt_burst; 100 : : #else 101 : : RTE_SET_USED(eth_dev); 102 : : #endif 103 : : } 104 : : #endif 105 : : 106 : : void 107 : 0 : cn9k_eth_set_rx_function(struct rte_eth_dev *eth_dev) 108 : : { 109 : : #if defined(RTE_ARCH_ARM64) 110 : : cn9k_eth_set_rx_blk_func(eth_dev); 111 : : cn9k_eth_set_rx_tmplt_func(eth_dev); 112 : : 113 : : rte_atomic_thread_fence(rte_memory_order_release); 114 : : #else 115 : : RTE_SET_USED(eth_dev); 116 : : #endif 117 : 0 : }