dpdk/drivers/net/netvsc/hn_nvs.h
<<
>>
Prefs
   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 */
  70struct hn_nvs_hdr {
  71        uint32_t        type;
  72} __rte_packed;
  73
  74struct 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
  81struct 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 */
  89struct 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 */
 101struct 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
 108struct 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 */
 118struct 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
 124struct 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
 131struct hn_nvs_rxbuf_sect {
 132        uint32_t        start;
 133        uint32_t        slotsz;
 134        uint32_t        slotcnt;
 135        uint32_t        end;
 136} __rte_packed;
 137
 138struct 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 */
 146struct 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
 152struct 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
 159struct 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 */
 166struct 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
 174struct 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
 181struct 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
 188struct 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
 204struct 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
 211int     hn_nvs_attach(struct hn_data *hv, unsigned int mtu);
 212void    hn_nvs_detach(struct hn_data *hv);
 213void    hn_nvs_ack_rxbuf(struct vmbus_channel *chan, uint64_t tid);
 214int     hn_nvs_alloc_subchans(struct hn_data *hv, uint32_t *nsubch);
 215void    hn_nvs_set_datapath(struct hn_data *hv, uint32_t path);
 216void    hn_nvs_handle_vfassoc(struct rte_eth_dev *dev,
 217                              const struct vmbus_chanpkt_hdr *hdr,
 218                              const void *data);
 219
 220static inline int
 221hn_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        return rte_vmbus_chan_send(chan, VMBUS_CHANPKT_TYPE_INBAND,
 226                                   nvs_msg, nvs_msglen, (uint64_t)sndc,
 227                                   flags, need_sig);
 228}
 229
 230static inline int
 231hn_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        return rte_vmbus_chan_send_sglist(chan, sg, sglen, nvs_msg, nvs_msglen,
 237                                          (uint64_t)sndc, need_sig);
 238}
 239