199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 299a2dd95SBruce Richardson * Copyright(c) 2017 Intel Corporation 399a2dd95SBruce Richardson */ 499a2dd95SBruce Richardson 599a2dd95SBruce Richardson #ifndef _RTE_ETHDEV_CORE_H_ 699a2dd95SBruce Richardson #define _RTE_ETHDEV_CORE_H_ 799a2dd95SBruce Richardson 899a2dd95SBruce Richardson /** 999a2dd95SBruce Richardson * @file 1099a2dd95SBruce Richardson * 1199a2dd95SBruce Richardson * RTE Ethernet Device internal header. 1299a2dd95SBruce Richardson * 1399a2dd95SBruce Richardson * This header contains internal data types. But they are still part of the 1499a2dd95SBruce Richardson * public API because they are used by inline functions in the published API. 1599a2dd95SBruce Richardson * 1699a2dd95SBruce Richardson * Applications should not use these directly. 1799a2dd95SBruce Richardson */ 1899a2dd95SBruce Richardson 1999a2dd95SBruce Richardson struct rte_eth_dev_callback; 2099a2dd95SBruce Richardson /** @internal Structure to keep track of registered callbacks */ 21f1f6ebc0SWilliam Tu RTE_TAILQ_HEAD(rte_eth_dev_cb_list, rte_eth_dev_callback); 2299a2dd95SBruce Richardson 2399a2dd95SBruce Richardson struct rte_eth_dev; 2499a2dd95SBruce Richardson 253c2ca0a9SAndrew Rybchenko /** 263c2ca0a9SAndrew Rybchenko * @internal Retrieve input packets from a receive queue of an Ethernet device. 273c2ca0a9SAndrew Rybchenko */ 2899a2dd95SBruce Richardson typedef uint16_t (*eth_rx_burst_t)(void *rxq, 2999a2dd95SBruce Richardson struct rte_mbuf **rx_pkts, 3099a2dd95SBruce Richardson uint16_t nb_pkts); 3199a2dd95SBruce Richardson 323c2ca0a9SAndrew Rybchenko /** 333c2ca0a9SAndrew Rybchenko * @internal Send output packets on a transmit queue of an Ethernet device. 343c2ca0a9SAndrew Rybchenko */ 3599a2dd95SBruce Richardson typedef uint16_t (*eth_tx_burst_t)(void *txq, 3699a2dd95SBruce Richardson struct rte_mbuf **tx_pkts, 3799a2dd95SBruce Richardson uint16_t nb_pkts); 3899a2dd95SBruce Richardson 393c2ca0a9SAndrew Rybchenko /** 403c2ca0a9SAndrew Rybchenko * @internal Prepare output packets on a transmit queue of an Ethernet device. 413c2ca0a9SAndrew Rybchenko */ 4299a2dd95SBruce Richardson typedef uint16_t (*eth_tx_prep_t)(void *txq, 4399a2dd95SBruce Richardson struct rte_mbuf **tx_pkts, 4499a2dd95SBruce Richardson uint16_t nb_pkts); 4599a2dd95SBruce Richardson 4699a2dd95SBruce Richardson 473c2ca0a9SAndrew Rybchenko /** @internal Get number of used descriptors on a receive queue. */ 488d7d4fcdSKonstantin Ananyev typedef uint32_t (*eth_rx_queue_count_t)(void *rxq); 4999a2dd95SBruce Richardson 503c2ca0a9SAndrew Rybchenko /** @internal Check the status of a Rx descriptor */ 5199a2dd95SBruce Richardson typedef int (*eth_rx_descriptor_status_t)(void *rxq, uint16_t offset); 5299a2dd95SBruce Richardson 53d4b9235fSJerin Jacob /** @internal Get number of used descriptors on a transmit queue. */ 54d4b9235fSJerin Jacob typedef int (*eth_tx_queue_count_t)(void *txq); 55d4b9235fSJerin Jacob 563c2ca0a9SAndrew Rybchenko /** @internal Check the status of a Tx descriptor */ 5799a2dd95SBruce Richardson typedef int (*eth_tx_descriptor_status_t)(void *txq, uint16_t offset); 5899a2dd95SBruce Richardson 59e43d2b89SFeifei Wang /** @internal Copy used mbufs from Tx mbuf ring into Rx mbuf ring */ 60e43d2b89SFeifei Wang typedef uint16_t (*eth_recycle_tx_mbufs_reuse_t)(void *txq, 61e43d2b89SFeifei Wang struct rte_eth_recycle_rxq_info *recycle_rxq_info); 62e43d2b89SFeifei Wang 63e43d2b89SFeifei Wang /** @internal Refill Rx descriptors with the recycling mbufs */ 64e43d2b89SFeifei Wang typedef void (*eth_recycle_rx_descriptors_refill_t)(void *rxq, uint16_t nb); 65e43d2b89SFeifei Wang 66c87d435aSKonstantin Ananyev /** 67c87d435aSKonstantin Ananyev * @internal 68c87d435aSKonstantin Ananyev * Structure used to hold opaque pointers to internal ethdev Rx/Tx 69c87d435aSKonstantin Ananyev * queues data. 70c87d435aSKonstantin Ananyev * The main purpose to expose these pointers at all - allow compiler 71c87d435aSKonstantin Ananyev * to fetch this data for fast-path ethdev inline functions in advance. 72c87d435aSKonstantin Ananyev */ 73c87d435aSKonstantin Ananyev struct rte_ethdev_qdata { 74c87d435aSKonstantin Ananyev /** points to array of internal queue data pointers */ 75c87d435aSKonstantin Ananyev void **data; 76c87d435aSKonstantin Ananyev /** points to array of queue callback data pointers */ 77f7053f01STyler Retzlaff RTE_ATOMIC(void *) *clbk; 78c87d435aSKonstantin Ananyev }; 79c87d435aSKonstantin Ananyev 80c87d435aSKonstantin Ananyev /** 81c87d435aSKonstantin Ananyev * @internal 82c87d435aSKonstantin Ananyev * fast-path ethdev functions and related data are hold in a flat array. 83c87d435aSKonstantin Ananyev * One entry per ethdev. 84c87d435aSKonstantin Ananyev * On 64-bit systems contents of this structure occupy exactly two 64B lines. 85c87d435aSKonstantin Ananyev * On 32-bit systems contents of this structure fits into one 64B line. 86c87d435aSKonstantin Ananyev */ 87*c6552d9aSTyler Retzlaff struct __rte_cache_aligned rte_eth_fp_ops { 88c87d435aSKonstantin Ananyev 89c87d435aSKonstantin Ananyev /**@{*/ 90c87d435aSKonstantin Ananyev /** 91c87d435aSKonstantin Ananyev * Rx fast-path functions and related data. 92c87d435aSKonstantin Ananyev * 64-bit systems: occupies first 64B line 93c87d435aSKonstantin Ananyev */ 94e43d2b89SFeifei Wang /** Rx queues data. */ 95e43d2b89SFeifei Wang struct rte_ethdev_qdata rxq; 96c87d435aSKonstantin Ananyev /** PMD receive function. */ 97c87d435aSKonstantin Ananyev eth_rx_burst_t rx_pkt_burst; 9809fd4227SAndrew Rybchenko /** Get the number of used Rx descriptors. */ 99c87d435aSKonstantin Ananyev eth_rx_queue_count_t rx_queue_count; 100c87d435aSKonstantin Ananyev /** Check the status of a Rx descriptor. */ 101c87d435aSKonstantin Ananyev eth_rx_descriptor_status_t rx_descriptor_status; 102e43d2b89SFeifei Wang /** Refill Rx descriptors with the recycling mbufs. */ 103e43d2b89SFeifei Wang eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill; 104e43d2b89SFeifei Wang uintptr_t reserved1[2]; 105c87d435aSKonstantin Ananyev /**@}*/ 106c87d435aSKonstantin Ananyev 107c87d435aSKonstantin Ananyev /**@{*/ 108c87d435aSKonstantin Ananyev /** 109c87d435aSKonstantin Ananyev * Tx fast-path functions and related data. 110c87d435aSKonstantin Ananyev * 64-bit systems: occupies second 64B line 111c87d435aSKonstantin Ananyev */ 112e43d2b89SFeifei Wang /** Tx queues data. */ 113e43d2b89SFeifei Wang struct rte_ethdev_qdata txq; 114c87d435aSKonstantin Ananyev /** PMD transmit function. */ 115c87d435aSKonstantin Ananyev eth_tx_burst_t tx_pkt_burst; 116c87d435aSKonstantin Ananyev /** PMD transmit prepare function. */ 117c87d435aSKonstantin Ananyev eth_tx_prep_t tx_pkt_prepare; 118c87d435aSKonstantin Ananyev /** Check the status of a Tx descriptor. */ 119c87d435aSKonstantin Ananyev eth_tx_descriptor_status_t tx_descriptor_status; 120e43d2b89SFeifei Wang /** Copy used mbufs from Tx mbuf ring into Rx. */ 121e43d2b89SFeifei Wang eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse; 122d4b9235fSJerin Jacob /** Get the number of used Tx descriptors. */ 123d4b9235fSJerin Jacob eth_tx_queue_count_t tx_queue_count; 124d4b9235fSJerin Jacob uintptr_t reserved2[1]; 125c87d435aSKonstantin Ananyev /**@}*/ 126c87d435aSKonstantin Ananyev 127*c6552d9aSTyler Retzlaff }; 128c87d435aSKonstantin Ananyev 129c87d435aSKonstantin Ananyev extern struct rte_eth_fp_ops rte_eth_fp_ops[RTE_MAX_ETHPORTS]; 130c87d435aSKonstantin Ananyev 13199a2dd95SBruce Richardson #endif /* _RTE_ETHDEV_CORE_H_ */ 132