1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* Vhost-user protocol */ 3 4 #ifndef __VHOST_USER_H__ 5 #define __VHOST_USER_H__ 6 7 /* Message flags */ 8 #define VHOST_USER_FLAG_REPLY BIT(2) 9 #define VHOST_USER_FLAG_NEED_REPLY BIT(3) 10 /* Feature bits */ 11 #define VHOST_USER_F_PROTOCOL_FEATURES 30 12 /* Protocol feature bits */ 13 #define VHOST_USER_PROTOCOL_F_REPLY_ACK 3 14 #define VHOST_USER_PROTOCOL_F_SLAVE_REQ 5 15 #define VHOST_USER_PROTOCOL_F_CONFIG 9 16 #define VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS 14 17 /* Vring state index masks */ 18 #define VHOST_USER_VRING_INDEX_MASK 0xff 19 #define VHOST_USER_VRING_POLL_MASK BIT(8) 20 21 /* Supported version */ 22 #define VHOST_USER_VERSION 1 23 /* Supported transport features */ 24 #define VHOST_USER_SUPPORTED_F BIT_ULL(VHOST_USER_F_PROTOCOL_FEATURES) 25 /* Supported protocol features */ 26 #define VHOST_USER_SUPPORTED_PROTOCOL_F (BIT_ULL(VHOST_USER_PROTOCOL_F_REPLY_ACK) | \ 27 BIT_ULL(VHOST_USER_PROTOCOL_F_SLAVE_REQ) | \ 28 BIT_ULL(VHOST_USER_PROTOCOL_F_CONFIG) | \ 29 BIT_ULL(VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS)) 30 31 enum vhost_user_request { 32 VHOST_USER_GET_FEATURES = 1, 33 VHOST_USER_SET_FEATURES = 2, 34 VHOST_USER_SET_OWNER = 3, 35 VHOST_USER_RESET_OWNER = 4, 36 VHOST_USER_SET_MEM_TABLE = 5, 37 VHOST_USER_SET_LOG_BASE = 6, 38 VHOST_USER_SET_LOG_FD = 7, 39 VHOST_USER_SET_VRING_NUM = 8, 40 VHOST_USER_SET_VRING_ADDR = 9, 41 VHOST_USER_SET_VRING_BASE = 10, 42 VHOST_USER_GET_VRING_BASE = 11, 43 VHOST_USER_SET_VRING_KICK = 12, 44 VHOST_USER_SET_VRING_CALL = 13, 45 VHOST_USER_SET_VRING_ERR = 14, 46 VHOST_USER_GET_PROTOCOL_FEATURES = 15, 47 VHOST_USER_SET_PROTOCOL_FEATURES = 16, 48 VHOST_USER_GET_QUEUE_NUM = 17, 49 VHOST_USER_SET_VRING_ENABLE = 18, 50 VHOST_USER_SEND_RARP = 19, 51 VHOST_USER_NET_SEND_MTU = 20, 52 VHOST_USER_SET_SLAVE_REQ_FD = 21, 53 VHOST_USER_IOTLB_MSG = 22, 54 VHOST_USER_SET_VRING_ENDIAN = 23, 55 VHOST_USER_GET_CONFIG = 24, 56 VHOST_USER_SET_CONFIG = 25, 57 VHOST_USER_VRING_KICK = 35, 58 }; 59 60 enum vhost_user_slave_request { 61 VHOST_USER_SLAVE_IOTLB_MSG = 1, 62 VHOST_USER_SLAVE_CONFIG_CHANGE_MSG = 2, 63 VHOST_USER_SLAVE_VRING_HOST_NOTIFIER_MSG = 3, 64 VHOST_USER_SLAVE_VRING_CALL = 4, 65 }; 66 67 struct vhost_user_header { 68 /* 69 * Use enum vhost_user_request for outgoing messages, 70 * uses enum vhost_user_slave_request for incoming ones. 71 */ 72 u32 request; 73 u32 flags; 74 u32 size; 75 } __packed; 76 77 struct vhost_user_config { 78 u32 offset; 79 u32 size; 80 u32 flags; 81 u8 payload[]; /* Variable length */ 82 } __packed; 83 84 struct vhost_user_vring_state { 85 u32 index; 86 u32 num; 87 } __packed; 88 89 struct vhost_user_vring_addr { 90 u32 index; 91 u32 flags; 92 u64 desc, used, avail, log; 93 } __packed; 94 95 struct vhost_user_mem_region { 96 u64 guest_addr; 97 u64 size; 98 u64 user_addr; 99 u64 mmap_offset; 100 } __packed; 101 102 struct vhost_user_mem_regions { 103 u32 num; 104 u32 padding; 105 struct vhost_user_mem_region regions[2]; /* Currently supporting 2 */ 106 } __packed; 107 108 union vhost_user_payload { 109 u64 integer; 110 struct vhost_user_config config; 111 struct vhost_user_vring_state vring_state; 112 struct vhost_user_vring_addr vring_addr; 113 struct vhost_user_mem_regions mem_regions; 114 }; 115 116 struct vhost_user_msg { 117 struct vhost_user_header header; 118 union vhost_user_payload payload; 119 } __packed; 120 121 #endif 122