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