1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2017 Intel Corporation 3 */ 4 5 #ifndef _RTE_ETHDEV_CORE_H_ 6 #define _RTE_ETHDEV_CORE_H_ 7 8 /** 9 * @file 10 * 11 * RTE Ethernet Device internal header. 12 * 13 * This header contains internal data types. But they are still part of the 14 * public API because they are used by inline functions in the published API. 15 * 16 * Applications should not use these directly. 17 */ 18 19 struct rte_eth_dev_callback; 20 /** @internal Structure to keep track of registered callbacks */ 21 RTE_TAILQ_HEAD(rte_eth_dev_cb_list, rte_eth_dev_callback); 22 23 struct rte_eth_dev; 24 25 /** 26 * @internal Retrieve input packets from a receive queue of an Ethernet device. 27 */ 28 typedef uint16_t (*eth_rx_burst_t)(void *rxq, 29 struct rte_mbuf **rx_pkts, 30 uint16_t nb_pkts); 31 32 /** 33 * @internal Send output packets on a transmit queue of an Ethernet device. 34 */ 35 typedef uint16_t (*eth_tx_burst_t)(void *txq, 36 struct rte_mbuf **tx_pkts, 37 uint16_t nb_pkts); 38 39 /** 40 * @internal Prepare output packets on a transmit queue of an Ethernet device. 41 */ 42 typedef uint16_t (*eth_tx_prep_t)(void *txq, 43 struct rte_mbuf **tx_pkts, 44 uint16_t nb_pkts); 45 46 47 /** @internal Get number of used descriptors on a receive queue. */ 48 typedef uint32_t (*eth_rx_queue_count_t)(void *rxq); 49 50 /** @internal Check the status of a Rx descriptor */ 51 typedef int (*eth_rx_descriptor_status_t)(void *rxq, uint16_t offset); 52 53 /** @internal Get number of used descriptors on a transmit queue. */ 54 typedef int (*eth_tx_queue_count_t)(void *txq); 55 56 /** @internal Check the status of a Tx descriptor */ 57 typedef int (*eth_tx_descriptor_status_t)(void *txq, uint16_t offset); 58 59 /** @internal Copy used mbufs from Tx mbuf ring into Rx mbuf ring */ 60 typedef uint16_t (*eth_recycle_tx_mbufs_reuse_t)(void *txq, 61 struct rte_eth_recycle_rxq_info *recycle_rxq_info); 62 63 /** @internal Refill Rx descriptors with the recycling mbufs */ 64 typedef void (*eth_recycle_rx_descriptors_refill_t)(void *rxq, uint16_t nb); 65 66 /** 67 * @internal 68 * Structure used to hold opaque pointers to internal ethdev Rx/Tx 69 * queues data. 70 * The main purpose to expose these pointers at all - allow compiler 71 * to fetch this data for fast-path ethdev inline functions in advance. 72 */ 73 struct rte_ethdev_qdata { 74 /** points to array of internal queue data pointers */ 75 void **data; 76 /** points to array of queue callback data pointers */ 77 RTE_ATOMIC(void *) *clbk; 78 }; 79 80 /** 81 * @internal 82 * fast-path ethdev functions and related data are hold in a flat array. 83 * One entry per ethdev. 84 * On 64-bit systems contents of this structure occupy exactly two 64B lines. 85 * On 32-bit systems contents of this structure fits into one 64B line. 86 */ 87 struct __rte_cache_aligned rte_eth_fp_ops { 88 89 /**@{*/ 90 /** 91 * Rx fast-path functions and related data. 92 * 64-bit systems: occupies first 64B line 93 */ 94 /** Rx queues data. */ 95 struct rte_ethdev_qdata rxq; 96 /** PMD receive function. */ 97 eth_rx_burst_t rx_pkt_burst; 98 /** Get the number of used Rx descriptors. */ 99 eth_rx_queue_count_t rx_queue_count; 100 /** Check the status of a Rx descriptor. */ 101 eth_rx_descriptor_status_t rx_descriptor_status; 102 /** Refill Rx descriptors with the recycling mbufs. */ 103 eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill; 104 uintptr_t reserved1[2]; 105 /**@}*/ 106 107 /**@{*/ 108 /** 109 * Tx fast-path functions and related data. 110 * 64-bit systems: occupies second 64B line 111 */ 112 /** Tx queues data. */ 113 struct rte_ethdev_qdata txq; 114 /** PMD transmit function. */ 115 eth_tx_burst_t tx_pkt_burst; 116 /** PMD transmit prepare function. */ 117 eth_tx_prep_t tx_pkt_prepare; 118 /** Check the status of a Tx descriptor. */ 119 eth_tx_descriptor_status_t tx_descriptor_status; 120 /** Copy used mbufs from Tx mbuf ring into Rx. */ 121 eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse; 122 /** Get the number of used Tx descriptors. */ 123 eth_tx_queue_count_t tx_queue_count; 124 uintptr_t reserved2[1]; 125 /**@}*/ 126 127 }; 128 129 extern struct rte_eth_fp_ops rte_eth_fp_ops[RTE_MAX_ETHPORTS]; 130 131 #endif /* _RTE_ETHDEV_CORE_H_ */ 132