ethdev: fix TPID handling in flow API
[dpdk.git] / drivers / net / sfc / sfc_dp_rx.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  *
3  * Copyright (c) 2017-2018 Solarflare Communications Inc.
4  * All rights reserved.
5  *
6  * This software was jointly developed between OKTET Labs (under contract
7  * for Solarflare) and Solarflare Communications, Inc.
8  */
9
10 #ifndef _SFC_DP_RX_H
11 #define _SFC_DP_RX_H
12
13 #include <rte_mempool.h>
14 #include <rte_ethdev_driver.h>
15
16 #include "sfc_dp.h"
17
18 #ifdef __cplusplus
19 extern "C" {
20 #endif
21
22 /**
23  * Generic receive queue information used on data path.
24  * It must be kept as small as it is possible since it is built into
25  * the structure used on datapath.
26  */
27 struct sfc_dp_rxq {
28         struct sfc_dp_queue     dpq;
29 };
30
31 /**
32  * Datapath receive queue creation information.
33  *
34  * The structure is used just to pass information from control path to
35  * datapath. It could be just function arguments, but it would be hardly
36  * readable.
37  */
38 struct sfc_dp_rx_qcreate_info {
39         /** Memory pool to allocate Rx buffer from */
40         struct rte_mempool      *refill_mb_pool;
41         /** Maximum number of pushed Rx descriptors in the queue */
42         unsigned int            max_fill_level;
43         /** Minimum number of unused Rx descriptors to do refill */
44         unsigned int            refill_threshold;
45         /**
46          * Usable mbuf data space in accordance with alignment and
47          * padding requirements imposed by HW.
48          */
49         unsigned int            buf_size;
50
51         /**
52          * Maximum number of Rx descriptors completed in one Rx event.
53          * Just for sanity checks if datapath would like to do.
54          */
55         unsigned int            batch_max;
56
57         /** Pseudo-header size */
58         unsigned int            prefix_size;
59
60         /** Receive queue flags initializer */
61         unsigned int            flags;
62 #define SFC_RXQ_FLAG_RSS_HASH   0x1
63
64         /** Rx queue size */
65         unsigned int            rxq_entries;
66         /** DMA-mapped Rx descriptors ring */
67         void                    *rxq_hw_ring;
68
69         /** Associated event queue size */
70         unsigned int            evq_entries;
71         /** Hardware event ring */
72         void                    *evq_hw_ring;
73
74         /** The queue index in hardware (required to push right doorbell) */
75         unsigned int            hw_index;
76         /**
77          * Virtual address of the memory-mapped BAR to push Rx refill
78          * doorbell
79          */
80         volatile void           *mem_bar;
81         /** VI window size shift */
82         unsigned int            vi_window_shift;
83 };
84
85 /**
86  * Get Rx datapath specific device info.
87  *
88  * @param dev_info              Device info to be adjusted
89  */
90 typedef void (sfc_dp_rx_get_dev_info_t)(struct rte_eth_dev_info *dev_info);
91
92 /**
93  * Get size of receive and event queue rings by the number of Rx
94  * descriptors.
95  *
96  * @param nb_rx_desc            Number of Rx descriptors
97  * @param rxq_entries           Location for number of Rx ring entries
98  * @param evq_entries           Location for number of event ring entries
99  * @param rxq_max_fill_level    Location for maximum Rx ring fill level
100  *
101  * @return 0 or positive errno.
102  */
103 typedef int (sfc_dp_rx_qsize_up_rings_t)(uint16_t nb_rx_desc,
104                                          unsigned int *rxq_entries,
105                                          unsigned int *evq_entries,
106                                          unsigned int *rxq_max_fill_level);
107
108 /**
109  * Allocate and initialize datapath receive queue.
110  *
111  * @param port_id       The port identifier
112  * @param queue_id      The queue identifier
113  * @param pci_addr      PCI function address
114  * @param socket_id     Socket identifier to allocate memory
115  * @param info          Receive queue information
116  * @param dp_rxqp       Location for generic datapath receive queue pointer
117  *
118  * @return 0 or positive errno.
119  */
120 typedef int (sfc_dp_rx_qcreate_t)(uint16_t port_id, uint16_t queue_id,
121                                   const struct rte_pci_addr *pci_addr,
122                                   int socket_id,
123                                   const struct sfc_dp_rx_qcreate_info *info,
124                                   struct sfc_dp_rxq **dp_rxqp);
125
126 /**
127  * Free resources allocated for datapath recevie queue.
128  */
129 typedef void (sfc_dp_rx_qdestroy_t)(struct sfc_dp_rxq *dp_rxq);
130
131 /**
132  * Receive queue start callback.
133  *
134  * It handovers EvQ to the datapath.
135  */
136 typedef int (sfc_dp_rx_qstart_t)(struct sfc_dp_rxq *dp_rxq,
137                                  unsigned int evq_read_ptr);
138
139 /**
140  * Receive queue stop function called before flush.
141  */
142 typedef void (sfc_dp_rx_qstop_t)(struct sfc_dp_rxq *dp_rxq,
143                                  unsigned int *evq_read_ptr);
144
145 /**
146  * Receive event handler used during queue flush only.
147  */
148 typedef bool (sfc_dp_rx_qrx_ev_t)(struct sfc_dp_rxq *dp_rxq, unsigned int id);
149
150 /**
151  * Receive queue purge function called after queue flush.
152  *
153  * Should be used to free unused recevie buffers.
154  */
155 typedef void (sfc_dp_rx_qpurge_t)(struct sfc_dp_rxq *dp_rxq);
156
157 /** Get packet types recognized/classified */
158 typedef const uint32_t * (sfc_dp_rx_supported_ptypes_get_t)(
159                                 uint32_t tunnel_encaps);
160
161 /** Get number of pending Rx descriptors */
162 typedef unsigned int (sfc_dp_rx_qdesc_npending_t)(struct sfc_dp_rxq *dp_rxq);
163
164 /** Check Rx descriptor status */
165 typedef int (sfc_dp_rx_qdesc_status_t)(struct sfc_dp_rxq *dp_rxq,
166                                        uint16_t offset);
167
168 /** Receive datapath definition */
169 struct sfc_dp_rx {
170         struct sfc_dp                           dp;
171
172         unsigned int                            features;
173 #define SFC_DP_RX_FEAT_SCATTER                  0x1
174 #define SFC_DP_RX_FEAT_MULTI_PROCESS            0x2
175 #define SFC_DP_RX_FEAT_TUNNELS                  0x4
176         sfc_dp_rx_get_dev_info_t                *get_dev_info;
177         sfc_dp_rx_qsize_up_rings_t              *qsize_up_rings;
178         sfc_dp_rx_qcreate_t                     *qcreate;
179         sfc_dp_rx_qdestroy_t                    *qdestroy;
180         sfc_dp_rx_qstart_t                      *qstart;
181         sfc_dp_rx_qstop_t                       *qstop;
182         sfc_dp_rx_qrx_ev_t                      *qrx_ev;
183         sfc_dp_rx_qpurge_t                      *qpurge;
184         sfc_dp_rx_supported_ptypes_get_t        *supported_ptypes_get;
185         sfc_dp_rx_qdesc_npending_t              *qdesc_npending;
186         sfc_dp_rx_qdesc_status_t                *qdesc_status;
187         eth_rx_burst_t                          pkt_burst;
188 };
189
190 static inline struct sfc_dp_rx *
191 sfc_dp_find_rx_by_name(struct sfc_dp_list *head, const char *name)
192 {
193         struct sfc_dp *p = sfc_dp_find_by_name(head, SFC_DP_RX, name);
194
195         return (p == NULL) ? NULL : container_of(p, struct sfc_dp_rx, dp);
196 }
197
198 static inline struct sfc_dp_rx *
199 sfc_dp_find_rx_by_caps(struct sfc_dp_list *head, unsigned int avail_caps)
200 {
201         struct sfc_dp *p = sfc_dp_find_by_caps(head, SFC_DP_RX, avail_caps);
202
203         return (p == NULL) ? NULL : container_of(p, struct sfc_dp_rx, dp);
204 }
205
206 extern struct sfc_dp_rx sfc_efx_rx;
207 extern struct sfc_dp_rx sfc_ef10_rx;
208
209 #ifdef __cplusplus
210 }
211 #endif
212 #endif /* _SFC_DP_RX_H */