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