net/enic: use dynamic log types
[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.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 };
82
83 /**
84  * Get Rx datapath specific device info.
85  *
86  * @param dev_info              Device info to be adjusted
87  */
88 typedef void (sfc_dp_rx_get_dev_info_t)(struct rte_eth_dev_info *dev_info);
89
90 /**
91  * Get size of receive and event queue rings by the number of Rx
92  * descriptors.
93  *
94  * @param nb_rx_desc            Number of Rx descriptors
95  * @param rxq_entries           Location for number of Rx ring entries
96  * @param evq_entries           Location for number of event ring entries
97  * @param rxq_max_fill_level    Location for maximum Rx ring fill level
98  *
99  * @return 0 or positive errno.
100  */
101 typedef int (sfc_dp_rx_qsize_up_rings_t)(uint16_t nb_rx_desc,
102                                          unsigned int *rxq_entries,
103                                          unsigned int *evq_entries,
104                                          unsigned int *rxq_max_fill_level);
105
106 /**
107  * Allocate and initialize datapath receive queue.
108  *
109  * @param port_id       The port identifier
110  * @param queue_id      The queue identifier
111  * @param pci_addr      PCI function address
112  * @param socket_id     Socket identifier to allocate memory
113  * @param info          Receive queue information
114  * @param dp_rxqp       Location for generic datapath receive queue pointer
115  *
116  * @return 0 or positive errno.
117  */
118 typedef int (sfc_dp_rx_qcreate_t)(uint16_t port_id, uint16_t queue_id,
119                                   const struct rte_pci_addr *pci_addr,
120                                   int socket_id,
121                                   const struct sfc_dp_rx_qcreate_info *info,
122                                   struct sfc_dp_rxq **dp_rxqp);
123
124 /**
125  * Free resources allocated for datapath recevie queue.
126  */
127 typedef void (sfc_dp_rx_qdestroy_t)(struct sfc_dp_rxq *dp_rxq);
128
129 /**
130  * Receive queue start callback.
131  *
132  * It handovers EvQ to the datapath.
133  */
134 typedef int (sfc_dp_rx_qstart_t)(struct sfc_dp_rxq *dp_rxq,
135                                  unsigned int evq_read_ptr);
136
137 /**
138  * Receive queue stop function called before flush.
139  */
140 typedef void (sfc_dp_rx_qstop_t)(struct sfc_dp_rxq *dp_rxq,
141                                  unsigned int *evq_read_ptr);
142
143 /**
144  * Receive event handler used during queue flush only.
145  */
146 typedef bool (sfc_dp_rx_qrx_ev_t)(struct sfc_dp_rxq *dp_rxq, unsigned int id);
147
148 /**
149  * Receive queue purge function called after queue flush.
150  *
151  * Should be used to free unused recevie buffers.
152  */
153 typedef void (sfc_dp_rx_qpurge_t)(struct sfc_dp_rxq *dp_rxq);
154
155 /** Get packet types recognized/classified */
156 typedef const uint32_t * (sfc_dp_rx_supported_ptypes_get_t)(
157                                 uint32_t tunnel_encaps);
158
159 /** Get number of pending Rx descriptors */
160 typedef unsigned int (sfc_dp_rx_qdesc_npending_t)(struct sfc_dp_rxq *dp_rxq);
161
162 /** Check Rx descriptor status */
163 typedef int (sfc_dp_rx_qdesc_status_t)(struct sfc_dp_rxq *dp_rxq,
164                                        uint16_t offset);
165
166 /** Receive datapath definition */
167 struct sfc_dp_rx {
168         struct sfc_dp                           dp;
169
170         unsigned int                            features;
171 #define SFC_DP_RX_FEAT_SCATTER                  0x1
172 #define SFC_DP_RX_FEAT_MULTI_PROCESS            0x2
173 #define SFC_DP_RX_FEAT_TUNNELS                  0x4
174         sfc_dp_rx_get_dev_info_t                *get_dev_info;
175         sfc_dp_rx_qsize_up_rings_t              *qsize_up_rings;
176         sfc_dp_rx_qcreate_t                     *qcreate;
177         sfc_dp_rx_qdestroy_t                    *qdestroy;
178         sfc_dp_rx_qstart_t                      *qstart;
179         sfc_dp_rx_qstop_t                       *qstop;
180         sfc_dp_rx_qrx_ev_t                      *qrx_ev;
181         sfc_dp_rx_qpurge_t                      *qpurge;
182         sfc_dp_rx_supported_ptypes_get_t        *supported_ptypes_get;
183         sfc_dp_rx_qdesc_npending_t              *qdesc_npending;
184         sfc_dp_rx_qdesc_status_t                *qdesc_status;
185         eth_rx_burst_t                          pkt_burst;
186 };
187
188 static inline struct sfc_dp_rx *
189 sfc_dp_find_rx_by_name(struct sfc_dp_list *head, const char *name)
190 {
191         struct sfc_dp *p = sfc_dp_find_by_name(head, SFC_DP_RX, name);
192
193         return (p == NULL) ? NULL : container_of(p, struct sfc_dp_rx, dp);
194 }
195
196 static inline struct sfc_dp_rx *
197 sfc_dp_find_rx_by_caps(struct sfc_dp_list *head, unsigned int avail_caps)
198 {
199         struct sfc_dp *p = sfc_dp_find_by_caps(head, SFC_DP_RX, avail_caps);
200
201         return (p == NULL) ? NULL : container_of(p, struct sfc_dp_rx, dp);
202 }
203
204 extern struct sfc_dp_rx sfc_efx_rx;
205 extern struct sfc_dp_rx sfc_ef10_rx;
206
207 #ifdef __cplusplus
208 }
209 #endif
210 #endif /* _SFC_DP_RX_H */