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