162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/* Vhost-user protocol */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef __VHOST_USER_H__
562306a36Sopenharmony_ci#define __VHOST_USER_H__
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci/* Message flags */
862306a36Sopenharmony_ci#define VHOST_USER_FLAG_REPLY		BIT(2)
962306a36Sopenharmony_ci#define VHOST_USER_FLAG_NEED_REPLY	BIT(3)
1062306a36Sopenharmony_ci/* Feature bits */
1162306a36Sopenharmony_ci#define VHOST_USER_F_PROTOCOL_FEATURES	30
1262306a36Sopenharmony_ci/* Protocol feature bits */
1362306a36Sopenharmony_ci#define VHOST_USER_PROTOCOL_F_REPLY_ACK			3
1462306a36Sopenharmony_ci#define VHOST_USER_PROTOCOL_F_SLAVE_REQ			5
1562306a36Sopenharmony_ci#define VHOST_USER_PROTOCOL_F_CONFIG			9
1662306a36Sopenharmony_ci#define VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS	14
1762306a36Sopenharmony_ci/* Vring state index masks */
1862306a36Sopenharmony_ci#define VHOST_USER_VRING_INDEX_MASK	0xff
1962306a36Sopenharmony_ci#define VHOST_USER_VRING_POLL_MASK	BIT(8)
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/* Supported version */
2262306a36Sopenharmony_ci#define VHOST_USER_VERSION		1
2362306a36Sopenharmony_ci/* Supported transport features */
2462306a36Sopenharmony_ci#define VHOST_USER_SUPPORTED_F		BIT_ULL(VHOST_USER_F_PROTOCOL_FEATURES)
2562306a36Sopenharmony_ci/* Supported protocol features */
2662306a36Sopenharmony_ci#define VHOST_USER_SUPPORTED_PROTOCOL_F	(BIT_ULL(VHOST_USER_PROTOCOL_F_REPLY_ACK) | \
2762306a36Sopenharmony_ci					 BIT_ULL(VHOST_USER_PROTOCOL_F_SLAVE_REQ) | \
2862306a36Sopenharmony_ci					 BIT_ULL(VHOST_USER_PROTOCOL_F_CONFIG) | \
2962306a36Sopenharmony_ci					 BIT_ULL(VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS))
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cienum vhost_user_request {
3262306a36Sopenharmony_ci	VHOST_USER_GET_FEATURES = 1,
3362306a36Sopenharmony_ci	VHOST_USER_SET_FEATURES = 2,
3462306a36Sopenharmony_ci	VHOST_USER_SET_OWNER = 3,
3562306a36Sopenharmony_ci	VHOST_USER_RESET_OWNER = 4,
3662306a36Sopenharmony_ci	VHOST_USER_SET_MEM_TABLE = 5,
3762306a36Sopenharmony_ci	VHOST_USER_SET_LOG_BASE = 6,
3862306a36Sopenharmony_ci	VHOST_USER_SET_LOG_FD = 7,
3962306a36Sopenharmony_ci	VHOST_USER_SET_VRING_NUM = 8,
4062306a36Sopenharmony_ci	VHOST_USER_SET_VRING_ADDR = 9,
4162306a36Sopenharmony_ci	VHOST_USER_SET_VRING_BASE = 10,
4262306a36Sopenharmony_ci	VHOST_USER_GET_VRING_BASE = 11,
4362306a36Sopenharmony_ci	VHOST_USER_SET_VRING_KICK = 12,
4462306a36Sopenharmony_ci	VHOST_USER_SET_VRING_CALL = 13,
4562306a36Sopenharmony_ci	VHOST_USER_SET_VRING_ERR = 14,
4662306a36Sopenharmony_ci	VHOST_USER_GET_PROTOCOL_FEATURES = 15,
4762306a36Sopenharmony_ci	VHOST_USER_SET_PROTOCOL_FEATURES = 16,
4862306a36Sopenharmony_ci	VHOST_USER_GET_QUEUE_NUM = 17,
4962306a36Sopenharmony_ci	VHOST_USER_SET_VRING_ENABLE = 18,
5062306a36Sopenharmony_ci	VHOST_USER_SEND_RARP = 19,
5162306a36Sopenharmony_ci	VHOST_USER_NET_SEND_MTU = 20,
5262306a36Sopenharmony_ci	VHOST_USER_SET_SLAVE_REQ_FD = 21,
5362306a36Sopenharmony_ci	VHOST_USER_IOTLB_MSG = 22,
5462306a36Sopenharmony_ci	VHOST_USER_SET_VRING_ENDIAN = 23,
5562306a36Sopenharmony_ci	VHOST_USER_GET_CONFIG = 24,
5662306a36Sopenharmony_ci	VHOST_USER_SET_CONFIG = 25,
5762306a36Sopenharmony_ci	VHOST_USER_VRING_KICK = 35,
5862306a36Sopenharmony_ci};
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cienum vhost_user_slave_request {
6162306a36Sopenharmony_ci	VHOST_USER_SLAVE_IOTLB_MSG = 1,
6262306a36Sopenharmony_ci	VHOST_USER_SLAVE_CONFIG_CHANGE_MSG = 2,
6362306a36Sopenharmony_ci	VHOST_USER_SLAVE_VRING_HOST_NOTIFIER_MSG = 3,
6462306a36Sopenharmony_ci	VHOST_USER_SLAVE_VRING_CALL = 4,
6562306a36Sopenharmony_ci};
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistruct vhost_user_header {
6862306a36Sopenharmony_ci	/*
6962306a36Sopenharmony_ci	 * Use enum vhost_user_request for outgoing messages,
7062306a36Sopenharmony_ci	 * uses enum vhost_user_slave_request for incoming ones.
7162306a36Sopenharmony_ci	 */
7262306a36Sopenharmony_ci	u32 request;
7362306a36Sopenharmony_ci	u32 flags;
7462306a36Sopenharmony_ci	u32 size;
7562306a36Sopenharmony_ci} __packed;
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_cistruct vhost_user_config {
7862306a36Sopenharmony_ci	u32 offset;
7962306a36Sopenharmony_ci	u32 size;
8062306a36Sopenharmony_ci	u32 flags;
8162306a36Sopenharmony_ci	u8 payload[]; /* Variable length */
8262306a36Sopenharmony_ci} __packed;
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_cistruct vhost_user_vring_state {
8562306a36Sopenharmony_ci	u32 index;
8662306a36Sopenharmony_ci	u32 num;
8762306a36Sopenharmony_ci} __packed;
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_cistruct vhost_user_vring_addr {
9062306a36Sopenharmony_ci	u32 index;
9162306a36Sopenharmony_ci	u32 flags;
9262306a36Sopenharmony_ci	u64 desc, used, avail, log;
9362306a36Sopenharmony_ci} __packed;
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_cistruct vhost_user_mem_region {
9662306a36Sopenharmony_ci	u64 guest_addr;
9762306a36Sopenharmony_ci	u64 size;
9862306a36Sopenharmony_ci	u64 user_addr;
9962306a36Sopenharmony_ci	u64 mmap_offset;
10062306a36Sopenharmony_ci} __packed;
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_cistruct vhost_user_mem_regions {
10362306a36Sopenharmony_ci	u32 num;
10462306a36Sopenharmony_ci	u32 padding;
10562306a36Sopenharmony_ci	struct vhost_user_mem_region regions[2]; /* Currently supporting 2 */
10662306a36Sopenharmony_ci} __packed;
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ciunion vhost_user_payload {
10962306a36Sopenharmony_ci	u64 integer;
11062306a36Sopenharmony_ci	struct vhost_user_config config;
11162306a36Sopenharmony_ci	struct vhost_user_vring_state vring_state;
11262306a36Sopenharmony_ci	struct vhost_user_vring_addr vring_addr;
11362306a36Sopenharmony_ci	struct vhost_user_mem_regions mem_regions;
11462306a36Sopenharmony_ci};
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_cistruct vhost_user_msg {
11762306a36Sopenharmony_ci	struct vhost_user_header header;
11862306a36Sopenharmony_ci	union vhost_user_payload payload;
11962306a36Sopenharmony_ci} __packed;
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci#endif
122