xref: /dpdk/drivers/net/cnxk/cn20k_tx_select.c (revision ec380d45edaa00b5dc3c38d2a3432c6553ee3e30)
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