xref: /dpdk/drivers/net/virtio/virtio_user/virtio_user_dev.h (revision dbce501ed7c4c5e4d11ea07264148d6be3934f8f)
15566a3e3SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
25566a3e3SBruce Richardson  * Copyright(c) 2010-2016 Intel Corporation
337a7eb2aSJianfeng Tan  */
437a7eb2aSJianfeng Tan 
537a7eb2aSJianfeng Tan #ifndef _VIRTIO_USER_DEV_H
637a7eb2aSJianfeng Tan #define _VIRTIO_USER_DEV_H
737a7eb2aSJianfeng Tan 
837a7eb2aSJianfeng Tan #include <limits.h>
9bd8f50a4SZhiyong Yang #include <stdbool.h>
107990d039SMaxime Coquelin 
117990d039SMaxime Coquelin #include "../virtio.h"
1237a7eb2aSJianfeng Tan #include "../virtio_ring.h"
1337a7eb2aSJianfeng Tan 
14f908b22eSAdrian Moreno enum virtio_user_backend_type {
15f908b22eSAdrian Moreno 	VIRTIO_USER_BACKEND_UNKNOWN,
16f908b22eSAdrian Moreno 	VIRTIO_USER_BACKEND_VHOST_USER,
17f908b22eSAdrian Moreno 	VIRTIO_USER_BACKEND_VHOST_KERNEL,
187d62bf6fSMaxime Coquelin 	VIRTIO_USER_BACKEND_VHOST_VDPA,
19f908b22eSAdrian Moreno };
20f908b22eSAdrian Moreno 
2148a44640SJens Freimann struct virtio_user_queue {
2248a44640SJens Freimann 	uint16_t used_idx;
2348a44640SJens Freimann 	bool avail_wrap_counter;
2448a44640SJens Freimann 	bool used_wrap_counter;
2548a44640SJens Freimann };
2648a44640SJens Freimann 
2737a7eb2aSJianfeng Tan struct virtio_user_dev {
2865832c82SMaxime Coquelin 	struct virtio_hw hw;
29f908b22eSAdrian Moreno 	enum virtio_user_backend_type backend_type;
30bd8f50a4SZhiyong Yang 	bool		is_server;  /* server or client mode */
3133d24d65SJianfeng Tan 
326fdf32d1SMaxime Coquelin 	int		*callfds;
336fdf32d1SMaxime Coquelin 	int		*kickfds;
3437a7eb2aSJianfeng Tan 	int		mac_specified;
3552901852SMaxime Coquelin 	uint16_t	max_queue_pairs;
3652901852SMaxime Coquelin 	uint16_t	queue_pairs;
3737a7eb2aSJianfeng Tan 	uint32_t	queue_size;
38142678d4SJianfeng Tan 	uint64_t	features; /* the negotiated features with driver,
39142678d4SJianfeng Tan 				   * and will be sync with device
40142678d4SJianfeng Tan 				   */
41142678d4SJianfeng Tan 	uint64_t	device_features; /* supported features by device */
42bb97d2ddSTiwei Bie 	uint64_t	frontend_features; /* enabled frontend features */
437c66ff61SMarvin Liu 	uint64_t	unsupported_features; /* unsupported features mask */
4437a7eb2aSJianfeng Tan 	uint8_t		status;
45d0131e49SXiao Wang 	uint16_t	net_status;
4635b2d13fSOlivier Matz 	uint8_t		mac_addr[RTE_ETHER_ADDR_LEN];
4737a7eb2aSJianfeng Tan 	char		path[PATH_MAX];
4886388a3aSMaxime Coquelin 	char		*ifname;
4986388a3aSMaxime Coquelin 
5048a44640SJens Freimann 	union {
516fdf32d1SMaxime Coquelin 		void			*ptr;
526fdf32d1SMaxime Coquelin 		struct vring		*split;
536fdf32d1SMaxime Coquelin 		struct vring_packed	*packed;
546fdf32d1SMaxime Coquelin 	} vrings;
556fdf32d1SMaxime Coquelin 
566fdf32d1SMaxime Coquelin 	struct virtio_user_queue *packed_queues;
576fdf32d1SMaxime Coquelin 	bool		*qp_enabled;
5848a44640SJens Freimann 
5933d24d65SJianfeng Tan 	struct virtio_user_backend_ops *ops;
6012ecb2f6SMaxime Coquelin 	pthread_mutex_t	mutex;
6112ecb2f6SMaxime Coquelin 	bool		started;
62748e5ea5SMaxime Coquelin 
6366b45ceaSMaxime Coquelin 	bool			hw_cvq;
6466b45ceaSMaxime Coquelin 	struct virtqueue	*scvq;
6566b45ceaSMaxime Coquelin 
66748e5ea5SMaxime Coquelin 	void *backend_data;
670fd27826SSrujana Challa 
680fd27826SSrujana Challa 	uint16_t **notify_area;
6937a7eb2aSJianfeng Tan };
7037a7eb2aSJianfeng Tan 
71844e4683SMaxime Coquelin int virtio_user_dev_set_features(struct virtio_user_dev *dev);
7237a7eb2aSJianfeng Tan int virtio_user_start_device(struct virtio_user_dev *dev);
7337a7eb2aSJianfeng Tan int virtio_user_stop_device(struct virtio_user_dev *dev);
7452901852SMaxime Coquelin int virtio_user_dev_init(struct virtio_user_dev *dev, char *path, uint16_t queues,
75488ed97aSMarvin Liu 			 int cq, int queue_size, const char *mac, char **ifname,
761c8489daSTiwei Bie 			 int server, int mrg_rxbuf, int in_order,
77f908b22eSAdrian Moreno 			 int packed_vq,
78f908b22eSAdrian Moreno 			 enum virtio_user_backend_type backend_type);
7937a7eb2aSJianfeng Tan void virtio_user_dev_uninit(struct virtio_user_dev *dev);
80f9b9d1a5SJianfeng Tan void virtio_user_handle_cq(struct virtio_user_dev *dev, uint16_t queue_idx);
8166b45ceaSMaxime Coquelin int virtio_user_dev_create_shadow_cvq(struct virtio_user_dev *dev, struct virtqueue *vq);
8266b45ceaSMaxime Coquelin void virtio_user_dev_destroy_shadow_cvq(struct virtio_user_dev *dev);
83d7e10ea9SAdrian Moreno int virtio_user_dev_set_status(struct virtio_user_dev *dev, uint8_t status);
84d7e10ea9SAdrian Moreno int virtio_user_dev_update_status(struct virtio_user_dev *dev);
8594973531SMaxime Coquelin int virtio_user_dev_update_link_state(struct virtio_user_dev *dev);
86c995b005SMaxime Coquelin int virtio_user_dev_set_mac(struct virtio_user_dev *dev);
87c995b005SMaxime Coquelin int virtio_user_dev_get_mac(struct virtio_user_dev *dev);
88*dbce501eSSrujana Challa int virtio_user_dev_get_rss_config(struct virtio_user_dev *dev, void *dst, size_t offset,
89*dbce501eSSrujana Challa 				   int length);
9023abee9dSIlya Maximets void virtio_user_dev_delayed_disconnect_handler(void *param);
9194973531SMaxime Coquelin int virtio_user_dev_server_reconnect(struct virtio_user_dev *dev);
92b0395dc8SAdrian Moreno extern const char * const virtio_user_backend_strings[];
9337a7eb2aSJianfeng Tan #endif
94