15566a3e3SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 25566a3e3SBruce Richardson * Copyright(c) 2010-2016 Intel Corporation 36a84c37eSJianfeng Tan */ 46a84c37eSJianfeng Tan 51708804eSAndrius Sirvys #ifndef _VIRTIO_USER_VHOST_H 61708804eSAndrius Sirvys #define _VIRTIO_USER_VHOST_H 76a84c37eSJianfeng Tan 86a84c37eSJianfeng Tan #include <stdint.h> 96a84c37eSJianfeng Tan #include <linux/types.h> 106a84c37eSJianfeng Tan #include <linux/ioctl.h> 116a84c37eSJianfeng Tan 12b5ba7ee4SMaxime Coquelin #include <rte_errno.h> 13b5ba7ee4SMaxime Coquelin 14b5ba7ee4SMaxime Coquelin #include "../virtio.h" 156a84c37eSJianfeng Tan #include "../virtio_logs.h" 166a84c37eSJianfeng Tan #include "../virtqueue.h" 176a84c37eSJianfeng Tan 186a84c37eSJianfeng Tan struct vhost_vring_state { 196a84c37eSJianfeng Tan unsigned int index; 206a84c37eSJianfeng Tan unsigned int num; 216a84c37eSJianfeng Tan }; 226a84c37eSJianfeng Tan 236a84c37eSJianfeng Tan struct vhost_vring_file { 246a84c37eSJianfeng Tan unsigned int index; 256a84c37eSJianfeng Tan int fd; 266a84c37eSJianfeng Tan }; 276a84c37eSJianfeng Tan 286a84c37eSJianfeng Tan struct vhost_vring_addr { 296a84c37eSJianfeng Tan unsigned int index; 306a84c37eSJianfeng Tan /* Option flags. */ 316a84c37eSJianfeng Tan unsigned int flags; 326a84c37eSJianfeng Tan /* Flag values: */ 336a84c37eSJianfeng Tan /* Whether log address is valid. If set enables logging. */ 346a84c37eSJianfeng Tan #define VHOST_VRING_F_LOG 0 356a84c37eSJianfeng Tan 366a84c37eSJianfeng Tan /* Start of array of descriptors (virtually contiguous) */ 376a84c37eSJianfeng Tan uint64_t desc_user_addr; 386a84c37eSJianfeng Tan /* Used structure address. Must be 32 bit aligned */ 396a84c37eSJianfeng Tan uint64_t used_user_addr; 406a84c37eSJianfeng Tan /* Available structure address. Must be 16 bit aligned */ 416a84c37eSJianfeng Tan uint64_t avail_user_addr; 426a84c37eSJianfeng Tan /* Logging support. */ 436a84c37eSJianfeng Tan /* Log writes to used structure, at offset calculated from specified 446a84c37eSJianfeng Tan * address. Address must be 32 bit aligned. 456a84c37eSJianfeng Tan */ 466a84c37eSJianfeng Tan uint64_t log_guest_addr; 476a84c37eSJianfeng Tan }; 486a84c37eSJianfeng Tan 4935a6630eSMaxime Coquelin #ifndef VHOST_BACKEND_F_IOTLB_MSG_V2 5035a6630eSMaxime Coquelin #define VHOST_BACKEND_F_IOTLB_MSG_V2 1 5135a6630eSMaxime Coquelin #endif 5235a6630eSMaxime Coquelin 53a121f175SMaxime Coquelin #ifndef VHOST_BACKEND_F_IOTLB_BATCH 54a121f175SMaxime Coquelin #define VHOST_BACKEND_F_IOTLB_BATCH 2 55a121f175SMaxime Coquelin #endif 56a121f175SMaxime Coquelin 576a84c37eSJianfeng Tan struct vhost_memory_region { 586a84c37eSJianfeng Tan uint64_t guest_phys_addr; 596a84c37eSJianfeng Tan uint64_t memory_size; /* bytes */ 606a84c37eSJianfeng Tan uint64_t userspace_addr; 616a84c37eSJianfeng Tan uint64_t mmap_offset; 626a84c37eSJianfeng Tan }; 636a84c37eSJianfeng Tan 6433d24d65SJianfeng Tan struct virtio_user_dev; 650b6df936SJianfeng Tan 6633d24d65SJianfeng Tan struct virtio_user_backend_ops { 6733d24d65SJianfeng Tan int (*setup)(struct virtio_user_dev *dev); 68748e5ea5SMaxime Coquelin int (*destroy)(struct virtio_user_dev *dev); 695b75b63cSMaxime Coquelin int (*get_backend_features)(uint64_t *features); 7006856cabSMaxime Coquelin int (*set_owner)(struct virtio_user_dev *dev); 71cc0151b3SMaxime Coquelin int (*get_features)(struct virtio_user_dev *dev, uint64_t *features); 72cc0151b3SMaxime Coquelin int (*set_features)(struct virtio_user_dev *dev, uint64_t features); 73539d910cSMaxime Coquelin int (*set_memory_table)(struct virtio_user_dev *dev); 74ab9098d2SMaxime Coquelin int (*set_vring_num)(struct virtio_user_dev *dev, struct vhost_vring_state *state); 75ab9098d2SMaxime Coquelin int (*set_vring_base)(struct virtio_user_dev *dev, struct vhost_vring_state *state); 76ab9098d2SMaxime Coquelin int (*get_vring_base)(struct virtio_user_dev *dev, struct vhost_vring_state *state); 77ce399c36SMaxime Coquelin int (*set_vring_call)(struct virtio_user_dev *dev, struct vhost_vring_file *file); 78ce399c36SMaxime Coquelin int (*set_vring_kick)(struct virtio_user_dev *dev, struct vhost_vring_file *file); 79dc65db73SMaxime Coquelin int (*set_vring_addr)(struct virtio_user_dev *dev, struct vhost_vring_addr *addr); 808723c894SMaxime Coquelin int (*get_status)(struct virtio_user_dev *dev, uint8_t *status); 818723c894SMaxime Coquelin int (*set_status)(struct virtio_user_dev *dev, uint8_t status); 829b7466f6SMaxime Coquelin int (*get_config)(struct virtio_user_dev *dev, uint8_t *data, uint32_t off, uint32_t len); 839b7466f6SMaxime Coquelin int (*set_config)(struct virtio_user_dev *dev, const uint8_t *data, uint32_t off, 849b7466f6SMaxime Coquelin uint32_t len); 859eb56fb2SMaxime Coquelin int (*cvq_enable)(struct virtio_user_dev *dev, int enable); 861b34ad28SMaxime Coquelin int (*enable_qp)(struct virtio_user_dev *dev, uint16_t pair_idx, int enable); 871b34ad28SMaxime Coquelin int (*dma_map)(struct virtio_user_dev *dev, void *addr, uint64_t iova, size_t len); 881b34ad28SMaxime Coquelin int (*dma_unmap)(struct virtio_user_dev *dev, void *addr, uint64_t iova, size_t len); 8994973531SMaxime Coquelin int (*update_link_state)(struct virtio_user_dev *dev); 9094973531SMaxime Coquelin int (*server_disconnect)(struct virtio_user_dev *dev); 9194973531SMaxime Coquelin int (*server_reconnect)(struct virtio_user_dev *dev); 9294973531SMaxime Coquelin int (*get_intr_fd)(struct virtio_user_dev *dev); 93*0fd27826SSrujana Challa int (*map_notification_area)(struct virtio_user_dev *dev); 94*0fd27826SSrujana Challa int (*unmap_notification_area)(struct virtio_user_dev *dev); 9533d24d65SJianfeng Tan }; 9633d24d65SJianfeng Tan 97520dd992SFerruh Yigit extern struct virtio_user_backend_ops virtio_ops_user; 98520dd992SFerruh Yigit extern struct virtio_user_backend_ops virtio_ops_kernel; 996b901437SMaxime Coquelin extern struct virtio_user_backend_ops virtio_ops_vdpa; 100e3b43481SJianfeng Tan 1016a84c37eSJianfeng Tan #endif 102