net/sfc: reserve queues for port representors
[dpdk.git] / drivers / net / sfc / sfc.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2 *
3  * Copyright(c) 2019-2021 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 <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_efx_mcdi.h"
25 #include "sfc_efx.h"
26
27 #include "sfc_debug.h"
28 #include "sfc_log.h"
29 #include "sfc_filter.h"
30 #include "sfc_sriov.h"
31 #include "sfc_mae.h"
32 #include "sfc_dp.h"
33 #include "sfc_sw_stats.h"
34 #include "sfc_repr_proxy.h"
35 #include "sfc_service.h"
36
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40
41 /*
42  * +---------------+
43  * | UNINITIALIZED |<-----------+
44  * +---------------+            |
45  *      |.eth_dev_init          |.eth_dev_uninit
46  *      V                       |
47  * +---------------+------------+
48  * |  INITIALIZED  |
49  * +---------------+<-----------<---------------+
50  *      |.dev_configure         |               |
51  *      V                       |failed         |
52  * +---------------+------------+               |
53  * |  CONFIGURING  |                            |
54  * +---------------+----+                       |
55  *      |success        |                       |
56  *      |               |               +---------------+
57  *      |               |               |    CLOSING    |
58  *      |               |               +---------------+
59  *      |               |                       ^
60  *      V               |.dev_configure         |
61  * +---------------+----+                       |.dev_close
62  * |  CONFIGURED   |----------------------------+
63  * +---------------+<-----------+
64  *      |.dev_start             |
65  *      V                       |
66  * +---------------+            |
67  * |   STARTING    |------------^
68  * +---------------+ failed     |
69  *      |success                |
70  *      |               +---------------+
71  *      |               |   STOPPING    |
72  *      |               +---------------+
73  *      |                       ^
74  *      V                       |.dev_stop
75  * +---------------+------------+
76  * |    STARTED    |
77  * +---------------+
78  */
79 enum sfc_adapter_state {
80         SFC_ADAPTER_UNINITIALIZED = 0,
81         SFC_ADAPTER_INITIALIZED,
82         SFC_ADAPTER_CONFIGURING,
83         SFC_ADAPTER_CONFIGURED,
84         SFC_ADAPTER_CLOSING,
85         SFC_ADAPTER_STARTING,
86         SFC_ADAPTER_STARTED,
87         SFC_ADAPTER_STOPPING,
88
89         SFC_ADAPTER_NSTATES
90 };
91
92 enum sfc_dev_filter_mode {
93         SFC_DEV_FILTER_MODE_PROMISC = 0,
94         SFC_DEV_FILTER_MODE_ALLMULTI,
95
96         SFC_DEV_FILTER_NMODES
97 };
98
99 struct sfc_intr {
100         efx_intr_type_t                 type;
101         rte_intr_callback_fn            handler;
102         boolean_t                       lsc_intr;
103         boolean_t                       rxq_intr;
104 };
105
106 struct sfc_rxq;
107 struct sfc_txq;
108
109 struct sfc_rxq_info;
110 struct sfc_txq_info;
111 struct sfc_dp_rx;
112
113 struct sfc_port {
114         unsigned int                    lsc_seq;
115
116         uint32_t                        phy_adv_cap_mask;
117         uint32_t                        phy_adv_cap;
118
119         unsigned int                    flow_ctrl;
120         boolean_t                       flow_ctrl_autoneg;
121         size_t                          pdu;
122
123         /*
124          * Flow API isolated mode overrides promisc and allmulti settings;
125          * they won't be applied if isolated mode is active
126          */
127         boolean_t                       promisc;
128         boolean_t                       allmulti;
129
130         struct rte_ether_addr           default_mac_addr;
131
132         unsigned int                    max_mcast_addrs;
133         unsigned int                    nb_mcast_addrs;
134         uint8_t                         *mcast_addrs;
135
136         uint64_t                        *mac_stats_buf;
137         unsigned int                    mac_stats_nb_supported;
138         efsys_mem_t                     mac_stats_dma_mem;
139         boolean_t                       mac_stats_reset_pending;
140         uint16_t                        mac_stats_update_period_ms;
141         uint32_t                        mac_stats_update_generation;
142         boolean_t                       mac_stats_periodic_dma_supported;
143         uint64_t                        mac_stats_last_request_timestamp;
144
145         uint32_t                mac_stats_mask[EFX_MAC_STATS_MASK_NPAGES];
146
147         unsigned int                    mac_stats_by_id[EFX_MAC_NSTATS];
148
149         uint64_t                        ipackets;
150 };
151
152 struct sfc_rss_hf_rte_to_efx {
153         uint64_t                        rte;
154         efx_rx_hash_type_t              efx;
155 };
156
157 struct sfc_rss {
158         unsigned int                    channels;
159         efx_rx_scale_context_type_t     context_type;
160         efx_rx_hash_support_t           hash_support;
161         efx_rx_hash_alg_t               hash_alg;
162         unsigned int                    hf_map_nb_entries;
163         struct sfc_rss_hf_rte_to_efx    *hf_map;
164
165         efx_rx_hash_type_t              hash_types;
166         unsigned int                    tbl[EFX_RSS_TBL_SIZE];
167         uint8_t                         key[EFX_RSS_KEY_SIZE];
168
169         uint32_t                        dummy_rss_context;
170 };
171
172 /* Adapter private data shared by primary and secondary processes */
173 struct sfc_adapter_shared {
174         unsigned int                    rxq_count;
175         struct sfc_rxq_info             *rxq_info;
176         unsigned int                    ethdev_rxq_count;
177
178         unsigned int                    txq_count;
179         struct sfc_txq_info             *txq_info;
180         unsigned int                    ethdev_txq_count;
181
182         struct sfc_rss                  rss;
183
184         boolean_t                       isolated;
185         uint32_t                        tunnel_encaps;
186
187         char                            log_prefix[SFC_LOG_PREFIX_MAX];
188         struct rte_pci_addr             pci_addr;
189         uint16_t                        port_id;
190
191         char                            *dp_rx_name;
192         char                            *dp_tx_name;
193
194         bool                            counters_rxq_allocated;
195         unsigned int                    nb_repr_rxq;
196         unsigned int                    nb_repr_txq;
197 };
198
199 /* Adapter process private data */
200 struct sfc_adapter_priv {
201         struct sfc_adapter_shared       *shared;
202         const struct sfc_dp_rx          *dp_rx;
203         const struct sfc_dp_tx          *dp_tx;
204         uint32_t                        logtype_main;
205 };
206
207 static inline struct sfc_adapter_priv *
208 sfc_adapter_priv_by_eth_dev(struct rte_eth_dev *eth_dev)
209 {
210         struct sfc_adapter_priv *sap = eth_dev->process_private;
211
212         SFC_ASSERT(sap != NULL);
213         return sap;
214 }
215
216 /* RxQ dedicated for counters (counter only RxQ) data */
217 struct sfc_counter_rxq {
218         unsigned int                    state;
219 #define SFC_COUNTER_RXQ_ATTACHED                0x1
220 #define SFC_COUNTER_RXQ_INITIALIZED             0x2
221         sfc_sw_index_t                  sw_index;
222         struct rte_mempool              *mp;
223 };
224
225 struct sfc_sw_stat_data {
226         const struct sfc_sw_stat_descr *descr;
227         /* Cache fragment */
228         uint64_t                        *cache;
229 };
230
231 struct sfc_sw_stats {
232         /* Number extended statistics provided by SW stats */
233         unsigned int                    xstats_count;
234         /* Supported SW statistics */
235         struct sfc_sw_stat_data         *supp;
236         unsigned int                    supp_count;
237
238         /* Cache for all supported SW statistics */
239         uint64_t                        *cache;
240         unsigned int                    cache_count;
241
242         uint64_t                        *reset_vals;
243         /* Location of per-queue reset values for packets/bytes in reset_vals */
244         uint64_t                        *reset_rx_pkts;
245         uint64_t                        *reset_rx_bytes;
246         uint64_t                        *reset_tx_pkts;
247         uint64_t                        *reset_tx_bytes;
248
249         rte_spinlock_t                  queues_bitmap_lock;
250         void                            *queues_bitmap_mem;
251         struct rte_bitmap               *queues_bitmap;
252 };
253
254 /* Adapter private data */
255 struct sfc_adapter {
256         /*
257          * It must be the first field of the sfc_adapter structure since
258          * sfc_adapter is the primary process private data (i.e.  process
259          * private data plus additional primary process specific data).
260          */
261         struct sfc_adapter_priv         priv;
262
263         /*
264          * PMD setup and configuration is not thread safe. Since it is not
265          * performance sensitive, it is better to guarantee thread-safety
266          * and add device level lock. Adapter control operations which
267          * change its state should acquire the lock.
268          */
269         rte_spinlock_t                  lock;
270         enum sfc_adapter_state          state;
271         struct rte_eth_dev              *eth_dev;
272         struct rte_kvargs               *kvargs;
273         int                             socket_id;
274         efsys_bar_t                     mem_bar;
275         /* Function control window offset */
276         efsys_dma_addr_t                fcw_offset;
277         efx_family_t                    family;
278         efx_nic_t                       *nic;
279         rte_spinlock_t                  nic_lock;
280         rte_atomic32_t                  restart_required;
281
282         struct sfc_efx_mcdi             mcdi;
283         struct sfc_sriov                sriov;
284         struct sfc_intr                 intr;
285         struct sfc_port                 port;
286         struct sfc_sw_stats             sw_stats;
287         struct sfc_filter               filter;
288         struct sfc_mae                  mae;
289         struct sfc_repr_proxy           repr_proxy;
290
291         struct sfc_flow_list            flow_list;
292
293         unsigned int                    rxq_max;
294         unsigned int                    txq_max;
295
296         unsigned int                    rxq_max_entries;
297         unsigned int                    rxq_min_entries;
298
299         unsigned int                    txq_max_entries;
300         unsigned int                    txq_min_entries;
301
302         unsigned int                    evq_max_entries;
303         unsigned int                    evq_min_entries;
304
305         uint32_t                        evq_flags;
306         unsigned int                    evq_count;
307
308         unsigned int                    mgmt_evq_index;
309         /*
310          * The lock is used to serialise management event queue polling
311          * which can be done from different context. Also the lock
312          * guarantees that mgmt_evq_running is preserved while the lock
313          * is held. It is used to serialise polling and start/stop
314          * operations.
315          *
316          * Locks which may be held when the lock is acquired:
317          *  - adapter lock, when:
318          *    - device start/stop to change mgmt_evq_running
319          *    - any control operations in client side MCDI proxy handling to
320          *      poll management event queue waiting for proxy response
321          *  - MCDI lock, when:
322          *    - any control operations in client side MCDI proxy handling to
323          *      poll management event queue waiting for proxy response
324          *
325          * Locks which are acquired with the lock held:
326          *  - nic_lock, when:
327          *    - MC event processing on management event queue polling
328          *      (e.g. MC REBOOT or BADASSERT events)
329          */
330         rte_spinlock_t                  mgmt_evq_lock;
331         bool                            mgmt_evq_running;
332         struct sfc_evq                  *mgmt_evq;
333
334         struct sfc_counter_rxq          counter_rxq;
335
336         struct sfc_rxq                  *rxq_ctrl;
337         struct sfc_txq                  *txq_ctrl;
338
339         boolean_t                       tso;
340         boolean_t                       tso_encap;
341
342         uint32_t                        rxd_wait_timeout_ns;
343
344         bool                            switchdev;
345 };
346
347 static inline struct sfc_adapter_shared *
348 sfc_adapter_shared_by_eth_dev(struct rte_eth_dev *eth_dev)
349 {
350         struct sfc_adapter_shared *sas = eth_dev->data->dev_private;
351
352         return sas;
353 }
354
355 static inline struct sfc_adapter *
356 sfc_adapter_by_eth_dev(struct rte_eth_dev *eth_dev)
357 {
358         struct sfc_adapter_priv *sap = sfc_adapter_priv_by_eth_dev(eth_dev);
359
360         SFC_ASSERT(rte_eal_process_type() == RTE_PROC_PRIMARY);
361
362         return container_of(sap, struct sfc_adapter, priv);
363 }
364
365 static inline struct sfc_adapter_shared *
366 sfc_sa2shared(struct sfc_adapter *sa)
367 {
368         return sa->priv.shared;
369 }
370
371 /*
372  * Add wrapper functions to acquire/release lock to be able to remove or
373  * change the lock in one place.
374  */
375
376 static inline void
377 sfc_adapter_lock_init(struct sfc_adapter *sa)
378 {
379         rte_spinlock_init(&sa->lock);
380 }
381
382 static inline int
383 sfc_adapter_is_locked(struct sfc_adapter *sa)
384 {
385         return rte_spinlock_is_locked(&sa->lock);
386 }
387
388 static inline void
389 sfc_adapter_lock(struct sfc_adapter *sa)
390 {
391         rte_spinlock_lock(&sa->lock);
392 }
393
394 static inline int
395 sfc_adapter_trylock(struct sfc_adapter *sa)
396 {
397         return rte_spinlock_trylock(&sa->lock);
398 }
399
400 static inline void
401 sfc_adapter_unlock(struct sfc_adapter *sa)
402 {
403         rte_spinlock_unlock(&sa->lock);
404 }
405
406 static inline void
407 sfc_adapter_lock_fini(__rte_unused struct sfc_adapter *sa)
408 {
409         /* Just for symmetry of the API */
410 }
411
412 static inline unsigned int
413 sfc_nb_counter_rxq(const struct sfc_adapter_shared *sas)
414 {
415         return sas->counters_rxq_allocated ? 1 : 0;
416 }
417
418 bool sfc_repr_supported(const struct sfc_adapter *sa);
419 bool sfc_repr_available(const struct sfc_adapter_shared *sas);
420
421 static inline unsigned int
422 sfc_repr_nb_rxq(const struct sfc_adapter_shared *sas)
423 {
424         return sas->nb_repr_rxq;
425 }
426
427 static inline unsigned int
428 sfc_repr_nb_txq(const struct sfc_adapter_shared *sas)
429 {
430         return sas->nb_repr_txq;
431 }
432
433 /** Get the number of milliseconds since boot from the default timer */
434 static inline uint64_t
435 sfc_get_system_msecs(void)
436 {
437         return rte_get_timer_cycles() * MS_PER_S / rte_get_timer_hz();
438 }
439
440 int sfc_dma_alloc(const struct sfc_adapter *sa, const char *name, uint16_t id,
441                   size_t len, int socket_id, efsys_mem_t *esmp);
442 void sfc_dma_free(const struct sfc_adapter *sa, efsys_mem_t *esmp);
443
444 uint32_t sfc_register_logtype(const struct rte_pci_addr *pci_addr,
445                               const char *lt_prefix_str,
446                               uint32_t ll_default);
447
448 int sfc_probe(struct sfc_adapter *sa);
449 void sfc_unprobe(struct sfc_adapter *sa);
450 int sfc_attach(struct sfc_adapter *sa);
451 void sfc_detach(struct sfc_adapter *sa);
452 int sfc_start(struct sfc_adapter *sa);
453 void sfc_stop(struct sfc_adapter *sa);
454
455 void sfc_schedule_restart(struct sfc_adapter *sa);
456
457 int sfc_mcdi_init(struct sfc_adapter *sa);
458 void sfc_mcdi_fini(struct sfc_adapter *sa);
459
460 int sfc_configure(struct sfc_adapter *sa);
461 void sfc_close(struct sfc_adapter *sa);
462
463 int sfc_intr_attach(struct sfc_adapter *sa);
464 void sfc_intr_detach(struct sfc_adapter *sa);
465 int sfc_intr_configure(struct sfc_adapter *sa);
466 void sfc_intr_close(struct sfc_adapter *sa);
467 int sfc_intr_start(struct sfc_adapter *sa);
468 void sfc_intr_stop(struct sfc_adapter *sa);
469
470 int sfc_port_attach(struct sfc_adapter *sa);
471 void sfc_port_detach(struct sfc_adapter *sa);
472 int sfc_port_configure(struct sfc_adapter *sa);
473 void sfc_port_close(struct sfc_adapter *sa);
474 int sfc_port_start(struct sfc_adapter *sa);
475 void sfc_port_stop(struct sfc_adapter *sa);
476 void sfc_port_link_mode_to_info(efx_link_mode_t link_mode,
477                                 struct rte_eth_link *link_info);
478 int sfc_port_update_mac_stats(struct sfc_adapter *sa, boolean_t manual_update);
479 int sfc_port_get_mac_stats(struct sfc_adapter *sa, struct rte_eth_xstat *xstats,
480                            unsigned int xstats_count, unsigned int *nb_written);
481 int sfc_port_get_mac_stats_by_id(struct sfc_adapter *sa, const uint64_t *ids,
482                                  uint64_t *values, unsigned int n);
483 int sfc_port_reset_mac_stats(struct sfc_adapter *sa);
484 int sfc_set_rx_mode(struct sfc_adapter *sa);
485 int sfc_set_rx_mode_unchecked(struct sfc_adapter *sa);
486
487 struct sfc_hw_switch_id;
488
489 int sfc_hw_switch_id_init(struct sfc_adapter *sa,
490                           struct sfc_hw_switch_id **idp);
491 void sfc_hw_switch_id_fini(struct sfc_adapter *sa,
492                            struct sfc_hw_switch_id *idp);
493 bool sfc_hw_switch_ids_equal(const struct sfc_hw_switch_id *left,
494                              const struct sfc_hw_switch_id *right);
495
496 #ifdef __cplusplus
497 }
498 #endif
499
500 #endif  /* _SFC_H */