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