xref: /dpdk/drivers/net/sfc/sfc_tx.h (revision 58d6f89a5139e715de4abb28fccd1155bcdf8052)
144c0947bSAndrew Rybchenko /* SPDX-License-Identifier: BSD-3-Clause
2244cfa79SAndrew Rybchenko  *
398d26ef7SAndrew Rybchenko  * Copyright(c) 2019-2021 Xilinx, Inc.
4a0147be5SAndrew Rybchenko  * Copyright(c) 2016-2019 Solarflare Communications Inc.
5a8ad8cf8SIvan Malov  *
6a8ad8cf8SIvan Malov  * This software was jointly developed between OKTET Labs (under contract
7a8ad8cf8SIvan Malov  * for Solarflare) and Solarflare Communications, Inc.
8a8ad8cf8SIvan Malov  */
9a8ad8cf8SIvan Malov 
10a8ad8cf8SIvan Malov #ifndef _SFC_TX_H
11a8ad8cf8SIvan Malov #define _SFC_TX_H
12a8ad8cf8SIvan Malov 
13a8ad8cf8SIvan Malov #include <rte_mbuf.h>
14df96fd0dSBruce Richardson #include <ethdev_driver.h>
15a8ad8cf8SIvan Malov 
16a8ad8cf8SIvan Malov #include "efx.h"
17a8ad8cf8SIvan Malov 
18dbdc8241SAndrew Rybchenko #include "sfc_dp_tx.h"
19dbdc8241SAndrew Rybchenko 
20a8ad8cf8SIvan Malov #ifdef __cplusplus
21a8ad8cf8SIvan Malov extern "C" {
22a8ad8cf8SIvan Malov #endif
23a8ad8cf8SIvan Malov 
24a8ad8cf8SIvan Malov struct sfc_adapter;
25b1b7ad93SIvan Malov struct sfc_evq;
26b1b7ad93SIvan Malov 
27dbdc8241SAndrew Rybchenko /**
28dbdc8241SAndrew Rybchenko  * Software Tx descriptor information associated with hardware Tx
29dbdc8241SAndrew Rybchenko  * descriptor.
30dbdc8241SAndrew Rybchenko  */
31dbdc8241SAndrew Rybchenko struct sfc_efx_tx_sw_desc {
32b1b7ad93SIvan Malov 	struct rte_mbuf		*mbuf;
33fec33d5bSIvan Malov 	uint8_t			*tsoh;	/* Buffer to store TSO header */
34b1b7ad93SIvan Malov };
35b1b7ad93SIvan Malov 
36b1b7ad93SIvan Malov enum sfc_txq_state_bit {
37b1b7ad93SIvan Malov 	SFC_TXQ_INITIALIZED_BIT = 0,
38b1b7ad93SIvan Malov #define SFC_TXQ_INITIALIZED	(1 << SFC_TXQ_INITIALIZED_BIT)
39fed9aeb4SIvan Malov 	SFC_TXQ_STARTED_BIT,
40fed9aeb4SIvan Malov #define SFC_TXQ_STARTED		(1 << SFC_TXQ_STARTED_BIT)
41fed9aeb4SIvan Malov 	SFC_TXQ_FLUSHING_BIT,
42fed9aeb4SIvan Malov #define SFC_TXQ_FLUSHING	(1 << SFC_TXQ_FLUSHING_BIT)
43fed9aeb4SIvan Malov 	SFC_TXQ_FLUSHED_BIT,
44fed9aeb4SIvan Malov #define SFC_TXQ_FLUSHED		(1 << SFC_TXQ_FLUSHED_BIT)
45a47c6d62SAndrew Rybchenko 	SFC_TXQ_FLUSH_FAILED_BIT,
46a47c6d62SAndrew Rybchenko #define SFC_TXQ_FLUSH_FAILED	(1 << SFC_TXQ_FLUSH_FAILED_BIT)
47b1b7ad93SIvan Malov };
48b1b7ad93SIvan Malov 
49dbdc8241SAndrew Rybchenko /**
5029e4237dSAndrew Rybchenko  * Transmit queue control primary process-only information.
5129e4237dSAndrew Rybchenko  * Not used on datapath.
52dbdc8241SAndrew Rybchenko  */
53b1b7ad93SIvan Malov struct sfc_txq {
54dbdc8241SAndrew Rybchenko 	unsigned int			hw_index;
55dbdc8241SAndrew Rybchenko 	struct sfc_evq			*evq;
56dbdc8241SAndrew Rybchenko 	efsys_mem_t			mem;
57dbdc8241SAndrew Rybchenko 	efx_txq_t			*common;
58dbdc8241SAndrew Rybchenko };
59dbdc8241SAndrew Rybchenko 
60dbdc8241SAndrew Rybchenko struct sfc_txq *sfc_txq_by_dp_txq(const struct sfc_dp_txq *dp_txq);
61db980d26SIgor Romanov struct sfc_txq_info *sfc_txq_info_by_ethdev_qid(struct sfc_adapter_shared *sas,
62db980d26SIgor Romanov 						sfc_ethdev_qid_t ethdev_qid);
63dbdc8241SAndrew Rybchenko /**
64dbdc8241SAndrew Rybchenko  * Transmit queue information used on libefx-based data path.
65dbdc8241SAndrew Rybchenko  * Allocated on the socket specified on the queue setup.
66dbdc8241SAndrew Rybchenko  */
67dbdc8241SAndrew Rybchenko struct sfc_efx_txq {
68dbdc8241SAndrew Rybchenko 	struct sfc_evq			*evq;
69dbdc8241SAndrew Rybchenko 	struct sfc_efx_tx_sw_desc	*sw_ring;
70b1b7ad93SIvan Malov 	unsigned int			ptr_mask;
71b1b7ad93SIvan Malov 	efx_desc_t			*pend_desc;
72b1b7ad93SIvan Malov 	efx_txq_t			*common;
73fed9aeb4SIvan Malov 	unsigned int			added;
74fed9aeb4SIvan Malov 	unsigned int			pending;
75fed9aeb4SIvan Malov 	unsigned int			completed;
76eaab5d96SAndrew Rybchenko 	unsigned int			max_fill_level;
7721f6411cSIvan Malov 	unsigned int			free_thresh;
787fd63681SIvan Malov 	uint16_t			hw_vlan_tci;
79676d11ffSAndrew Rybchenko 	uint16_t			dma_desc_size_max;
80b1b7ad93SIvan Malov 
81b1b7ad93SIvan Malov 	unsigned int			hw_index;
82b1b7ad93SIvan Malov 	unsigned int			flags;
83dbdc8241SAndrew Rybchenko #define SFC_EFX_TXQ_FLAG_STARTED	0x1
84dbdc8241SAndrew Rybchenko #define SFC_EFX_TXQ_FLAG_RUNNING	0x2
85dbdc8241SAndrew Rybchenko 
86dbdc8241SAndrew Rybchenko 	/* Datapath transmit queue anchor */
87dbdc8241SAndrew Rybchenko 	struct sfc_dp_txq		dp;
88b1b7ad93SIvan Malov };
89b1b7ad93SIvan Malov 
90dbdc8241SAndrew Rybchenko static inline struct sfc_efx_txq *
sfc_efx_txq_by_dp_txq(struct sfc_dp_txq * dp_txq)91dbdc8241SAndrew Rybchenko sfc_efx_txq_by_dp_txq(struct sfc_dp_txq *dp_txq)
92b1b7ad93SIvan Malov {
93dbdc8241SAndrew Rybchenko 	return container_of(dp_txq, struct sfc_efx_txq, dp);
94b1b7ad93SIvan Malov }
95a8ad8cf8SIvan Malov 
96a8ad8cf8SIvan Malov struct sfc_txq_info {
97561508daSAndrew Rybchenko 	unsigned int		state;
98b1b7ad93SIvan Malov 	unsigned int		entries;
9942ce2521SAndrew Rybchenko 	struct sfc_dp_txq	*dp;
100c6a1d9b5SIvan Malov 	boolean_t		deferred_start;
101c6a1d9b5SIvan Malov 	boolean_t		deferred_started;
102b57870f2SAndrew Rybchenko 	unsigned int		free_thresh;
103b57870f2SAndrew Rybchenko 	uint64_t		offloads;
104a8ad8cf8SIvan Malov };
105a8ad8cf8SIvan Malov 
106561508daSAndrew Rybchenko struct sfc_txq_info *sfc_txq_info_by_dp_txq(const struct sfc_dp_txq *dp_txq);
107561508daSAndrew Rybchenko 
108df64eaddSAndrew Rybchenko int sfc_tx_configure(struct sfc_adapter *sa);
109df64eaddSAndrew Rybchenko void sfc_tx_close(struct sfc_adapter *sa);
110a8ad8cf8SIvan Malov 
111*58d6f89aSIgor Romanov int sfc_tx_qinit_info(struct sfc_adapter *sa, sfc_sw_index_t sw_index);
112db980d26SIgor Romanov int sfc_tx_qinit(struct sfc_adapter *sa, sfc_sw_index_t sw_index,
113b1b7ad93SIvan Malov 		 uint16_t nb_tx_desc, unsigned int socket_id,
114b1b7ad93SIvan Malov 		 const struct rte_eth_txconf *tx_conf);
115db980d26SIgor Romanov void sfc_tx_qfini(struct sfc_adapter *sa, sfc_sw_index_t sw_index);
116b1b7ad93SIvan Malov 
117561508daSAndrew Rybchenko void sfc_tx_qflush_done(struct sfc_txq_info *txq_info);
118db980d26SIgor Romanov int sfc_tx_qstart(struct sfc_adapter *sa, sfc_sw_index_t sw_index);
119db980d26SIgor Romanov void sfc_tx_qstop(struct sfc_adapter *sa, sfc_sw_index_t sw_index);
120fed9aeb4SIvan Malov int sfc_tx_start(struct sfc_adapter *sa);
121fed9aeb4SIvan Malov void sfc_tx_stop(struct sfc_adapter *sa);
122fed9aeb4SIvan Malov 
12385069adeSIvan Malov uint64_t sfc_tx_get_dev_offload_caps(struct sfc_adapter *sa);
124c78d280eSIvan Malov uint64_t sfc_tx_get_queue_offload_caps(struct sfc_adapter *sa);
12585069adeSIvan Malov 
126fec33d5bSIvan Malov /* From 'sfc_tso.c' */
127dbdc8241SAndrew Rybchenko int sfc_efx_tso_alloc_tsoh_objs(struct sfc_efx_tx_sw_desc *sw_ring,
128dbdc8241SAndrew Rybchenko 				unsigned int txq_entries,
129dbdc8241SAndrew Rybchenko 				unsigned int socket_id);
130dbdc8241SAndrew Rybchenko void sfc_efx_tso_free_tsoh_objs(struct sfc_efx_tx_sw_desc *sw_ring,
131fec33d5bSIvan Malov 				unsigned int txq_entries);
132dbdc8241SAndrew Rybchenko int sfc_efx_tso_do(struct sfc_efx_txq *txq, unsigned int idx,
133dbdc8241SAndrew Rybchenko 		   struct rte_mbuf **in_seg, size_t *in_off, efx_desc_t **pend,
134dbdc8241SAndrew Rybchenko 		   unsigned int *pkt_descs, size_t *pkt_len);
135fec33d5bSIvan Malov 
136a8ad8cf8SIvan Malov #ifdef __cplusplus
137a8ad8cf8SIvan Malov }
138a8ad8cf8SIvan Malov #endif
139a8ad8cf8SIvan Malov #endif	/* _SFC_TX_H */
140