ethdev: separate driver APIs
[dpdk.git] / drivers / net / enic / enic.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2008-2017 Cisco Systems, Inc.  All rights reserved.
3  * Copyright 2007 Nuova Systems, Inc.  All rights reserved.
4  */
5
6 #ifndef _ENIC_H_
7 #define _ENIC_H_
8
9 #include "vnic_enet.h"
10 #include "vnic_dev.h"
11 #include "vnic_wq.h"
12 #include "vnic_rq.h"
13 #include "vnic_cq.h"
14 #include "vnic_intr.h"
15 #include "vnic_stats.h"
16 #include "vnic_nic.h"
17 #include "vnic_rss.h"
18 #include "enic_res.h"
19 #include "cq_enet_desc.h"
20 #include <sys/queue.h>
21 #include <rte_spinlock.h>
22
23 #define DRV_NAME                "enic_pmd"
24 #define DRV_DESCRIPTION         "Cisco VIC Ethernet NIC Poll-mode Driver"
25 #define DRV_COPYRIGHT           "Copyright 2008-2015 Cisco Systems, Inc"
26
27 #define ENIC_WQ_MAX             8
28 /* With Rx scatter support, we use two RQs on VIC per RQ used by app. Both
29  * RQs use the same CQ.
30  */
31 #define ENIC_RQ_MAX             16
32 #define ENIC_CQ_MAX             (ENIC_WQ_MAX + (ENIC_RQ_MAX / 2))
33 #define ENIC_INTR_MAX           (ENIC_CQ_MAX + 2)
34 #define ENIC_MAX_MAC_ADDR       64
35
36 #define VLAN_ETH_HLEN           18
37
38 #define ENICPMD_SETTING(enic, f) ((enic->config.flags & VENETF_##f) ? 1 : 0)
39
40 #define ENICPMD_BDF_LENGTH      13   /* 0000:00:00.0'\0' */
41 #define ENIC_CALC_IP_CKSUM      1
42 #define ENIC_CALC_TCP_UDP_CKSUM 2
43 #define ENIC_MAX_MTU            9000
44 #define ENIC_PAGE_SIZE          4096
45 #define PAGE_ROUND_UP(x) \
46         ((((unsigned long)(x)) + ENIC_PAGE_SIZE-1) & (~(ENIC_PAGE_SIZE-1)))
47
48 #define ENICPMD_VFIO_PATH          "/dev/vfio/vfio"
49 /*#define ENIC_DESC_COUNT_MAKE_ODD (x) do{if ((~(x)) & 1) { (x)--; } }while(0)*/
50
51 #define PCI_DEVICE_ID_CISCO_VIC_ENET         0x0043  /* ethernet vnic */
52 #define PCI_DEVICE_ID_CISCO_VIC_ENET_VF      0x0071  /* enet SRIOV VF */
53
54 /* Special Filter id for non-specific packet flagging. Don't change value */
55 #define ENIC_MAGIC_FILTER_ID 0xffff
56
57 #define ENICPMD_FDIR_MAX           64
58
59 struct enic_fdir_node {
60         struct rte_eth_fdir_filter filter;
61         u16 fltr_id;
62         u16 rq_index;
63 };
64
65 struct enic_fdir {
66         struct rte_eth_fdir_stats stats;
67         struct rte_hash *hash;
68         struct enic_fdir_node *nodes[ENICPMD_FDIR_MAX];
69         u32 modes;
70         u32 types_mask;
71         void (*copy_fltr_fn)(struct filter_v2 *filt,
72                              struct rte_eth_fdir_input *input,
73                              struct rte_eth_fdir_masks *masks);
74 };
75
76 struct enic_soft_stats {
77         rte_atomic64_t rx_nombuf;
78         rte_atomic64_t rx_packet_errors;
79         rte_atomic64_t tx_oversized;
80 };
81
82 struct enic_memzone_entry {
83         const struct rte_memzone *rz;
84         LIST_ENTRY(enic_memzone_entry) entries;
85 };
86
87 struct rte_flow {
88         LIST_ENTRY(rte_flow) next;
89         u16 enic_filter_id;
90         struct filter_v2 enic_filter;
91 };
92
93 /* Per-instance private data structure */
94 struct enic {
95         struct enic *next;
96         struct rte_pci_device *pdev;
97         struct vnic_enet_config config;
98         struct vnic_dev_bar bar0;
99         struct vnic_dev *vdev;
100
101         unsigned int port_id;
102         struct rte_eth_dev *rte_dev;
103         struct enic_fdir fdir;
104         char bdf_name[ENICPMD_BDF_LENGTH];
105         int dev_fd;
106         int iommu_group_fd;
107         int iommu_groupid;
108         int eventfd;
109         uint8_t mac_addr[ETH_ALEN];
110         pthread_t err_intr_thread;
111         int promisc;
112         int allmulti;
113         u8 ig_vlan_strip_en;
114         int link_status;
115         u8 hw_ip_checksum;
116         u16 max_mtu;
117         u8 adv_filters;
118         u32 flow_filter_mode;
119         u8 filter_tags;
120
121         unsigned int flags;
122         unsigned int priv_flags;
123
124         /* work queue */
125         struct vnic_wq wq[ENIC_WQ_MAX];
126         unsigned int wq_count;
127
128         /* receive queue */
129         struct vnic_rq rq[ENIC_RQ_MAX];
130         unsigned int rq_count;
131
132         /* completion queue */
133         struct vnic_cq cq[ENIC_CQ_MAX];
134         unsigned int cq_count;
135
136         /* interrupt resource */
137         struct vnic_intr intr;
138         unsigned int intr_count;
139
140         /* software counters */
141         struct enic_soft_stats soft_stats;
142
143         /* configured resources on vic */
144         unsigned int conf_rq_count;
145         unsigned int conf_wq_count;
146         unsigned int conf_cq_count;
147         unsigned int conf_intr_count;
148
149         /* linked list storing memory allocations */
150         LIST_HEAD(enic_memzone_list, enic_memzone_entry) memzone_list;
151         rte_spinlock_t memzone_list_lock;
152         rte_spinlock_t mtu_lock;
153
154         LIST_HEAD(enic_flows, rte_flow) flows;
155         rte_spinlock_t flows_lock;
156 };
157
158 /* Get the CQ index from a Start of Packet(SOP) RQ index */
159 static inline unsigned int enic_sop_rq_idx_to_cq_idx(unsigned int sop_idx)
160 {
161         return sop_idx / 2;
162 }
163
164 /* Get the RTE RQ index from a Start of Packet(SOP) RQ index */
165 static inline unsigned int enic_sop_rq_idx_to_rte_idx(unsigned int sop_idx)
166 {
167         return sop_idx / 2;
168 }
169
170 /* Get the Start of Packet(SOP) RQ index from a RTE RQ index */
171 static inline unsigned int enic_rte_rq_idx_to_sop_idx(unsigned int rte_idx)
172 {
173         return rte_idx * 2;
174 }
175
176 /* Get the Data RQ index from a RTE RQ index */
177 static inline unsigned int enic_rte_rq_idx_to_data_idx(unsigned int rte_idx)
178 {
179         return rte_idx * 2 + 1;
180 }
181
182 static inline unsigned int enic_vnic_rq_count(struct enic *enic)
183 {
184         return enic->rq_count * 2;
185 }
186
187 static inline unsigned int enic_cq_rq(__rte_unused struct enic *enic, unsigned int rq)
188 {
189         /* Scatter rx uses two receive queues together with one
190          * completion queue, so the completion queue number is no
191          * longer the same as the rq number.
192          */
193         return rq / 2;
194 }
195
196 static inline unsigned int enic_cq_wq(struct enic *enic, unsigned int wq)
197 {
198         return enic->rq_count + wq;
199 }
200
201 static inline struct enic *pmd_priv(struct rte_eth_dev *eth_dev)
202 {
203         return (struct enic *)eth_dev->data->dev_private;
204 }
205
206 static inline uint32_t
207 enic_ring_add(uint32_t n_descriptors, uint32_t i0, uint32_t i1)
208 {
209         uint32_t d = i0 + i1;
210         d -= (d >= n_descriptors) ? n_descriptors : 0;
211         return d;
212 }
213
214 static inline uint32_t
215 enic_ring_sub(uint32_t n_descriptors, uint32_t i0, uint32_t i1)
216 {
217         int32_t d = i1 - i0;
218         return (uint32_t)((d < 0) ? ((int32_t)n_descriptors + d) : d);
219 }
220
221 static inline uint32_t
222 enic_ring_incr(uint32_t n_descriptors, uint32_t idx)
223 {
224         idx++;
225         if (unlikely(idx == n_descriptors))
226                 idx = 0;
227         return idx;
228 }
229
230 extern void enic_fdir_stats_get(struct enic *enic,
231         struct rte_eth_fdir_stats *stats);
232 extern int enic_fdir_add_fltr(struct enic *enic,
233         struct rte_eth_fdir_filter *params);
234 extern int enic_fdir_del_fltr(struct enic *enic,
235         struct rte_eth_fdir_filter *params);
236 extern void enic_free_wq(void *txq);
237 extern int enic_alloc_intr_resources(struct enic *enic);
238 extern int enic_setup_finish(struct enic *enic);
239 extern int enic_alloc_wq(struct enic *enic, uint16_t queue_idx,
240         unsigned int socket_id, uint16_t nb_desc);
241 extern void enic_start_wq(struct enic *enic, uint16_t queue_idx);
242 extern int enic_stop_wq(struct enic *enic, uint16_t queue_idx);
243 extern void enic_start_rq(struct enic *enic, uint16_t queue_idx);
244 extern int enic_stop_rq(struct enic *enic, uint16_t queue_idx);
245 extern void enic_free_rq(void *rxq);
246 extern int enic_alloc_rq(struct enic *enic, uint16_t queue_idx,
247         unsigned int socket_id, struct rte_mempool *mp,
248         uint16_t nb_desc, uint16_t free_thresh);
249 extern int enic_set_rss_nic_cfg(struct enic *enic);
250 extern int enic_set_vnic_res(struct enic *enic);
251 extern int enic_enable(struct enic *enic);
252 extern int enic_disable(struct enic *enic);
253 extern void enic_remove(struct enic *enic);
254 extern int enic_get_link_status(struct enic *enic);
255 extern int enic_dev_stats_get(struct enic *enic,
256         struct rte_eth_stats *r_stats);
257 extern void enic_dev_stats_clear(struct enic *enic);
258 extern void enic_add_packet_filter(struct enic *enic);
259 int enic_set_mac_address(struct enic *enic, uint8_t *mac_addr);
260 void enic_del_mac_address(struct enic *enic, int mac_index);
261 extern unsigned int enic_cleanup_wq(struct enic *enic, struct vnic_wq *wq);
262 extern void enic_send_pkt(struct enic *enic, struct vnic_wq *wq,
263                           struct rte_mbuf *tx_pkt, unsigned short len,
264                           uint8_t sop, uint8_t eop, uint8_t cq_entry,
265                           uint16_t ol_flags, uint16_t vlan_tag);
266
267 extern void enic_post_wq_index(struct vnic_wq *wq);
268 extern int enic_probe(struct enic *enic);
269 extern int enic_clsf_init(struct enic *enic);
270 extern void enic_clsf_destroy(struct enic *enic);
271 uint16_t enic_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
272                         uint16_t nb_pkts);
273 uint16_t enic_dummy_recv_pkts(void *rx_queue,
274                               struct rte_mbuf **rx_pkts,
275                               uint16_t nb_pkts);
276 uint16_t enic_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
277                                uint16_t nb_pkts);
278 int enic_set_mtu(struct enic *enic, uint16_t new_mtu);
279 int enic_link_update(struct enic *enic);
280 void enic_fdir_info(struct enic *enic);
281 void enic_fdir_info_get(struct enic *enic, struct rte_eth_fdir_info *stats);
282 void copy_fltr_v1(struct filter_v2 *fltr, struct rte_eth_fdir_input *input,
283                   struct rte_eth_fdir_masks *masks);
284 void copy_fltr_v2(struct filter_v2 *fltr, struct rte_eth_fdir_input *input,
285                   struct rte_eth_fdir_masks *masks);
286 extern const struct rte_flow_ops enic_flow_ops;
287 #endif /* _ENIC_H_ */