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