Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright (c) 2018, Microsoft Corporation. 3 : : * All Rights Reserved. 4 : : */ 5 : : 6 : : #ifndef _VMBUS_REG_H_ 7 : : #define _VMBUS_REG_H_ 8 : : 9 : : /* 10 : : * Hyper-V SynIC message format. 11 : : */ 12 : : #define VMBUS_MSG_DSIZE_MAX 240 13 : : #define VMBUS_MSG_SIZE 256 14 : : 15 : : struct __rte_packed_begin vmbus_message { 16 : : uint32_t type; /* HYPERV_MSGTYPE_ */ 17 : : uint8_t dsize; /* data size */ 18 : : uint8_t flags; /* VMBUS_MSGFLAG_ */ 19 : : uint16_t rsvd; 20 : : uint64_t id; 21 : : uint8_t data[VMBUS_MSG_DSIZE_MAX]; 22 : : } __rte_packed_end; 23 : : 24 : : #define VMBUS_MSGFLAG_PENDING 0x01 25 : : 26 : : /* 27 : : * Hyper-V Monitor Notification Facility 28 : : */ 29 : : 30 : : struct __rte_packed_begin vmbus_mon_trig { 31 : : RTE_ATOMIC(uint32_t) pending; 32 : : uint32_t armed; 33 : : } __rte_packed_end; 34 : : 35 : : #define VMBUS_MONTRIGS_MAX 4 36 : : #define VMBUS_MONTRIG_LEN 32 37 : : 38 : : /* 39 : : * Hyper-V Monitor Notification Facility 40 : : */ 41 : : struct __rte_packed_begin hyperv_mon_param { 42 : : uint32_t connid; 43 : : uint16_t evtflag_ofs; 44 : : uint16_t rsvd; 45 : : } __rte_packed_end; 46 : : 47 : : struct __rte_packed_begin vmbus_mon_page { 48 : : uint32_t state; 49 : : uint32_t rsvd1; 50 : : 51 : : struct vmbus_mon_trig trigs[VMBUS_MONTRIGS_MAX]; 52 : : uint8_t rsvd2[536]; 53 : : 54 : : uint16_t lat[VMBUS_MONTRIGS_MAX][VMBUS_MONTRIG_LEN]; 55 : : uint8_t rsvd3[256]; 56 : : 57 : : struct hyperv_mon_param 58 : : param[VMBUS_MONTRIGS_MAX][VMBUS_MONTRIG_LEN]; 59 : : uint8_t rsvd4[1984]; 60 : : } __rte_packed_end; 61 : : 62 : : /* 63 : : * Buffer ring 64 : : */ 65 : : 66 : : struct __rte_packed_begin vmbus_bufring { 67 : : volatile uint32_t windex; 68 : : volatile uint32_t rindex; 69 : : 70 : : /* 71 : : * Interrupt mask {0,1} 72 : : * 73 : : * For TX bufring, host set this to 1, when it is processing 74 : : * the TX bufring, so that we can safely skip the TX event 75 : : * notification to host. 76 : : * 77 : : * For RX bufring, once this is set to 1 by us, host will not 78 : : * further dispatch interrupts to us, even if there are data 79 : : * pending on the RX bufring. This effectively disables the 80 : : * interrupt of the channel to which this RX bufring is attached. 81 : : */ 82 : : volatile uint32_t imask; 83 : : 84 : : /* 85 : : * Win8 uses some of the reserved bits to implement 86 : : * interrupt driven flow management. On the send side 87 : : * we can request that the receiver interrupt the sender 88 : : * when the ring transitions from being full to being able 89 : : * to handle a message of size "pending_send_sz". 90 : : * 91 : : * Add necessary state for this enhancement. 92 : : */ 93 : : volatile uint32_t pending_send; 94 : : uint32_t reserved1[12]; 95 : : 96 : : union { 97 : : struct { 98 : : uint32_t feat_pending_send_sz:1; 99 : : }; 100 : : uint32_t value; 101 : : } feature_bits; 102 : : 103 : : /* 104 : : * This is the end of ring buffer head. The ring buffer data is system 105 : : * page aligned and starts at rte_mem_page_size() from the beginning 106 : : * of this structure 107 : : */ 108 : : } __rte_packed_end; 109 : : 110 : : /* 111 : : * Channel packets 112 : : */ 113 : : 114 : : /* Channel packet flags */ 115 : : #define VMBUS_CHANPKT_TYPE_INBAND 0x0006 116 : : #define VMBUS_CHANPKT_TYPE_RXBUF 0x0007 117 : : #define VMBUS_CHANPKT_TYPE_GPA 0x0009 118 : : #define VMBUS_CHANPKT_TYPE_COMP 0x000b 119 : : 120 : : #define VMBUS_CHANPKT_FLAG_NONE 0 121 : : #define VMBUS_CHANPKT_FLAG_RC 0x0001 /* report completion */ 122 : : 123 : : #define VMBUS_CHANPKT_SIZE_SHIFT 3 124 : : #define VMBUS_CHANPKT_SIZE_ALIGN (1 << VMBUS_CHANPKT_SIZE_SHIFT) 125 : : #define VMBUS_CHANPKT_HLEN_MIN \ 126 : : (sizeof(struct vmbus_chanpkt_hdr) >> VMBUS_CHANPKT_SIZE_SHIFT) 127 : : 128 : : static inline uint32_t 129 : : vmbus_chanpkt_getlen(uint16_t pktlen) 130 : : { 131 [ # # # # ]: 0 : return (uint32_t)pktlen << VMBUS_CHANPKT_SIZE_SHIFT; 132 : : } 133 : : 134 : : /* 135 : : * GPA stuffs. 136 : : */ 137 : : struct __rte_packed_begin vmbus_gpa_range { 138 : : uint32_t len; 139 : : uint32_t ofs; 140 : : uint64_t page[]; 141 : : } __rte_packed_end; 142 : : 143 : : /* This is actually vmbus_gpa_range.gpa_page[1] */ 144 : : struct __rte_packed_begin vmbus_gpa { 145 : : uint32_t len; 146 : : uint32_t ofs; 147 : : uint64_t page; 148 : : } __rte_packed_end; 149 : : 150 : : struct __rte_packed_begin vmbus_chanpkt_hdr { 151 : : uint16_t type; /* VMBUS_CHANPKT_TYPE_ */ 152 : : uint16_t hlen; /* header len, in 8 bytes */ 153 : : uint16_t tlen; /* total len, in 8 bytes */ 154 : : uint16_t flags; /* VMBUS_CHANPKT_FLAG_ */ 155 : : uint64_t xactid; 156 : : } __rte_packed_end; 157 : : 158 : : static inline uint32_t 159 : : vmbus_chanpkt_datalen(const struct vmbus_chanpkt_hdr *pkt) 160 : : { 161 : 0 : return vmbus_chanpkt_getlen(pkt->tlen) 162 [ # # ]: 0 : - vmbus_chanpkt_getlen(pkt->hlen); 163 : : } 164 : : 165 : : struct __rte_packed_begin vmbus_chanpkt { 166 : : struct vmbus_chanpkt_hdr hdr; 167 : : } __rte_packed_end; 168 : : 169 : : struct __rte_packed_begin vmbus_rxbuf_desc { 170 : : uint32_t len; 171 : : uint32_t ofs; 172 : : } __rte_packed_end; 173 : : 174 : : struct __rte_packed_begin vmbus_chanpkt_rxbuf { 175 : : struct vmbus_chanpkt_hdr hdr; 176 : : uint16_t rxbuf_id; 177 : : uint16_t rsvd; 178 : : uint32_t rxbuf_cnt; 179 : : struct vmbus_rxbuf_desc rxbuf[]; 180 : : } __rte_packed_end; 181 : : 182 : : struct __rte_packed_begin vmbus_chanpkt_sglist { 183 : : struct vmbus_chanpkt_hdr hdr; 184 : : uint32_t rsvd; 185 : : uint32_t gpa_cnt; 186 : : struct vmbus_gpa gpa[]; 187 : : } __rte_packed_end; 188 : : 189 : : /* 190 : : * Channel messages 191 : : * - Embedded in vmbus_message.msg_data, e.g. response and notification. 192 : : * - Embedded in hypercall_postmsg_in.hc_data, e.g. request. 193 : : */ 194 : : 195 : : #define VMBUS_CHANMSG_TYPE_CHOFFER 1 /* NOTE */ 196 : : #define VMBUS_CHANMSG_TYPE_CHRESCIND 2 /* NOTE */ 197 : : #define VMBUS_CHANMSG_TYPE_CHREQUEST 3 /* REQ */ 198 : : #define VMBUS_CHANMSG_TYPE_CHOFFER_DONE 4 /* NOTE */ 199 : : #define VMBUS_CHANMSG_TYPE_CHOPEN 5 /* REQ */ 200 : : #define VMBUS_CHANMSG_TYPE_CHOPEN_RESP 6 /* RESP */ 201 : : #define VMBUS_CHANMSG_TYPE_CHCLOSE 7 /* REQ */ 202 : : #define VMBUS_CHANMSG_TYPE_GPADL_CONN 8 /* REQ */ 203 : : #define VMBUS_CHANMSG_TYPE_GPADL_SUBCONN 9 /* REQ */ 204 : : #define VMBUS_CHANMSG_TYPE_GPADL_CONNRESP 10 /* RESP */ 205 : : #define VMBUS_CHANMSG_TYPE_GPADL_DISCONN 11 /* REQ */ 206 : : #define VMBUS_CHANMSG_TYPE_GPADL_DISCONNRESP 12 /* RESP */ 207 : : #define VMBUS_CHANMSG_TYPE_CHFREE 13 /* REQ */ 208 : : #define VMBUS_CHANMSG_TYPE_CONNECT 14 /* REQ */ 209 : : #define VMBUS_CHANMSG_TYPE_CONNECT_RESP 15 /* RESP */ 210 : : #define VMBUS_CHANMSG_TYPE_DISCONNECT 16 /* REQ */ 211 : : #define VMBUS_CHANMSG_TYPE_MAX 22 212 : : 213 : : struct __rte_packed_begin vmbus_chanmsg_hdr { 214 : : uint32_t type; /* VMBUS_CHANMSG_TYPE_ */ 215 : : uint32_t rsvd; 216 : : } __rte_packed_end; 217 : : 218 : : /* VMBUS_CHANMSG_TYPE_CONNECT */ 219 : : struct __rte_packed_begin vmbus_chanmsg_connect { 220 : : struct vmbus_chanmsg_hdr hdr; 221 : : uint32_t ver; 222 : : uint32_t rsvd; 223 : : uint64_t evtflags; 224 : : uint64_t mnf1; 225 : : uint64_t mnf2; 226 : : } __rte_packed_end; 227 : : 228 : : /* VMBUS_CHANMSG_TYPE_CONNECT_RESP */ 229 : : struct __rte_packed_begin vmbus_chanmsg_connect_resp { 230 : : struct vmbus_chanmsg_hdr hdr; 231 : : uint8_t done; 232 : : } __rte_packed_end; 233 : : 234 : : /* VMBUS_CHANMSG_TYPE_CHREQUEST */ 235 : : struct __rte_packed_begin vmbus_chanmsg_chrequest { 236 : : struct vmbus_chanmsg_hdr hdr; 237 : : } __rte_packed_end; 238 : : 239 : : /* VMBUS_CHANMSG_TYPE_DISCONNECT */ 240 : : struct __rte_packed_begin vmbus_chanmsg_disconnect { 241 : : struct vmbus_chanmsg_hdr hdr; 242 : : } __rte_packed_end; 243 : : 244 : : /* VMBUS_CHANMSG_TYPE_CHOPEN */ 245 : : struct __rte_packed_begin vmbus_chanmsg_chopen { 246 : : struct vmbus_chanmsg_hdr hdr; 247 : : uint32_t chanid; 248 : : uint32_t openid; 249 : : uint32_t gpadl; 250 : : uint32_t vcpuid; 251 : : uint32_t txbr_pgcnt; 252 : : #define VMBUS_CHANMSG_CHOPEN_UDATA_SIZE 120 253 : : uint8_t udata[VMBUS_CHANMSG_CHOPEN_UDATA_SIZE]; 254 : : } __rte_packed_end; 255 : : 256 : : /* VMBUS_CHANMSG_TYPE_CHOPEN_RESP */ 257 : : struct __rte_packed_begin vmbus_chanmsg_chopen_resp { 258 : : struct vmbus_chanmsg_hdr hdr; 259 : : uint32_t chanid; 260 : : uint32_t openid; 261 : : uint32_t status; 262 : : } __rte_packed_end; 263 : : 264 : : /* VMBUS_CHANMSG_TYPE_GPADL_CONN */ 265 : : struct __rte_packed_begin vmbus_chanmsg_gpadl_conn { 266 : : struct vmbus_chanmsg_hdr hdr; 267 : : uint32_t chanid; 268 : : uint32_t gpadl; 269 : : uint16_t range_len; 270 : : uint16_t range_cnt; 271 : : struct vmbus_gpa_range range; 272 : : } __rte_packed_end; 273 : : 274 : : #define VMBUS_CHANMSG_GPADL_CONN_PGMAX 26 275 : : 276 : : /* VMBUS_CHANMSG_TYPE_GPADL_SUBCONN */ 277 : : struct __rte_packed_begin vmbus_chanmsg_gpadl_subconn { 278 : : struct vmbus_chanmsg_hdr hdr; 279 : : uint32_t msgno; 280 : : uint32_t gpadl; 281 : : uint64_t gpa_page[]; 282 : : } __rte_packed_end; 283 : : 284 : : #define VMBUS_CHANMSG_GPADL_SUBCONN_PGMAX 28 285 : : 286 : : /* VMBUS_CHANMSG_TYPE_GPADL_CONNRESP */ 287 : : struct __rte_packed_begin vmbus_chanmsg_gpadl_connresp { 288 : : struct vmbus_chanmsg_hdr hdr; 289 : : uint32_t chanid; 290 : : uint32_t gpadl; 291 : : uint32_t status; 292 : : } __rte_packed_end; 293 : : 294 : : /* VMBUS_CHANMSG_TYPE_CHCLOSE */ 295 : : struct __rte_packed_begin vmbus_chanmsg_chclose { 296 : : struct vmbus_chanmsg_hdr hdr; 297 : : uint32_t chanid; 298 : : } __rte_packed_end; 299 : : 300 : : /* VMBUS_CHANMSG_TYPE_GPADL_DISCONN */ 301 : : struct __rte_packed_begin vmbus_chanmsg_gpadl_disconn { 302 : : struct vmbus_chanmsg_hdr hdr; 303 : : uint32_t chanid; 304 : : uint32_t gpadl; 305 : : } __rte_packed_end; 306 : : 307 : : /* VMBUS_CHANMSG_TYPE_CHFREE */ 308 : : struct __rte_packed_begin vmbus_chanmsg_chfree { 309 : : struct vmbus_chanmsg_hdr hdr; 310 : : uint32_t chanid; 311 : : } __rte_packed_end; 312 : : 313 : : /* VMBUS_CHANMSG_TYPE_CHRESCIND */ 314 : : struct __rte_packed_begin vmbus_chanmsg_chrescind { 315 : : struct vmbus_chanmsg_hdr hdr; 316 : : uint32_t chanid; 317 : : } __rte_packed_end; 318 : : 319 : : /* VMBUS_CHANMSG_TYPE_CHOFFER */ 320 : : struct __rte_packed_begin vmbus_chanmsg_choffer { 321 : : struct vmbus_chanmsg_hdr hdr; 322 : : rte_uuid_t chtype; 323 : : rte_uuid_t chinst; 324 : : uint64_t chlat; /* unit: 100ns */ 325 : : uint32_t chrev; 326 : : uint32_t svrctx_sz; 327 : : uint16_t chflags; 328 : : uint16_t mmio_sz; /* unit: MB */ 329 : : uint8_t udata[120]; 330 : : uint16_t subidx; 331 : : uint16_t rsvd; 332 : : uint32_t chanid; 333 : : uint8_t montrig; 334 : : uint8_t flags1; /* VMBUS_CHOFFER_FLAG1_ */ 335 : : uint16_t flags2; 336 : : uint32_t connid; 337 : : } __rte_packed_end; 338 : : 339 : : #define VMBUS_CHOFFER_FLAG1_HASMNF 0x01 340 : : 341 : : #endif /* !_VMBUS_REG_H_ */