14b867132SPaolo Bonzini /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 24b867132SPaolo Bonzini #ifndef _LINUX_VHOST_TYPES_H 34b867132SPaolo Bonzini #define _LINUX_VHOST_TYPES_H 44b867132SPaolo Bonzini /* Userspace interface for in-kernel virtio accelerators. */ 54b867132SPaolo Bonzini 64b867132SPaolo Bonzini /* vhost is used to reduce the number of system calls involved in virtio. 74b867132SPaolo Bonzini * 84b867132SPaolo Bonzini * Existing virtio net code is used in the guest without modification. 94b867132SPaolo Bonzini * 104b867132SPaolo Bonzini * This header includes interface used by userspace hypervisor for 114b867132SPaolo Bonzini * device configuration. 124b867132SPaolo Bonzini */ 134b867132SPaolo Bonzini 144b867132SPaolo Bonzini #include <linux/types.h> 154b867132SPaolo Bonzini #include <linux/compiler.h> 164b867132SPaolo Bonzini #include <linux/virtio_config.h> 174b867132SPaolo Bonzini #include <linux/virtio_ring.h> 184b867132SPaolo Bonzini 194b867132SPaolo Bonzini struct vhost_vring_state { 204b867132SPaolo Bonzini unsigned int index; 214b867132SPaolo Bonzini unsigned int num; 224b867132SPaolo Bonzini }; 234b867132SPaolo Bonzini 244b867132SPaolo Bonzini struct vhost_vring_file { 254b867132SPaolo Bonzini unsigned int index; 264b867132SPaolo Bonzini int fd; /* Pass -1 to unbind from file. */ 274b867132SPaolo Bonzini 284b867132SPaolo Bonzini }; 294b867132SPaolo Bonzini 304b867132SPaolo Bonzini struct vhost_vring_addr { 314b867132SPaolo Bonzini unsigned int index; 324b867132SPaolo Bonzini /* Option flags. */ 334b867132SPaolo Bonzini unsigned int flags; 344b867132SPaolo Bonzini /* Flag values: */ 354b867132SPaolo Bonzini /* Whether log address is valid. If set enables logging. */ 364b867132SPaolo Bonzini #define VHOST_VRING_F_LOG 0 374b867132SPaolo Bonzini 384b867132SPaolo Bonzini /* Start of array of descriptors (virtually contiguous) */ 394b867132SPaolo Bonzini __u64 desc_user_addr; 404b867132SPaolo Bonzini /* Used structure address. Must be 32 bit aligned */ 414b867132SPaolo Bonzini __u64 used_user_addr; 424b867132SPaolo Bonzini /* Available structure address. Must be 16 bit aligned */ 434b867132SPaolo Bonzini __u64 avail_user_addr; 444b867132SPaolo Bonzini /* Logging support. */ 454b867132SPaolo Bonzini /* Log writes to used structure, at offset calculated from specified 464b867132SPaolo Bonzini * address. Address must be 32 bit aligned. */ 474b867132SPaolo Bonzini __u64 log_guest_addr; 484b867132SPaolo Bonzini }; 494b867132SPaolo Bonzini 50c1ecd8e9SMike Christie struct vhost_worker_state { 51c1ecd8e9SMike Christie /* 52c1ecd8e9SMike Christie * For VHOST_NEW_WORKER the kernel will return the new vhost_worker id. 53c1ecd8e9SMike Christie * For VHOST_FREE_WORKER this must be set to the id of the vhost_worker 54c1ecd8e9SMike Christie * to free. 55c1ecd8e9SMike Christie */ 56c1ecd8e9SMike Christie unsigned int worker_id; 57c1ecd8e9SMike Christie }; 58c1ecd8e9SMike Christie 59c1ecd8e9SMike Christie struct vhost_vring_worker { 60c1ecd8e9SMike Christie /* vring index */ 61c1ecd8e9SMike Christie unsigned int index; 62c1ecd8e9SMike Christie /* The id of the vhost_worker returned from VHOST_NEW_WORKER */ 63c1ecd8e9SMike Christie unsigned int worker_id; 64c1ecd8e9SMike Christie }; 65c1ecd8e9SMike Christie 664b867132SPaolo Bonzini /* no alignment requirement */ 674b867132SPaolo Bonzini struct vhost_iotlb_msg { 684b867132SPaolo Bonzini __u64 iova; 694b867132SPaolo Bonzini __u64 size; 704b867132SPaolo Bonzini __u64 uaddr; 714b867132SPaolo Bonzini #define VHOST_ACCESS_RO 0x1 724b867132SPaolo Bonzini #define VHOST_ACCESS_WO 0x2 734b867132SPaolo Bonzini #define VHOST_ACCESS_RW 0x3 744b867132SPaolo Bonzini __u8 perm; 754b867132SPaolo Bonzini #define VHOST_IOTLB_MISS 1 764b867132SPaolo Bonzini #define VHOST_IOTLB_UPDATE 2 774b867132SPaolo Bonzini #define VHOST_IOTLB_INVALIDATE 3 784b867132SPaolo Bonzini #define VHOST_IOTLB_ACCESS_FAIL 4 7925abc060SJason Wang /* 8025abc060SJason Wang * VHOST_IOTLB_BATCH_BEGIN and VHOST_IOTLB_BATCH_END allow modifying 8125abc060SJason Wang * multiple mappings in one go: beginning with 8225abc060SJason Wang * VHOST_IOTLB_BATCH_BEGIN, followed by any number of 8325abc060SJason Wang * VHOST_IOTLB_UPDATE messages, and ending with VHOST_IOTLB_BATCH_END. 8425abc060SJason Wang * When one of these two values is used as the message type, the rest 8525abc060SJason Wang * of the fields in the message are ignored. There's no guarantee that 8625abc060SJason Wang * these changes take place automatically in the device. 8725abc060SJason Wang */ 8825abc060SJason Wang #define VHOST_IOTLB_BATCH_BEGIN 5 8925abc060SJason Wang #define VHOST_IOTLB_BATCH_END 6 904b867132SPaolo Bonzini __u8 type; 914b867132SPaolo Bonzini }; 924b867132SPaolo Bonzini 934b867132SPaolo Bonzini #define VHOST_IOTLB_MSG 0x1 944b867132SPaolo Bonzini #define VHOST_IOTLB_MSG_V2 0x2 954b867132SPaolo Bonzini 964b867132SPaolo Bonzini struct vhost_msg { 974b867132SPaolo Bonzini int type; 984b867132SPaolo Bonzini union { 994b867132SPaolo Bonzini struct vhost_iotlb_msg iotlb; 1004b867132SPaolo Bonzini __u8 padding[64]; 1014b867132SPaolo Bonzini }; 1024b867132SPaolo Bonzini }; 1034b867132SPaolo Bonzini 1044b867132SPaolo Bonzini struct vhost_msg_v2 { 1054b867132SPaolo Bonzini __u32 type; 10691233ad7SGautam Dawar __u32 asid; 1074b867132SPaolo Bonzini union { 1084b867132SPaolo Bonzini struct vhost_iotlb_msg iotlb; 1094b867132SPaolo Bonzini __u8 padding[64]; 1104b867132SPaolo Bonzini }; 1114b867132SPaolo Bonzini }; 1124b867132SPaolo Bonzini 1134b867132SPaolo Bonzini struct vhost_memory_region { 1144b867132SPaolo Bonzini __u64 guest_phys_addr; 1154b867132SPaolo Bonzini __u64 memory_size; /* bytes */ 1164b867132SPaolo Bonzini __u64 userspace_addr; 1174b867132SPaolo Bonzini __u64 flags_padding; /* No flags are currently specified. */ 1184b867132SPaolo Bonzini }; 1194b867132SPaolo Bonzini 1204b867132SPaolo Bonzini /* All region addresses and sizes must be 4K aligned. */ 1214b867132SPaolo Bonzini #define VHOST_PAGE_SIZE 0x1000 1224b867132SPaolo Bonzini 1234b867132SPaolo Bonzini struct vhost_memory { 1244b867132SPaolo Bonzini __u32 nregions; 1254b867132SPaolo Bonzini __u32 padding; 12694dfc73eSGustavo A. R. Silva struct vhost_memory_region regions[]; 1274b867132SPaolo Bonzini }; 1284b867132SPaolo Bonzini 1294b867132SPaolo Bonzini /* VHOST_SCSI specific definitions */ 1304b867132SPaolo Bonzini 1314b867132SPaolo Bonzini /* 1324b867132SPaolo Bonzini * Used by QEMU userspace to ensure a consistent vhost-scsi ABI. 1334b867132SPaolo Bonzini * 1344b867132SPaolo Bonzini * ABI Rev 0: July 2012 version starting point for v3.6-rc merge candidate + 1354b867132SPaolo Bonzini * RFC-v2 vhost-scsi userspace. Add GET_ABI_VERSION ioctl usage 1364b867132SPaolo Bonzini * ABI Rev 1: January 2013. Ignore vhost_tpgt field in struct vhost_scsi_target. 1374b867132SPaolo Bonzini * All the targets under vhost_wwpn can be seen and used by guset. 1384b867132SPaolo Bonzini */ 1394b867132SPaolo Bonzini 1404b867132SPaolo Bonzini #define VHOST_SCSI_ABI_VERSION 1 1414b867132SPaolo Bonzini 1424b867132SPaolo Bonzini struct vhost_scsi_target { 1434b867132SPaolo Bonzini int abi_version; 1444b867132SPaolo Bonzini char vhost_wwpn[224]; /* TRANSPORT_IQN_LEN */ 1454b867132SPaolo Bonzini unsigned short vhost_tpgt; 1464b867132SPaolo Bonzini unsigned short reserved; 1474b867132SPaolo Bonzini }; 1484b867132SPaolo Bonzini 1494c8cf318STiwei Bie /* VHOST_VDPA specific definitions */ 1504c8cf318STiwei Bie 1514c8cf318STiwei Bie struct vhost_vdpa_config { 1524c8cf318STiwei Bie __u32 off; 1534c8cf318STiwei Bie __u32 len; 15494dfc73eSGustavo A. R. Silva __u8 buf[]; 1554c8cf318STiwei Bie }; 1564c8cf318STiwei Bie 1571b48dc03SJason Wang /* vhost vdpa IOVA range 1581b48dc03SJason Wang * @first: First address that can be mapped by vhost-vDPA 1591b48dc03SJason Wang * @last: Last address that can be mapped by vhost-vDPA 1601b48dc03SJason Wang */ 1611b48dc03SJason Wang struct vhost_vdpa_iova_range { 1621b48dc03SJason Wang __u64 first; 1631b48dc03SJason Wang __u64 last; 1641b48dc03SJason Wang }; 1651b48dc03SJason Wang 1664b867132SPaolo Bonzini /* Feature bits */ 1674b867132SPaolo Bonzini /* Log all write descriptors. Can be changed while device is active. */ 1684b867132SPaolo Bonzini #define VHOST_F_LOG_ALL 26 1694b867132SPaolo Bonzini /* vhost-net should add virtio_net_hdr for RX, and strip for TX packets. */ 1704b867132SPaolo Bonzini #define VHOST_NET_F_VIRTIO_NET_HDR 27 1714b867132SPaolo Bonzini 172175d493cSGautam Dawar /* Use message type V2 */ 173175d493cSGautam Dawar #define VHOST_BACKEND_F_IOTLB_MSG_V2 0x1 174175d493cSGautam Dawar /* IOTLB can accept batching hints */ 175175d493cSGautam Dawar #define VHOST_BACKEND_F_IOTLB_BATCH 0x2 17691233ad7SGautam Dawar /* IOTLB can accept address space identifier through V2 type of IOTLB 17791233ad7SGautam Dawar * message 17891233ad7SGautam Dawar */ 17991233ad7SGautam Dawar #define VHOST_BACKEND_F_IOTLB_ASID 0x3 1800723f1dfSEugenio Pérez /* Device can be suspended */ 1810723f1dfSEugenio Pérez #define VHOST_BACKEND_F_SUSPEND 0x4 18269106b6fSSebastien Boeuf /* Device can be resumed */ 18369106b6fSSebastien Boeuf #define VHOST_BACKEND_F_RESUME 0x5 1848b59b4daSEugenio Pérez /* Device supports the driver enabling virtqueues both before and after 1858b59b4daSEugenio Pérez * DRIVER_OK 1868b59b4daSEugenio Pérez */ 1878b59b4daSEugenio Pérez #define VHOST_BACKEND_F_ENABLE_AFTER_DRIVER_OK 0x6 1887db0d602SSi-Wei Liu /* Device may expose the virtqueue's descriptor area, driver area and 1897db0d602SSi-Wei Liu * device area to a different group for ASID binding than where its 1907db0d602SSi-Wei Liu * buffers may reside. Requires VHOST_BACKEND_F_IOTLB_ASID. 1917db0d602SSi-Wei Liu */ 1927db0d602SSi-Wei Liu #define VHOST_BACKEND_F_DESC_ASID 0x7 193*4398776fSSi-Wei Liu /* IOTLB don't flush memory mapping across device reset */ 194*4398776fSSi-Wei Liu #define VHOST_BACKEND_F_IOTLB_PERSIST 0x8 195175d493cSGautam Dawar 1964b867132SPaolo Bonzini #endif 197