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