dpdk/drivers/net/bnx2x/bnx2x_vfpf.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause
   2 * Copyright (c) 2013-2015 Brocade Communications Systems, Inc.
   3 * Copyright (c) 2015-2018 Cavium Inc.
   4 * All rights reserved.
   5 * www.cavium.com
   6 */
   7
   8#ifndef BNX2X_VFPF_H
   9#define BNX2X_VFPF_H
  10
  11#include "ecore_sp.h"
  12
  13struct vf_resource_query {
  14        uint8_t num_rxqs;
  15        uint8_t num_txqs;
  16        uint8_t num_sbs;
  17        uint8_t num_mac_filters;
  18        uint8_t num_vlan_filters;
  19        uint8_t num_mc_filters;
  20};
  21
  22#define BNX2X_VF_STATUS_SUCCESS         1
  23#define BNX2X_VF_STATUS_FAILURE         2
  24#define BNX2X_VF_STATUS_NO_RESOURCES    4
  25#define BNX2X_VF_BULLETIN_TRIES         5
  26
  27#define BNX2X_VF_Q_FLAG_CACHE_ALIGN     0x0008
  28#define BNX2X_VF_Q_FLAG_STATS           0x0010
  29#define BNX2X_VF_Q_FLAG_OV              0x0020
  30#define BNX2X_VF_Q_FLAG_VLAN            0x0040
  31#define BNX2X_VF_Q_FLAG_COS             0x0080
  32#define BNX2X_VF_Q_FLAG_HC              0x0100
  33#define BNX2X_VF_Q_FLAG_DHC             0x0200
  34#define BNX2X_VF_Q_FLAG_LEADING_RSS     0x0400
  35
  36#define TLV_BUFFER_SIZE                 1024
  37
  38#define VFPF_RX_MASK_ACCEPT_NONE                0x00000000
  39#define VFPF_RX_MASK_ACCEPT_MATCHED_UNICAST     0x00000001
  40#define VFPF_RX_MASK_ACCEPT_MATCHED_MULTICAST   0x00000002
  41#define VFPF_RX_MASK_ACCEPT_ALL_UNICAST         0x00000004
  42#define VFPF_RX_MASK_ACCEPT_ALL_MULTICAST       0x00000008
  43#define VFPF_RX_MASK_ACCEPT_BROADCAST           0x00000010
  44
  45/* general tlv header (used for both vf->pf request and pf->vf response) */
  46struct channel_tlv {
  47        uint16_t type;
  48        uint16_t length;
  49};
  50
  51struct vf_first_tlv {
  52        struct channel_tlv tl;
  53        uint32_t reply_offset;
  54};
  55
  56struct tlv_buffer_size {
  57        uint8_t tlv_buffer[TLV_BUFFER_SIZE];
  58};
  59
  60/* tlv struct for all PF replies except acquire */
  61struct vf_common_reply_tlv {
  62        struct channel_tlv tl;
  63        uint8_t status;
  64        uint8_t pad[3];
  65};
  66
  67/* used to terminate and pad a tlv list */
  68struct channel_list_end_tlv {
  69        struct channel_tlv tl;
  70        uint32_t pad;
  71};
  72
  73/* Acquire */
  74struct vf_acquire_tlv {
  75        struct vf_first_tlv first_tlv;
  76
  77        uint8_t vf_id;
  78        uint8_t pad[3];
  79
  80        struct vf_resource_query res_query;
  81
  82        uint64_t bulletin_addr;
  83};
  84
  85/* simple operation request on queue */
  86struct vf_q_op_tlv {
  87        struct vf_first_tlv     first_tlv;
  88        uint8_t vf_qid;
  89        uint8_t pad[3];
  90};
  91
  92/* receive side scaling tlv */
  93struct vf_rss_tlv {
  94        struct vf_first_tlv     first_tlv;
  95        uint32_t                rss_flags;
  96        uint8_t                 rss_result_mask;
  97        uint8_t                 ind_table_size;
  98        uint8_t                 rss_key_size;
  99        uint8_t                 pad;
 100        uint8_t                 ind_table[T_ETH_INDIRECTION_TABLE_SIZE];
 101        uint32_t                rss_key[T_ETH_RSS_KEY]; /* hash values */
 102};
 103
 104struct vf_resc {
 105#define BNX2X_VF_MAX_QUEUES_PER_VF         16
 106#define BNX2X_VF_MAX_SBS_PER_VF            16
 107        uint16_t hw_sbs[BNX2X_VF_MAX_SBS_PER_VF];
 108        uint8_t hw_qid[BNX2X_VF_MAX_QUEUES_PER_VF];
 109        uint8_t num_rxqs;
 110        uint8_t num_txqs;
 111        uint8_t num_sbs;
 112        uint8_t num_mac_filters;
 113        uint8_t num_vlan_filters;
 114        uint8_t num_mc_filters;
 115        uint8_t permanent_mac_addr[ETH_ALEN];
 116        struct rte_ether_addr current_mac_addr;
 117        uint16_t pf_link_speed;
 118        uint32_t pf_link_supported;
 119};
 120
 121/* tlv struct holding reply for acquire */
 122struct vf_acquire_resp_tlv {
 123        uint16_t type;
 124        uint16_t length;
 125        uint8_t status;
 126        uint8_t pad1[3];
 127        uint32_t chip_num;
 128        uint8_t pad2[4];
 129        char fw_ver[32];
 130        uint16_t db_size;
 131        uint8_t pad3[2];
 132        struct vf_resc resc;
 133};
 134
 135/* Init VF */
 136struct vf_init_tlv {
 137        struct vf_first_tlv first_tlv;
 138        uint64_t sb_addr[BNX2X_VF_MAX_SBS_PER_VF];
 139        uint64_t spq_addr;
 140        uint64_t stats_addr;
 141        uint16_t stats_step;
 142        uint32_t flags;
 143        uint32_t pad[2];
 144};
 145
 146struct vf_rxq_params {
 147        /* physical addresses */
 148        uint64_t rcq_addr;
 149        uint64_t rcq_np_addr;
 150        uint64_t rxq_addr;
 151        uint64_t pad1;
 152
 153        /* sb + hc info */
 154        uint8_t  vf_sb_id;
 155        uint8_t  sb_cq_index;
 156        uint16_t hc_rate;       /* desired interrupts per sec. */
 157        /* rx buffer info */
 158        uint16_t mtu;
 159        uint16_t buf_sz;
 160        uint16_t flags;         /* for BNX2X_VF_Q_FLAG_X flags */
 161        uint16_t stat_id;       /* valid if BNX2X_VF_Q_FLAG_STATS */
 162
 163        uint8_t pad2[5];
 164
 165        uint8_t drop_flags;
 166        uint8_t cache_line_log; /* BNX2X_VF_Q_FLAG_CACHE_ALIGN */
 167        uint8_t pad3;
 168};
 169
 170struct vf_txq_params {
 171        /* physical addresses */
 172        uint64_t txq_addr;
 173
 174        /* sb + hc info */
 175        uint8_t  vf_sb_id;      /* index in hw_sbs[] */
 176        uint8_t  sb_index;      /* Index in the SB */
 177        uint16_t hc_rate;       /* desired interrupts per sec. */
 178        uint32_t flags;         /* for BNX2X_VF_Q_FLAG_X flags */
 179        uint16_t stat_id;       /* valid if BNX2X_VF_Q_FLAG_STATS */
 180        uint8_t  traffic_type;  /* see in setup_context() */
 181        uint8_t  pad;
 182};
 183
 184/* Setup Queue */
 185struct vf_setup_q_tlv {
 186        struct vf_first_tlv first_tlv;
 187
 188        struct vf_rxq_params rxq;
 189        struct vf_txq_params txq;
 190
 191        uint8_t vf_qid;                 /* index in hw_qid[] */
 192        uint8_t param_valid;
 193        #define VF_RXQ_VALID            0x01
 194        #define VF_TXQ_VALID            0x02
 195        uint8_t pad[2];
 196};
 197
 198/* Set Queue Filters */
 199struct vf_q_mac_vlan_filter {
 200        uint32_t flags;
 201        #define BNX2X_VF_Q_FILTER_DEST_MAC_VALID        0x01
 202        #define BNX2X_VF_Q_FILTER_VLAN_TAG_VALID        0x02
 203        #define BNX2X_VF_Q_FILTER_SET_MAC               0x100   /* set/clear */
 204        uint8_t  mac[ETH_ALEN];
 205        uint16_t vlan_tag;
 206};
 207
 208
 209#define _UP_ETH_ALEN    (6)
 210
 211/* configure queue filters */
 212struct vf_set_q_filters_tlv {
 213        struct vf_first_tlv first_tlv;
 214
 215        uint32_t flags;
 216        #define BNX2X_VF_MAC_VLAN_CHANGED       0x01
 217        #define BNX2X_VF_MULTICAST_CHANGED      0x02
 218        #define BNX2X_VF_RX_MASK_CHANGED        0x04
 219
 220        uint8_t vf_qid;                 /* index in hw_qid[] */
 221        uint8_t mac_filters_cnt;
 222        uint8_t multicast_cnt;
 223        uint8_t pad;
 224
 225        #define VF_MAX_MAC_FILTERS                      16
 226        #define VF_MAX_VLAN_FILTERS                     16
 227        #define VF_MAX_FILTERS                  (VF_MAX_MAC_FILTERS +\
 228                                                        VF_MAX_VLAN_FILTERS)
 229        struct vf_q_mac_vlan_filter filters[VF_MAX_FILTERS];
 230
 231        #define VF_MAX_MULTICAST_PER_VF                 32
 232        uint8_t  multicast[VF_MAX_MULTICAST_PER_VF][_UP_ETH_ALEN];
 233        unsigned long rx_mask;
 234};
 235
 236
 237/* close VF (disable VF) */
 238struct vf_close_tlv {
 239        struct vf_first_tlv     first_tlv;
 240        uint16_t                vf_id;  /* for debug */
 241        uint8_t pad[2];
 242};
 243
 244/* rlease the VF's acquired resources */
 245struct vf_release_tlv {
 246        struct vf_first_tlv   first_tlv;
 247        uint16_t                vf_id;  /* for debug */
 248        uint8_t pad[2];
 249};
 250
 251union query_tlvs {
 252        struct vf_first_tlv             first_tlv;
 253        struct vf_acquire_tlv           acquire;
 254        struct vf_init_tlv              init;
 255        struct vf_close_tlv             close;
 256        struct vf_q_op_tlv              q_op;
 257        struct vf_setup_q_tlv           setup_q;
 258        struct vf_set_q_filters_tlv     set_q_filters;
 259        struct vf_release_tlv           release;
 260        struct vf_rss_tlv               update_rss;
 261        struct channel_list_end_tlv     list_end;
 262        struct tlv_buffer_size          tlv_buf_size;
 263};
 264
 265union resp_tlvs {
 266        struct vf_common_reply_tlv      common_reply;
 267        struct vf_acquire_resp_tlv      acquire_resp;
 268        struct channel_list_end_tlv     list_end;
 269        struct tlv_buffer_size          tlv_buf_size;
 270};
 271
 272/* struct allocated by VF driver, PF sends updates to VF via bulletin */
 273struct bnx2x_vf_bulletin {
 274        uint32_t crc;                   /* crc of structure to ensure is not in
 275                                         * mid-update
 276                                         */
 277        uint16_t version;
 278        uint16_t length;
 279
 280        uint64_t valid_bitmap;  /* bitmap indicating which fields
 281                                         * hold valid values
 282                                         */
 283
 284#define MAC_ADDR_VALID          0       /* alert the vf that a new mac address
 285                                         * is available for it
 286                                         */
 287#define VLAN_VALID              1       /* when set, the vf should no access the
 288                                         * vf channel
 289                                         */
 290#define CHANNEL_DOWN            2       /* vf channel is disabled. VFs are not
 291                                         * to attempt to send messages on the
 292                                         * channel after this bit is set
 293                                         */
 294        uint8_t mac[ETH_ALEN];
 295        uint8_t mac_pad[2];
 296
 297        uint16_t vlan;
 298        uint8_t vlan_pad[6];
 299};
 300
 301#define MAX_TLVS_IN_LIST 50
 302enum channel_tlvs {
 303        BNX2X_VF_TLV_NONE, /* ends tlv sequence */
 304        BNX2X_VF_TLV_ACQUIRE,
 305        BNX2X_VF_TLV_INIT,
 306        BNX2X_VF_TLV_SETUP_Q,
 307        BNX2X_VF_TLV_SET_Q_FILTERS,
 308        BNX2X_VF_TLV_ACTIVATE_Q,
 309        BNX2X_VF_TLV_DEACTIVATE_Q,
 310        BNX2X_VF_TLV_TEARDOWN_Q,
 311        BNX2X_VF_TLV_CLOSE,
 312        BNX2X_VF_TLV_RELEASE,
 313        BNX2X_VF_TLV_UPDATE_RSS_OLD,
 314        BNX2X_VF_TLV_PF_RELEASE_VF,
 315        BNX2X_VF_TLV_LIST_END,
 316        BNX2X_VF_TLV_FLR,
 317        BNX2X_VF_TLV_PF_SET_MAC,
 318        BNX2X_VF_TLV_PF_SET_VLAN,
 319        BNX2X_VF_TLV_UPDATE_RSS,
 320        BNX2X_VF_TLV_PHYS_PORT_ID,
 321        BNX2X_VF_TLV_MAX
 322};
 323
 324struct bnx2x_vf_mbx_msg {
 325        union query_tlvs query[BNX2X_VF_MAX_QUEUES_PER_VF];
 326        union resp_tlvs resp;
 327};
 328
 329int bnx2x_vf_teardown_queue(struct bnx2x_softc *sc, int qid);
 330int bnx2x_vf_set_mac(struct bnx2x_softc *sc, int set);
 331int bnx2x_vf_config_rss(struct bnx2x_softc *sc, struct ecore_config_rss_params *params);
 332int bnx2x_vfpf_set_mcast(struct bnx2x_softc *sc,
 333                        struct rte_ether_addr *mc_addrs,
 334                        uint32_t mc_addrs_num);
 335
 336#endif /* BNX2X_VFPF_H */
 337