xref: /linux/include/uapi/linux/vhost_types.h (revision ab1c247094e323177a578b38f0325bf79f0317ac)
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