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