Data Accelerator Offload
Loading...
Searching...
No Matches
dao_virtio_netdev.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: Marvell-Proprietary
2 * Copyright (c) 2023 Marvell
3 */
4
11#ifndef __INCLUDE_DAO_VIRTIO_NET_H__
12#define __INCLUDE_DAO_VIRTIO_NET_H__
13
14#include <dao_virtio.h>
15#include <dao_util.h>
16
17#include <spec/virtio_net.h>
18
22 uint16_t status;
29 uint32_t speed;
37 uint8_t duplex;
38};
39
43 uint16_t pem_devid;
45#define DAO_VIRTIO_NETDEV_EXTBUF DAO_BIT_ULL(0)
46 uint16_t flags;
47 union {
48 struct {
50 struct rte_mempool *pool;
51 };
53 struct {
54 uint16_t dataroom_size;
55 };
56 };
58 uint16_t dma_vchan;
64 uint16_t reta_size;
66 uint16_t hash_key_size;
68 uint16_t mtu;
70 uint8_t mac[VIRTIO_NET_ETHER_ADDR_LEN];
74 bool csum_en;
75};
76
77/* End of structure dao_virtio_netdev_conf. */
78
84 uint16_t deq_fn_id;
86 uint16_t enq_fn_id;
88 uint16_t mgmt_fn_id;
90#define DAO_VIRTIO_NETDEV_MEM_SZ 8192
91 uint8_t reserved[DAO_VIRTIO_NETDEV_MEM_SZ];
92};
93
97 uint64_t desc_data[2];
99 struct virtio_net_hdr hdr;
100} __rte_packed;
101
104
105/* Fast path data */
107typedef uint16_t (*dao_virtio_net_deq_fn_t)(void *q, struct rte_mbuf **mbufs, uint16_t nb_mbufs);
109typedef uint16_t (*dao_virtio_net_enq_fn_t)(void *q, struct rte_mbuf **mbufs, uint16_t nb_mbufs);
111typedef int (*dao_net_desc_manage_fn_t)(uint16_t devid, uint16_t qp_count);
112
119
121typedef uint16_t (*dao_virtio_net_deq_ext_fn_t)(void *q, void **vbufs, uint16_t nb_bufs);
123typedef uint16_t (*dao_virtio_net_enq_ext_fn_t)(void *q, void **vbufs, uint16_t nb_bufs);
128
130typedef int (*dao_virtio_netdev_rss_cb_t)(uint16_t devid, struct virtio_net_ctrl_rss *rss);
132typedef int (*dao_virtio_netdev_status_cb_t)(uint16_t devid, uint8_t status);
134typedef int (*dao_virtio_netdev_promisc_cb_t)(uint16_t devid, uint8_t enable);
136typedef int (*dao_virtio_netdev_allmulti_cb_t)(uint16_t devid, uint8_t enable);
138typedef int (*dao_virtio_netdev_mac_set_cb_t)(uint16_t devid, uint8_t *mac);
140typedef int (*dao_virtio_netdev_mac_add_cb_t)(uint16_t devid, struct virtio_net_ctrl_mac *mac_tbl,
141 uint8_t type);
143typedef int (*dao_virtio_netdev_mq_cfg_t)(uint16_t devid, bool qmap_set);
145typedef int (*dao_virtio_netdev_vlan_t)(uint16_t devid, uint16_t vlan_tci);
146typedef int (*dao_virtio_netdev_extbuf_get)(uint16_t devid, void *buffs[], uint16_t nb_buffs);
147typedef int (*dao_virtio_netdev_extbuf_put)(uint16_t devid, void *buffs[], uint16_t nb_buffs);
148
174
175/* End of structure dao_virtio_netdev_cbs. */
176
187int dao_virtio_netdev_init(uint16_t devid, struct dao_virtio_netdev_conf *conf);
188
198int dao_virtio_netdev_fini(uint16_t devid);
199
207
212
222
231uint64_t dao_virtio_netdev_feature_bits_get(uint16_t devid);
232
245int dao_virtio_netdev_queue_count_max(uint16_t pem_devid, uint16_t devid);
246
258
267uint8_t dao_virtio_netdev_hdrlen_get(uint16_t devid);
268
269/* Fast path routines */
270
284static __rte_always_inline int
285dao_virtio_net_desc_manage(uint16_t devid, uint16_t qp_count)
286{
287 struct dao_virtio_netdev *netdev = &dao_virtio_netdevs[devid];
289 mgmt_fn = dao_net_desc_manage_fns[netdev->mgmt_fn_id];
290
291 return (*mgmt_fn)(devid, qp_count);
292}
293
308static __rte_always_inline uint16_t
309dao_virtio_net_dequeue_burst(uint16_t devid, uint16_t qid,
310 struct rte_mbuf **mbufs, uint16_t nb_mbufs)
311{
312 struct dao_virtio_netdev *netdev = &dao_virtio_netdevs[devid];
314 void *q = netdev->qs[qid];
315
316 if (unlikely(!q))
317 return 0;
318
319 deq_fn = dao_virtio_net_deq_fns[netdev->deq_fn_id];
320
321 return (*deq_fn)(q, mbufs, nb_mbufs);
322}
323
338static __rte_always_inline uint16_t
339dao_virtio_net_enqueue_burst(uint16_t devid, uint16_t qid,
340 struct rte_mbuf **mbufs, uint16_t nb_mbufs)
341{
342 struct dao_virtio_netdev *netdev = &dao_virtio_netdevs[devid];
344 void *q = netdev->qs[qid];
345
346 if (unlikely(!q))
347 return 0;
348
349 enq_fn = dao_virtio_net_enq_fns[netdev->enq_fn_id];
350
351 return (*enq_fn)(q, mbufs, nb_mbufs);
352}
353
368static __rte_always_inline uint16_t
369dao_virtio_net_dequeue_burst_ext(uint16_t devid, uint16_t qid, void **vbufs, uint16_t nb_bufs)
370{
371 struct dao_virtio_netdev *netdev = &dao_virtio_netdevs[devid];
373 void *q = netdev->qs[qid];
374
375 if (unlikely(!q))
376 return 0;
377
378 deq_fn = dao_virtio_net_deq_ext_fns[netdev->deq_fn_id];
379
380 return (*deq_fn)(q, vbufs, nb_bufs);
381}
382
397static __rte_always_inline uint16_t
398dao_virtio_net_enqueue_burst_ext(uint16_t devid, uint16_t qid, void **vbufs, uint16_t nb_bufs)
399{
400 struct dao_virtio_netdev *netdev = &dao_virtio_netdevs[devid];
402 void *q = netdev->qs[qid];
403
404 if (unlikely(!q))
405 return 0;
406
407 enq_fn = dao_virtio_net_enq_ext_fns[netdev->enq_fn_id];
408
409 return (*enq_fn)(q, vbufs, nb_bufs);
410}
411
412#endif /* __INCLUDE_DAO_VIRTIO_NET_H__ */
#define DAO_VIRTIO_MAX_QUEUES
Definition dao_virtio.h:21
static __rte_always_inline uint16_t dao_virtio_net_enqueue_burst_ext(uint16_t devid, uint16_t qid, void **vbufs, uint16_t nb_bufs)
static __rte_always_inline uint16_t dao_virtio_net_enqueue_burst(uint16_t devid, uint16_t qid, struct rte_mbuf **mbufs, uint16_t nb_mbufs)
uint8_t dao_virtio_netdev_hdrlen_get(uint16_t devid)
int dao_virtio_netdev_init(uint16_t devid, struct dao_virtio_netdev_conf *conf)
int(* dao_virtio_netdev_allmulti_cb_t)(uint16_t devid, uint8_t enable)
void dao_virtio_netdev_cb_register(struct dao_virtio_netdev_cbs *cbs)
dao_virtio_net_enq_fn_t dao_virtio_net_enq_fns[]
uint16_t(* dao_virtio_net_enq_ext_fn_t)(void *q, void **vbufs, uint16_t nb_bufs)
int(* dao_virtio_netdev_mac_add_cb_t)(uint16_t devid, struct virtio_net_ctrl_mac *mac_tbl, uint8_t type)
dao_virtio_net_enq_ext_fn_t dao_virtio_net_enq_ext_fns[]
static __rte_always_inline int dao_virtio_net_desc_manage(uint16_t devid, uint16_t qp_count)
static __rte_always_inline uint16_t dao_virtio_net_dequeue_burst(uint16_t devid, uint16_t qid, struct rte_mbuf **mbufs, uint16_t nb_mbufs)
uint16_t(* dao_virtio_net_deq_ext_fn_t)(void *q, void **vbufs, uint16_t nb_bufs)
int dao_virtio_netdev_link_sts_update(uint16_t devid, struct dao_virtio_netdev_link_info *info)
dao_virtio_net_deq_fn_t dao_virtio_net_deq_fns[]
int(* dao_virtio_netdev_mq_cfg_t)(uint16_t devid, bool qmap_set)
void dao_virtio_netdev_cb_unregister(void)
dao_net_desc_manage_fn_t dao_net_desc_manage_fns[]
struct dao_virtio_netdev dao_virtio_netdevs[]
int(* dao_virtio_netdev_vlan_t)(uint16_t devid, uint16_t vlan_tci)
uint16_t(* dao_virtio_net_enq_fn_t)(void *q, struct rte_mbuf **mbufs, uint16_t nb_mbufs)
int(* dao_virtio_netdev_status_cb_t)(uint16_t devid, uint8_t status)
static __rte_always_inline uint16_t dao_virtio_net_dequeue_burst_ext(uint16_t devid, uint16_t qid, void **vbufs, uint16_t nb_bufs)
dao_virtio_net_deq_ext_fn_t dao_virtio_net_deq_ext_fns[]
int dao_virtio_netdev_fini(uint16_t devid)
#define DAO_VIRTIO_NETDEV_MEM_SZ
int(* dao_virtio_netdev_promisc_cb_t)(uint16_t devid, uint8_t enable)
uint16_t(* dao_virtio_net_deq_fn_t)(void *q, struct rte_mbuf **mbufs, uint16_t nb_mbufs)
int(* dao_virtio_netdev_mac_set_cb_t)(uint16_t devid, uint8_t *mac)
int(* dao_virtio_netdev_rss_cb_t)(uint16_t devid, struct virtio_net_ctrl_rss *rss)
int dao_virtio_netdev_queue_count_max(uint16_t pem_devid, uint16_t devid)
int dao_virtio_netdev_queue_count(uint16_t devid)
int(* dao_net_desc_manage_fn_t)(uint16_t devid, uint16_t qp_count)
uint64_t dao_virtio_netdev_feature_bits_get(uint16_t devid)
struct virtio_net_hdr hdr
dao_virtio_netdev_rss_cb_t rss_cb
dao_virtio_netdev_status_cb_t status_cb
dao_virtio_netdev_promisc_cb_t promisc_cb
dao_virtio_netdev_mac_set_cb_t mac_set
dao_virtio_netdev_extbuf_get extbuf_get
dao_virtio_netdev_vlan_t vlan_add
dao_virtio_netdev_extbuf_put extbuf_put
dao_virtio_netdev_vlan_t vlan_del
dao_virtio_netdev_allmulti_cb_t allmulti_cb
dao_virtio_netdev_mac_add_cb_t mac_add
dao_virtio_netdev_mq_cfg_t mq_configure
uint8_t mac[VIRTIO_NET_ETHER_ADDR_LEN]
struct dao_virtio_netdev_link_info link_info
struct rte_mempool * pool
void *qs[DAO_VIRTIO_MAX_QUEUES] __rte_cache_aligned