xref: /dpdk/lib/ethdev/rte_ethdev_core.h (revision c6552d9a8deffa448de2d5e2e726f50508c1efd2)
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