cdff9be3ec90fb0ee264132a8c53e1b6577dbbda
[dpdk.git] / drivers / net / sfc / sfc.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  *
3  * Copyright(c) 2019-2020 Xilinx, Inc.
4  * Copyright(c) 2016-2019 Solarflare Communications Inc.
5  *
6  * This software was jointly developed between OKTET Labs (under contract
7  * for Solarflare) and Solarflare Communications, Inc.
8  */
9
10 #ifndef _SFC_H
11 #define _SFC_H
12
13 #include <stdbool.h>
14
15 #include <rte_pci.h>
16 #include <rte_bus_pci.h>
17 #include <rte_ethdev_driver.h>
18 #include <rte_kvargs.h>
19 #include <rte_spinlock.h>
20 #include <rte_atomic.h>
21
22 #include "efx.h"
23
24 #include "sfc_debug.h"
25 #include "sfc_filter.h"
26
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30
31 /*
32  * +---------------+
33  * | UNINITIALIZED |<-----------+
34  * +---------------+            |
35  *      |.eth_dev_init          |.eth_dev_uninit
36  *      V                       |
37  * +---------------+------------+
38  * |  INITIALIZED  |
39  * +---------------+<-----------<---------------+
40  *      |.dev_configure         |               |
41  *      V                       |failed         |
42  * +---------------+------------+               |
43  * |  CONFIGURING  |                            |
44  * +---------------+----+                       |
45  *      |success        |                       |
46  *      |               |               +---------------+
47  *      |               |               |    CLOSING    |
48  *      |               |               +---------------+
49  *      |               |                       ^
50  *      V               |.dev_configure         |
51  * +---------------+----+                       |.dev_close
52  * |  CONFIGURED   |----------------------------+
53  * +---------------+<-----------+
54  *      |.dev_start             |
55  *      V                       |
56  * +---------------+            |
57  * |   STARTING    |------------^
58  * +---------------+ failed     |
59  *      |success                |
60  *      |               +---------------+
61  *      |               |   STOPPING    |
62  *      |               +---------------+
63  *      |                       ^
64  *      V                       |.dev_stop
65  * +---------------+------------+
66  * |    STARTED    |
67  * +---------------+
68  */
69 enum sfc_adapter_state {
70         SFC_ADAPTER_UNINITIALIZED = 0,
71         SFC_ADAPTER_INITIALIZED,
72         SFC_ADAPTER_CONFIGURING,
73         SFC_ADAPTER_CONFIGURED,
74         SFC_ADAPTER_CLOSING,
75         SFC_ADAPTER_STARTING,
76         SFC_ADAPTER_STARTED,
77         SFC_ADAPTER_STOPPING,
78
79         SFC_ADAPTER_NSTATES
80 };
81
82 enum sfc_dev_filter_mode {
83         SFC_DEV_FILTER_MODE_PROMISC = 0,
84         SFC_DEV_FILTER_MODE_ALLMULTI,
85
86         SFC_DEV_FILTER_NMODES
87 };
88
89 enum sfc_mcdi_state {
90         SFC_MCDI_UNINITIALIZED = 0,
91         SFC_MCDI_INITIALIZED,
92         SFC_MCDI_BUSY,
93         SFC_MCDI_COMPLETED,
94
95         SFC_MCDI_NSTATES
96 };
97
98 struct sfc_mcdi {
99         rte_spinlock_t                  lock;
100         efsys_mem_t                     mem;
101         enum sfc_mcdi_state             state;
102         efx_mcdi_transport_t            transport;
103         uint32_t                        logtype;
104         uint32_t                        proxy_handle;
105         efx_rc_t                        proxy_result;
106 };
107
108 struct sfc_intr {
109         efx_intr_type_t                 type;
110         rte_intr_callback_fn            handler;
111         boolean_t                       lsc_intr;
112         boolean_t                       rxq_intr;
113 };
114
115 struct sfc_rxq;
116 struct sfc_txq;
117
118 struct sfc_rxq_info;
119 struct sfc_txq_info;
120 struct sfc_dp_rx;
121
122 struct sfc_port {
123         unsigned int                    lsc_seq;
124
125         uint32_t                        phy_adv_cap_mask;
126         uint32_t                        phy_adv_cap;
127
128         unsigned int                    flow_ctrl;
129         boolean_t                       flow_ctrl_autoneg;
130         size_t                          pdu;
131
132         /*
133          * Flow API isolated mode overrides promisc and allmulti settings;
134          * they won't be applied if isolated mode is active
135          */
136         boolean_t                       promisc;
137         boolean_t                       allmulti;
138
139         struct rte_ether_addr           default_mac_addr;
140
141         unsigned int                    max_mcast_addrs;
142         unsigned int                    nb_mcast_addrs;
143         uint8_t                         *mcast_addrs;
144
145         rte_spinlock_t                  mac_stats_lock;
146         uint64_t                        *mac_stats_buf;
147         unsigned int                    mac_stats_nb_supported;
148         efsys_mem_t                     mac_stats_dma_mem;
149         boolean_t                       mac_stats_reset_pending;
150         uint16_t                        mac_stats_update_period_ms;
151         uint32_t                        mac_stats_update_generation;
152         boolean_t                       mac_stats_periodic_dma_supported;
153         uint64_t                        mac_stats_last_request_timestamp;
154
155         uint32_t                mac_stats_mask[EFX_MAC_STATS_MASK_NPAGES];
156
157         uint64_t                        ipackets;
158 };
159
160 struct sfc_rss_hf_rte_to_efx {
161         uint64_t                        rte;
162         efx_rx_hash_type_t              efx;
163 };
164
165 struct sfc_rss {
166         unsigned int                    channels;
167         efx_rx_scale_context_type_t     context_type;
168         efx_rx_hash_support_t           hash_support;
169         efx_rx_hash_alg_t               hash_alg;
170         unsigned int                    hf_map_nb_entries;
171         struct sfc_rss_hf_rte_to_efx    *hf_map;
172
173         efx_rx_hash_type_t              hash_types;
174         unsigned int                    tbl[EFX_RSS_TBL_SIZE];
175         uint8_t                         key[EFX_RSS_KEY_SIZE];
176 };
177
178 /* Adapter private data shared by primary and secondary processes */
179 struct sfc_adapter_shared {
180         unsigned int                    rxq_count;
181         struct sfc_rxq_info             *rxq_info;
182
183         unsigned int                    txq_count;
184         struct sfc_txq_info             *txq_info;
185
186         struct sfc_rss                  rss;
187
188         boolean_t                       isolated;
189         uint32_t                        tunnel_encaps;
190
191         struct rte_pci_addr             pci_addr;
192         uint16_t                        port_id;
193
194         char                            *dp_rx_name;
195         char                            *dp_tx_name;
196 };
197
198 /* Adapter process private data */
199 struct sfc_adapter_priv {
200         struct sfc_adapter_shared       *shared;
201         const struct sfc_dp_rx          *dp_rx;
202         const struct sfc_dp_tx          *dp_tx;
203         uint32_t                        logtype_main;
204 };
205
206 static inline struct sfc_adapter_priv *
207 sfc_adapter_priv_by_eth_dev(struct rte_eth_dev *eth_dev)
208 {
209         struct sfc_adapter_priv *sap = eth_dev->process_private;
210
211         SFC_ASSERT(sap != NULL);
212         return sap;
213 }
214
215 /* Adapter private data */
216 struct sfc_adapter {
217         /*
218          * It must be the first field of the sfc_adapter structure since
219          * sfc_adapter is the primary process private data (i.e.  process
220          * private data plus additional primary process specific data).
221          */
222         struct sfc_adapter_priv         priv;
223
224         /*
225          * PMD setup and configuration is not thread safe. Since it is not
226          * performance sensitive, it is better to guarantee thread-safety
227          * and add device level lock. Adapter control operations which
228          * change its state should acquire the lock.
229          */
230         rte_spinlock_t                  lock;
231         enum sfc_adapter_state          state;
232         struct rte_eth_dev              *eth_dev;
233         struct rte_kvargs               *kvargs;
234         int                             socket_id;
235         efsys_bar_t                     mem_bar;
236         efx_family_t                    family;
237         efx_nic_t                       *nic;
238         rte_spinlock_t                  nic_lock;
239         rte_atomic32_t                  restart_required;
240
241         struct sfc_mcdi                 mcdi;
242         struct sfc_intr                 intr;
243         struct sfc_port                 port;
244         struct sfc_filter               filter;
245
246         struct sfc_flow_list            flow_list;
247
248         unsigned int                    rxq_max;
249         unsigned int                    txq_max;
250
251         unsigned int                    rxq_max_entries;
252         unsigned int                    rxq_min_entries;
253
254         unsigned int                    txq_max_entries;
255         unsigned int                    txq_min_entries;
256
257         unsigned int                    evq_max_entries;
258         unsigned int                    evq_min_entries;
259
260         uint32_t                        evq_flags;
261         unsigned int                    evq_count;
262
263         unsigned int                    mgmt_evq_index;
264         /*
265          * The lock is used to serialise management event queue polling
266          * which can be done from different context. Also the lock
267          * guarantees that mgmt_evq_running is preserved while the lock
268          * is held. It is used to serialise polling and start/stop
269          * operations.
270          *
271          * Locks which may be held when the lock is acquired:
272          *  - adapter lock, when:
273          *    - device start/stop to change mgmt_evq_running
274          *    - any control operations in client side MCDI proxy handling to
275          *      poll management event queue waiting for proxy response
276          *  - MCDI lock, when:
277          *    - any control operations in client side MCDI proxy handling to
278          *      poll management event queue waiting for proxy response
279          *
280          * Locks which are acquired with the lock held:
281          *  - nic_lock, when:
282          *    - MC event processing on management event queue polling
283          *      (e.g. MC REBOOT or BADASSERT events)
284          */
285         rte_spinlock_t                  mgmt_evq_lock;
286         bool                            mgmt_evq_running;
287         struct sfc_evq                  *mgmt_evq;
288
289         struct sfc_rxq                  *rxq_ctrl;
290         struct sfc_txq                  *txq_ctrl;
291
292         boolean_t                       tso;
293         boolean_t                       tso_encap;
294
295         uint32_t                        rxd_wait_timeout_ns;
296 };
297
298 static inline struct sfc_adapter_shared *
299 sfc_adapter_shared_by_eth_dev(struct rte_eth_dev *eth_dev)
300 {
301         struct sfc_adapter_shared *sas = eth_dev->data->dev_private;
302
303         return sas;
304 }
305
306 static inline struct sfc_adapter *
307 sfc_adapter_by_eth_dev(struct rte_eth_dev *eth_dev)
308 {
309         struct sfc_adapter_priv *sap = sfc_adapter_priv_by_eth_dev(eth_dev);
310
311         SFC_ASSERT(rte_eal_process_type() == RTE_PROC_PRIMARY);
312
313         return container_of(sap, struct sfc_adapter, priv);
314 }
315
316 static inline struct sfc_adapter_shared *
317 sfc_sa2shared(struct sfc_adapter *sa)
318 {
319         return sa->priv.shared;
320 }
321
322 /*
323  * Add wrapper functions to acquire/release lock to be able to remove or
324  * change the lock in one place.
325  */
326
327 static inline void
328 sfc_adapter_lock_init(struct sfc_adapter *sa)
329 {
330         rte_spinlock_init(&sa->lock);
331 }
332
333 static inline int
334 sfc_adapter_is_locked(struct sfc_adapter *sa)
335 {
336         return rte_spinlock_is_locked(&sa->lock);
337 }
338
339 static inline void
340 sfc_adapter_lock(struct sfc_adapter *sa)
341 {
342         rte_spinlock_lock(&sa->lock);
343 }
344
345 static inline int
346 sfc_adapter_trylock(struct sfc_adapter *sa)
347 {
348         return rte_spinlock_trylock(&sa->lock);
349 }
350
351 static inline void
352 sfc_adapter_unlock(struct sfc_adapter *sa)
353 {
354         rte_spinlock_unlock(&sa->lock);
355 }
356
357 static inline void
358 sfc_adapter_lock_fini(__rte_unused struct sfc_adapter *sa)
359 {
360         /* Just for symmetry of the API */
361 }
362
363 /** Get the number of milliseconds since boot from the default timer */
364 static inline uint64_t
365 sfc_get_system_msecs(void)
366 {
367         return rte_get_timer_cycles() * MS_PER_S / rte_get_timer_hz();
368 }
369
370 int sfc_dma_alloc(const struct sfc_adapter *sa, const char *name, uint16_t id,
371                   size_t len, int socket_id, efsys_mem_t *esmp);
372 void sfc_dma_free(const struct sfc_adapter *sa, efsys_mem_t *esmp);
373
374 uint32_t sfc_register_logtype(const struct rte_pci_addr *pci_addr,
375                               const char *lt_prefix_str,
376                               uint32_t ll_default);
377
378 int sfc_probe(struct sfc_adapter *sa);
379 void sfc_unprobe(struct sfc_adapter *sa);
380 int sfc_attach(struct sfc_adapter *sa);
381 void sfc_detach(struct sfc_adapter *sa);
382 int sfc_start(struct sfc_adapter *sa);
383 void sfc_stop(struct sfc_adapter *sa);
384
385 void sfc_schedule_restart(struct sfc_adapter *sa);
386
387 int sfc_mcdi_init(struct sfc_adapter *sa);
388 void sfc_mcdi_fini(struct sfc_adapter *sa);
389
390 int sfc_configure(struct sfc_adapter *sa);
391 void sfc_close(struct sfc_adapter *sa);
392
393 int sfc_intr_attach(struct sfc_adapter *sa);
394 void sfc_intr_detach(struct sfc_adapter *sa);
395 int sfc_intr_configure(struct sfc_adapter *sa);
396 void sfc_intr_close(struct sfc_adapter *sa);
397 int sfc_intr_start(struct sfc_adapter *sa);
398 void sfc_intr_stop(struct sfc_adapter *sa);
399
400 int sfc_port_attach(struct sfc_adapter *sa);
401 void sfc_port_detach(struct sfc_adapter *sa);
402 int sfc_port_configure(struct sfc_adapter *sa);
403 void sfc_port_close(struct sfc_adapter *sa);
404 int sfc_port_start(struct sfc_adapter *sa);
405 void sfc_port_stop(struct sfc_adapter *sa);
406 void sfc_port_link_mode_to_info(efx_link_mode_t link_mode,
407                                 struct rte_eth_link *link_info);
408 int sfc_port_update_mac_stats(struct sfc_adapter *sa);
409 int sfc_port_reset_mac_stats(struct sfc_adapter *sa);
410 int sfc_set_rx_mode(struct sfc_adapter *sa);
411 int sfc_set_rx_mode_unchecked(struct sfc_adapter *sa);
412
413
414 #ifdef __cplusplus
415 }
416 #endif
417
418 #endif  /* _SFC_H */