1e0adee91Smikeb /*- 2d958ad14Smikeb * Copyright (c) 2016 Microsoft Corp. 3e0adee91Smikeb * All rights reserved. 4e0adee91Smikeb * 5e0adee91Smikeb * Redistribution and use in source and binary forms, with or without 6e0adee91Smikeb * modification, are permitted provided that the following conditions 7e0adee91Smikeb * are met: 8e0adee91Smikeb * 1. Redistributions of source code must retain the above copyright 9e0adee91Smikeb * notice unmodified, this list of conditions, and the following 10e0adee91Smikeb * disclaimer. 11e0adee91Smikeb * 2. Redistributions in binary form must reproduce the above copyright 12e0adee91Smikeb * notice, this list of conditions and the following disclaimer in the 13e0adee91Smikeb * documentation and/or other materials provided with the distribution. 14e0adee91Smikeb * 15e0adee91Smikeb * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16e0adee91Smikeb * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17e0adee91Smikeb * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18e0adee91Smikeb * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19e0adee91Smikeb * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20e0adee91Smikeb * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21e0adee91Smikeb * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22e0adee91Smikeb * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23e0adee91Smikeb * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24e0adee91Smikeb * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25e0adee91Smikeb */ 26e0adee91Smikeb 274f3f6fbcSmikeb #ifndef _DEV_PV_IF_HVNREG_H_ 284f3f6fbcSmikeb #define _DEV_PV_IF_HVNREG_H_ 29e0adee91Smikeb 30d958ad14Smikeb #define HVN_NVS_PROTO_VERSION_1 0x00002 31d958ad14Smikeb #define HVN_NVS_PROTO_VERSION_2 0x30002 32d958ad14Smikeb #define HVN_NVS_PROTO_VERSION_4 0x40000 33d958ad14Smikeb #define HVN_NVS_PROTO_VERSION_5 0x50000 34e0adee91Smikeb 35d958ad14Smikeb #define HVN_NVS_RXBUF_SIG 0x2409 36d958ad14Smikeb #define HVN_NVS_CHIM_SIG 0x1984 37e0adee91Smikeb 38d958ad14Smikeb #define HVN_NVS_CHIM_IDX_INVALID 0xffffffff 39d958ad14Smikeb 40d958ad14Smikeb #define HVN_NVS_RNDIS_MTYPE_DATA 0 41d958ad14Smikeb #define HVN_NVS_RNDIS_MTYPE_CTRL 1 42e0adee91Smikeb 43e0adee91Smikeb /* 44*4b1a56afSjsg * NVS message transaction status codes. 45e0adee91Smikeb */ 46d958ad14Smikeb #define HVN_NVS_STATUS_OK 1 47d958ad14Smikeb #define HVN_NVS_STATUS_FAILED 2 48e0adee91Smikeb 49e0adee91Smikeb /* 50d958ad14Smikeb * NVS request/response message types. 51e0adee91Smikeb */ 52d958ad14Smikeb #define HVN_NVS_TYPE_INIT 1 53d958ad14Smikeb #define HVN_NVS_TYPE_INIT_RESP 2 54d958ad14Smikeb #define HVN_NVS_TYPE_NDIS_INIT 100 55d958ad14Smikeb #define HVN_NVS_TYPE_RXBUF_CONN 101 56d958ad14Smikeb #define HVN_NVS_TYPE_RXBUF_CONNRESP 102 57d958ad14Smikeb #define HVN_NVS_TYPE_RXBUF_DISCONN 103 58d958ad14Smikeb #define HVN_NVS_TYPE_CHIM_CONN 104 59d958ad14Smikeb #define HVN_NVS_TYPE_CHIM_CONNRESP 105 60d958ad14Smikeb #define HVN_NVS_TYPE_CHIM_DISCONN 106 61d958ad14Smikeb #define HVN_NVS_TYPE_RNDIS 107 62d958ad14Smikeb #define HVN_NVS_TYPE_RNDIS_ACK 108 63d958ad14Smikeb #define HVN_NVS_TYPE_NDIS_CONF 125 64d958ad14Smikeb #define HVN_NVS_TYPE_VFASSOC_NOTE 128 /* notification */ 65d958ad14Smikeb #define HVN_NVS_TYPE_SET_DATAPATH 129 66d958ad14Smikeb #define HVN_NVS_TYPE_SUBCH_REQ 133 67d958ad14Smikeb #define HVN_NVS_TYPE_SUBCH_RESP 133 /* same as SUBCH_REQ */ 68d958ad14Smikeb #define HVN_NVS_TYPE_TXTBL_NOTE 134 /* notification */ 69e0adee91Smikeb 70e0adee91Smikeb /* 71d958ad14Smikeb * Any size less than this one will _not_ work, e.g. hn_nvs_init 72d958ad14Smikeb * only has 12B valid data, however, if only 12B data were sent, 73d958ad14Smikeb * Hypervisor would never reply. 74e0adee91Smikeb */ 75d958ad14Smikeb #define HVN_NVS_REQSIZE_MIN 32 76e0adee91Smikeb 77d958ad14Smikeb /* NVS message common header */ 78d958ad14Smikeb struct hvn_nvs_hdr { 79d958ad14Smikeb uint32_t nvs_type; 80d958ad14Smikeb } __packed; 81e0adee91Smikeb 82d958ad14Smikeb struct hvn_nvs_init { 83d958ad14Smikeb uint32_t nvs_type; /* HVN_NVS_TYPE_INIT */ 84d958ad14Smikeb uint32_t nvs_ver_min; 85d958ad14Smikeb uint32_t nvs_ver_max; 86d958ad14Smikeb uint8_t nvs_rsvd[20]; 87d958ad14Smikeb } __packed; 88e0adee91Smikeb 89d958ad14Smikeb struct hvn_nvs_init_resp { 90d958ad14Smikeb uint32_t nvs_type; /* HVN_NVS_TYPE_INIT_RESP */ 91d958ad14Smikeb uint32_t nvs_ver; /* deprecated */ 92d958ad14Smikeb uint32_t nvs_rsvd; 93d958ad14Smikeb uint32_t nvs_status; /* HVN_NVS_STATUS_ */ 94d958ad14Smikeb } __packed; 95e0adee91Smikeb 96*4b1a56afSjsg /* No response */ 97d958ad14Smikeb struct hvn_nvs_ndis_conf { 98d958ad14Smikeb uint32_t nvs_type; /* HVN_NVS_TYPE_NDIS_CONF */ 99d958ad14Smikeb uint32_t nvs_mtu; 100d958ad14Smikeb uint32_t nvs_rsvd; 101d958ad14Smikeb uint64_t nvs_caps; /* HVN_NVS_NDIS_CONF_ */ 102d958ad14Smikeb uint8_t nvs_rsvd1[12]; 103d958ad14Smikeb } __packed; 104d958ad14Smikeb 105d958ad14Smikeb #define HVN_NVS_NDIS_CONF_SRIOV 0x0004 106d958ad14Smikeb #define HVN_NVS_NDIS_CONF_VLAN 0x0008 107d958ad14Smikeb 108d958ad14Smikeb /* No response */ 109d958ad14Smikeb struct hvn_nvs_ndis_init { 110d958ad14Smikeb uint32_t nvs_type; /* HVN_NVS_TYPE_NDIS_INIT */ 111d958ad14Smikeb uint32_t nvs_ndis_major; /* NDIS_VERSION_MAJOR_ */ 112d958ad14Smikeb uint32_t nvs_ndis_minor; /* NDIS_VERSION_MINOR_ */ 113d958ad14Smikeb uint8_t nvs_rsvd[20]; 114d958ad14Smikeb } __packed; 115d958ad14Smikeb 116d958ad14Smikeb struct hvn_nvs_rxbuf_conn { 117d958ad14Smikeb uint32_t nvs_type; /* HVN_NVS_TYPE_RXBUF_CONN */ 118d958ad14Smikeb uint32_t nvs_gpadl; /* RXBUF vmbus GPADL */ 119d958ad14Smikeb uint16_t nvs_sig; /* HVN_NVS_RXBUF_SIG */ 120d958ad14Smikeb uint8_t nvs_rsvd[22]; 121d958ad14Smikeb } __packed; 122d958ad14Smikeb 123d958ad14Smikeb struct hvn_nvs_rxbuf_sect { 124d958ad14Smikeb uint32_t nvs_start; 125d958ad14Smikeb uint32_t nvs_slotsz; 126d958ad14Smikeb uint32_t nvs_slotcnt; 127d958ad14Smikeb uint32_t nvs_end; 128d958ad14Smikeb } __packed; 129d958ad14Smikeb 130d958ad14Smikeb struct hvn_nvs_rxbuf_conn_resp { 131d958ad14Smikeb uint32_t nvs_type; /* HVN_NVS_TYPE_RXBUF_CONNRESP */ 132d958ad14Smikeb uint32_t nvs_status; /* HVN_NVS_STATUS_ */ 133d958ad14Smikeb uint32_t nvs_nsect; /* # of elem in nvs_sect */ 134d958ad14Smikeb struct hvn_nvs_rxbuf_sect nvs_sect[0]; 135d958ad14Smikeb } __packed; 136d958ad14Smikeb 137d958ad14Smikeb /* No response */ 138d958ad14Smikeb struct hvn_nvs_rxbuf_disconn { 139d958ad14Smikeb uint32_t nvs_type; /* HVN_NVS_TYPE_RXBUF_DISCONN */ 140d958ad14Smikeb uint16_t nvs_sig; /* HVN_NVS_RXBUF_SIG */ 141d958ad14Smikeb uint8_t nvs_rsvd[26]; 142d958ad14Smikeb } __packed; 143d958ad14Smikeb 144d958ad14Smikeb struct hvn_nvs_chim_conn { 145d958ad14Smikeb uint32_t nvs_type; /* HVN_NVS_TYPE_CHIM_CONN */ 146d958ad14Smikeb uint32_t nvs_gpadl; /* chimney buf vmbus GPADL */ 147d958ad14Smikeb uint16_t nvs_sig; /* NDIS_NVS_CHIM_SIG */ 148d958ad14Smikeb uint8_t nvs_rsvd[22]; 149d958ad14Smikeb } __packed; 150d958ad14Smikeb 151d958ad14Smikeb struct hvn_nvs_chim_conn_resp { 152d958ad14Smikeb uint32_t nvs_type; /* HVN_NVS_TYPE_CHIM_CONNRESP */ 153d958ad14Smikeb uint32_t nvs_status; /* HVN_NVS_STATUS_ */ 154d958ad14Smikeb uint32_t nvs_sectsz; /* section size */ 155d958ad14Smikeb } __packed; 156d958ad14Smikeb 157d958ad14Smikeb /* No response */ 158d958ad14Smikeb struct hvn_nvs_chim_disconn { 159d958ad14Smikeb uint32_t nvs_type; /* HVN_NVS_TYPE_CHIM_DISCONN */ 160d958ad14Smikeb uint16_t nvs_sig; /* HVN_NVS_CHIM_SIG */ 161d958ad14Smikeb uint8_t nvs_rsvd[26]; 162d958ad14Smikeb } __packed; 163d958ad14Smikeb 164d958ad14Smikeb #define HVN_NVS_SUBCH_OP_ALLOC 1 165d958ad14Smikeb 166d958ad14Smikeb struct hvn_nvs_subch_req { 167d958ad14Smikeb uint32_t nvs_type; /* HVN_NVS_TYPE_SUBCH_REQ */ 168d958ad14Smikeb uint32_t nvs_op; /* HVN_NVS_SUBCH_OP_ */ 169d958ad14Smikeb uint32_t nvs_nsubch; 170d958ad14Smikeb uint8_t nvs_rsvd[20]; 171d958ad14Smikeb } __packed; 172d958ad14Smikeb 173d958ad14Smikeb struct hvn_nvs_subch_resp { 174d958ad14Smikeb uint32_t nvs_type; /* HVN_NVS_TYPE_SUBCH_RESP */ 175d958ad14Smikeb uint32_t nvs_status; /* HVN_NVS_STATUS_ */ 176d958ad14Smikeb uint32_t nvs_nsubch; 177d958ad14Smikeb } __packed; 178d958ad14Smikeb 179d958ad14Smikeb struct hvn_nvs_rndis { 180d958ad14Smikeb uint32_t nvs_type; /* HVN_NVS_TYPE_RNDIS */ 181d958ad14Smikeb uint32_t nvs_rndis_mtype;/* HVN_NVS_RNDIS_MTYPE_ */ 182e0adee91Smikeb /* 183d958ad14Smikeb * Chimney sending buffer index and size. 184e0adee91Smikeb * 185d958ad14Smikeb * NOTE: 186d958ad14Smikeb * If nvs_chim_idx is set to HVN_NVS_CHIM_IDX_INVALID 187d958ad14Smikeb * and nvs_chim_sz is set to 0, then chimney sending 188d958ad14Smikeb * buffer is _not_ used by this RNDIS message. 189e0adee91Smikeb */ 190d958ad14Smikeb uint32_t nvs_chim_idx; 191d958ad14Smikeb uint32_t nvs_chim_sz; 192d958ad14Smikeb uint8_t nvs_rsvd[16]; 193e0adee91Smikeb } __packed; 194e0adee91Smikeb 195d958ad14Smikeb struct hvn_nvs_rndis_ack { 196d958ad14Smikeb uint32_t nvs_type; /* HVN_NVS_TYPE_RNDIS_ACK */ 197d958ad14Smikeb uint32_t nvs_status; /* HVN_NVS_STATUS_ */ 198d958ad14Smikeb uint8_t nvs_rsvd[24]; 199e0adee91Smikeb } __packed; 200e0adee91Smikeb 2014f3f6fbcSmikeb #endif /* _DEV_PV_IF_HVNREG_H_ */ 202