1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2017 Intel Corporation 3 */ 4 5 #ifndef _RTE_ETHDEV_DRIVER_H_ 6 #define _RTE_ETHDEV_DRIVER_H_ 7 8 /** 9 * @file 10 * 11 * RTE Ethernet Device PMD API 12 * 13 * These APIs for the use from Ethernet drivers, user applications shouldn't 14 * use them. 15 * 16 */ 17 18 #include <rte_ethdev.h> 19 20 #ifdef __cplusplus 21 extern "C" { 22 #endif 23 24 /**< @internal Declaration of the hairpin peer queue information structure. */ 25 struct rte_hairpin_peer_info; 26 27 /* 28 * Definitions of all functions exported by an Ethernet driver through the 29 * generic structure of type *eth_dev_ops* supplied in the *rte_eth_dev* 30 * structure associated with an Ethernet device. 31 */ 32 33 typedef int (*eth_dev_configure_t)(struct rte_eth_dev *dev); 34 /**< @internal Ethernet device configuration. */ 35 36 typedef int (*eth_dev_start_t)(struct rte_eth_dev *dev); 37 /**< @internal Function used to start a configured Ethernet device. */ 38 39 typedef int (*eth_dev_stop_t)(struct rte_eth_dev *dev); 40 /**< @internal Function used to stop a configured Ethernet device. */ 41 42 typedef int (*eth_dev_set_link_up_t)(struct rte_eth_dev *dev); 43 /**< @internal Function used to link up a configured Ethernet device. */ 44 45 typedef int (*eth_dev_set_link_down_t)(struct rte_eth_dev *dev); 46 /**< @internal Function used to link down a configured Ethernet device. */ 47 48 typedef int (*eth_dev_close_t)(struct rte_eth_dev *dev); 49 /**< @internal Function used to close a configured Ethernet device. */ 50 51 typedef int (*eth_dev_reset_t)(struct rte_eth_dev *dev); 52 /** <@internal Function used to reset a configured Ethernet device. */ 53 54 typedef int (*eth_is_removed_t)(struct rte_eth_dev *dev); 55 /**< @internal Function used to detect an Ethernet device removal. */ 56 57 /** 58 * @internal 59 * Function used to enable the Rx promiscuous mode of an Ethernet device. 60 * 61 * @param dev 62 * ethdev handle of port. 63 * 64 * @return 65 * Negative errno value on error, 0 on success. 66 * 67 * @retval 0 68 * Success, promiscuous mode is enabled. 69 * @retval -ENOTSUP 70 * Promiscuous mode is not supported. 71 * @retval -ENODEV 72 * Device is gone. 73 * @retval -E_RTE_SECONDARY 74 * Function was called from a secondary process instance and not supported. 75 * @retval -ETIMEDOUT 76 * Attempt to enable promiscuos mode failed because of timeout. 77 * @retval -EAGAIN 78 * Failed to enable promiscuous mode. 79 */ 80 typedef int (*eth_promiscuous_enable_t)(struct rte_eth_dev *dev); 81 82 /** 83 * @internal 84 * Function used to disable the Rx promiscuous mode of an Ethernet device. 85 * 86 * @param dev 87 * ethdev handle of port. 88 * 89 * @return 90 * Negative errno value on error, 0 on success. 91 * 92 * @retval 0 93 * Success, promiscuous mode is disabled. 94 * @retval -ENOTSUP 95 * Promiscuous mode disabling is not supported. 96 * @retval -ENODEV 97 * Device is gone. 98 * @retval -E_RTE_SECONDARY 99 * Function was called from a secondary process instance and not supported. 100 * @retval -ETIMEDOUT 101 * Attempt to disable promiscuos mode failed because of timeout. 102 * @retval -EAGAIN 103 * Failed to disable promiscuous mode. 104 */ 105 typedef int (*eth_promiscuous_disable_t)(struct rte_eth_dev *dev); 106 107 /** 108 * @internal 109 * Enable the receipt of all multicast packets by an Ethernet device. 110 * 111 * @param dev 112 * ethdev handle of port. 113 * 114 * @return 115 * Negative errno value on error, 0 on success. 116 * 117 * @retval 0 118 * Success, all-multicast mode is enabled. 119 * @retval -ENOTSUP 120 * All-multicast mode is not supported. 121 * @retval -ENODEV 122 * Device is gone. 123 * @retval -E_RTE_SECONDARY 124 * Function was called from a secondary process instance and not supported. 125 * @retval -ETIMEDOUT 126 * Attempt to enable all-multicast mode failed because of timeout. 127 * @retval -EAGAIN 128 * Failed to enable all-multicast mode. 129 */ 130 typedef int (*eth_allmulticast_enable_t)(struct rte_eth_dev *dev); 131 132 /** 133 * @internal 134 * Disable the receipt of all multicast packets by an Ethernet device. 135 * 136 * @param dev 137 * ethdev handle of port. 138 * 139 * @return 140 * Negative errno value on error, 0 on success. 141 * 142 * @retval 0 143 * Success, all-multicast mode is disabled. 144 * @retval -ENOTSUP 145 * All-multicast mode disabling is not supported. 146 * @retval -ENODEV 147 * Device is gone. 148 * @retval -E_RTE_SECONDARY 149 * Function was called from a secondary process instance and not supported. 150 * @retval -ETIMEDOUT 151 * Attempt to disable all-multicast mode failed because of timeout. 152 * @retval -EAGAIN 153 * Failed to disable all-multicast mode. 154 */ 155 typedef int (*eth_allmulticast_disable_t)(struct rte_eth_dev *dev); 156 157 typedef int (*eth_link_update_t)(struct rte_eth_dev *dev, 158 int wait_to_complete); 159 /**< @internal Get link speed, duplex mode and state (up/down) of an Ethernet device. */ 160 161 typedef int (*eth_stats_get_t)(struct rte_eth_dev *dev, 162 struct rte_eth_stats *igb_stats); 163 /**< @internal Get global I/O statistics of an Ethernet device. */ 164 165 /** 166 * @internal 167 * Reset global I/O statistics of an Ethernet device to 0. 168 * 169 * @param dev 170 * ethdev handle of port. 171 * 172 * @return 173 * Negative errno value on error, 0 on success. 174 * 175 * @retval 0 176 * Success, statistics has been reset. 177 * @retval -ENOTSUP 178 * Resetting statistics is not supported. 179 * @retval -EINVAL 180 * Resetting statistics is not valid. 181 * @retval -ENOMEM 182 * Not enough memory to get the stats. 183 */ 184 typedef int (*eth_stats_reset_t)(struct rte_eth_dev *dev); 185 186 typedef int (*eth_xstats_get_t)(struct rte_eth_dev *dev, 187 struct rte_eth_xstat *stats, unsigned int n); 188 /**< @internal Get extended stats of an Ethernet device. */ 189 190 typedef int (*eth_xstats_get_by_id_t)(struct rte_eth_dev *dev, 191 const uint64_t *ids, 192 uint64_t *values, 193 unsigned int n); 194 /**< @internal Get extended stats of an Ethernet device. */ 195 196 /** 197 * @internal 198 * Reset extended stats of an Ethernet device. 199 * 200 * @param dev 201 * ethdev handle of port. 202 * 203 * @return 204 * Negative errno value on error, 0 on success. 205 * 206 * @retval 0 207 * Success, statistics has been reset. 208 * @retval -ENOTSUP 209 * Resetting statistics is not supported. 210 * @retval -EINVAL 211 * Resetting statistics is not valid. 212 * @retval -ENOMEM 213 * Not enough memory to get the stats. 214 */ 215 typedef int (*eth_xstats_reset_t)(struct rte_eth_dev *dev); 216 217 typedef int (*eth_xstats_get_names_t)(struct rte_eth_dev *dev, 218 struct rte_eth_xstat_name *xstats_names, unsigned int size); 219 /**< @internal Get names of extended stats of an Ethernet device. */ 220 221 typedef int (*eth_xstats_get_names_by_id_t)(struct rte_eth_dev *dev, 222 struct rte_eth_xstat_name *xstats_names, const uint64_t *ids, 223 unsigned int size); 224 /**< @internal Get names of extended stats of an Ethernet device. */ 225 226 typedef int (*eth_queue_stats_mapping_set_t)(struct rte_eth_dev *dev, 227 uint16_t queue_id, 228 uint8_t stat_idx, 229 uint8_t is_rx); 230 /**< @internal Set a queue statistics mapping for a tx/rx queue of an Ethernet device. */ 231 232 typedef int (*eth_dev_infos_get_t)(struct rte_eth_dev *dev, 233 struct rte_eth_dev_info *dev_info); 234 /**< @internal Get specific information of an Ethernet device. */ 235 236 typedef const uint32_t *(*eth_dev_supported_ptypes_get_t)(struct rte_eth_dev *dev); 237 /**< @internal Get supported ptypes of an Ethernet device. */ 238 239 /** 240 * @internal 241 * Inform Ethernet device about reduced range of packet types to handle. 242 * 243 * @param dev 244 * The Ethernet device identifier. 245 * @param ptype_mask 246 * The ptype family that application is interested in should be bitwise OR of 247 * RTE_PTYPE_*_MASK or 0. 248 * @return 249 * - (0) if Success. 250 */ 251 typedef int (*eth_dev_ptypes_set_t)(struct rte_eth_dev *dev, 252 uint32_t ptype_mask); 253 254 typedef int (*eth_queue_start_t)(struct rte_eth_dev *dev, 255 uint16_t queue_id); 256 /**< @internal Start rx and tx of a queue of an Ethernet device. */ 257 258 typedef int (*eth_queue_stop_t)(struct rte_eth_dev *dev, 259 uint16_t queue_id); 260 /**< @internal Stop rx and tx of a queue of an Ethernet device. */ 261 262 typedef int (*eth_rx_queue_setup_t)(struct rte_eth_dev *dev, 263 uint16_t rx_queue_id, 264 uint16_t nb_rx_desc, 265 unsigned int socket_id, 266 const struct rte_eth_rxconf *rx_conf, 267 struct rte_mempool *mb_pool); 268 /**< @internal Set up a receive queue of an Ethernet device. */ 269 270 typedef int (*eth_tx_queue_setup_t)(struct rte_eth_dev *dev, 271 uint16_t tx_queue_id, 272 uint16_t nb_tx_desc, 273 unsigned int socket_id, 274 const struct rte_eth_txconf *tx_conf); 275 /**< @internal Setup a transmit queue of an Ethernet device. */ 276 277 typedef int (*eth_rx_enable_intr_t)(struct rte_eth_dev *dev, 278 uint16_t rx_queue_id); 279 /**< @internal Enable interrupt of a receive queue of an Ethernet device. */ 280 281 typedef int (*eth_rx_disable_intr_t)(struct rte_eth_dev *dev, 282 uint16_t rx_queue_id); 283 /**< @internal Disable interrupt of a receive queue of an Ethernet device. */ 284 285 typedef void (*eth_queue_release_t)(void *queue); 286 /**< @internal Release memory resources allocated by given RX/TX queue. */ 287 288 typedef int (*eth_fw_version_get_t)(struct rte_eth_dev *dev, 289 char *fw_version, size_t fw_size); 290 /**< @internal Get firmware information of an Ethernet device. */ 291 292 typedef int (*eth_tx_done_cleanup_t)(void *txq, uint32_t free_cnt); 293 /**< @internal Force mbufs to be from TX ring. */ 294 295 typedef void (*eth_rxq_info_get_t)(struct rte_eth_dev *dev, 296 uint16_t rx_queue_id, struct rte_eth_rxq_info *qinfo); 297 298 typedef void (*eth_txq_info_get_t)(struct rte_eth_dev *dev, 299 uint16_t tx_queue_id, struct rte_eth_txq_info *qinfo); 300 301 typedef int (*eth_burst_mode_get_t)(struct rte_eth_dev *dev, 302 uint16_t queue_id, struct rte_eth_burst_mode *mode); 303 304 typedef int (*mtu_set_t)(struct rte_eth_dev *dev, uint16_t mtu); 305 /**< @internal Set MTU. */ 306 307 typedef int (*vlan_filter_set_t)(struct rte_eth_dev *dev, 308 uint16_t vlan_id, 309 int on); 310 /**< @internal filtering of a VLAN Tag Identifier by an Ethernet device. */ 311 312 typedef int (*vlan_tpid_set_t)(struct rte_eth_dev *dev, 313 enum rte_vlan_type type, uint16_t tpid); 314 /**< @internal set the outer/inner VLAN-TPID by an Ethernet device. */ 315 316 typedef int (*vlan_offload_set_t)(struct rte_eth_dev *dev, int mask); 317 /**< @internal set VLAN offload function by an Ethernet device. */ 318 319 typedef int (*vlan_pvid_set_t)(struct rte_eth_dev *dev, 320 uint16_t vlan_id, 321 int on); 322 /**< @internal set port based TX VLAN insertion by an Ethernet device. */ 323 324 typedef void (*vlan_strip_queue_set_t)(struct rte_eth_dev *dev, 325 uint16_t rx_queue_id, 326 int on); 327 /**< @internal VLAN stripping enable/disable by an queue of Ethernet device. */ 328 329 typedef int (*flow_ctrl_get_t)(struct rte_eth_dev *dev, 330 struct rte_eth_fc_conf *fc_conf); 331 /**< @internal Get current flow control parameter on an Ethernet device */ 332 333 typedef int (*flow_ctrl_set_t)(struct rte_eth_dev *dev, 334 struct rte_eth_fc_conf *fc_conf); 335 /**< @internal Setup flow control parameter on an Ethernet device */ 336 337 typedef int (*priority_flow_ctrl_set_t)(struct rte_eth_dev *dev, 338 struct rte_eth_pfc_conf *pfc_conf); 339 /**< @internal Setup priority flow control parameter on an Ethernet device */ 340 341 typedef int (*reta_update_t)(struct rte_eth_dev *dev, 342 struct rte_eth_rss_reta_entry64 *reta_conf, 343 uint16_t reta_size); 344 /**< @internal Update RSS redirection table on an Ethernet device */ 345 346 typedef int (*reta_query_t)(struct rte_eth_dev *dev, 347 struct rte_eth_rss_reta_entry64 *reta_conf, 348 uint16_t reta_size); 349 /**< @internal Query RSS redirection table on an Ethernet device */ 350 351 typedef int (*rss_hash_update_t)(struct rte_eth_dev *dev, 352 struct rte_eth_rss_conf *rss_conf); 353 /**< @internal Update RSS hash configuration of an Ethernet device */ 354 355 typedef int (*rss_hash_conf_get_t)(struct rte_eth_dev *dev, 356 struct rte_eth_rss_conf *rss_conf); 357 /**< @internal Get current RSS hash configuration of an Ethernet device */ 358 359 typedef int (*eth_dev_led_on_t)(struct rte_eth_dev *dev); 360 /**< @internal Turn on SW controllable LED on an Ethernet device */ 361 362 typedef int (*eth_dev_led_off_t)(struct rte_eth_dev *dev); 363 /**< @internal Turn off SW controllable LED on an Ethernet device */ 364 365 typedef void (*eth_mac_addr_remove_t)(struct rte_eth_dev *dev, uint32_t index); 366 /**< @internal Remove MAC address from receive address register */ 367 368 typedef int (*eth_mac_addr_add_t)(struct rte_eth_dev *dev, 369 struct rte_ether_addr *mac_addr, 370 uint32_t index, 371 uint32_t vmdq); 372 /**< @internal Set a MAC address into Receive Address Register */ 373 374 typedef int (*eth_mac_addr_set_t)(struct rte_eth_dev *dev, 375 struct rte_ether_addr *mac_addr); 376 /**< @internal Set a MAC address into Receive Address Register */ 377 378 typedef int (*eth_uc_hash_table_set_t)(struct rte_eth_dev *dev, 379 struct rte_ether_addr *mac_addr, 380 uint8_t on); 381 /**< @internal Set a Unicast Hash bitmap */ 382 383 typedef int (*eth_uc_all_hash_table_set_t)(struct rte_eth_dev *dev, 384 uint8_t on); 385 /**< @internal Set all Unicast Hash bitmap */ 386 387 typedef int (*eth_set_queue_rate_limit_t)(struct rte_eth_dev *dev, 388 uint16_t queue_idx, 389 uint16_t tx_rate); 390 /**< @internal Set queue TX rate */ 391 392 typedef int (*eth_mirror_rule_set_t)(struct rte_eth_dev *dev, 393 struct rte_eth_mirror_conf *mirror_conf, 394 uint8_t rule_id, 395 uint8_t on); 396 /**< @internal Add a traffic mirroring rule on an Ethernet device */ 397 398 typedef int (*eth_mirror_rule_reset_t)(struct rte_eth_dev *dev, 399 uint8_t rule_id); 400 /**< @internal Remove a traffic mirroring rule on an Ethernet device */ 401 402 typedef int (*eth_udp_tunnel_port_add_t)(struct rte_eth_dev *dev, 403 struct rte_eth_udp_tunnel *tunnel_udp); 404 /**< @internal Add tunneling UDP port */ 405 406 typedef int (*eth_udp_tunnel_port_del_t)(struct rte_eth_dev *dev, 407 struct rte_eth_udp_tunnel *tunnel_udp); 408 /**< @internal Delete tunneling UDP port */ 409 410 typedef int (*eth_set_mc_addr_list_t)(struct rte_eth_dev *dev, 411 struct rte_ether_addr *mc_addr_set, 412 uint32_t nb_mc_addr); 413 /**< @internal set the list of multicast addresses on an Ethernet device */ 414 415 typedef int (*eth_timesync_enable_t)(struct rte_eth_dev *dev); 416 /**< @internal Function used to enable IEEE1588/802.1AS timestamping. */ 417 418 typedef int (*eth_timesync_disable_t)(struct rte_eth_dev *dev); 419 /**< @internal Function used to disable IEEE1588/802.1AS timestamping. */ 420 421 typedef int (*eth_timesync_read_rx_timestamp_t)(struct rte_eth_dev *dev, 422 struct timespec *timestamp, 423 uint32_t flags); 424 /**< @internal Function used to read an RX IEEE1588/802.1AS timestamp. */ 425 426 typedef int (*eth_timesync_read_tx_timestamp_t)(struct rte_eth_dev *dev, 427 struct timespec *timestamp); 428 /**< @internal Function used to read a TX IEEE1588/802.1AS timestamp. */ 429 430 typedef int (*eth_timesync_adjust_time)(struct rte_eth_dev *dev, int64_t); 431 /**< @internal Function used to adjust the device clock */ 432 433 typedef int (*eth_timesync_read_time)(struct rte_eth_dev *dev, 434 struct timespec *timestamp); 435 /**< @internal Function used to get time from the device clock. */ 436 437 typedef int (*eth_timesync_write_time)(struct rte_eth_dev *dev, 438 const struct timespec *timestamp); 439 /**< @internal Function used to get time from the device clock */ 440 441 typedef int (*eth_read_clock)(struct rte_eth_dev *dev, 442 uint64_t *timestamp); 443 /**< @internal Function used to get the current value of the device clock. */ 444 445 typedef int (*eth_get_reg_t)(struct rte_eth_dev *dev, 446 struct rte_dev_reg_info *info); 447 /**< @internal Retrieve registers */ 448 449 typedef int (*eth_get_eeprom_length_t)(struct rte_eth_dev *dev); 450 /**< @internal Retrieve eeprom size */ 451 452 typedef int (*eth_get_eeprom_t)(struct rte_eth_dev *dev, 453 struct rte_dev_eeprom_info *info); 454 /**< @internal Retrieve eeprom data */ 455 456 typedef int (*eth_set_eeprom_t)(struct rte_eth_dev *dev, 457 struct rte_dev_eeprom_info *info); 458 /**< @internal Program eeprom data */ 459 460 typedef int (*eth_get_module_info_t)(struct rte_eth_dev *dev, 461 struct rte_eth_dev_module_info *modinfo); 462 /**< @internal Retrieve type and size of plugin module eeprom */ 463 464 typedef int (*eth_get_module_eeprom_t)(struct rte_eth_dev *dev, 465 struct rte_dev_eeprom_info *info); 466 /**< @internal Retrieve plugin module eeprom data */ 467 468 /** 469 * Feature filter types 470 */ 471 enum rte_filter_type { 472 RTE_ETH_FILTER_NONE = 0, 473 RTE_ETH_FILTER_ETHERTYPE, 474 RTE_ETH_FILTER_FLEXIBLE, 475 RTE_ETH_FILTER_SYN, 476 RTE_ETH_FILTER_NTUPLE, 477 RTE_ETH_FILTER_TUNNEL, 478 RTE_ETH_FILTER_FDIR, 479 RTE_ETH_FILTER_HASH, 480 RTE_ETH_FILTER_L2_TUNNEL, 481 RTE_ETH_FILTER_GENERIC, 482 }; 483 484 /** 485 * Generic operations on filters 486 */ 487 enum rte_filter_op { 488 RTE_ETH_FILTER_GET, /**< get flow API ops */ 489 }; 490 491 typedef int (*eth_filter_ctrl_t)(struct rte_eth_dev *dev, 492 enum rte_filter_type filter_type, 493 enum rte_filter_op filter_op, 494 void *arg); 495 /**< @internal Take operations to assigned filter type on an Ethernet device */ 496 497 typedef int (*eth_tm_ops_get_t)(struct rte_eth_dev *dev, void *ops); 498 /**< @internal Get Traffic Management (TM) operations on an Ethernet device */ 499 500 typedef int (*eth_mtr_ops_get_t)(struct rte_eth_dev *dev, void *ops); 501 /**< @internal Get Traffic Metering and Policing (MTR) operations */ 502 503 typedef int (*eth_get_dcb_info)(struct rte_eth_dev *dev, 504 struct rte_eth_dcb_info *dcb_info); 505 /**< @internal Get dcb information on an Ethernet device */ 506 507 typedef int (*eth_pool_ops_supported_t)(struct rte_eth_dev *dev, 508 const char *pool); 509 /**< @internal Test if a port supports specific mempool ops */ 510 511 /** 512 * @internal 513 * Get the hairpin capabilities. 514 * 515 * @param dev 516 * ethdev handle of port. 517 * @param cap 518 * returns the hairpin capabilities from the device. 519 * 520 * @return 521 * Negative errno value on error, 0 on success. 522 * 523 * @retval 0 524 * Success, hairpin is supported. 525 * @retval -ENOTSUP 526 * Hairpin is not supported. 527 */ 528 typedef int (*eth_hairpin_cap_get_t)(struct rte_eth_dev *dev, 529 struct rte_eth_hairpin_cap *cap); 530 531 /** 532 * @internal 533 * Setup RX hairpin queue. 534 * 535 * @param dev 536 * ethdev handle of port. 537 * @param rx_queue_id 538 * the selected RX queue index. 539 * @param nb_rx_desc 540 * the requested number of descriptors for this queue. 0 - use PMD default. 541 * @param conf 542 * the RX hairpin configuration structure. 543 * 544 * @return 545 * Negative errno value on error, 0 on success. 546 * 547 * @retval 0 548 * Success, hairpin is supported. 549 * @retval -ENOTSUP 550 * Hairpin is not supported. 551 * @retval -EINVAL 552 * One of the parameters is invalid. 553 * @retval -ENOMEM 554 * Unable to allocate resources. 555 */ 556 typedef int (*eth_rx_hairpin_queue_setup_t) 557 (struct rte_eth_dev *dev, uint16_t rx_queue_id, 558 uint16_t nb_rx_desc, 559 const struct rte_eth_hairpin_conf *conf); 560 561 /** 562 * @internal 563 * Setup TX hairpin queue. 564 * 565 * @param dev 566 * ethdev handle of port. 567 * @param tx_queue_id 568 * the selected TX queue index. 569 * @param nb_tx_desc 570 * the requested number of descriptors for this queue. 0 - use PMD default. 571 * @param conf 572 * the TX hairpin configuration structure. 573 * 574 * @return 575 * Negative errno value on error, 0 on success. 576 * 577 * @retval 0 578 * Success, hairpin is supported. 579 * @retval -ENOTSUP 580 * Hairpin is not supported. 581 * @retval -EINVAL 582 * One of the parameters is invalid. 583 * @retval -ENOMEM 584 * Unable to allocate resources. 585 */ 586 typedef int (*eth_tx_hairpin_queue_setup_t) 587 (struct rte_eth_dev *dev, uint16_t tx_queue_id, 588 uint16_t nb_tx_desc, 589 const struct rte_eth_hairpin_conf *hairpin_conf); 590 591 /** 592 * @internal 593 * Get Forward Error Correction(FEC) capability. 594 * 595 * @param dev 596 * ethdev handle of port. 597 * @param speed_fec_capa 598 * speed_fec_capa is out only with per-speed capabilities. 599 * @param num 600 * a number of elements in an speed_fec_capa array. 601 * 602 * @return 603 * Negative errno value on error, positive value on success. 604 * 605 * @retval positive value 606 * A non-negative value lower or equal to num: success. The return value 607 * is the number of entries filled in the fec capa array. 608 * A non-negative value higher than num: error, the given fec capa array 609 * is too small. The return value corresponds to the num that should 610 * be given to succeed. The entries in the fec capa array are not valid 611 * and shall not be used by the caller. 612 * @retval -ENOTSUP 613 * Operation is not supported. 614 * @retval -EIO 615 * Device is removed. 616 * @retval -EINVAL 617 * *num* or *speed_fec_capa* invalid. 618 */ 619 typedef int (*eth_fec_get_capability_t)(struct rte_eth_dev *dev, 620 struct rte_eth_fec_capa *speed_fec_capa, unsigned int num); 621 622 /** 623 * @internal 624 * Get Forward Error Correction(FEC) mode. 625 * 626 * @param dev 627 * ethdev handle of port. 628 * @param fec_capa 629 * a bitmask of enabled FEC modes. If AUTO bit is set, other 630 * bits specify FEC modes which may be negotiated. If AUTO 631 * bit is clear, specify FEC modes to be used (only one valid 632 * mode per speed may be set). 633 * 634 * @return 635 * Negative errno value on error, 0 on success. 636 * 637 * @retval 0 638 * Success, get FEC success. 639 * @retval -ENOTSUP 640 * Operation is not supported. 641 * @retval -EIO 642 * Device is removed. 643 */ 644 typedef int (*eth_fec_get_t)(struct rte_eth_dev *dev, 645 uint32_t *fec_capa); 646 647 /** 648 * @internal 649 * Set Forward Error Correction(FEC) mode. 650 * 651 * @param dev 652 * ethdev handle of port. 653 * @param fec_capa 654 * bitmask of allowed FEC modes. It must be only one 655 * if AUTO is disabled. If AUTO is enabled, other 656 * bits specify FEC modes which may be negotiated. 657 * 658 * @return 659 * Negative errno value on error, 0 on success. 660 * 661 * @retval 0 662 * Success, set FEC success. 663 * @retval -ENOTSUP 664 * Operation is not supported. 665 * @retval -EINVAL 666 * Unsupported FEC mode requested. 667 * @retval -EIO 668 * Device is removed. 669 */ 670 typedef int (*eth_fec_set_t)(struct rte_eth_dev *dev, uint32_t fec_capa); 671 672 /** 673 * @internal 674 * Get all hairpin Tx/Rx peer ports of the current device, if any. 675 * 676 * @param dev 677 * ethdev handle of port. 678 * @param peer_ports 679 * array to save the ports list. 680 * @param len 681 * array length. 682 * @param direction 683 * value to decide the current to peer direction 684 * positive - used as Tx to get all peer Rx ports. 685 * zero - used as Rx to get all peer Tx ports. 686 * 687 * @return 688 * Negative errno value on error, 0 or positive on success. 689 * 690 * @retval 0 691 * Success, no peer ports. 692 * @retval >0 693 * Actual number of the peer ports. 694 * @retval -ENOTSUP 695 * Get peer ports API is not supported. 696 * @retval -EINVAL 697 * One of the parameters is invalid. 698 */ 699 typedef int (*hairpin_get_peer_ports_t)(struct rte_eth_dev *dev, 700 uint16_t *peer_ports, size_t len, 701 uint32_t direction); 702 703 /** 704 * @internal 705 * Bind all hairpin Tx queues of one port to the Rx queues of the peer port. 706 * 707 * @param dev 708 * ethdev handle of port. 709 * @param rx_port 710 * the peer Rx port. 711 * 712 * @return 713 * Negative errno value on error, 0 on success. 714 * 715 * @retval 0 716 * Success, bind successfully. 717 * @retval -ENOTSUP 718 * Bind API is not supported. 719 * @retval -EINVAL 720 * One of the parameters is invalid. 721 * @retval -EBUSY 722 * Device is not started. 723 */ 724 typedef int (*eth_hairpin_bind_t)(struct rte_eth_dev *dev, 725 uint16_t rx_port); 726 727 /** 728 * @internal 729 * Unbind all hairpin Tx queues of one port from the Rx queues of the peer port. 730 * 731 * @param dev 732 * ethdev handle of port. 733 * @param rx_port 734 * the peer Rx port. 735 * 736 * @return 737 * Negative errno value on error, 0 on success. 738 * 739 * @retval 0 740 * Success, unbind successfully. 741 * @retval -ENOTSUP 742 * Bind API is not supported. 743 * @retval -EINVAL 744 * One of the parameters is invalid. 745 * @retval -EBUSY 746 * Device is already stopped. 747 */ 748 typedef int (*eth_hairpin_unbind_t)(struct rte_eth_dev *dev, 749 uint16_t rx_port); 750 751 typedef int (*eth_hairpin_queue_peer_update_t) 752 (struct rte_eth_dev *dev, uint16_t peer_queue, 753 struct rte_hairpin_peer_info *current_info, 754 struct rte_hairpin_peer_info *peer_info, uint32_t direction); 755 /**< @internal Update and fetch peer queue information. */ 756 757 typedef int (*eth_hairpin_queue_peer_bind_t) 758 (struct rte_eth_dev *dev, uint16_t cur_queue, 759 struct rte_hairpin_peer_info *peer_info, uint32_t direction); 760 /**< @internal Bind peer queue to the current queue with fetched information. */ 761 762 typedef int (*eth_hairpin_queue_peer_unbind_t) 763 (struct rte_eth_dev *dev, uint16_t cur_queue, uint32_t direction); 764 /**< @internal Unbind peer queue from the current queue. */ 765 766 /** 767 * @internal A structure containing the functions exported by an Ethernet driver. 768 */ 769 struct eth_dev_ops { 770 eth_dev_configure_t dev_configure; /**< Configure device. */ 771 eth_dev_start_t dev_start; /**< Start device. */ 772 eth_dev_stop_t dev_stop; /**< Stop device. */ 773 eth_dev_set_link_up_t dev_set_link_up; /**< Device link up. */ 774 eth_dev_set_link_down_t dev_set_link_down; /**< Device link down. */ 775 eth_dev_close_t dev_close; /**< Close device. */ 776 eth_dev_reset_t dev_reset; /**< Reset device. */ 777 eth_link_update_t link_update; /**< Get device link state. */ 778 eth_is_removed_t is_removed; 779 /**< Check if the device was physically removed. */ 780 781 eth_promiscuous_enable_t promiscuous_enable; /**< Promiscuous ON. */ 782 eth_promiscuous_disable_t promiscuous_disable;/**< Promiscuous OFF. */ 783 eth_allmulticast_enable_t allmulticast_enable;/**< RX multicast ON. */ 784 eth_allmulticast_disable_t allmulticast_disable;/**< RX multicast OFF. */ 785 eth_mac_addr_remove_t mac_addr_remove; /**< Remove MAC address. */ 786 eth_mac_addr_add_t mac_addr_add; /**< Add a MAC address. */ 787 eth_mac_addr_set_t mac_addr_set; /**< Set a MAC address. */ 788 eth_set_mc_addr_list_t set_mc_addr_list; /**< set list of mcast addrs. */ 789 mtu_set_t mtu_set; /**< Set MTU. */ 790 791 eth_stats_get_t stats_get; /**< Get generic device statistics. */ 792 eth_stats_reset_t stats_reset; /**< Reset generic device statistics. */ 793 eth_xstats_get_t xstats_get; /**< Get extended device statistics. */ 794 eth_xstats_reset_t xstats_reset; /**< Reset extended device statistics. */ 795 eth_xstats_get_names_t xstats_get_names; 796 /**< Get names of extended statistics. */ 797 eth_queue_stats_mapping_set_t queue_stats_mapping_set; 798 /**< Configure per queue stat counter mapping. */ 799 800 eth_dev_infos_get_t dev_infos_get; /**< Get device info. */ 801 eth_rxq_info_get_t rxq_info_get; /**< retrieve RX queue information. */ 802 eth_txq_info_get_t txq_info_get; /**< retrieve TX queue information. */ 803 eth_burst_mode_get_t rx_burst_mode_get; /**< Get RX burst mode */ 804 eth_burst_mode_get_t tx_burst_mode_get; /**< Get TX burst mode */ 805 eth_fw_version_get_t fw_version_get; /**< Get firmware version. */ 806 eth_dev_supported_ptypes_get_t dev_supported_ptypes_get; 807 /**< Get packet types supported and identified by device. */ 808 eth_dev_ptypes_set_t dev_ptypes_set; 809 /**< Inform Ethernet device about reduced range of packet types to handle. */ 810 811 vlan_filter_set_t vlan_filter_set; /**< Filter VLAN Setup. */ 812 vlan_tpid_set_t vlan_tpid_set; /**< Outer/Inner VLAN TPID Setup. */ 813 vlan_strip_queue_set_t vlan_strip_queue_set; /**< VLAN Stripping on queue. */ 814 vlan_offload_set_t vlan_offload_set; /**< Set VLAN Offload. */ 815 vlan_pvid_set_t vlan_pvid_set; /**< Set port based TX VLAN insertion. */ 816 817 eth_queue_start_t rx_queue_start;/**< Start RX for a queue. */ 818 eth_queue_stop_t rx_queue_stop; /**< Stop RX for a queue. */ 819 eth_queue_start_t tx_queue_start;/**< Start TX for a queue. */ 820 eth_queue_stop_t tx_queue_stop; /**< Stop TX for a queue. */ 821 eth_rx_queue_setup_t rx_queue_setup;/**< Set up device RX queue. */ 822 eth_queue_release_t rx_queue_release; /**< Release RX queue. */ 823 824 eth_rx_enable_intr_t rx_queue_intr_enable; /**< Enable Rx queue interrupt. */ 825 eth_rx_disable_intr_t rx_queue_intr_disable; /**< Disable Rx queue interrupt. */ 826 eth_tx_queue_setup_t tx_queue_setup;/**< Set up device TX queue. */ 827 eth_queue_release_t tx_queue_release; /**< Release TX queue. */ 828 eth_tx_done_cleanup_t tx_done_cleanup;/**< Free tx ring mbufs */ 829 830 eth_dev_led_on_t dev_led_on; /**< Turn on LED. */ 831 eth_dev_led_off_t dev_led_off; /**< Turn off LED. */ 832 833 flow_ctrl_get_t flow_ctrl_get; /**< Get flow control. */ 834 flow_ctrl_set_t flow_ctrl_set; /**< Setup flow control. */ 835 priority_flow_ctrl_set_t priority_flow_ctrl_set; /**< Setup priority flow control. */ 836 837 eth_uc_hash_table_set_t uc_hash_table_set; /**< Set Unicast Table Array. */ 838 eth_uc_all_hash_table_set_t uc_all_hash_table_set; /**< Set Unicast hash bitmap. */ 839 840 eth_mirror_rule_set_t mirror_rule_set; /**< Add a traffic mirror rule. */ 841 eth_mirror_rule_reset_t mirror_rule_reset; /**< reset a traffic mirror rule. */ 842 843 eth_udp_tunnel_port_add_t udp_tunnel_port_add; /** Add UDP tunnel port. */ 844 eth_udp_tunnel_port_del_t udp_tunnel_port_del; /** Del UDP tunnel port. */ 845 846 eth_set_queue_rate_limit_t set_queue_rate_limit; /**< Set queue rate limit. */ 847 848 rss_hash_update_t rss_hash_update; /** Configure RSS hash protocols. */ 849 rss_hash_conf_get_t rss_hash_conf_get; /** Get current RSS hash configuration. */ 850 reta_update_t reta_update; /** Update redirection table. */ 851 reta_query_t reta_query; /** Query redirection table. */ 852 853 eth_get_reg_t get_reg; /**< Get registers. */ 854 eth_get_eeprom_length_t get_eeprom_length; /**< Get eeprom length. */ 855 eth_get_eeprom_t get_eeprom; /**< Get eeprom data. */ 856 eth_set_eeprom_t set_eeprom; /**< Set eeprom. */ 857 858 eth_get_module_info_t get_module_info; 859 /** Get plugin module eeprom attribute. */ 860 eth_get_module_eeprom_t get_module_eeprom; 861 /** Get plugin module eeprom data. */ 862 863 eth_filter_ctrl_t filter_ctrl; /**< common filter control. */ 864 865 eth_get_dcb_info get_dcb_info; /** Get DCB information. */ 866 867 eth_timesync_enable_t timesync_enable; 868 /** Turn IEEE1588/802.1AS timestamping on. */ 869 eth_timesync_disable_t timesync_disable; 870 /** Turn IEEE1588/802.1AS timestamping off. */ 871 eth_timesync_read_rx_timestamp_t timesync_read_rx_timestamp; 872 /** Read the IEEE1588/802.1AS RX timestamp. */ 873 eth_timesync_read_tx_timestamp_t timesync_read_tx_timestamp; 874 /** Read the IEEE1588/802.1AS TX timestamp. */ 875 eth_timesync_adjust_time timesync_adjust_time; /** Adjust the device clock. */ 876 eth_timesync_read_time timesync_read_time; /** Get the device clock time. */ 877 eth_timesync_write_time timesync_write_time; /** Set the device clock time. */ 878 879 eth_read_clock read_clock; 880 881 eth_xstats_get_by_id_t xstats_get_by_id; 882 /**< Get extended device statistic values by ID. */ 883 eth_xstats_get_names_by_id_t xstats_get_names_by_id; 884 /**< Get name of extended device statistics by ID. */ 885 886 eth_tm_ops_get_t tm_ops_get; 887 /**< Get Traffic Management (TM) operations. */ 888 889 eth_mtr_ops_get_t mtr_ops_get; 890 /**< Get Traffic Metering and Policing (MTR) operations. */ 891 892 eth_pool_ops_supported_t pool_ops_supported; 893 /**< Test if a port supports specific mempool ops */ 894 895 eth_hairpin_cap_get_t hairpin_cap_get; 896 /**< Returns the hairpin capabilities. */ 897 eth_rx_hairpin_queue_setup_t rx_hairpin_queue_setup; 898 /**< Set up device RX hairpin queue. */ 899 eth_tx_hairpin_queue_setup_t tx_hairpin_queue_setup; 900 /**< Set up device TX hairpin queue. */ 901 902 eth_fec_get_capability_t fec_get_capability; 903 /**< Get Forward Error Correction(FEC) capability. */ 904 eth_fec_get_t fec_get; 905 /**< Get Forward Error Correction(FEC) mode. */ 906 eth_fec_set_t fec_set; 907 /**< Set Forward Error Correction(FEC) mode. */ 908 hairpin_get_peer_ports_t hairpin_get_peer_ports; 909 /**< Get hairpin peer ports list. */ 910 eth_hairpin_bind_t hairpin_bind; 911 /**< Bind all hairpin Tx queues of device to the peer port Rx queues. */ 912 eth_hairpin_unbind_t hairpin_unbind; 913 /**< Unbind all hairpin Tx queues from the peer port Rx queues. */ 914 eth_hairpin_queue_peer_update_t hairpin_queue_peer_update; 915 /**< Pass the current queue info and get the peer queue info. */ 916 eth_hairpin_queue_peer_bind_t hairpin_queue_peer_bind; 917 /**< Set up the connection between the pair of hairpin queues. */ 918 eth_hairpin_queue_peer_unbind_t hairpin_queue_peer_unbind; 919 /**< Disconnect the hairpin queues of a pair from each other. */ 920 }; 921 922 /** 923 * RX/TX queue states 924 */ 925 #define RTE_ETH_QUEUE_STATE_STOPPED 0 926 #define RTE_ETH_QUEUE_STATE_STARTED 1 927 #define RTE_ETH_QUEUE_STATE_HAIRPIN 2 928 929 /** 930 * @internal 931 * Check if the selected Rx queue is hairpin queue. 932 * 933 * @param dev 934 * Pointer to the selected device. 935 * @param queue_id 936 * The selected queue. 937 * 938 * @return 939 * - (1) if the queue is hairpin queue, 0 otherwise. 940 */ 941 __rte_internal 942 int rte_eth_dev_is_rx_hairpin_queue(struct rte_eth_dev *dev, uint16_t queue_id); 943 944 /** 945 * @internal 946 * Check if the selected Tx queue is hairpin queue. 947 * 948 * @param dev 949 * Pointer to the selected device. 950 * @param queue_id 951 * The selected queue. 952 * 953 * @return 954 * - (1) if the queue is hairpin queue, 0 otherwise. 955 */ 956 __rte_internal 957 int rte_eth_dev_is_tx_hairpin_queue(struct rte_eth_dev *dev, uint16_t queue_id); 958 959 /** 960 * @internal 961 * Returns a ethdev slot specified by the unique identifier name. 962 * 963 * @param name 964 * The pointer to the Unique identifier name for each Ethernet device 965 * @return 966 * - The pointer to the ethdev slot, on success. NULL on error 967 */ 968 __rte_internal 969 struct rte_eth_dev *rte_eth_dev_allocated(const char *name); 970 971 /** 972 * @internal 973 * Allocates a new ethdev slot for an ethernet device and returns the pointer 974 * to that slot for the driver to use. 975 * 976 * @param name Unique identifier name for each Ethernet device 977 * @return 978 * - Slot in the rte_dev_devices array for a new device; 979 */ 980 __rte_internal 981 struct rte_eth_dev *rte_eth_dev_allocate(const char *name); 982 983 /** 984 * @internal 985 * Attach to the ethdev already initialized by the primary 986 * process. 987 * 988 * @param name Ethernet device's name. 989 * @return 990 * - Success: Slot in the rte_dev_devices array for attached 991 * device. 992 * - Error: Null pointer. 993 */ 994 __rte_internal 995 struct rte_eth_dev *rte_eth_dev_attach_secondary(const char *name); 996 997 /** 998 * @internal 999 * Notify RTE_ETH_EVENT_DESTROY and release the specified ethdev port. 1000 * 1001 * The following PMD-managed data fields will be freed: 1002 * - dev_private 1003 * - mac_addrs 1004 * - hash_mac_addrs 1005 * If one of these fields should not be freed, 1006 * it must be reset to NULL by the PMD, typically in dev_close method. 1007 * 1008 * @param eth_dev 1009 * Device to be detached. 1010 * @return 1011 * - 0 on success, negative on error 1012 */ 1013 __rte_internal 1014 int rte_eth_dev_release_port(struct rte_eth_dev *eth_dev); 1015 1016 /** 1017 * @internal 1018 * Release device queues and clear its configuration to force the user 1019 * application to reconfigure it. It is for internal use only. 1020 * 1021 * @param dev 1022 * Pointer to struct rte_eth_dev. 1023 * 1024 * @return 1025 * void 1026 */ 1027 __rte_internal 1028 void rte_eth_dev_internal_reset(struct rte_eth_dev *dev); 1029 1030 /** 1031 * @internal Executes all the user application registered callbacks for 1032 * the specific device. It is for DPDK internal user only. User 1033 * application should not call it directly. 1034 * 1035 * @param dev 1036 * Pointer to struct rte_eth_dev. 1037 * @param event 1038 * Eth device interrupt event type. 1039 * @param ret_param 1040 * To pass data back to user application. 1041 * This allows the user application to decide if a particular function 1042 * is permitted or not. 1043 * 1044 * @return 1045 * int 1046 */ 1047 __rte_internal 1048 int rte_eth_dev_callback_process(struct rte_eth_dev *dev, 1049 enum rte_eth_event_type event, void *ret_param); 1050 1051 /** 1052 * @internal 1053 * This is the last step of device probing. 1054 * It must be called after a port is allocated and initialized successfully. 1055 * 1056 * The notification RTE_ETH_EVENT_NEW is sent to other entities 1057 * (libraries and applications). 1058 * The state is set as RTE_ETH_DEV_ATTACHED. 1059 * 1060 * @param dev 1061 * New ethdev port. 1062 */ 1063 __rte_internal 1064 void rte_eth_dev_probing_finish(struct rte_eth_dev *dev); 1065 1066 /** 1067 * Create memzone for HW rings. 1068 * malloc can't be used as the physical address is needed. 1069 * If the memzone is already created, then this function returns a ptr 1070 * to the old one. 1071 * 1072 * @param eth_dev 1073 * The *eth_dev* pointer is the address of the *rte_eth_dev* structure 1074 * @param name 1075 * The name of the memory zone 1076 * @param queue_id 1077 * The index of the queue to add to name 1078 * @param size 1079 * The sizeof of the memory area 1080 * @param align 1081 * Alignment for resulting memzone. Must be a power of 2. 1082 * @param socket_id 1083 * The *socket_id* argument is the socket identifier in case of NUMA. 1084 */ 1085 __rte_internal 1086 const struct rte_memzone * 1087 rte_eth_dma_zone_reserve(const struct rte_eth_dev *eth_dev, const char *name, 1088 uint16_t queue_id, size_t size, 1089 unsigned align, int socket_id); 1090 1091 /** 1092 * Free previously allocated memzone for HW rings. 1093 * 1094 * @param eth_dev 1095 * The *eth_dev* pointer is the address of the *rte_eth_dev* structure 1096 * @param name 1097 * The name of the memory zone 1098 * @param queue_id 1099 * The index of the queue to add to name 1100 * @return 1101 * Negative errno value on error, 0 on success. 1102 */ 1103 __rte_internal 1104 int 1105 rte_eth_dma_zone_free(const struct rte_eth_dev *eth_dev, const char *name, 1106 uint16_t queue_id); 1107 1108 /** 1109 * @internal 1110 * Atomically set the link status for the specific device. 1111 * It is for use by DPDK device driver use only. 1112 * User applications should not call it 1113 * 1114 * @param dev 1115 * Pointer to struct rte_eth_dev. 1116 * @param link 1117 * New link status value. 1118 * @return 1119 * Same convention as eth_link_update operation. 1120 * 0 if link up status has changed 1121 * -1 if link up status was unchanged 1122 */ 1123 static inline int 1124 rte_eth_linkstatus_set(struct rte_eth_dev *dev, 1125 const struct rte_eth_link *new_link) 1126 { 1127 uint64_t *dev_link = (uint64_t *)&(dev->data->dev_link); 1128 union { 1129 uint64_t val64; 1130 struct rte_eth_link link; 1131 } orig; 1132 1133 RTE_BUILD_BUG_ON(sizeof(*new_link) != sizeof(uint64_t)); 1134 1135 orig.val64 = __atomic_exchange_n(dev_link, *(const uint64_t *)new_link, 1136 __ATOMIC_SEQ_CST); 1137 1138 return (orig.link.link_status == new_link->link_status) ? -1 : 0; 1139 } 1140 1141 /** 1142 * @internal 1143 * Atomically get the link speed and status. 1144 * 1145 * @param dev 1146 * Pointer to struct rte_eth_dev. 1147 * @param link 1148 * link status value. 1149 */ 1150 static inline void 1151 rte_eth_linkstatus_get(const struct rte_eth_dev *dev, 1152 struct rte_eth_link *link) 1153 { 1154 uint64_t *src = (uint64_t *)&(dev->data->dev_link); 1155 uint64_t *dst = (uint64_t *)link; 1156 1157 RTE_BUILD_BUG_ON(sizeof(*link) != sizeof(uint64_t)); 1158 1159 *dst = __atomic_load_n(src, __ATOMIC_SEQ_CST); 1160 } 1161 1162 /** 1163 * Allocate an unique switch domain identifier. 1164 * 1165 * A pool of switch domain identifiers which can be allocated on request. This 1166 * will enabled devices which support the concept of switch domains to request 1167 * a switch domain id which is guaranteed to be unique from other devices 1168 * running in the same process. 1169 * 1170 * @param domain_id 1171 * switch domain identifier parameter to pass back to application 1172 * 1173 * @return 1174 * Negative errno value on error, 0 on success. 1175 */ 1176 __rte_internal 1177 int 1178 rte_eth_switch_domain_alloc(uint16_t *domain_id); 1179 1180 /** 1181 * Free switch domain. 1182 * 1183 * Return a switch domain identifier to the pool of free identifiers after it is 1184 * no longer in use by device. 1185 * 1186 * @param domain_id 1187 * switch domain identifier to free 1188 * 1189 * @return 1190 * Negative errno value on error, 0 on success. 1191 */ 1192 __rte_internal 1193 int 1194 rte_eth_switch_domain_free(uint16_t domain_id); 1195 1196 /** Generic Ethernet device arguments */ 1197 struct rte_eth_devargs { 1198 uint16_t ports[RTE_MAX_ETHPORTS]; 1199 /** port/s number to enable on a multi-port single function */ 1200 uint16_t nb_ports; 1201 /** number of ports in ports field */ 1202 uint16_t representor_ports[RTE_MAX_ETHPORTS]; 1203 /** representor port/s identifier to enable on device */ 1204 uint16_t nb_representor_ports; 1205 /** number of ports in representor port field */ 1206 }; 1207 1208 /** 1209 * PMD helper function to parse ethdev arguments 1210 * 1211 * @param devargs 1212 * device arguments 1213 * @param eth_devargs 1214 * parsed ethdev specific arguments. 1215 * 1216 * @return 1217 * Negative errno value on error, 0 on success. 1218 */ 1219 __rte_internal 1220 int 1221 rte_eth_devargs_parse(const char *devargs, struct rte_eth_devargs *eth_devargs); 1222 1223 1224 typedef int (*ethdev_init_t)(struct rte_eth_dev *ethdev, void *init_params); 1225 typedef int (*ethdev_bus_specific_init)(struct rte_eth_dev *ethdev, 1226 void *bus_specific_init_params); 1227 1228 /** 1229 * PMD helper function for the creation of a new ethdev ports. 1230 * 1231 * @param device 1232 * rte_device handle. 1233 * @param name 1234 * port name. 1235 * @param priv_data_size 1236 * size of private data required for port. 1237 * @param bus_specific_init 1238 * port bus specific initialisation callback function 1239 * @param bus_init_params 1240 * port bus specific initialisation parameters 1241 * @param ethdev_init 1242 * device specific port initialization callback function 1243 * @param init_params 1244 * port initialisation parameters 1245 * 1246 * @return 1247 * Negative errno value on error, 0 on success. 1248 */ 1249 __rte_internal 1250 int 1251 rte_eth_dev_create(struct rte_device *device, const char *name, 1252 size_t priv_data_size, 1253 ethdev_bus_specific_init bus_specific_init, void *bus_init_params, 1254 ethdev_init_t ethdev_init, void *init_params); 1255 1256 1257 typedef int (*ethdev_uninit_t)(struct rte_eth_dev *ethdev); 1258 1259 /** 1260 * PMD helper function for cleaning up the resources of a ethdev port on it's 1261 * destruction. 1262 * 1263 * @param ethdev 1264 * ethdev handle of port. 1265 * @param ethdev_uninit 1266 * device specific port un-initialise callback function 1267 * 1268 * @return 1269 * Negative errno value on error, 0 on success. 1270 */ 1271 __rte_internal 1272 int 1273 rte_eth_dev_destroy(struct rte_eth_dev *ethdev, ethdev_uninit_t ethdev_uninit); 1274 1275 /** 1276 * @internal 1277 * Pass the current hairpin queue HW and/or SW information to the peer queue 1278 * and fetch back the information of the peer queue. 1279 * 1280 * @param peer_port 1281 * Peer port identifier of the Ethernet device. 1282 * @param peer_queue 1283 * Peer queue index of the port. 1284 * @param cur_info 1285 * Pointer to the current information structure. 1286 * @param peer_info 1287 * Pointer to the peer information, output. 1288 * @param direction 1289 * Direction to pass the information. 1290 * positive - pass Tx queue information and get peer Rx queue information 1291 * zero - pass Rx queue information and get peer Tx queue information 1292 * 1293 * @return 1294 * Negative errno value on error, 0 on success. 1295 */ 1296 __rte_internal 1297 int 1298 rte_eth_hairpin_queue_peer_update(uint16_t peer_port, uint16_t peer_queue, 1299 struct rte_hairpin_peer_info *cur_info, 1300 struct rte_hairpin_peer_info *peer_info, 1301 uint32_t direction); 1302 1303 /** 1304 * @internal 1305 * Configure current hairpin queue with the peer information fetched to create 1306 * the connection (bind) with peer queue in the specified direction. 1307 * This function might need to be called twice to fully create the connections. 1308 * 1309 * @param cur_port 1310 * Current port identifier of the Ethernet device. 1311 * @param cur_queue 1312 * Current queue index of the port. 1313 * @param peer_info 1314 * Pointer to the peer information, input. 1315 * @param direction 1316 * Direction to create the connection. 1317 * positive - bind current Tx queue to peer Rx queue 1318 * zero - bind current Rx queue to peer Tx queue 1319 * 1320 * @return 1321 * Negative errno value on error, 0 on success. 1322 */ 1323 __rte_internal 1324 int 1325 rte_eth_hairpin_queue_peer_bind(uint16_t cur_port, uint16_t cur_queue, 1326 struct rte_hairpin_peer_info *peer_info, 1327 uint32_t direction); 1328 1329 /** 1330 * @internal 1331 * Reset the current queue state and configuration to disconnect (unbind) it 1332 * from the peer queue. 1333 * This function might need to be called twice to disconnect each other. 1334 * 1335 * @param cur_port 1336 * Current port identifier of the Ethernet device. 1337 * @param cur_queue 1338 * Current queue index of the port. 1339 * @param direction 1340 * Direction to destroy the connection. 1341 * positive - unbind current Tx queue from peer Rx queue 1342 * zero - unbind current Rx queue from peer Tx queue 1343 * 1344 * @return 1345 * Negative errno value on error, 0 on success. 1346 */ 1347 __rte_internal 1348 int 1349 rte_eth_hairpin_queue_peer_unbind(uint16_t cur_port, uint16_t cur_queue, 1350 uint32_t direction); 1351 1352 1353 /* 1354 * Legacy ethdev API used internally by drivers. 1355 */ 1356 1357 /** 1358 * Define all structures for Ethertype Filter type. 1359 */ 1360 1361 #define RTE_ETHTYPE_FLAGS_MAC 0x0001 /**< If set, compare mac */ 1362 #define RTE_ETHTYPE_FLAGS_DROP 0x0002 /**< If set, drop packet when match */ 1363 1364 /** 1365 * A structure used to define the ethertype filter entry 1366 * to support RTE_ETH_FILTER_ETHERTYPE data representation. 1367 */ 1368 struct rte_eth_ethertype_filter { 1369 struct rte_ether_addr mac_addr; /**< Mac address to match. */ 1370 uint16_t ether_type; /**< Ether type to match */ 1371 uint16_t flags; /**< Flags from RTE_ETHTYPE_FLAGS_* */ 1372 uint16_t queue; /**< Queue assigned to when match*/ 1373 }; 1374 1375 /** 1376 * A structure used to define the TCP syn filter entry 1377 * to support RTE_ETH_FILTER_SYN data representation. 1378 */ 1379 struct rte_eth_syn_filter { 1380 /** 1 - higher priority than other filters, 0 - lower priority. */ 1381 uint8_t hig_pri; 1382 uint16_t queue; /**< Queue assigned to when match */ 1383 }; 1384 1385 /** 1386 * filter type of tunneling packet 1387 */ 1388 #define ETH_TUNNEL_FILTER_OMAC 0x01 /**< filter by outer MAC addr */ 1389 #define ETH_TUNNEL_FILTER_OIP 0x02 /**< filter by outer IP Addr */ 1390 #define ETH_TUNNEL_FILTER_TENID 0x04 /**< filter by tenant ID */ 1391 #define ETH_TUNNEL_FILTER_IMAC 0x08 /**< filter by inner MAC addr */ 1392 #define ETH_TUNNEL_FILTER_IVLAN 0x10 /**< filter by inner VLAN ID */ 1393 #define ETH_TUNNEL_FILTER_IIP 0x20 /**< filter by inner IP addr */ 1394 1395 #define RTE_TUNNEL_FILTER_IMAC_IVLAN (ETH_TUNNEL_FILTER_IMAC | \ 1396 ETH_TUNNEL_FILTER_IVLAN) 1397 #define RTE_TUNNEL_FILTER_IMAC_IVLAN_TENID (ETH_TUNNEL_FILTER_IMAC | \ 1398 ETH_TUNNEL_FILTER_IVLAN | \ 1399 ETH_TUNNEL_FILTER_TENID) 1400 #define RTE_TUNNEL_FILTER_IMAC_TENID (ETH_TUNNEL_FILTER_IMAC | \ 1401 ETH_TUNNEL_FILTER_TENID) 1402 #define RTE_TUNNEL_FILTER_OMAC_TENID_IMAC (ETH_TUNNEL_FILTER_OMAC | \ 1403 ETH_TUNNEL_FILTER_TENID | \ 1404 ETH_TUNNEL_FILTER_IMAC) 1405 1406 /** 1407 * Select IPv4 or IPv6 for tunnel filters. 1408 */ 1409 enum rte_tunnel_iptype { 1410 RTE_TUNNEL_IPTYPE_IPV4 = 0, /**< IPv4. */ 1411 RTE_TUNNEL_IPTYPE_IPV6, /**< IPv6. */ 1412 }; 1413 1414 /** 1415 * Tunneling Packet filter configuration. 1416 */ 1417 struct rte_eth_tunnel_filter_conf { 1418 struct rte_ether_addr outer_mac; /**< Outer MAC address to match. */ 1419 struct rte_ether_addr inner_mac; /**< Inner MAC address to match. */ 1420 uint16_t inner_vlan; /**< Inner VLAN to match. */ 1421 enum rte_tunnel_iptype ip_type; /**< IP address type. */ 1422 /** 1423 * Outer destination IP address to match if ETH_TUNNEL_FILTER_OIP 1424 * is set in filter_type, or inner destination IP address to match 1425 * if ETH_TUNNEL_FILTER_IIP is set in filter_type. 1426 */ 1427 union { 1428 uint32_t ipv4_addr; /**< IPv4 address in big endian. */ 1429 uint32_t ipv6_addr[4]; /**< IPv6 address in big endian. */ 1430 } ip_addr; 1431 /** Flags from ETH_TUNNEL_FILTER_XX - see above. */ 1432 uint16_t filter_type; 1433 enum rte_eth_tunnel_type tunnel_type; /**< Tunnel Type. */ 1434 uint32_t tenant_id; /**< Tenant ID to match. VNI, GRE key... */ 1435 uint16_t queue_id; /**< Queue assigned to if match. */ 1436 }; 1437 1438 #ifdef __cplusplus 1439 } 1440 #endif 1441 1442 #endif /* _RTE_ETHDEV_DRIVER_H_ */ 1443