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