1da054c64SPaolo Bonzini /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2da054c64SPaolo Bonzini #ifndef _LINUX_VHOST_TYPES_H 3da054c64SPaolo Bonzini #define _LINUX_VHOST_TYPES_H 4da054c64SPaolo Bonzini /* Userspace interface for in-kernel virtio accelerators. */ 5da054c64SPaolo Bonzini 6da054c64SPaolo Bonzini /* vhost is used to reduce the number of system calls involved in virtio. 7da054c64SPaolo Bonzini * 8da054c64SPaolo Bonzini * Existing virtio net code is used in the guest without modification. 9da054c64SPaolo Bonzini * 10da054c64SPaolo Bonzini * This header includes interface used by userspace hypervisor for 11da054c64SPaolo Bonzini * device configuration. 12da054c64SPaolo Bonzini */ 13da054c64SPaolo Bonzini 14da054c64SPaolo Bonzini #include "standard-headers/linux/types.h" 15da054c64SPaolo Bonzini 16da054c64SPaolo Bonzini #include "standard-headers/linux/virtio_config.h" 17da054c64SPaolo Bonzini #include "standard-headers/linux/virtio_ring.h" 18da054c64SPaolo Bonzini 19da054c64SPaolo Bonzini struct vhost_vring_state { 20da054c64SPaolo Bonzini unsigned int index; 21da054c64SPaolo Bonzini unsigned int num; 22da054c64SPaolo Bonzini }; 23da054c64SPaolo Bonzini 24da054c64SPaolo Bonzini struct vhost_vring_file { 25da054c64SPaolo Bonzini unsigned int index; 26da054c64SPaolo Bonzini int fd; /* Pass -1 to unbind from file. */ 27da054c64SPaolo Bonzini 28da054c64SPaolo Bonzini }; 29da054c64SPaolo Bonzini 30da054c64SPaolo Bonzini struct vhost_vring_addr { 31da054c64SPaolo Bonzini unsigned int index; 32da054c64SPaolo Bonzini /* Option flags. */ 33da054c64SPaolo Bonzini unsigned int flags; 34da054c64SPaolo Bonzini /* Flag values: */ 35da054c64SPaolo Bonzini /* Whether log address is valid. If set enables logging. */ 36da054c64SPaolo Bonzini #define VHOST_VRING_F_LOG 0 37da054c64SPaolo Bonzini 38da054c64SPaolo Bonzini /* Start of array of descriptors (virtually contiguous) */ 39da054c64SPaolo Bonzini uint64_t desc_user_addr; 40da054c64SPaolo Bonzini /* Used structure address. Must be 32 bit aligned */ 41da054c64SPaolo Bonzini uint64_t used_user_addr; 42da054c64SPaolo Bonzini /* Available structure address. Must be 16 bit aligned */ 43da054c64SPaolo Bonzini uint64_t avail_user_addr; 44da054c64SPaolo Bonzini /* Logging support. */ 45da054c64SPaolo Bonzini /* Log writes to used structure, at offset calculated from specified 46da054c64SPaolo Bonzini * address. Address must be 32 bit aligned. */ 47da054c64SPaolo Bonzini uint64_t log_guest_addr; 48da054c64SPaolo Bonzini }; 49da054c64SPaolo Bonzini 50d0bf492fSCédric Le Goater struct vhost_worker_state { 51d0bf492fSCédric Le Goater /* 52d0bf492fSCédric Le Goater * For VHOST_NEW_WORKER the kernel will return the new vhost_worker id. 53d0bf492fSCédric Le Goater * For VHOST_FREE_WORKER this must be set to the id of the vhost_worker 54d0bf492fSCédric Le Goater * to free. 55d0bf492fSCédric Le Goater */ 56d0bf492fSCédric Le Goater unsigned int worker_id; 57d0bf492fSCédric Le Goater }; 58d0bf492fSCédric Le Goater 59d0bf492fSCédric Le Goater struct vhost_vring_worker { 60d0bf492fSCédric Le Goater /* vring index */ 61d0bf492fSCédric Le Goater unsigned int index; 62d0bf492fSCédric Le Goater /* The id of the vhost_worker returned from VHOST_NEW_WORKER */ 63d0bf492fSCédric Le Goater unsigned int worker_id; 64d0bf492fSCédric Le Goater }; 65d0bf492fSCédric Le Goater 66da054c64SPaolo Bonzini /* no alignment requirement */ 67da054c64SPaolo Bonzini struct vhost_iotlb_msg { 68da054c64SPaolo Bonzini uint64_t iova; 69da054c64SPaolo Bonzini uint64_t size; 70da054c64SPaolo Bonzini uint64_t uaddr; 71da054c64SPaolo Bonzini #define VHOST_ACCESS_RO 0x1 72da054c64SPaolo Bonzini #define VHOST_ACCESS_WO 0x2 73da054c64SPaolo Bonzini #define VHOST_ACCESS_RW 0x3 74da054c64SPaolo Bonzini uint8_t perm; 75da054c64SPaolo Bonzini #define VHOST_IOTLB_MISS 1 76da054c64SPaolo Bonzini #define VHOST_IOTLB_UPDATE 2 77da054c64SPaolo Bonzini #define VHOST_IOTLB_INVALIDATE 3 78da054c64SPaolo Bonzini #define VHOST_IOTLB_ACCESS_FAIL 4 79e6546342SJason Wang /* 80e6546342SJason Wang * VHOST_IOTLB_BATCH_BEGIN and VHOST_IOTLB_BATCH_END allow modifying 81e6546342SJason Wang * multiple mappings in one go: beginning with 82e6546342SJason Wang * VHOST_IOTLB_BATCH_BEGIN, followed by any number of 83e6546342SJason Wang * VHOST_IOTLB_UPDATE messages, and ending with VHOST_IOTLB_BATCH_END. 84e6546342SJason Wang * When one of these two values is used as the message type, the rest 85e6546342SJason Wang * of the fields in the message are ignored. There's no guarantee that 86e6546342SJason Wang * these changes take place automatically in the device. 87e6546342SJason Wang */ 88e6546342SJason Wang #define VHOST_IOTLB_BATCH_BEGIN 5 89e6546342SJason Wang #define VHOST_IOTLB_BATCH_END 6 90da054c64SPaolo Bonzini uint8_t type; 91da054c64SPaolo Bonzini }; 92da054c64SPaolo Bonzini 93da054c64SPaolo Bonzini #define VHOST_IOTLB_MSG 0x1 94da054c64SPaolo Bonzini #define VHOST_IOTLB_MSG_V2 0x2 95da054c64SPaolo Bonzini 96da054c64SPaolo Bonzini struct vhost_msg { 97da054c64SPaolo Bonzini int type; 98da054c64SPaolo Bonzini union { 99da054c64SPaolo Bonzini struct vhost_iotlb_msg iotlb; 100da054c64SPaolo Bonzini uint8_t padding[64]; 101da054c64SPaolo Bonzini }; 102da054c64SPaolo Bonzini }; 103da054c64SPaolo Bonzini 104da054c64SPaolo Bonzini struct vhost_msg_v2 { 105da054c64SPaolo Bonzini uint32_t type; 106d525f73fSChenyi Qiang uint32_t asid; 107da054c64SPaolo Bonzini union { 108da054c64SPaolo Bonzini struct vhost_iotlb_msg iotlb; 109da054c64SPaolo Bonzini uint8_t padding[64]; 110da054c64SPaolo Bonzini }; 111da054c64SPaolo Bonzini }; 112da054c64SPaolo Bonzini 113da054c64SPaolo Bonzini struct vhost_memory_region { 114da054c64SPaolo Bonzini uint64_t guest_phys_addr; 115da054c64SPaolo Bonzini uint64_t memory_size; /* bytes */ 116da054c64SPaolo Bonzini uint64_t userspace_addr; 117da054c64SPaolo Bonzini uint64_t flags_padding; /* No flags are currently specified. */ 118da054c64SPaolo Bonzini }; 119da054c64SPaolo Bonzini 120da054c64SPaolo Bonzini /* All region addresses and sizes must be 4K aligned. */ 121da054c64SPaolo Bonzini #define VHOST_PAGE_SIZE 0x1000 122da054c64SPaolo Bonzini 123da054c64SPaolo Bonzini struct vhost_memory { 124da054c64SPaolo Bonzini uint32_t nregions; 125da054c64SPaolo Bonzini uint32_t padding; 126d525f73fSChenyi Qiang struct vhost_memory_region regions[]; 127da054c64SPaolo Bonzini }; 128da054c64SPaolo Bonzini 129da054c64SPaolo Bonzini /* VHOST_SCSI specific definitions */ 130da054c64SPaolo Bonzini 131da054c64SPaolo Bonzini /* 132da054c64SPaolo Bonzini * Used by QEMU userspace to ensure a consistent vhost-scsi ABI. 133da054c64SPaolo Bonzini * 134da054c64SPaolo Bonzini * ABI Rev 0: July 2012 version starting point for v3.6-rc merge candidate + 135da054c64SPaolo Bonzini * RFC-v2 vhost-scsi userspace. Add GET_ABI_VERSION ioctl usage 136da054c64SPaolo Bonzini * ABI Rev 1: January 2013. Ignore vhost_tpgt field in struct vhost_scsi_target. 137da054c64SPaolo Bonzini * All the targets under vhost_wwpn can be seen and used by guset. 138da054c64SPaolo Bonzini */ 139da054c64SPaolo Bonzini 140da054c64SPaolo Bonzini #define VHOST_SCSI_ABI_VERSION 1 141da054c64SPaolo Bonzini 142da054c64SPaolo Bonzini struct vhost_scsi_target { 143da054c64SPaolo Bonzini int abi_version; 144da054c64SPaolo Bonzini char vhost_wwpn[224]; /* TRANSPORT_IQN_LEN */ 145da054c64SPaolo Bonzini unsigned short vhost_tpgt; 146da054c64SPaolo Bonzini unsigned short reserved; 147da054c64SPaolo Bonzini }; 148da054c64SPaolo Bonzini 149dc6f8d45SCornelia Huck /* VHOST_VDPA specific definitions */ 150dc6f8d45SCornelia Huck 151dc6f8d45SCornelia Huck struct vhost_vdpa_config { 152dc6f8d45SCornelia Huck uint32_t off; 153dc6f8d45SCornelia Huck uint32_t len; 154d525f73fSChenyi Qiang uint8_t buf[]; 155dc6f8d45SCornelia Huck }; 156dc6f8d45SCornelia Huck 157b3c818a4SEric Farman /* vhost vdpa IOVA range 158b3c818a4SEric Farman * @first: First address that can be mapped by vhost-vDPA 159b3c818a4SEric Farman * @last: Last address that can be mapped by vhost-vDPA 160b3c818a4SEric Farman */ 161b3c818a4SEric Farman struct vhost_vdpa_iova_range { 162b3c818a4SEric Farman uint64_t first; 163b3c818a4SEric Farman uint64_t last; 164b3c818a4SEric Farman }; 165b3c818a4SEric Farman 166da054c64SPaolo Bonzini /* Feature bits */ 167da054c64SPaolo Bonzini /* Log all write descriptors. Can be changed while device is active. */ 168da054c64SPaolo Bonzini #define VHOST_F_LOG_ALL 26 169da054c64SPaolo Bonzini /* vhost-net should add virtio_net_hdr for RX, and strip for TX packets. */ 170da054c64SPaolo Bonzini #define VHOST_NET_F_VIRTIO_NET_HDR 27 171da054c64SPaolo Bonzini 172d525f73fSChenyi Qiang /* Use message type V2 */ 173d525f73fSChenyi Qiang #define VHOST_BACKEND_F_IOTLB_MSG_V2 0x1 174d525f73fSChenyi Qiang /* IOTLB can accept batching hints */ 175d525f73fSChenyi Qiang #define VHOST_BACKEND_F_IOTLB_BATCH 0x2 176d525f73fSChenyi Qiang /* IOTLB can accept address space identifier through V2 type of IOTLB 177d525f73fSChenyi Qiang * message 178d525f73fSChenyi Qiang */ 179d525f73fSChenyi Qiang #define VHOST_BACKEND_F_IOTLB_ASID 0x3 180d525f73fSChenyi Qiang /* Device can be suspended */ 181d525f73fSChenyi Qiang #define VHOST_BACKEND_F_SUSPEND 0x4 182c5c0fdbeSDavid 'Digit' Turner /* Device can be resumed */ 183c5c0fdbeSDavid 'Digit' Turner #define VHOST_BACKEND_F_RESUME 0x5 184da3c22c7SThomas Huth /* Device supports the driver enabling virtqueues both before and after 185da3c22c7SThomas Huth * DRIVER_OK 186da3c22c7SThomas Huth */ 187da3c22c7SThomas Huth #define VHOST_BACKEND_F_ENABLE_AFTER_DRIVER_OK 0x6 188*efb91426SDaniel Henrique Barboza /* Device may expose the virtqueue's descriptor area, driver area and 189*efb91426SDaniel Henrique Barboza * device area to a different group for ASID binding than where its 190*efb91426SDaniel Henrique Barboza * buffers may reside. Requires VHOST_BACKEND_F_IOTLB_ASID. 191*efb91426SDaniel Henrique Barboza */ 192*efb91426SDaniel Henrique Barboza #define VHOST_BACKEND_F_DESC_ASID 0x7 193*efb91426SDaniel Henrique Barboza /* IOTLB don't flush memory mapping across device reset */ 194*efb91426SDaniel Henrique Barboza #define VHOST_BACKEND_F_IOTLB_PERSIST 0x8 195d525f73fSChenyi Qiang 196da054c64SPaolo Bonzini #endif 197