Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright(C) 2021 Marvell. 3 : : */ 4 : : 5 : : #include "cn10k_ethdev.h" 6 : : #include "cn10k_rx.h" 7 : : 8 : : static __rte_used void 9 [ # # ]: 0 : pick_rx_func(struct rte_eth_dev *eth_dev, 10 : : const eth_rx_burst_t rx_burst[NIX_RX_OFFLOAD_MAX]) 11 : : { 12 : : struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev); 13 : : 14 : : /* [VLAN] [TSP] [MARK] [CKSUM] [PTYPE] [RSS] */ 15 : 0 : eth_dev->rx_pkt_burst = 16 : 0 : rx_burst[dev->rx_offload_flags & (NIX_RX_OFFLOAD_MAX - 1)]; 17 : : 18 [ # # ]: 0 : if (eth_dev->data->dev_started) 19 : 0 : rte_eth_fp_ops[eth_dev->data->port_id].rx_pkt_burst = 20 : : eth_dev->rx_pkt_burst; 21 : : 22 : : rte_atomic_thread_fence(__ATOMIC_RELEASE); 23 : 0 : } 24 : : 25 : : static uint16_t __rte_noinline __rte_hot __rte_unused 26 : : cn10k_nix_flush_rx(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t pkts) 27 : : { 28 : : const uint16_t flags = NIX_RX_MULTI_SEG_F | NIX_RX_REAS_F | NIX_RX_OFFLOAD_SECURITY_F; 29 : : return cn10k_nix_flush_recv_pkts(rx_queue, rx_pkts, pkts, flags); 30 : : } 31 : : 32 : : void 33 : 0 : cn10k_eth_set_rx_function(struct rte_eth_dev *eth_dev) 34 : : { 35 : : #if defined(RTE_ARCH_ARM64) 36 : : struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev); 37 : : 38 : : const eth_rx_burst_t nix_eth_rx_burst[NIX_RX_OFFLOAD_MAX] = { 39 : : #define R(name, flags)[flags] = cn10k_nix_recv_pkts_##name, 40 : : 41 : : NIX_RX_FASTPATH_MODES 42 : : #undef R 43 : : }; 44 : : 45 : : const eth_rx_burst_t nix_eth_rx_burst_mseg[NIX_RX_OFFLOAD_MAX] = { 46 : : #define R(name, flags)[flags] = cn10k_nix_recv_pkts_mseg_##name, 47 : : 48 : : NIX_RX_FASTPATH_MODES 49 : : #undef R 50 : : }; 51 : : 52 : : const eth_rx_burst_t nix_eth_rx_burst_reas[NIX_RX_OFFLOAD_MAX] = { 53 : : #define R(name, flags)[flags] = cn10k_nix_recv_pkts_reas_##name, 54 : : NIX_RX_FASTPATH_MODES 55 : : #undef R 56 : : }; 57 : : 58 : : const eth_rx_burst_t nix_eth_rx_burst_mseg_reas[NIX_RX_OFFLOAD_MAX] = { 59 : : #define R(name, flags)[flags] = cn10k_nix_recv_pkts_reas_mseg_##name, 60 : : NIX_RX_FASTPATH_MODES 61 : : #undef R 62 : : }; 63 : : 64 : : const eth_rx_burst_t nix_eth_rx_vec_burst[NIX_RX_OFFLOAD_MAX] = { 65 : : #define R(name, flags)[flags] = cn10k_nix_recv_pkts_vec_##name, 66 : : 67 : : NIX_RX_FASTPATH_MODES 68 : : #undef R 69 : : }; 70 : : 71 : : const eth_rx_burst_t nix_eth_rx_vec_burst_mseg[NIX_RX_OFFLOAD_MAX] = { 72 : : #define R(name, flags)[flags] = cn10k_nix_recv_pkts_vec_mseg_##name, 73 : : 74 : : NIX_RX_FASTPATH_MODES 75 : : #undef R 76 : : }; 77 : : 78 : : const eth_rx_burst_t nix_eth_rx_vec_burst_reas[NIX_RX_OFFLOAD_MAX] = { 79 : : #define R(name, flags)[flags] = cn10k_nix_recv_pkts_reas_vec_##name, 80 : : NIX_RX_FASTPATH_MODES 81 : : #undef R 82 : : }; 83 : : 84 : : const eth_rx_burst_t nix_eth_rx_vec_burst_mseg_reas[NIX_RX_OFFLOAD_MAX] = { 85 : : #define R(name, flags)[flags] = cn10k_nix_recv_pkts_reas_vec_mseg_##name, 86 : : NIX_RX_FASTPATH_MODES 87 : : #undef R 88 : : }; 89 : : 90 : : /* Copy multi seg version with security for tear down sequence */ 91 : : if (rte_eal_process_type() == RTE_PROC_PRIMARY) 92 : : dev->rx_pkt_burst_no_offload = cn10k_nix_flush_rx; 93 : : 94 : : if (dev->scalar_ena) { 95 : : if (dev->rx_offloads & RTE_ETH_RX_OFFLOAD_SCATTER) { 96 : : if (dev->rx_offload_flags & NIX_RX_REAS_F) 97 : : return pick_rx_func(eth_dev, 98 : : nix_eth_rx_burst_mseg_reas); 99 : : else 100 : : return pick_rx_func(eth_dev, 101 : : nix_eth_rx_burst_mseg); 102 : : } 103 : : if (dev->rx_offload_flags & NIX_RX_REAS_F) 104 : : return pick_rx_func(eth_dev, nix_eth_rx_burst_reas); 105 : : else 106 : : return pick_rx_func(eth_dev, nix_eth_rx_burst); 107 : : } 108 : : 109 : : if (dev->rx_offloads & RTE_ETH_RX_OFFLOAD_SCATTER) { 110 : : if (dev->rx_offload_flags & NIX_RX_REAS_F) 111 : : return pick_rx_func(eth_dev, 112 : : nix_eth_rx_vec_burst_mseg_reas); 113 : : else 114 : : return pick_rx_func(eth_dev, nix_eth_rx_vec_burst_mseg); 115 : : } 116 : : 117 : : if (dev->rx_offload_flags & NIX_RX_REAS_F) 118 : : return pick_rx_func(eth_dev, nix_eth_rx_vec_burst_reas); 119 : : else 120 : : return pick_rx_func(eth_dev, nix_eth_rx_vec_burst); 121 : : #else 122 : : RTE_SET_USED(eth_dev); 123 : : #endif 124 : 0 : }