Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright (c) 2018 Microsoft Corp. 3 : : * All rights reserved. 4 : : */ 5 : : 6 : : /* 7 : : * The indirection table message is the largest message 8 : : * received from host, and that is 112 bytes. 9 : : */ 10 : : #define NVS_RESPSIZE_MAX 256 11 : : 12 : : /* 13 : : * NDIS protocol version numbers 14 : : */ 15 : : #define NDIS_VERSION_6_1 0x00060001 16 : : #define NDIS_VERSION_6_20 0x00060014 17 : : #define NDIS_VERSION_6_30 0x0006001e 18 : : #define NDIS_VERSION_MAJOR(ver) (((ver) & 0xffff0000) >> 16) 19 : : #define NDIS_VERSION_MINOR(ver) ((ver) & 0xffff) 20 : : 21 : : /* 22 : : * NVS versions. 23 : : */ 24 : : #define NVS_VERSION_1 0x00002 25 : : #define NVS_VERSION_2 0x30002 26 : : #define NVS_VERSION_4 0x40000 27 : : #define NVS_VERSION_5 0x50000 28 : : #define NVS_VERSION_6 0x60000 29 : : #define NVS_VERSION_61 0x60001 30 : : 31 : : #define NVS_RXBUF_SIG 0xcafe 32 : : #define NVS_CHIM_SIG 0xface 33 : : 34 : : #define NVS_CHIM_IDX_INVALID 0xffffffff 35 : : 36 : : #define NVS_RNDIS_MTYPE_DATA 0 37 : : #define NVS_RNDIS_MTYPE_CTRL 1 38 : : 39 : : /* 40 : : * NVS message transaction status codes. 41 : : */ 42 : : #define NVS_STATUS_OK 1 43 : : #define NVS_STATUS_FAILED 2 44 : : 45 : : /* 46 : : * NVS request/response message types. 47 : : */ 48 : : #define NVS_TYPE_INIT 1 49 : : #define NVS_TYPE_INIT_RESP 2 50 : : 51 : : #define NVS_TYPE_NDIS_INIT 100 52 : : #define NVS_TYPE_RXBUF_CONN 101 53 : : #define NVS_TYPE_RXBUF_CONNRESP 102 54 : : #define NVS_TYPE_RXBUF_DISCONN 103 55 : : #define NVS_TYPE_CHIM_CONN 104 56 : : #define NVS_TYPE_CHIM_CONNRESP 105 57 : : #define NVS_TYPE_CHIM_DISCONN 106 58 : : #define NVS_TYPE_RNDIS 107 59 : : #define NVS_TYPE_RNDIS_ACK 108 60 : : 61 : : #define NVS_TYPE_NDIS_CONF 125 62 : : #define NVS_TYPE_VFASSOC_NOTE 128 /* notification */ 63 : : #define NVS_TYPE_SET_DATAPATH 129 64 : : #define NVS_TYPE_SUBCH_REQ 133 65 : : #define NVS_TYPE_SUBCH_RESP 133 /* same as SUBCH_REQ */ 66 : : #define NVS_TYPE_TXTBL_NOTE 134 /* notification */ 67 : : 68 : : 69 : : /* NVS message common header */ 70 : : struct hn_nvs_hdr { 71 : : uint32_t type; 72 : : } __rte_packed; 73 : : 74 : : struct hn_nvs_init { 75 : : uint32_t type; /* NVS_TYPE_INIT */ 76 : : uint32_t ver_min; 77 : : uint32_t ver_max; 78 : : uint8_t rsvd[28]; 79 : : } __rte_packed; 80 : : 81 : : struct hn_nvs_init_resp { 82 : : uint32_t type; /* NVS_TYPE_INIT_RESP */ 83 : : uint32_t ver; /* deprecated */ 84 : : uint32_t rsvd; 85 : : uint32_t status; /* NVS_STATUS_ */ 86 : : } __rte_packed; 87 : : 88 : : /* No response */ 89 : : struct hn_nvs_ndis_conf { 90 : : uint32_t type; /* NVS_TYPE_NDIS_CONF */ 91 : : uint32_t mtu; 92 : : uint32_t rsvd; 93 : : uint64_t caps; /* NVS_NDIS_CONF_ */ 94 : : uint8_t rsvd1[20]; 95 : : } __rte_packed; 96 : : 97 : : #define NVS_NDIS_CONF_SRIOV 0x0004 98 : : #define NVS_NDIS_CONF_VLAN 0x0008 99 : : 100 : : /* No response */ 101 : : struct hn_nvs_ndis_init { 102 : : uint32_t type; /* NVS_TYPE_NDIS_INIT */ 103 : : uint32_t ndis_major; /* NDIS_VERSION_MAJOR_ */ 104 : : uint32_t ndis_minor; /* NDIS_VERSION_MINOR_ */ 105 : : uint8_t rsvd[28]; 106 : : } __rte_packed; 107 : : 108 : : struct hn_nvs_vf_association { 109 : : uint32_t type; /* NVS_TYPE_VFASSOC_NOTE */ 110 : : uint32_t allocated; 111 : : uint32_t serial; 112 : : } __rte_packed; 113 : : 114 : : #define NVS_DATAPATH_SYNTHETIC 0 115 : : #define NVS_DATAPATH_VF 1 116 : : 117 : : /* No response */ 118 : : struct hn_nvs_datapath { 119 : : uint32_t type; /* NVS_TYPE_SET_DATAPATH */ 120 : : uint32_t active_path;/* NVS_DATAPATH_* */ 121 : : uint8_t rsvd[32]; 122 : : } __rte_packed; 123 : : 124 : : struct hn_nvs_rxbuf_conn { 125 : : uint32_t type; /* NVS_TYPE_RXBUF_CONN */ 126 : : uint32_t gpadl; /* RXBUF vmbus GPADL */ 127 : : uint16_t sig; /* NVS_RXBUF_SIG */ 128 : : uint8_t rsvd[30]; 129 : : } __rte_packed; 130 : : 131 : : struct hn_nvs_rxbuf_sect { 132 : : uint32_t start; 133 : : uint32_t slotsz; 134 : : uint32_t slotcnt; 135 : : uint32_t end; 136 : : } __rte_packed; 137 : : 138 : : struct hn_nvs_rxbuf_connresp { 139 : : uint32_t type; /* NVS_TYPE_RXBUF_CONNRESP */ 140 : : uint32_t status; /* NVS_STATUS_ */ 141 : : uint32_t nsect; /* # of elem in nvs_sect */ 142 : : struct hn_nvs_rxbuf_sect nvs_sect[1]; 143 : : } __rte_packed; 144 : : 145 : : /* No response */ 146 : : struct hn_nvs_rxbuf_disconn { 147 : : uint32_t type; /* NVS_TYPE_RXBUF_DISCONN */ 148 : : uint16_t sig; /* NVS_RXBUF_SIG */ 149 : : uint8_t rsvd[34]; 150 : : } __rte_packed; 151 : : 152 : : struct hn_nvs_chim_conn { 153 : : uint32_t type; /* NVS_TYPE_CHIM_CONN */ 154 : : uint32_t gpadl; /* chimney buf vmbus GPADL */ 155 : : uint16_t sig; /* NDIS_NVS_CHIM_SIG */ 156 : : uint8_t rsvd[30]; 157 : : } __rte_packed; 158 : : 159 : : struct hn_nvs_chim_connresp { 160 : : uint32_t type; /* NVS_TYPE_CHIM_CONNRESP */ 161 : : uint32_t status; /* NVS_STATUS_ */ 162 : : uint32_t sectsz; /* section size */ 163 : : } __rte_packed; 164 : : 165 : : /* No response */ 166 : : struct hn_nvs_chim_disconn { 167 : : uint32_t type; /* NVS_TYPE_CHIM_DISCONN */ 168 : : uint16_t sig; /* NVS_CHIM_SIG */ 169 : : uint8_t rsvd[34]; 170 : : } __rte_packed; 171 : : 172 : : #define NVS_SUBCH_OP_ALLOC 1 173 : : 174 : : struct hn_nvs_subch_req { 175 : : uint32_t type; /* NVS_TYPE_SUBCH_REQ */ 176 : : uint32_t op; /* NVS_SUBCH_OP_ */ 177 : : uint32_t nsubch; 178 : : uint8_t rsvd[28]; 179 : : } __rte_packed; 180 : : 181 : : struct hn_nvs_subch_resp { 182 : : uint32_t type; /* NVS_TYPE_SUBCH_RESP */ 183 : : uint32_t status; /* NVS_STATUS_ */ 184 : : uint32_t nsubch; 185 : : uint8_t rsvd[28]; 186 : : } __rte_packed; 187 : : 188 : : struct hn_nvs_rndis { 189 : : uint32_t type; /* NVS_TYPE_RNDIS */ 190 : : uint32_t rndis_mtype;/* NVS_RNDIS_MTYPE_ */ 191 : : /* 192 : : * Chimney sending buffer index and size. 193 : : * 194 : : * NOTE: 195 : : * If nvs_chim_idx is set to NVS_CHIM_IDX_INVALID 196 : : * and nvs_chim_sz is set to 0, then chimney sending 197 : : * buffer is _not_ used by this RNDIS message. 198 : : */ 199 : : uint32_t chim_idx; 200 : : uint32_t chim_sz; 201 : : uint8_t rsvd[24]; 202 : : } __rte_packed; 203 : : 204 : : struct hn_nvs_rndis_ack { 205 : : uint32_t type; /* NVS_TYPE_RNDIS_ACK */ 206 : : uint32_t status; /* NVS_STATUS_ */ 207 : : uint8_t rsvd[32]; 208 : : } __rte_packed; 209 : : 210 : : 211 : : int hn_nvs_attach(struct hn_data *hv, unsigned int mtu); 212 : : void hn_nvs_detach(struct hn_data *hv); 213 : : void hn_nvs_ack_rxbuf(struct vmbus_channel *chan, uint64_t tid); 214 : : int hn_nvs_alloc_subchans(struct hn_data *hv, uint32_t *nsubch); 215 : : int hn_nvs_set_datapath(struct hn_data *hv, uint32_t path); 216 : : void hn_nvs_handle_vfassoc(struct rte_eth_dev *dev, 217 : : const struct vmbus_chanpkt_hdr *hdr, 218 : : const void *data); 219 : : 220 : : static inline int 221 : : hn_nvs_send(struct vmbus_channel *chan, uint16_t flags, 222 : : void *nvs_msg, int nvs_msglen, uintptr_t sndc, 223 : : bool *need_sig) 224 : : { 225 : 0 : return rte_vmbus_chan_send(chan, VMBUS_CHANPKT_TYPE_INBAND, 226 : : nvs_msg, nvs_msglen, (uint64_t)sndc, 227 : : flags, need_sig); 228 : : } 229 : : 230 : : static inline int 231 : : hn_nvs_send_sglist(struct vmbus_channel *chan, 232 : : struct vmbus_gpa sg[], unsigned int sglen, 233 : : void *nvs_msg, int nvs_msglen, 234 : : uintptr_t sndc, bool *need_sig) 235 : : { 236 : 0 : return rte_vmbus_chan_send_sglist(chan, sg, sglen, nvs_msg, nvs_msglen, 237 : : (uint64_t)sndc, need_sig); 238 : : }