1*ec380d45SNithin Dabilpuram /* SPDX-License-Identifier: BSD-3-Clause 2*ec380d45SNithin Dabilpuram * Copyright(C) 2024 Marvell. 3*ec380d45SNithin Dabilpuram */ 4*ec380d45SNithin Dabilpuram 5*ec380d45SNithin Dabilpuram #include "cn20k_ethdev.h" 6*ec380d45SNithin Dabilpuram #include "cn20k_tx.h" 7*ec380d45SNithin Dabilpuram 8*ec380d45SNithin Dabilpuram static __rte_used inline void 9*ec380d45SNithin Dabilpuram pick_tx_func(struct rte_eth_dev *eth_dev, const eth_tx_burst_t tx_burst[NIX_TX_OFFLOAD_MAX]) 10*ec380d45SNithin Dabilpuram { 11*ec380d45SNithin Dabilpuram struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev); 12*ec380d45SNithin Dabilpuram 13*ec380d45SNithin Dabilpuram /* [SEC] [TSP] [TSO] [NOFF] [VLAN] [OL3_OL4_CSUM] [IL3_IL4_CSUM] */ 14*ec380d45SNithin Dabilpuram eth_dev->tx_pkt_burst = tx_burst[dev->tx_offload_flags & (NIX_TX_OFFLOAD_MAX - 1)]; 15*ec380d45SNithin Dabilpuram 16*ec380d45SNithin Dabilpuram if (eth_dev->data->dev_started) 17*ec380d45SNithin Dabilpuram rte_eth_fp_ops[eth_dev->data->port_id].tx_pkt_burst = eth_dev->tx_pkt_burst; 18*ec380d45SNithin Dabilpuram } 19*ec380d45SNithin Dabilpuram 20*ec380d45SNithin Dabilpuram #if defined(RTE_ARCH_ARM64) 21*ec380d45SNithin Dabilpuram static int 22*ec380d45SNithin Dabilpuram cn20k_nix_tx_queue_count(void *tx_queue) 23*ec380d45SNithin Dabilpuram { 24*ec380d45SNithin Dabilpuram struct cn20k_eth_txq *txq = (struct cn20k_eth_txq *)tx_queue; 25*ec380d45SNithin Dabilpuram 26*ec380d45SNithin Dabilpuram return cnxk_nix_tx_queue_count(txq->fc_mem, txq->sqes_per_sqb_log2); 27*ec380d45SNithin Dabilpuram } 28*ec380d45SNithin Dabilpuram 29*ec380d45SNithin Dabilpuram static int 30*ec380d45SNithin Dabilpuram cn20k_nix_tx_queue_sec_count(void *tx_queue) 31*ec380d45SNithin Dabilpuram { 32*ec380d45SNithin Dabilpuram struct cn20k_eth_txq *txq = (struct cn20k_eth_txq *)tx_queue; 33*ec380d45SNithin Dabilpuram 34*ec380d45SNithin Dabilpuram return cnxk_nix_tx_queue_sec_count(txq->fc_mem, txq->sqes_per_sqb_log2, txq->cpt_fc); 35*ec380d45SNithin Dabilpuram } 36*ec380d45SNithin Dabilpuram 37*ec380d45SNithin Dabilpuram static void 38*ec380d45SNithin Dabilpuram cn20k_eth_set_tx_tmplt_func(struct rte_eth_dev *eth_dev) 39*ec380d45SNithin Dabilpuram { 40*ec380d45SNithin Dabilpuram #if !defined(CNXK_DIS_TMPLT_FUNC) 41*ec380d45SNithin Dabilpuram struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev); 42*ec380d45SNithin Dabilpuram 43*ec380d45SNithin Dabilpuram const eth_tx_burst_t nix_eth_tx_burst[NIX_TX_OFFLOAD_MAX] = { 44*ec380d45SNithin Dabilpuram #define T(name, sz, flags) [flags] = cn20k_nix_xmit_pkts_##name, 45*ec380d45SNithin Dabilpuram 46*ec380d45SNithin Dabilpuram NIX_TX_FASTPATH_MODES 47*ec380d45SNithin Dabilpuram #undef T 48*ec380d45SNithin Dabilpuram }; 49*ec380d45SNithin Dabilpuram 50*ec380d45SNithin Dabilpuram const eth_tx_burst_t nix_eth_tx_burst_mseg[NIX_TX_OFFLOAD_MAX] = { 51*ec380d45SNithin Dabilpuram #define T(name, sz, flags) [flags] = cn20k_nix_xmit_pkts_mseg_##name, 52*ec380d45SNithin Dabilpuram 53*ec380d45SNithin Dabilpuram NIX_TX_FASTPATH_MODES 54*ec380d45SNithin Dabilpuram #undef T 55*ec380d45SNithin Dabilpuram }; 56*ec380d45SNithin Dabilpuram 57*ec380d45SNithin Dabilpuram const eth_tx_burst_t nix_eth_tx_vec_burst[NIX_TX_OFFLOAD_MAX] = { 58*ec380d45SNithin Dabilpuram #define T(name, sz, flags) [flags] = cn20k_nix_xmit_pkts_vec_##name, 59*ec380d45SNithin Dabilpuram 60*ec380d45SNithin Dabilpuram NIX_TX_FASTPATH_MODES 61*ec380d45SNithin Dabilpuram #undef T 62*ec380d45SNithin Dabilpuram }; 63*ec380d45SNithin Dabilpuram 64*ec380d45SNithin Dabilpuram const eth_tx_burst_t nix_eth_tx_vec_burst_mseg[NIX_TX_OFFLOAD_MAX] = { 65*ec380d45SNithin Dabilpuram #define T(name, sz, flags) [flags] = cn20k_nix_xmit_pkts_vec_mseg_##name, 66*ec380d45SNithin Dabilpuram 67*ec380d45SNithin Dabilpuram NIX_TX_FASTPATH_MODES 68*ec380d45SNithin Dabilpuram #undef T 69*ec380d45SNithin Dabilpuram }; 70*ec380d45SNithin Dabilpuram 71*ec380d45SNithin Dabilpuram if (dev->scalar_ena || dev->tx_mark) { 72*ec380d45SNithin Dabilpuram pick_tx_func(eth_dev, nix_eth_tx_burst); 73*ec380d45SNithin Dabilpuram if (dev->tx_offloads & RTE_ETH_TX_OFFLOAD_MULTI_SEGS) 74*ec380d45SNithin Dabilpuram pick_tx_func(eth_dev, nix_eth_tx_burst_mseg); 75*ec380d45SNithin Dabilpuram } else { 76*ec380d45SNithin Dabilpuram pick_tx_func(eth_dev, nix_eth_tx_vec_burst); 77*ec380d45SNithin Dabilpuram if (dev->tx_offloads & RTE_ETH_TX_OFFLOAD_MULTI_SEGS) 78*ec380d45SNithin Dabilpuram pick_tx_func(eth_dev, nix_eth_tx_vec_burst_mseg); 79*ec380d45SNithin Dabilpuram } 80*ec380d45SNithin Dabilpuram #else 81*ec380d45SNithin Dabilpuram RTE_SET_USED(eth_dev); 82*ec380d45SNithin Dabilpuram #endif 83*ec380d45SNithin Dabilpuram } 84*ec380d45SNithin Dabilpuram 85*ec380d45SNithin Dabilpuram static void 86*ec380d45SNithin Dabilpuram cn20k_eth_set_tx_blk_func(struct rte_eth_dev *eth_dev) 87*ec380d45SNithin Dabilpuram { 88*ec380d45SNithin Dabilpuram #if defined(CNXK_DIS_TMPLT_FUNC) 89*ec380d45SNithin Dabilpuram struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev); 90*ec380d45SNithin Dabilpuram 91*ec380d45SNithin Dabilpuram if (dev->scalar_ena || dev->tx_mark) 92*ec380d45SNithin Dabilpuram eth_dev->tx_pkt_burst = cn20k_nix_xmit_pkts_all_offload; 93*ec380d45SNithin Dabilpuram else 94*ec380d45SNithin Dabilpuram eth_dev->tx_pkt_burst = cn20k_nix_xmit_pkts_vec_all_offload; 95*ec380d45SNithin Dabilpuram 96*ec380d45SNithin Dabilpuram if (eth_dev->data->dev_started) 97*ec380d45SNithin Dabilpuram rte_eth_fp_ops[eth_dev->data->port_id].tx_pkt_burst = eth_dev->tx_pkt_burst; 98*ec380d45SNithin Dabilpuram #else 99*ec380d45SNithin Dabilpuram RTE_SET_USED(eth_dev); 100*ec380d45SNithin Dabilpuram #endif 101*ec380d45SNithin Dabilpuram } 102*ec380d45SNithin Dabilpuram #endif 103*ec380d45SNithin Dabilpuram 104*ec380d45SNithin Dabilpuram void 105*ec380d45SNithin Dabilpuram cn20k_eth_set_tx_function(struct rte_eth_dev *eth_dev) 106*ec380d45SNithin Dabilpuram { 107*ec380d45SNithin Dabilpuram #if defined(RTE_ARCH_ARM64) 108*ec380d45SNithin Dabilpuram struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev); 109*ec380d45SNithin Dabilpuram 110*ec380d45SNithin Dabilpuram cn20k_eth_set_tx_blk_func(eth_dev); 111*ec380d45SNithin Dabilpuram cn20k_eth_set_tx_tmplt_func(eth_dev); 112*ec380d45SNithin Dabilpuram 113*ec380d45SNithin Dabilpuram if (dev->tx_offloads & RTE_ETH_TX_OFFLOAD_SECURITY) 114*ec380d45SNithin Dabilpuram eth_dev->tx_queue_count = cn20k_nix_tx_queue_sec_count; 115*ec380d45SNithin Dabilpuram else 116*ec380d45SNithin Dabilpuram eth_dev->tx_queue_count = cn20k_nix_tx_queue_count; 117*ec380d45SNithin Dabilpuram 118*ec380d45SNithin Dabilpuram rte_atomic_thread_fence(rte_memory_order_release); 119*ec380d45SNithin Dabilpuram #else 120*ec380d45SNithin Dabilpuram RTE_SET_USED(eth_dev); 121*ec380d45SNithin Dabilpuram #endif 122*ec380d45SNithin Dabilpuram } 123