9e6282eadd2afa5f45b7f7fbe18fd1259de24c43
[deb_dpdk.git] / drivers / net / sfc / sfc_rx.h
1 /*-
2  *   BSD LICENSE
3  *
4  * Copyright (c) 2016-2017 Solarflare Communications Inc.
5  * All rights reserved.
6  *
7  * This software was jointly developed between OKTET Labs (under contract
8  * for Solarflare) and Solarflare Communications, Inc.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright notice,
14  *    this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright notice,
16  *    this list of conditions and the following disclaimer in the documentation
17  *    and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
29  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 #ifndef _SFC_RX_H
33 #define _SFC_RX_H
34
35 #include <rte_mbuf.h>
36 #include <rte_mempool.h>
37 #include <rte_ethdev.h>
38
39 #include "efx.h"
40
41 #include "sfc_dp_rx.h"
42
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46
47 struct sfc_adapter;
48 struct sfc_evq;
49
50 /**
51  * Software Rx descriptor information associated with hardware Rx
52  * descriptor.
53  */
54 struct sfc_efx_rx_sw_desc {
55         struct rte_mbuf         *mbuf;
56         unsigned int            flags;
57         unsigned int            size;
58 };
59
60 /** Receive queue state bits */
61 enum sfc_rxq_state_bit {
62         SFC_RXQ_INITIALIZED_BIT = 0,
63 #define SFC_RXQ_INITIALIZED     (1 << SFC_RXQ_INITIALIZED_BIT)
64         SFC_RXQ_STARTED_BIT,
65 #define SFC_RXQ_STARTED         (1 << SFC_RXQ_STARTED_BIT)
66         SFC_RXQ_FLUSHING_BIT,
67 #define SFC_RXQ_FLUSHING        (1 << SFC_RXQ_FLUSHING_BIT)
68         SFC_RXQ_FLUSHED_BIT,
69 #define SFC_RXQ_FLUSHED         (1 << SFC_RXQ_FLUSHED_BIT)
70         SFC_RXQ_FLUSH_FAILED_BIT,
71 #define SFC_RXQ_FLUSH_FAILED    (1 << SFC_RXQ_FLUSH_FAILED_BIT)
72 };
73
74 /**
75  * Receive queue control information.
76  * Allocated on the socket specified on the queue setup.
77  */
78 struct sfc_rxq {
79         struct sfc_evq          *evq;
80         efx_rxq_t               *common;
81         efsys_mem_t             mem;
82         unsigned int            hw_index;
83         unsigned int            refill_threshold;
84         struct rte_mempool      *refill_mb_pool;
85         struct sfc_dp_rxq       *dp;
86         unsigned int            state;
87 };
88
89 static inline unsigned int
90 sfc_rxq_sw_index_by_hw_index(unsigned int hw_index)
91 {
92         return hw_index;
93 }
94
95 static inline unsigned int
96 sfc_rxq_sw_index(const struct sfc_rxq *rxq)
97 {
98         return sfc_rxq_sw_index_by_hw_index(rxq->hw_index);
99 }
100
101 struct sfc_rxq *sfc_rxq_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq);
102
103 /**
104  * Receive queue information used on libefx-based data path.
105  * Allocated on the socket specified on the queue setup.
106  */
107 struct sfc_efx_rxq {
108         /* Used on data path */
109         struct sfc_evq                  *evq;
110         unsigned int                    flags;
111 #define SFC_EFX_RXQ_FLAG_STARTED        0x1
112 #define SFC_EFX_RXQ_FLAG_RUNNING        0x2
113 #define SFC_EFX_RXQ_FLAG_RSS_HASH       0x4
114         unsigned int                    ptr_mask;
115         unsigned int                    pending;
116         unsigned int                    completed;
117         uint16_t                        batch_max;
118         uint16_t                        prefix_size;
119         struct sfc_efx_rx_sw_desc       *sw_desc;
120
121         /* Used on refill */
122         unsigned int                    added;
123         unsigned int                    pushed;
124         unsigned int                    refill_threshold;
125         uint16_t                        buf_size;
126         struct rte_mempool              *refill_mb_pool;
127         efx_rxq_t                       *common;
128
129         /* Datapath receive queue anchor */
130         struct sfc_dp_rxq               dp;
131 };
132
133 static inline struct sfc_efx_rxq *
134 sfc_efx_rxq_by_dp_rxq(struct sfc_dp_rxq *dp_rxq)
135 {
136         return container_of(dp_rxq, struct sfc_efx_rxq, dp);
137 }
138
139 /**
140  * Receive queue information used during setup/release only.
141  * Allocated on the same socket as adapter data.
142  */
143 struct sfc_rxq_info {
144         unsigned int            max_entries;
145         unsigned int            entries;
146         efx_rxq_type_t          type;
147         struct sfc_rxq          *rxq;
148         boolean_t               deferred_start;
149         boolean_t               deferred_started;
150 };
151
152 int sfc_rx_configure(struct sfc_adapter *sa);
153 void sfc_rx_close(struct sfc_adapter *sa);
154 int sfc_rx_start(struct sfc_adapter *sa);
155 void sfc_rx_stop(struct sfc_adapter *sa);
156
157 int sfc_rx_qinit(struct sfc_adapter *sa, unsigned int rx_queue_id,
158                  uint16_t nb_rx_desc, unsigned int socket_id,
159                  const struct rte_eth_rxconf *rx_conf,
160                  struct rte_mempool *mb_pool);
161 void sfc_rx_qfini(struct sfc_adapter *sa, unsigned int sw_index);
162 int sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index);
163 void sfc_rx_qstop(struct sfc_adapter *sa, unsigned int sw_index);
164
165 void sfc_rx_qflush_done(struct sfc_rxq *rxq);
166 void sfc_rx_qflush_failed(struct sfc_rxq *rxq);
167
168 unsigned int sfc_rx_qdesc_npending(struct sfc_adapter *sa,
169                                    unsigned int sw_index);
170 int sfc_rx_qdesc_done(struct sfc_dp_rxq *dp_rxq, unsigned int offset);
171
172 #if EFSYS_OPT_RX_SCALE
173 efx_rx_hash_type_t sfc_rte_to_efx_hash_type(uint64_t rss_hf);
174 uint64_t sfc_efx_to_rte_hash_type(efx_rx_hash_type_t efx_hash_types);
175 #endif
176
177 #ifdef __cplusplus
178 }
179 #endif
180 #endif  /* _SFC_RX_H */