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