df7168ca4b6a15a662e1b878d6f21b0b4de85b6c
[dpdk.git] / lib / ethdev / rte_ethdev_core.h
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 #include <pthread.h>
9
10 /**
11  * @file
12  *
13  * RTE Ethernet Device internal header.
14  *
15  * This header contains internal data types. But they are still part of the
16  * public API because they are used by inline functions in the published API.
17  *
18  * Applications should not use these directly.
19  *
20  */
21
22 struct rte_eth_dev_callback;
23 /** @internal Structure to keep track of registered callbacks */
24 RTE_TAILQ_HEAD(rte_eth_dev_cb_list, rte_eth_dev_callback);
25
26 struct rte_eth_dev;
27
28 typedef uint16_t (*eth_rx_burst_t)(void *rxq,
29                                    struct rte_mbuf **rx_pkts,
30                                    uint16_t nb_pkts);
31 /**< @internal Retrieve input packets from a receive queue of an Ethernet device. */
32
33 typedef uint16_t (*eth_tx_burst_t)(void *txq,
34                                    struct rte_mbuf **tx_pkts,
35                                    uint16_t nb_pkts);
36 /**< @internal Send output packets on a transmit queue of an Ethernet device. */
37
38 typedef uint16_t (*eth_tx_prep_t)(void *txq,
39                                    struct rte_mbuf **tx_pkts,
40                                    uint16_t nb_pkts);
41 /**< @internal Prepare output packets on a transmit queue of an Ethernet device. */
42
43
44 typedef uint32_t (*eth_rx_queue_count_t)(void *rxq);
45 /**< @internal Get number of used descriptors on a receive queue. */
46
47 typedef int (*eth_rx_descriptor_status_t)(void *rxq, uint16_t offset);
48 /**< @internal Check the status of a Rx descriptor */
49
50 typedef int (*eth_tx_descriptor_status_t)(void *txq, uint16_t offset);
51 /**< @internal Check the status of a Tx descriptor */
52
53 /**
54  * @internal
55  * Structure used to hold opaque pointers to internal ethdev Rx/Tx
56  * queues data.
57  * The main purpose to expose these pointers at all - allow compiler
58  * to fetch this data for fast-path ethdev inline functions in advance.
59  */
60 struct rte_ethdev_qdata {
61         /** points to array of internal queue data pointers */
62         void **data;
63         /** points to array of queue callback data pointers */
64         void **clbk;
65 };
66
67 /**
68  * @internal
69  * fast-path ethdev functions and related data are hold in a flat array.
70  * One entry per ethdev.
71  * On 64-bit systems contents of this structure occupy exactly two 64B lines.
72  * On 32-bit systems contents of this structure fits into one 64B line.
73  */
74 struct rte_eth_fp_ops {
75
76         /**@{*/
77         /**
78          * Rx fast-path functions and related data.
79          * 64-bit systems: occupies first 64B line
80          */
81         /** PMD receive function. */
82         eth_rx_burst_t rx_pkt_burst;
83         /** Get the number of used RX descriptors. */
84         eth_rx_queue_count_t rx_queue_count;
85         /** Check the status of a Rx descriptor. */
86         eth_rx_descriptor_status_t rx_descriptor_status;
87         /** Rx queues data. */
88         struct rte_ethdev_qdata rxq;
89         uintptr_t reserved1[3];
90         /**@}*/
91
92         /**@{*/
93         /**
94          * Tx fast-path functions and related data.
95          * 64-bit systems: occupies second 64B line
96          */
97         /** PMD transmit function. */
98         eth_tx_burst_t tx_pkt_burst;
99         /** PMD transmit prepare function. */
100         eth_tx_prep_t tx_pkt_prepare;
101         /** Check the status of a Tx descriptor. */
102         eth_tx_descriptor_status_t tx_descriptor_status;
103         /** Tx queues data. */
104         struct rte_ethdev_qdata txq;
105         uintptr_t reserved2[3];
106         /**@}*/
107
108 } __rte_cache_aligned;
109
110 extern struct rte_eth_fp_ops rte_eth_fp_ops[RTE_MAX_ETHPORTS];
111
112
113 /**
114  * @internal
115  * Structure used to hold information about the callbacks to be called for a
116  * queue on RX and TX.
117  */
118 struct rte_eth_rxtx_callback {
119         struct rte_eth_rxtx_callback *next;
120         union{
121                 rte_rx_callback_fn rx;
122                 rte_tx_callback_fn tx;
123         } fn;
124         void *param;
125 };
126
127 /**
128  * @internal
129  * The generic data structure associated with each ethernet device.
130  *
131  * Pointers to burst-oriented packet receive and transmit functions are
132  * located at the beginning of the structure, along with the pointer to
133  * where all the data elements for the particular device are stored in shared
134  * memory. This split allows the function pointer and driver data to be per-
135  * process, while the actual configuration data for the device is shared.
136  */
137 struct rte_eth_dev {
138         eth_rx_burst_t rx_pkt_burst; /**< Pointer to PMD receive function. */
139         eth_tx_burst_t tx_pkt_burst; /**< Pointer to PMD transmit function. */
140         eth_tx_prep_t tx_pkt_prepare; /**< Pointer to PMD transmit prepare function. */
141
142         eth_rx_queue_count_t       rx_queue_count; /**< Get the number of used RX descriptors. */
143         eth_rx_descriptor_status_t rx_descriptor_status; /**< Check the status of a Rx descriptor. */
144         eth_tx_descriptor_status_t tx_descriptor_status; /**< Check the status of a Tx descriptor. */
145
146         /**
147          * Next two fields are per-device data but *data is shared between
148          * primary and secondary processes and *process_private is per-process
149          * private. The second one is managed by PMDs if necessary.
150          */
151         struct rte_eth_dev_data *data;  /**< Pointer to device data. */
152         void *process_private; /**< Pointer to per-process device data. */
153         const struct eth_dev_ops *dev_ops; /**< Functions exported by PMD */
154         struct rte_device *device; /**< Backing device */
155         struct rte_intr_handle *intr_handle; /**< Device interrupt handle */
156         /** User application callbacks for NIC interrupts */
157         struct rte_eth_dev_cb_list link_intr_cbs;
158         /**
159          * User-supplied functions called from rx_burst to post-process
160          * received packets before passing them to the user
161          */
162         struct rte_eth_rxtx_callback *post_rx_burst_cbs[RTE_MAX_QUEUES_PER_PORT];
163         /**
164          * User-supplied functions called from tx_burst to pre-process
165          * received packets before passing them to the driver for transmission.
166          */
167         struct rte_eth_rxtx_callback *pre_tx_burst_cbs[RTE_MAX_QUEUES_PER_PORT];
168         enum rte_eth_dev_state state; /**< Flag indicating the port state */
169         void *security_ctx; /**< Context for security ops */
170
171         uint64_t reserved_64s[4]; /**< Reserved for future fields */
172         void *reserved_ptrs[4];   /**< Reserved for future fields */
173 } __rte_cache_aligned;
174
175 struct rte_eth_dev_sriov;
176 struct rte_eth_dev_owner;
177
178 /**
179  * @internal
180  * The data part, with no function pointers, associated with each ethernet device.
181  *
182  * This structure is safe to place in shared memory to be common among different
183  * processes in a multi-process configuration.
184  */
185 struct rte_eth_dev_data {
186         char name[RTE_ETH_NAME_MAX_LEN]; /**< Unique identifier name */
187
188         void **rx_queues; /**< Array of pointers to RX queues. */
189         void **tx_queues; /**< Array of pointers to TX queues. */
190         uint16_t nb_rx_queues; /**< Number of RX queues. */
191         uint16_t nb_tx_queues; /**< Number of TX queues. */
192
193         struct rte_eth_dev_sriov sriov;    /**< SRIOV data */
194
195         void *dev_private;
196                         /**< PMD-specific private data.
197                          *   @see rte_eth_dev_release_port()
198                          */
199
200         struct rte_eth_link dev_link;   /**< Link-level information & status. */
201         struct rte_eth_conf dev_conf;   /**< Configuration applied to device. */
202         uint16_t mtu;                   /**< Maximum Transmission Unit. */
203         uint32_t min_rx_buf_size;
204                         /**< Common RX buffer size handled by all queues. */
205
206         uint64_t rx_mbuf_alloc_failed; /**< RX ring mbuf allocation failures. */
207         struct rte_ether_addr *mac_addrs;
208                         /**< Device Ethernet link address.
209                          *   @see rte_eth_dev_release_port()
210                          */
211         uint64_t mac_pool_sel[ETH_NUM_RECEIVE_MAC_ADDR];
212                         /**< Bitmap associating MAC addresses to pools. */
213         struct rte_ether_addr *hash_mac_addrs;
214                         /**< Device Ethernet MAC addresses of hash filtering.
215                          *   @see rte_eth_dev_release_port()
216                          */
217         uint16_t port_id;           /**< Device [external] port identifier. */
218
219         __extension__
220         uint8_t promiscuous   : 1, /**< RX promiscuous mode ON(1) / OFF(0). */
221                 scattered_rx : 1,  /**< RX of scattered packets is ON(1) / OFF(0) */
222                 all_multicast : 1, /**< RX all multicast mode ON(1) / OFF(0). */
223                 dev_started : 1,   /**< Device state: STARTED(1) / STOPPED(0). */
224                 lro         : 1,   /**< RX LRO is ON(1) / OFF(0) */
225                 dev_configured : 1;
226                 /**< Indicates whether the device is configured.
227                  *   CONFIGURED(1) / NOT CONFIGURED(0).
228                  */
229         uint8_t rx_queue_state[RTE_MAX_QUEUES_PER_PORT];
230                 /**< Queues state: HAIRPIN(2) / STARTED(1) / STOPPED(0). */
231         uint8_t tx_queue_state[RTE_MAX_QUEUES_PER_PORT];
232                 /**< Queues state: HAIRPIN(2) / STARTED(1) / STOPPED(0). */
233         uint32_t dev_flags;             /**< Capabilities. */
234         int numa_node;                  /**< NUMA node connection. */
235         struct rte_vlan_filter_conf vlan_filter_conf;
236                         /**< VLAN filter configuration. */
237         struct rte_eth_dev_owner owner; /**< The port owner. */
238         uint16_t representor_id;
239                         /**< Switch-specific identifier.
240                          *   Valid if RTE_ETH_DEV_REPRESENTOR in dev_flags.
241                          */
242         uint16_t backer_port_id;
243                         /**< Port ID of the backing device.
244                          *   This device will be used to query representor
245                          *   info and calculate representor IDs.
246                          *   Valid if RTE_ETH_DEV_REPRESENTOR in dev_flags.
247                          */
248
249         pthread_mutex_t flow_ops_mutex; /**< rte_flow ops mutex. */
250         uint64_t reserved_64s[4]; /**< Reserved for future fields */
251         void *reserved_ptrs[4];   /**< Reserved for future fields */
252 } __rte_cache_aligned;
253
254 /**
255  * @internal
256  * The pool of *rte_eth_dev* structures. The size of the pool
257  * is configured at compile-time in the <rte_ethdev.c> file.
258  */
259 extern struct rte_eth_dev rte_eth_devices[];
260
261 #endif /* _RTE_ETHDEV_CORE_H_ */