11ab4434cSAriel Elior /* bnx2x_sriov.h: Broadcom Everest network driver. 21ab4434cSAriel Elior * 3247fa82bSYuval Mintz * Copyright 2009-2013 Broadcom Corporation 41ab4434cSAriel Elior * 51ab4434cSAriel Elior * Unless you and Broadcom execute a separate written software license 61ab4434cSAriel Elior * agreement governing use of this software, this software is licensed to you 71ab4434cSAriel Elior * under the terms of the GNU General Public License version 2, available 81ab4434cSAriel Elior * at http://www.gnu.org/licenses/old-licenses/gpl-2.0.html (the "GPL"). 91ab4434cSAriel Elior * 101ab4434cSAriel Elior * Notwithstanding the above, under no circumstances may you combine this 111ab4434cSAriel Elior * software in any way with any other Broadcom software provided under a 121ab4434cSAriel Elior * license other than the GPL, without Broadcom's express prior written 131ab4434cSAriel Elior * consent. 141ab4434cSAriel Elior * 151ab4434cSAriel Elior * Maintained by: Eilon Greenstein <eilong@broadcom.com> 161ab4434cSAriel Elior * Written by: Shmulik Ravid <shmulikr@broadcom.com> 171ab4434cSAriel Elior * Ariel Elior <ariele@broadcom.com> 181ab4434cSAriel Elior */ 191ab4434cSAriel Elior #ifndef BNX2X_SRIOV_H 201ab4434cSAriel Elior #define BNX2X_SRIOV_H 211ab4434cSAriel Elior 228ca5e17eSAriel Elior #include "bnx2x_vfpf.h" 236411280aSAriel Elior #include "bnx2x.h" 246411280aSAriel Elior 256411280aSAriel Elior enum sample_bulletin_result { 266411280aSAriel Elior PFVF_BULLETIN_UNCHANGED, 276411280aSAriel Elior PFVF_BULLETIN_UPDATED, 286411280aSAriel Elior PFVF_BULLETIN_CRC_ERR 296411280aSAriel Elior }; 306411280aSAriel Elior 316411280aSAriel Elior #ifdef CONFIG_BNX2X_SRIOV 328ca5e17eSAriel Elior 33290ca2bbSAriel Elior /* The bnx2x device structure holds vfdb structure described below. 34290ca2bbSAriel Elior * The VF array is indexed by the relative vfid. 35290ca2bbSAriel Elior */ 368ca5e17eSAriel Elior #define BNX2X_VF_MAX_QUEUES 16 378db573baSAriel Elior #define BNX2X_VF_MAX_TPA_AGG_QUEUES 8 388db573baSAriel Elior 39290ca2bbSAriel Elior struct bnx2x_sriov { 40290ca2bbSAriel Elior u32 first_vf_in_pf; 41290ca2bbSAriel Elior 42290ca2bbSAriel Elior /* standard SRIOV capability fields, mostly for debugging */ 43290ca2bbSAriel Elior int pos; /* capability position */ 44290ca2bbSAriel Elior int nres; /* number of resources */ 45290ca2bbSAriel Elior u32 cap; /* SR-IOV Capabilities */ 46290ca2bbSAriel Elior u16 ctrl; /* SR-IOV Control */ 47290ca2bbSAriel Elior u16 total; /* total VFs associated with the PF */ 48290ca2bbSAriel Elior u16 initial; /* initial VFs associated with the PF */ 49290ca2bbSAriel Elior u16 nr_virtfn; /* number of VFs available */ 50290ca2bbSAriel Elior u16 offset; /* first VF Routing ID offset */ 51290ca2bbSAriel Elior u16 stride; /* following VF stride */ 52290ca2bbSAriel Elior u32 pgsz; /* page size for BAR alignment */ 53290ca2bbSAriel Elior u8 link; /* Function Dependency Link */ 54290ca2bbSAriel Elior }; 55290ca2bbSAriel Elior 56290ca2bbSAriel Elior /* bars */ 57290ca2bbSAriel Elior struct bnx2x_vf_bar { 58290ca2bbSAriel Elior u64 bar; 59290ca2bbSAriel Elior u32 size; 60290ca2bbSAriel Elior }; 61290ca2bbSAriel Elior 62f1929b01SAriel Elior struct bnx2x_vf_bar_info { 63f1929b01SAriel Elior struct bnx2x_vf_bar bars[PCI_SRIOV_NUM_BARS]; 64f1929b01SAriel Elior u8 nr_bars; 65f1929b01SAriel Elior }; 66f1929b01SAriel Elior 67290ca2bbSAriel Elior /* vf queue (used both for rx or tx) */ 68290ca2bbSAriel Elior struct bnx2x_vf_queue { 69290ca2bbSAriel Elior struct eth_context *cxt; 70290ca2bbSAriel Elior 71290ca2bbSAriel Elior /* MACs object */ 72290ca2bbSAriel Elior struct bnx2x_vlan_mac_obj mac_obj; 73290ca2bbSAriel Elior 74290ca2bbSAriel Elior /* VLANs object */ 75290ca2bbSAriel Elior struct bnx2x_vlan_mac_obj vlan_obj; 76290ca2bbSAriel Elior atomic_t vlan_count; /* 0 means vlan-0 is set ~ untagged */ 77290ca2bbSAriel Elior 78290ca2bbSAriel Elior /* Queue Slow-path State object */ 79290ca2bbSAriel Elior struct bnx2x_queue_sp_obj sp_obj; 80290ca2bbSAriel Elior 81290ca2bbSAriel Elior u32 cid; 82290ca2bbSAriel Elior u16 index; 83290ca2bbSAriel Elior u16 sb_idx; 84290ca2bbSAriel Elior }; 85290ca2bbSAriel Elior 86290ca2bbSAriel Elior /* struct bnx2x_vfop_qctor_params - prepare queue construction parameters: 87290ca2bbSAriel Elior * q-init, q-setup and SB index 88290ca2bbSAriel Elior */ 89290ca2bbSAriel Elior struct bnx2x_vfop_qctor_params { 90290ca2bbSAriel Elior struct bnx2x_queue_state_params qstate; 91290ca2bbSAriel Elior struct bnx2x_queue_setup_params prep_qsetup; 92290ca2bbSAriel Elior }; 93290ca2bbSAriel Elior 94290ca2bbSAriel Elior /* VFOP parameters (one copy per VF) */ 95290ca2bbSAriel Elior union bnx2x_vfop_params { 96290ca2bbSAriel Elior struct bnx2x_vlan_mac_ramrod_params vlan_mac; 97290ca2bbSAriel Elior struct bnx2x_rx_mode_ramrod_params rx_mode; 98290ca2bbSAriel Elior struct bnx2x_mcast_ramrod_params mcast; 99290ca2bbSAriel Elior struct bnx2x_config_rss_params rss; 100290ca2bbSAriel Elior struct bnx2x_vfop_qctor_params qctor; 101290ca2bbSAriel Elior }; 102290ca2bbSAriel Elior 103290ca2bbSAriel Elior /* forward */ 104290ca2bbSAriel Elior struct bnx2x_virtf; 105fd1fc79dSAriel Elior 106fd1fc79dSAriel Elior /* VFOP definitions */ 107fd1fc79dSAriel Elior typedef void (*vfop_handler_t)(struct bnx2x *bp, struct bnx2x_virtf *vf); 108fd1fc79dSAriel Elior 1098db573baSAriel Elior struct bnx2x_vfop_cmd { 1108db573baSAriel Elior vfop_handler_t done; 1118db573baSAriel Elior bool block; 1128db573baSAriel Elior }; 1138db573baSAriel Elior 114fd1fc79dSAriel Elior /* VFOP queue filters command additional arguments */ 115fd1fc79dSAriel Elior struct bnx2x_vfop_filter { 116fd1fc79dSAriel Elior struct list_head link; 117fd1fc79dSAriel Elior int type; 118fd1fc79dSAriel Elior #define BNX2X_VFOP_FILTER_MAC 1 119fd1fc79dSAriel Elior #define BNX2X_VFOP_FILTER_VLAN 2 120fd1fc79dSAriel Elior 121fd1fc79dSAriel Elior bool add; 122fd1fc79dSAriel Elior u8 *mac; 123fd1fc79dSAriel Elior u16 vid; 124fd1fc79dSAriel Elior }; 125fd1fc79dSAriel Elior 126fd1fc79dSAriel Elior struct bnx2x_vfop_filters { 127fd1fc79dSAriel Elior int add_cnt; 128fd1fc79dSAriel Elior struct list_head head; 129fd1fc79dSAriel Elior struct bnx2x_vfop_filter filters[]; 130fd1fc79dSAriel Elior }; 131fd1fc79dSAriel Elior 132fd1fc79dSAriel Elior /* transient list allocated, built and saved until its 133fd1fc79dSAriel Elior * passed to the SP-VERBs layer. 134fd1fc79dSAriel Elior */ 135fd1fc79dSAriel Elior struct bnx2x_vfop_args_mcast { 136fd1fc79dSAriel Elior int mc_num; 137fd1fc79dSAriel Elior struct bnx2x_mcast_list_elem *mc; 138fd1fc79dSAriel Elior }; 139fd1fc79dSAriel Elior 140fd1fc79dSAriel Elior struct bnx2x_vfop_args_qctor { 141fd1fc79dSAriel Elior int qid; 142fd1fc79dSAriel Elior u16 sb_idx; 143fd1fc79dSAriel Elior }; 144fd1fc79dSAriel Elior 145fd1fc79dSAriel Elior struct bnx2x_vfop_args_qdtor { 146fd1fc79dSAriel Elior int qid; 147fd1fc79dSAriel Elior struct eth_context *cxt; 148fd1fc79dSAriel Elior }; 149fd1fc79dSAriel Elior 150fd1fc79dSAriel Elior struct bnx2x_vfop_args_defvlan { 151fd1fc79dSAriel Elior int qid; 152fd1fc79dSAriel Elior bool enable; 153fd1fc79dSAriel Elior u16 vid; 154fd1fc79dSAriel Elior u8 prio; 155fd1fc79dSAriel Elior }; 156fd1fc79dSAriel Elior 157fd1fc79dSAriel Elior struct bnx2x_vfop_args_qx { 158fd1fc79dSAriel Elior int qid; 159fd1fc79dSAriel Elior bool en_add; 160fd1fc79dSAriel Elior }; 161fd1fc79dSAriel Elior 162fd1fc79dSAriel Elior struct bnx2x_vfop_args_filters { 163fd1fc79dSAriel Elior struct bnx2x_vfop_filters *multi_filter; 164fd1fc79dSAriel Elior atomic_t *credit; /* non NULL means 'don't consume credit' */ 165fd1fc79dSAriel Elior }; 166fd1fc79dSAriel Elior 167fd1fc79dSAriel Elior union bnx2x_vfop_args { 168fd1fc79dSAriel Elior struct bnx2x_vfop_args_mcast mc_list; 169fd1fc79dSAriel Elior struct bnx2x_vfop_args_qctor qctor; 170fd1fc79dSAriel Elior struct bnx2x_vfop_args_qdtor qdtor; 171fd1fc79dSAriel Elior struct bnx2x_vfop_args_defvlan defvlan; 172fd1fc79dSAriel Elior struct bnx2x_vfop_args_qx qx; 173fd1fc79dSAriel Elior struct bnx2x_vfop_args_filters filters; 174fd1fc79dSAriel Elior }; 175fd1fc79dSAriel Elior 176fd1fc79dSAriel Elior struct bnx2x_vfop { 177fd1fc79dSAriel Elior struct list_head link; 178fd1fc79dSAriel Elior int rc; /* return code */ 179fd1fc79dSAriel Elior int state; /* next state */ 180fd1fc79dSAriel Elior union bnx2x_vfop_args args; /* extra arguments */ 181fd1fc79dSAriel Elior union bnx2x_vfop_params *op_p; /* ramrod params */ 182fd1fc79dSAriel Elior 183fd1fc79dSAriel Elior /* state machine callbacks */ 184fd1fc79dSAriel Elior vfop_handler_t transition; 185fd1fc79dSAriel Elior vfop_handler_t done; 186fd1fc79dSAriel Elior }; 187fd1fc79dSAriel Elior 188290ca2bbSAriel Elior /* vf context */ 189290ca2bbSAriel Elior struct bnx2x_virtf { 190290ca2bbSAriel Elior u16 cfg_flags; 191290ca2bbSAriel Elior #define VF_CFG_STATS 0x0001 192290ca2bbSAriel Elior #define VF_CFG_FW_FC 0x0002 193290ca2bbSAriel Elior #define VF_CFG_TPA 0x0004 194290ca2bbSAriel Elior #define VF_CFG_INT_SIMD 0x0008 195290ca2bbSAriel Elior #define VF_CACHE_LINE 0x0010 1963ec9f9caSAriel Elior #define VF_CFG_VLAN 0x0020 197290ca2bbSAriel Elior 198290ca2bbSAriel Elior u8 state; 199290ca2bbSAriel Elior #define VF_FREE 0 /* VF ready to be acquired holds no resc */ 20016a5fd92SYuval Mintz #define VF_ACQUIRED 1 /* VF acquired, but not initialized */ 201290ca2bbSAriel Elior #define VF_ENABLED 2 /* VF Enabled */ 202290ca2bbSAriel Elior #define VF_RESET 3 /* VF FLR'd, pending cleanup */ 203290ca2bbSAriel Elior 204290ca2bbSAriel Elior /* non 0 during flr cleanup */ 205290ca2bbSAriel Elior u8 flr_clnup_stage; 206290ca2bbSAriel Elior #define VF_FLR_CLN 1 /* reclaim resources and do 'final cleanup' 207290ca2bbSAriel Elior * sans the end-wait 208290ca2bbSAriel Elior */ 209290ca2bbSAriel Elior #define VF_FLR_ACK 2 /* ACK flr notification */ 210290ca2bbSAriel Elior #define VF_FLR_EPILOG 3 /* wait for VF remnants to dissipate in the HW 211290ca2bbSAriel Elior * ~ final cleanup' end wait 212290ca2bbSAriel Elior */ 213290ca2bbSAriel Elior 214290ca2bbSAriel Elior /* dma */ 215290ca2bbSAriel Elior dma_addr_t fw_stat_map; /* valid iff VF_CFG_STATS */ 216290ca2bbSAriel Elior dma_addr_t spq_map; 217290ca2bbSAriel Elior dma_addr_t bulletin_map; 218290ca2bbSAriel Elior 219290ca2bbSAriel Elior /* Allocated resources counters. Before the VF is acquired, the 220290ca2bbSAriel Elior * counters hold the following values: 221290ca2bbSAriel Elior * 222290ca2bbSAriel Elior * - xxq_count = 0 as the queues memory is not allocated yet. 223290ca2bbSAriel Elior * 224290ca2bbSAriel Elior * - sb_count = The number of status blocks configured for this VF in 225290ca2bbSAriel Elior * the IGU CAM. Initially read during probe. 226290ca2bbSAriel Elior * 227290ca2bbSAriel Elior * - xx_rules_count = The number of rules statically and equally 228290ca2bbSAriel Elior * allocated for each VF, during PF load. 229290ca2bbSAriel Elior */ 230290ca2bbSAriel Elior struct vf_pf_resc_request alloc_resc; 231290ca2bbSAriel Elior #define vf_rxq_count(vf) ((vf)->alloc_resc.num_rxqs) 232290ca2bbSAriel Elior #define vf_txq_count(vf) ((vf)->alloc_resc.num_txqs) 233290ca2bbSAriel Elior #define vf_sb_count(vf) ((vf)->alloc_resc.num_sbs) 234290ca2bbSAriel Elior #define vf_mac_rules_cnt(vf) ((vf)->alloc_resc.num_mac_filters) 235290ca2bbSAriel Elior #define vf_vlan_rules_cnt(vf) ((vf)->alloc_resc.num_vlan_filters) 236290ca2bbSAriel Elior #define vf_mc_rules_cnt(vf) ((vf)->alloc_resc.num_mc_filters) 237290ca2bbSAriel Elior 238290ca2bbSAriel Elior u8 sb_count; /* actual number of SBs */ 239290ca2bbSAriel Elior u8 igu_base_id; /* base igu status block id */ 240290ca2bbSAriel Elior 241290ca2bbSAriel Elior struct bnx2x_vf_queue *vfqs; 242290ca2bbSAriel Elior #define bnx2x_vfq(vf, nr, var) ((vf)->vfqs[(nr)].var) 243290ca2bbSAriel Elior 244290ca2bbSAriel Elior u8 index; /* index in the vf array */ 245290ca2bbSAriel Elior u8 abs_vfid; 246290ca2bbSAriel Elior u8 sp_cl_id; 247290ca2bbSAriel Elior u32 error; /* 0 means all's-well */ 248290ca2bbSAriel Elior 249290ca2bbSAriel Elior /* BDF */ 250290ca2bbSAriel Elior unsigned int bus; 251290ca2bbSAriel Elior unsigned int devfn; 252290ca2bbSAriel Elior 253290ca2bbSAriel Elior /* bars */ 254290ca2bbSAriel Elior struct bnx2x_vf_bar bars[PCI_SRIOV_NUM_BARS]; 255290ca2bbSAriel Elior 256290ca2bbSAriel Elior /* set-mac ramrod state 1-pending, 0-done */ 257290ca2bbSAriel Elior unsigned long filter_state; 258290ca2bbSAriel Elior 259290ca2bbSAriel Elior /* leading rss client id ~~ the client id of the first rxq, must be 260290ca2bbSAriel Elior * set for each txq. 261290ca2bbSAriel Elior */ 262290ca2bbSAriel Elior int leading_rss; 263290ca2bbSAriel Elior 264290ca2bbSAriel Elior /* MCAST object */ 265290ca2bbSAriel Elior struct bnx2x_mcast_obj mcast_obj; 266290ca2bbSAriel Elior 267290ca2bbSAriel Elior /* RSS configuration object */ 268290ca2bbSAriel Elior struct bnx2x_rss_config_obj rss_conf_obj; 269290ca2bbSAriel Elior 270290ca2bbSAriel Elior /* slow-path operations */ 271290ca2bbSAriel Elior atomic_t op_in_progress; 272290ca2bbSAriel Elior int op_rc; 273290ca2bbSAriel Elior bool op_wait_blocking; 274290ca2bbSAriel Elior struct list_head op_list_head; 275290ca2bbSAriel Elior union bnx2x_vfop_params op_params; 276290ca2bbSAriel Elior struct mutex op_mutex; /* one vfop at a time mutex */ 277290ca2bbSAriel Elior enum channel_tlvs op_current; 278290ca2bbSAriel Elior }; 279290ca2bbSAriel Elior 280290ca2bbSAriel Elior #define BNX2X_NR_VIRTFN(bp) ((bp)->vfdb->sriov.nr_virtfn) 281290ca2bbSAriel Elior 282290ca2bbSAriel Elior #define for_each_vf(bp, var) \ 283290ca2bbSAriel Elior for ((var) = 0; (var) < BNX2X_NR_VIRTFN(bp); (var)++) 284290ca2bbSAriel Elior 2858ca5e17eSAriel Elior #define for_each_vfq(vf, var) \ 2868ca5e17eSAriel Elior for ((var) = 0; (var) < vf_rxq_count(vf); (var)++) 2878ca5e17eSAriel Elior 2888ca5e17eSAriel Elior #define for_each_vf_sb(vf, var) \ 2898ca5e17eSAriel Elior for ((var) = 0; (var) < vf_sb_count(vf); (var)++) 2908ca5e17eSAriel Elior 291b93288d5SAriel Elior #define is_vf_multi(vf) (vf_rxq_count(vf) > 1) 292b93288d5SAriel Elior 293b56e9670SAriel Elior #define HW_VF_HANDLE(bp, abs_vfid) \ 294b56e9670SAriel Elior (u16)(BP_ABS_FUNC((bp)) | (1<<3) | ((u16)(abs_vfid) << 4)) 295b56e9670SAriel Elior 296b56e9670SAriel Elior #define FW_PF_MAX_HANDLE 8 297b56e9670SAriel Elior 298b56e9670SAriel Elior #define FW_VF_HANDLE(abs_vfid) \ 299b56e9670SAriel Elior (abs_vfid + FW_PF_MAX_HANDLE) 300b56e9670SAriel Elior 3018ca5e17eSAriel Elior /* locking and unlocking the channel mutex */ 3028ca5e17eSAriel Elior void bnx2x_lock_vf_pf_channel(struct bnx2x *bp, struct bnx2x_virtf *vf, 3038ca5e17eSAriel Elior enum channel_tlvs tlv); 3048ca5e17eSAriel Elior 3058ca5e17eSAriel Elior void bnx2x_unlock_vf_pf_channel(struct bnx2x *bp, struct bnx2x_virtf *vf, 3068ca5e17eSAriel Elior enum channel_tlvs expected_tlv); 3078ca5e17eSAriel Elior 308b56e9670SAriel Elior /* VF mail box (aka vf-pf channel) */ 309b56e9670SAriel Elior 310b56e9670SAriel Elior /* a container for the bi-directional vf<-->pf messages. 311b56e9670SAriel Elior * The actual response will be placed according to the offset parameter 312b56e9670SAriel Elior * provided in the request 313b56e9670SAriel Elior */ 314b56e9670SAriel Elior 315b56e9670SAriel Elior #define MBX_MSG_ALIGN 8 316b56e9670SAriel Elior #define MBX_MSG_ALIGNED_SIZE (roundup(sizeof(struct bnx2x_vf_mbx_msg), \ 317b56e9670SAriel Elior MBX_MSG_ALIGN)) 318b56e9670SAriel Elior 3191ab4434cSAriel Elior struct bnx2x_vf_mbx_msg { 3201ab4434cSAriel Elior union vfpf_tlvs req; 3211ab4434cSAriel Elior union pfvf_tlvs resp; 3221ab4434cSAriel Elior }; 3231ab4434cSAriel Elior 324290ca2bbSAriel Elior struct bnx2x_vf_mbx { 325290ca2bbSAriel Elior struct bnx2x_vf_mbx_msg *msg; 326290ca2bbSAriel Elior dma_addr_t msg_mapping; 327290ca2bbSAriel Elior 328290ca2bbSAriel Elior /* VF GPA address */ 329290ca2bbSAriel Elior u32 vf_addr_lo; 330290ca2bbSAriel Elior u32 vf_addr_hi; 331290ca2bbSAriel Elior 332290ca2bbSAriel Elior struct vfpf_first_tlv first_tlv; /* saved VF request header */ 333290ca2bbSAriel Elior 334290ca2bbSAriel Elior u8 flags; 335290ca2bbSAriel Elior #define VF_MSG_INPROCESS 0x1 /* failsafe - the FW should prevent 336290ca2bbSAriel Elior * more then one pending msg 337290ca2bbSAriel Elior */ 338290ca2bbSAriel Elior }; 339290ca2bbSAriel Elior 340b56e9670SAriel Elior struct bnx2x_vf_sp { 341b56e9670SAriel Elior union { 342b56e9670SAriel Elior struct eth_classify_rules_ramrod_data e2; 343b56e9670SAriel Elior } mac_rdata; 344b56e9670SAriel Elior 345b56e9670SAriel Elior union { 346b56e9670SAriel Elior struct eth_classify_rules_ramrod_data e2; 347b56e9670SAriel Elior } vlan_rdata; 348b56e9670SAriel Elior 349b56e9670SAriel Elior union { 350b56e9670SAriel Elior struct eth_filter_rules_ramrod_data e2; 351b56e9670SAriel Elior } rx_mode_rdata; 352b56e9670SAriel Elior 353b56e9670SAriel Elior union { 354b56e9670SAriel Elior struct eth_multicast_rules_ramrod_data e2; 355b56e9670SAriel Elior } mcast_rdata; 356b56e9670SAriel Elior 357b56e9670SAriel Elior union { 358b56e9670SAriel Elior struct client_init_ramrod_data init_data; 359b56e9670SAriel Elior struct client_update_ramrod_data update_data; 360b56e9670SAriel Elior } q_data; 361b56e9670SAriel Elior }; 362b56e9670SAriel Elior 363290ca2bbSAriel Elior struct hw_dma { 364290ca2bbSAriel Elior void *addr; 365290ca2bbSAriel Elior dma_addr_t mapping; 366290ca2bbSAriel Elior size_t size; 367290ca2bbSAriel Elior }; 368290ca2bbSAriel Elior 369290ca2bbSAriel Elior struct bnx2x_vfdb { 370290ca2bbSAriel Elior #define BP_VFDB(bp) ((bp)->vfdb) 371290ca2bbSAriel Elior /* vf array */ 372290ca2bbSAriel Elior struct bnx2x_virtf *vfs; 373290ca2bbSAriel Elior #define BP_VF(bp, idx) (&((bp)->vfdb->vfs[(idx)])) 374290ca2bbSAriel Elior #define bnx2x_vf(bp, idx, var) ((bp)->vfdb->vfs[(idx)].var) 375290ca2bbSAriel Elior 376290ca2bbSAriel Elior /* queue array - for all vfs */ 377290ca2bbSAriel Elior struct bnx2x_vf_queue *vfqs; 378290ca2bbSAriel Elior 379290ca2bbSAriel Elior /* vf HW contexts */ 380290ca2bbSAriel Elior struct hw_dma context[BNX2X_VF_CIDS/ILT_PAGE_CIDS]; 381290ca2bbSAriel Elior #define BP_VF_CXT_PAGE(bp, i) (&(bp)->vfdb->context[(i)]) 382290ca2bbSAriel Elior 383290ca2bbSAriel Elior /* SR-IOV information */ 384290ca2bbSAriel Elior struct bnx2x_sriov sriov; 385290ca2bbSAriel Elior struct hw_dma mbx_dma; 386290ca2bbSAriel Elior #define BP_VF_MBX_DMA(bp) (&((bp)->vfdb->mbx_dma)) 387290ca2bbSAriel Elior struct bnx2x_vf_mbx mbxs[BNX2X_MAX_NUM_OF_VFS]; 388290ca2bbSAriel Elior #define BP_VF_MBX(bp, vfid) (&((bp)->vfdb->mbxs[(vfid)])) 389290ca2bbSAriel Elior 390abc5a021SAriel Elior struct hw_dma bulletin_dma; 391abc5a021SAriel Elior #define BP_VF_BULLETIN_DMA(bp) (&((bp)->vfdb->bulletin_dma)) 392abc5a021SAriel Elior #define BP_VF_BULLETIN(bp, vf) \ 393abc5a021SAriel Elior (((struct pf_vf_bulletin_content *)(BP_VF_BULLETIN_DMA(bp)->addr)) \ 394abc5a021SAriel Elior + (vf)) 395abc5a021SAriel Elior 396290ca2bbSAriel Elior struct hw_dma sp_dma; 397290ca2bbSAriel Elior #define bnx2x_vf_sp(bp, vf, field) ((bp)->vfdb->sp_dma.addr + \ 398290ca2bbSAriel Elior (vf)->index * sizeof(struct bnx2x_vf_sp) + \ 399290ca2bbSAriel Elior offsetof(struct bnx2x_vf_sp, field)) 400290ca2bbSAriel Elior #define bnx2x_vf_sp_map(bp, vf, field) ((bp)->vfdb->sp_dma.mapping + \ 401290ca2bbSAriel Elior (vf)->index * sizeof(struct bnx2x_vf_sp) + \ 402290ca2bbSAriel Elior offsetof(struct bnx2x_vf_sp, field)) 403290ca2bbSAriel Elior 404290ca2bbSAriel Elior #define FLRD_VFS_DWORDS (BNX2X_MAX_NUM_OF_VFS / 32) 405290ca2bbSAriel Elior u32 flrd_vfs[FLRD_VFS_DWORDS]; 406290ca2bbSAriel Elior }; 407290ca2bbSAriel Elior 408fd1fc79dSAriel Elior /* queue access */ 409fd1fc79dSAriel Elior static inline struct bnx2x_vf_queue *vfq_get(struct bnx2x_virtf *vf, u8 index) 410fd1fc79dSAriel Elior { 411fd1fc79dSAriel Elior return &(vf->vfqs[index]); 412fd1fc79dSAriel Elior } 413fd1fc79dSAriel Elior 4148ca5e17eSAriel Elior static inline bool vfq_is_leading(struct bnx2x_vf_queue *vfq) 4158ca5e17eSAriel Elior { 4168ca5e17eSAriel Elior return (vfq->index == 0); 4178ca5e17eSAriel Elior } 4188ca5e17eSAriel Elior 4198ca5e17eSAriel Elior /* FW ids */ 420b56e9670SAriel Elior static inline u8 vf_igu_sb(struct bnx2x_virtf *vf, u16 sb_idx) 421b56e9670SAriel Elior { 422b56e9670SAriel Elior return vf->igu_base_id + sb_idx; 423b56e9670SAriel Elior } 424b56e9670SAriel Elior 4258ca5e17eSAriel Elior static inline u8 vf_hc_qzone(struct bnx2x_virtf *vf, u16 sb_idx) 4268ca5e17eSAriel Elior { 4278ca5e17eSAriel Elior return vf_igu_sb(vf, sb_idx); 4288ca5e17eSAriel Elior } 4298ca5e17eSAriel Elior 4308ca5e17eSAriel Elior static u8 vfq_cl_id(struct bnx2x_virtf *vf, struct bnx2x_vf_queue *q) 4318ca5e17eSAriel Elior { 4328ca5e17eSAriel Elior return vf->igu_base_id + q->index; 4338ca5e17eSAriel Elior } 4348ca5e17eSAriel Elior 4358db573baSAriel Elior static inline u8 vfq_stat_id(struct bnx2x_virtf *vf, struct bnx2x_vf_queue *q) 4368db573baSAriel Elior { 4378db573baSAriel Elior return vfq_cl_id(vf, q); 4388db573baSAriel Elior } 4398db573baSAriel Elior 4408ca5e17eSAriel Elior static inline u8 vfq_qzone_id(struct bnx2x_virtf *vf, struct bnx2x_vf_queue *q) 4418ca5e17eSAriel Elior { 4428ca5e17eSAriel Elior return vfq_cl_id(vf, q); 4438ca5e17eSAriel Elior } 4448ca5e17eSAriel Elior 445290ca2bbSAriel Elior /* global iov routines */ 446290ca2bbSAriel Elior int bnx2x_iov_init_ilt(struct bnx2x *bp, u16 line); 447290ca2bbSAriel Elior int bnx2x_iov_init_one(struct bnx2x *bp, int int_mode_param, int num_vfs_param); 448290ca2bbSAriel Elior void bnx2x_iov_remove_one(struct bnx2x *bp); 449b56e9670SAriel Elior void bnx2x_iov_free_mem(struct bnx2x *bp); 450b56e9670SAriel Elior int bnx2x_iov_alloc_mem(struct bnx2x *bp); 451b56e9670SAriel Elior int bnx2x_iov_nic_init(struct bnx2x *bp); 452f1929b01SAriel Elior int bnx2x_iov_chip_cleanup(struct bnx2x *bp); 453b56e9670SAriel Elior void bnx2x_iov_init_dq(struct bnx2x *bp); 454b56e9670SAriel Elior void bnx2x_iov_init_dmae(struct bnx2x *bp); 455fd1fc79dSAriel Elior void bnx2x_iov_set_queue_sp_obj(struct bnx2x *bp, int vf_cid, 456fd1fc79dSAriel Elior struct bnx2x_queue_sp_obj **q_obj); 457fd1fc79dSAriel Elior void bnx2x_iov_sp_event(struct bnx2x *bp, int vf_cid, bool queue_work); 458fd1fc79dSAriel Elior int bnx2x_iov_eq_sp_event(struct bnx2x *bp, union event_ring_elem *elem); 45967c431a5SAriel Elior void bnx2x_iov_adjust_stats_req(struct bnx2x *bp); 46067c431a5SAriel Elior void bnx2x_iov_storm_stats_update(struct bnx2x *bp); 461fd1fc79dSAriel Elior void bnx2x_iov_sp_task(struct bnx2x *bp); 462fd1fc79dSAriel Elior /* global vf mailbox routines */ 463fd1fc79dSAriel Elior void bnx2x_vf_mbx(struct bnx2x *bp, struct vf_pf_event_data *vfpf_event); 464b56e9670SAriel Elior void bnx2x_vf_enable_mbx(struct bnx2x *bp, u8 abs_vfid); 465954ea748SAriel Elior 466954ea748SAriel Elior /* CORE VF API */ 467954ea748SAriel Elior typedef u8 bnx2x_mac_addr_t[ETH_ALEN]; 468954ea748SAriel Elior 4698ca5e17eSAriel Elior /* acquire */ 4708ca5e17eSAriel Elior int bnx2x_vf_acquire(struct bnx2x *bp, struct bnx2x_virtf *vf, 4718ca5e17eSAriel Elior struct vf_pf_resc_request *resc); 472b93288d5SAriel Elior /* init */ 473b93288d5SAriel Elior int bnx2x_vf_init(struct bnx2x *bp, struct bnx2x_virtf *vf, 474b93288d5SAriel Elior dma_addr_t *sb_map); 4758db573baSAriel Elior 4768db573baSAriel Elior /* VFOP generic helpers */ 4778db573baSAriel Elior #define bnx2x_vfop_default(state) do { \ 4788db573baSAriel Elior BNX2X_ERR("Bad state %d\n", (state)); \ 4798db573baSAriel Elior vfop->rc = -EINVAL; \ 4808db573baSAriel Elior goto op_err; \ 4818db573baSAriel Elior } while (0) 4828db573baSAriel Elior 4838db573baSAriel Elior enum { 4848db573baSAriel Elior VFOP_DONE, 4858db573baSAriel Elior VFOP_CONT, 4868db573baSAriel Elior VFOP_VERIFY_PEND, 4878db573baSAriel Elior }; 4888db573baSAriel Elior 4898db573baSAriel Elior #define bnx2x_vfop_finalize(vf, rc, next) do { \ 4908db573baSAriel Elior if ((rc) < 0) \ 4918db573baSAriel Elior goto op_err; \ 4928db573baSAriel Elior else if ((rc) > 0) \ 4938db573baSAriel Elior goto op_pending; \ 4948db573baSAriel Elior else if ((next) == VFOP_DONE) \ 4958db573baSAriel Elior goto op_done; \ 4968db573baSAriel Elior else if ((next) == VFOP_VERIFY_PEND) \ 4978db573baSAriel Elior BNX2X_ERR("expected pending\n"); \ 4988db573baSAriel Elior else { \ 499*6bf07b8eSYuval Mintz DP(BNX2X_MSG_IOV, "no ramrod. Scheduling\n"); \ 5008db573baSAriel Elior atomic_set(&vf->op_in_progress, 1); \ 5018db573baSAriel Elior queue_delayed_work(bnx2x_wq, &bp->sp_task, 0); \ 5028db573baSAriel Elior return; \ 5038db573baSAriel Elior } \ 5048db573baSAriel Elior } while (0) 5058db573baSAriel Elior 5068db573baSAriel Elior #define bnx2x_vfop_opset(first_state, trans_hndlr, done_hndlr) \ 5078db573baSAriel Elior do { \ 5088db573baSAriel Elior vfop->state = first_state; \ 5098db573baSAriel Elior vfop->op_p = &vf->op_params; \ 5108db573baSAriel Elior vfop->transition = trans_hndlr; \ 5118db573baSAriel Elior vfop->done = done_hndlr; \ 5128db573baSAriel Elior } while (0) 5138db573baSAriel Elior 514fd1fc79dSAriel Elior static inline struct bnx2x_vfop *bnx2x_vfop_cur(struct bnx2x *bp, 515fd1fc79dSAriel Elior struct bnx2x_virtf *vf) 516fd1fc79dSAriel Elior { 517fd1fc79dSAriel Elior WARN(!mutex_is_locked(&vf->op_mutex), "about to access vf op linked list but mutex was not locked!"); 518fd1fc79dSAriel Elior WARN_ON(list_empty(&vf->op_list_head)); 519fd1fc79dSAriel Elior return list_first_entry(&vf->op_list_head, struct bnx2x_vfop, link); 520fd1fc79dSAriel Elior } 521fd1fc79dSAriel Elior 5228db573baSAriel Elior static inline struct bnx2x_vfop *bnx2x_vfop_add(struct bnx2x *bp, 5238db573baSAriel Elior struct bnx2x_virtf *vf) 5248db573baSAriel Elior { 5258db573baSAriel Elior struct bnx2x_vfop *vfop = kzalloc(sizeof(*vfop), GFP_KERNEL); 5268db573baSAriel Elior 5278db573baSAriel Elior WARN(!mutex_is_locked(&vf->op_mutex), "about to access vf op linked list but mutex was not locked!"); 5288db573baSAriel Elior if (vfop) { 5298db573baSAriel Elior INIT_LIST_HEAD(&vfop->link); 5308db573baSAriel Elior list_add(&vfop->link, &vf->op_list_head); 5318db573baSAriel Elior } 5328db573baSAriel Elior return vfop; 5338db573baSAriel Elior } 5348db573baSAriel Elior 5358db573baSAriel Elior static inline void bnx2x_vfop_end(struct bnx2x *bp, struct bnx2x_virtf *vf, 5368db573baSAriel Elior struct bnx2x_vfop *vfop) 5378db573baSAriel Elior { 5388db573baSAriel Elior /* rc < 0 - error, otherwise set to 0 */ 5398db573baSAriel Elior DP(BNX2X_MSG_IOV, "rc was %d\n", vfop->rc); 5408db573baSAriel Elior if (vfop->rc >= 0) 5418db573baSAriel Elior vfop->rc = 0; 5428db573baSAriel Elior DP(BNX2X_MSG_IOV, "rc is now %d\n", vfop->rc); 5438db573baSAriel Elior 5448db573baSAriel Elior /* unlink the current op context and propagate error code 5458db573baSAriel Elior * must be done before invoking the 'done()' handler 5468db573baSAriel Elior */ 5478db573baSAriel Elior WARN(!mutex_is_locked(&vf->op_mutex), 5488db573baSAriel Elior "about to access vf op linked list but mutex was not locked!"); 5498db573baSAriel Elior list_del(&vfop->link); 5508db573baSAriel Elior 5518db573baSAriel Elior if (list_empty(&vf->op_list_head)) { 5528db573baSAriel Elior DP(BNX2X_MSG_IOV, "list was empty %d\n", vfop->rc); 5538db573baSAriel Elior vf->op_rc = vfop->rc; 5548db573baSAriel Elior DP(BNX2X_MSG_IOV, "copying rc vf->op_rc %d, vfop->rc %d\n", 5558db573baSAriel Elior vf->op_rc, vfop->rc); 5568db573baSAriel Elior } else { 5578db573baSAriel Elior struct bnx2x_vfop *cur_vfop; 5588db573baSAriel Elior 5598db573baSAriel Elior DP(BNX2X_MSG_IOV, "list not empty %d\n", vfop->rc); 5608db573baSAriel Elior cur_vfop = bnx2x_vfop_cur(bp, vf); 5618db573baSAriel Elior cur_vfop->rc = vfop->rc; 5628db573baSAriel Elior DP(BNX2X_MSG_IOV, "copying rc vf->op_rc %d, vfop->rc %d\n", 5638db573baSAriel Elior vf->op_rc, vfop->rc); 5648db573baSAriel Elior } 5658db573baSAriel Elior 5668db573baSAriel Elior /* invoke done handler */ 5678db573baSAriel Elior if (vfop->done) { 5688db573baSAriel Elior DP(BNX2X_MSG_IOV, "calling done handler\n"); 5698db573baSAriel Elior vfop->done(bp, vf); 570f1929b01SAriel Elior } else { 571f1929b01SAriel Elior /* there is no done handler for the operation to unlock 572f1929b01SAriel Elior * the mutex. Must have gotten here from PF initiated VF RELEASE 573f1929b01SAriel Elior */ 574f1929b01SAriel Elior bnx2x_unlock_vf_pf_channel(bp, vf, CHANNEL_TLV_PF_RELEASE_VF); 5758db573baSAriel Elior } 5768db573baSAriel Elior 5778db573baSAriel Elior DP(BNX2X_MSG_IOV, "done handler complete. vf->op_rc %d, vfop->rc %d\n", 5788db573baSAriel Elior vf->op_rc, vfop->rc); 5798db573baSAriel Elior 5808db573baSAriel Elior /* if this is the last nested op reset the wait_blocking flag 5818db573baSAriel Elior * to release any blocking wrappers, only after 'done()' is invoked 5828db573baSAriel Elior */ 5838db573baSAriel Elior if (list_empty(&vf->op_list_head)) { 5848db573baSAriel Elior DP(BNX2X_MSG_IOV, "list was empty after done %d\n", vfop->rc); 5858db573baSAriel Elior vf->op_wait_blocking = false; 5868db573baSAriel Elior } 5878db573baSAriel Elior 5888db573baSAriel Elior kfree(vfop); 5898db573baSAriel Elior } 5908db573baSAriel Elior 5918db573baSAriel Elior static inline int bnx2x_vfop_wait_blocking(struct bnx2x *bp, 5928db573baSAriel Elior struct bnx2x_virtf *vf) 5938db573baSAriel Elior { 5948db573baSAriel Elior /* can take a while if any port is running */ 5958db573baSAriel Elior int cnt = 5000; 5968db573baSAriel Elior 5978db573baSAriel Elior might_sleep(); 5988db573baSAriel Elior while (cnt--) { 5998db573baSAriel Elior if (vf->op_wait_blocking == false) { 6008db573baSAriel Elior #ifdef BNX2X_STOP_ON_ERROR 6018db573baSAriel Elior DP(BNX2X_MSG_IOV, "exit (cnt %d)\n", 5000 - cnt); 6028db573baSAriel Elior #endif 6038db573baSAriel Elior return 0; 6048db573baSAriel Elior } 6058db573baSAriel Elior usleep_range(1000, 2000); 6068db573baSAriel Elior 6078db573baSAriel Elior if (bp->panic) 6088db573baSAriel Elior return -EIO; 6098db573baSAriel Elior } 6108db573baSAriel Elior 6118db573baSAriel Elior /* timeout! */ 6128db573baSAriel Elior #ifdef BNX2X_STOP_ON_ERROR 6138db573baSAriel Elior bnx2x_panic(); 6148db573baSAriel Elior #endif 6158db573baSAriel Elior 6168db573baSAriel Elior return -EBUSY; 6178db573baSAriel Elior } 6188db573baSAriel Elior 6198db573baSAriel Elior static inline int bnx2x_vfop_transition(struct bnx2x *bp, 6208db573baSAriel Elior struct bnx2x_virtf *vf, 6218db573baSAriel Elior vfop_handler_t transition, 6228db573baSAriel Elior bool block) 6238db573baSAriel Elior { 6248db573baSAriel Elior if (block) 6258db573baSAriel Elior vf->op_wait_blocking = true; 6268db573baSAriel Elior transition(bp, vf); 6278db573baSAriel Elior if (block) 6288db573baSAriel Elior return bnx2x_vfop_wait_blocking(bp, vf); 6298db573baSAriel Elior return 0; 6308db573baSAriel Elior } 6318db573baSAriel Elior 6328db573baSAriel Elior /* VFOP queue construction helpers */ 6338db573baSAriel Elior void bnx2x_vfop_qctor_dump_tx(struct bnx2x *bp, struct bnx2x_virtf *vf, 6348db573baSAriel Elior struct bnx2x_queue_init_params *init_params, 6358db573baSAriel Elior struct bnx2x_queue_setup_params *setup_params, 6368db573baSAriel Elior u16 q_idx, u16 sb_idx); 6378db573baSAriel Elior 6388db573baSAriel Elior void bnx2x_vfop_qctor_dump_rx(struct bnx2x *bp, struct bnx2x_virtf *vf, 6398db573baSAriel Elior struct bnx2x_queue_init_params *init_params, 6408db573baSAriel Elior struct bnx2x_queue_setup_params *setup_params, 6418db573baSAriel Elior u16 q_idx, u16 sb_idx); 6428db573baSAriel Elior 6438db573baSAriel Elior void bnx2x_vfop_qctor_prep(struct bnx2x *bp, 6448db573baSAriel Elior struct bnx2x_virtf *vf, 6458db573baSAriel Elior struct bnx2x_vf_queue *q, 6468db573baSAriel Elior struct bnx2x_vfop_qctor_params *p, 6478db573baSAriel Elior unsigned long q_type); 648954ea748SAriel Elior int bnx2x_vfop_mac_list_cmd(struct bnx2x *bp, 649954ea748SAriel Elior struct bnx2x_virtf *vf, 650954ea748SAriel Elior struct bnx2x_vfop_cmd *cmd, 651954ea748SAriel Elior struct bnx2x_vfop_filters *macs, 652954ea748SAriel Elior int qid, bool drv_only); 653954ea748SAriel Elior 654954ea748SAriel Elior int bnx2x_vfop_vlan_set_cmd(struct bnx2x *bp, 655954ea748SAriel Elior struct bnx2x_virtf *vf, 656954ea748SAriel Elior struct bnx2x_vfop_cmd *cmd, 657954ea748SAriel Elior int qid, u16 vid, bool add); 658954ea748SAriel Elior 659954ea748SAriel Elior int bnx2x_vfop_vlan_list_cmd(struct bnx2x *bp, 660954ea748SAriel Elior struct bnx2x_virtf *vf, 661954ea748SAriel Elior struct bnx2x_vfop_cmd *cmd, 662954ea748SAriel Elior struct bnx2x_vfop_filters *vlans, 663954ea748SAriel Elior int qid, bool drv_only); 664954ea748SAriel Elior 6658db573baSAriel Elior int bnx2x_vfop_qsetup_cmd(struct bnx2x *bp, 6668db573baSAriel Elior struct bnx2x_virtf *vf, 6678db573baSAriel Elior struct bnx2x_vfop_cmd *cmd, 6688db573baSAriel Elior int qid); 6698db573baSAriel Elior 670463a68a7SAriel Elior int bnx2x_vfop_qdown_cmd(struct bnx2x *bp, 671463a68a7SAriel Elior struct bnx2x_virtf *vf, 672463a68a7SAriel Elior struct bnx2x_vfop_cmd *cmd, 673463a68a7SAriel Elior int qid); 674463a68a7SAriel Elior 675954ea748SAriel Elior int bnx2x_vfop_mcast_cmd(struct bnx2x *bp, 676954ea748SAriel Elior struct bnx2x_virtf *vf, 677954ea748SAriel Elior struct bnx2x_vfop_cmd *cmd, 678954ea748SAriel Elior bnx2x_mac_addr_t *mcasts, 679954ea748SAriel Elior int mcast_num, bool drv_only); 680954ea748SAriel Elior 681954ea748SAriel Elior int bnx2x_vfop_rxmode_cmd(struct bnx2x *bp, 682954ea748SAriel Elior struct bnx2x_virtf *vf, 683954ea748SAriel Elior struct bnx2x_vfop_cmd *cmd, 684954ea748SAriel Elior int qid, unsigned long accept_flags); 685954ea748SAriel Elior 68699e9d211SAriel Elior int bnx2x_vfop_close_cmd(struct bnx2x *bp, 68799e9d211SAriel Elior struct bnx2x_virtf *vf, 68899e9d211SAriel Elior struct bnx2x_vfop_cmd *cmd); 68999e9d211SAriel Elior 690f1929b01SAriel Elior int bnx2x_vfop_release_cmd(struct bnx2x *bp, 691f1929b01SAriel Elior struct bnx2x_virtf *vf, 692f1929b01SAriel Elior struct bnx2x_vfop_cmd *cmd); 693f1929b01SAriel Elior 694f1929b01SAriel Elior /* VF release ~ VF close + VF release-resources 695f1929b01SAriel Elior * 696f1929b01SAriel Elior * Release is the ultimate SW shutdown and is called whenever an 697f1929b01SAriel Elior * irrecoverable error is encountered. 698f1929b01SAriel Elior */ 699f1929b01SAriel Elior void bnx2x_vf_release(struct bnx2x *bp, struct bnx2x_virtf *vf, bool block); 700290ca2bbSAriel Elior int bnx2x_vf_idx_by_abs_fid(struct bnx2x *bp, u16 abs_vfid); 7018ca5e17eSAriel Elior u8 bnx2x_vf_max_queue_cnt(struct bnx2x *bp, struct bnx2x_virtf *vf); 702d16132ceSAriel Elior 703d16132ceSAriel Elior /* FLR routines */ 704d16132ceSAriel Elior 705b56e9670SAriel Elior /* VF FLR helpers */ 706b56e9670SAriel Elior int bnx2x_vf_flr_clnup_epilog(struct bnx2x *bp, u8 abs_vfid); 707b56e9670SAriel Elior void bnx2x_vf_enable_access(struct bnx2x *bp, u8 abs_vfid); 708d16132ceSAriel Elior 709d16132ceSAriel Elior /* Handles an FLR (or VF_DISABLE) notification form the MCP */ 710d16132ceSAriel Elior void bnx2x_vf_handle_flr_event(struct bnx2x *bp); 711d16132ceSAriel Elior 712be1f1ffaSAriel Elior void bnx2x_add_tlv(struct bnx2x *bp, void *tlvs_list, u16 offset, u16 type, 713be1f1ffaSAriel Elior u16 length); 714be1f1ffaSAriel Elior void bnx2x_vfpf_prep(struct bnx2x *bp, struct vfpf_first_tlv *first_tlv, 715be1f1ffaSAriel Elior u16 type, u16 length); 7161d6f3cd8SDmitry Kravkov void bnx2x_vfpf_finalize(struct bnx2x *bp, struct vfpf_first_tlv *first_tlv); 717be1f1ffaSAriel Elior void bnx2x_dp_tlv_list(struct bnx2x *bp, void *tlvs_list); 718fd1fc79dSAriel Elior 719fd1fc79dSAriel Elior bool bnx2x_tlv_supported(u16 tlvtype); 720fd1fc79dSAriel Elior 721abc5a021SAriel Elior u32 bnx2x_crc_vf_bulletin(struct bnx2x *bp, 722abc5a021SAriel Elior struct pf_vf_bulletin_content *bulletin); 723abc5a021SAriel Elior int bnx2x_post_vf_bulletin(struct bnx2x *bp, int vf); 724abc5a021SAriel Elior 725abc5a021SAriel Elior enum sample_bulletin_result bnx2x_sample_bulletin(struct bnx2x *bp); 726abc5a021SAriel Elior 7276411280aSAriel Elior /* VF side vfpf channel functions */ 7286411280aSAriel Elior int bnx2x_vfpf_acquire(struct bnx2x *bp, u8 tx_count, u8 rx_count); 7296411280aSAriel Elior int bnx2x_vfpf_release(struct bnx2x *bp); 7306411280aSAriel Elior int bnx2x_vfpf_release(struct bnx2x *bp); 7316411280aSAriel Elior int bnx2x_vfpf_init(struct bnx2x *bp); 7326411280aSAriel Elior void bnx2x_vfpf_close_vf(struct bnx2x *bp); 7336411280aSAriel Elior int bnx2x_vfpf_setup_q(struct bnx2x *bp, int fp_idx); 7346411280aSAriel Elior int bnx2x_vfpf_teardown_queue(struct bnx2x *bp, int qidx); 735f8f4f61aSDmitry Kravkov int bnx2x_vfpf_config_mac(struct bnx2x *bp, u8 *addr, u8 vf_qid, bool set); 7366411280aSAriel Elior int bnx2x_vfpf_set_mcast(struct net_device *dev); 7376411280aSAriel Elior int bnx2x_vfpf_storm_rx_mode(struct bnx2x *bp); 7386411280aSAriel Elior 7396411280aSAriel Elior static inline void bnx2x_vf_fill_fw_str(struct bnx2x *bp, char *buf, 7406411280aSAriel Elior size_t buf_len) 7416411280aSAriel Elior { 7426411280aSAriel Elior strlcpy(buf, bp->acquire_resp.pfdev_info.fw_ver, buf_len); 7436411280aSAriel Elior } 7446411280aSAriel Elior 7456411280aSAriel Elior static inline int bnx2x_vf_ustorm_prods_offset(struct bnx2x *bp, 7466411280aSAriel Elior struct bnx2x_fastpath *fp) 7476411280aSAriel Elior { 7486411280aSAriel Elior return PXP_VF_ADDR_USDM_QUEUES_START + 7496411280aSAriel Elior bp->acquire_resp.resc.hw_qid[fp->index] * 7506411280aSAriel Elior sizeof(struct ustorm_queue_zone_data); 7516411280aSAriel Elior } 7526411280aSAriel Elior 7536411280aSAriel Elior enum sample_bulletin_result bnx2x_sample_bulletin(struct bnx2x *bp); 7541d6f3cd8SDmitry Kravkov void __iomem *bnx2x_vf_doorbells(struct bnx2x *bp); 7556411280aSAriel Elior int bnx2x_vf_pci_alloc(struct bnx2x *bp); 7563c76feffSAriel Elior int bnx2x_enable_sriov(struct bnx2x *bp); 7573c76feffSAriel Elior void bnx2x_disable_sriov(struct bnx2x *bp); 7586411280aSAriel Elior static inline int bnx2x_vf_headroom(struct bnx2x *bp) 7596411280aSAriel Elior { 7606411280aSAriel Elior return bp->vfdb->sriov.nr_virtfn * BNX2X_CLIENTS_PER_VF; 7616411280aSAriel Elior } 7623ec9f9caSAriel Elior void bnx2x_pf_set_vfs_vlan(struct bnx2x *bp); 7633c76feffSAriel Elior int bnx2x_sriov_configure(struct pci_dev *dev, int num_vfs); 7643c76feffSAriel Elior int bnx2x_open_epilog(struct bnx2x *bp); 7656411280aSAriel Elior 7666411280aSAriel Elior #else /* CONFIG_BNX2X_SRIOV */ 7676411280aSAriel Elior 7686411280aSAriel Elior static inline void bnx2x_iov_set_queue_sp_obj(struct bnx2x *bp, int vf_cid, 7696411280aSAriel Elior struct bnx2x_queue_sp_obj **q_obj) {} 7706411280aSAriel Elior static inline void bnx2x_iov_sp_event(struct bnx2x *bp, int vf_cid, 7716411280aSAriel Elior bool queue_work) {} 7726411280aSAriel Elior static inline void bnx2x_vf_handle_flr_event(struct bnx2x *bp) {} 7736411280aSAriel Elior static inline int bnx2x_iov_eq_sp_event(struct bnx2x *bp, 7746411280aSAriel Elior union event_ring_elem *elem) {return 1; } 7756411280aSAriel Elior static inline void bnx2x_iov_sp_task(struct bnx2x *bp) {} 7766411280aSAriel Elior static inline void bnx2x_vf_mbx(struct bnx2x *bp, 7776411280aSAriel Elior struct vf_pf_event_data *vfpf_event) {} 7786411280aSAriel Elior static inline int bnx2x_iov_init_ilt(struct bnx2x *bp, u16 line) {return line; } 7796411280aSAriel Elior static inline void bnx2x_iov_init_dq(struct bnx2x *bp) {} 7806411280aSAriel Elior static inline int bnx2x_iov_alloc_mem(struct bnx2x *bp) {return 0; } 781580d9d08SYuval Mintz static inline void bnx2x_iov_free_mem(struct bnx2x *bp) {} 7826411280aSAriel Elior static inline int bnx2x_iov_chip_cleanup(struct bnx2x *bp) {return 0; } 7836411280aSAriel Elior static inline void bnx2x_iov_init_dmae(struct bnx2x *bp) {} 7846411280aSAriel Elior static inline int bnx2x_iov_init_one(struct bnx2x *bp, int int_mode_param, 7856411280aSAriel Elior int num_vfs_param) {return 0; } 7866411280aSAriel Elior static inline void bnx2x_iov_remove_one(struct bnx2x *bp) {} 7873c76feffSAriel Elior static inline int bnx2x_enable_sriov(struct bnx2x *bp) {return 0; } 7883c76feffSAriel Elior static inline void bnx2x_disable_sriov(struct bnx2x *bp) {} 7896411280aSAriel Elior static inline int bnx2x_vfpf_acquire(struct bnx2x *bp, 7906411280aSAriel Elior u8 tx_count, u8 rx_count) {return 0; } 7916411280aSAriel Elior static inline int bnx2x_vfpf_release(struct bnx2x *bp) {return 0; } 7926411280aSAriel Elior static inline int bnx2x_vfpf_init(struct bnx2x *bp) {return 0; } 7936411280aSAriel Elior static inline void bnx2x_vfpf_close_vf(struct bnx2x *bp) {} 7946411280aSAriel Elior static inline int bnx2x_vfpf_setup_q(struct bnx2x *bp, int fp_idx) {return 0; } 7956411280aSAriel Elior static inline int bnx2x_vfpf_teardown_queue(struct bnx2x *bp, int qidx) {return 0; } 796f8f4f61aSDmitry Kravkov static inline int bnx2x_vfpf_config_mac(struct bnx2x *bp, u8 *addr, 797f8f4f61aSDmitry Kravkov u8 vf_qid, bool set) {return 0; } 7986411280aSAriel Elior static inline int bnx2x_vfpf_set_mcast(struct net_device *dev) {return 0; } 7996411280aSAriel Elior static inline int bnx2x_vfpf_storm_rx_mode(struct bnx2x *bp) {return 0; } 8006411280aSAriel Elior static inline int bnx2x_iov_nic_init(struct bnx2x *bp) {return 0; } 8016411280aSAriel Elior static inline int bnx2x_vf_headroom(struct bnx2x *bp) {return 0; } 8026411280aSAriel Elior static inline void bnx2x_iov_adjust_stats_req(struct bnx2x *bp) {} 8036411280aSAriel Elior static inline void bnx2x_vf_fill_fw_str(struct bnx2x *bp, char *buf, 8046411280aSAriel Elior size_t buf_len) {} 8056411280aSAriel Elior static inline int bnx2x_vf_ustorm_prods_offset(struct bnx2x *bp, 8066411280aSAriel Elior struct bnx2x_fastpath *fp) {return 0; } 8076411280aSAriel Elior static inline enum sample_bulletin_result bnx2x_sample_bulletin(struct bnx2x *bp) 8086411280aSAriel Elior { 8096411280aSAriel Elior return PFVF_BULLETIN_UNCHANGED; 8106411280aSAriel Elior } 8116411280aSAriel Elior 8121d6f3cd8SDmitry Kravkov static inline void __iomem *bnx2x_vf_doorbells(struct bnx2x *bp) 8131d6f3cd8SDmitry Kravkov { 8141d6f3cd8SDmitry Kravkov return NULL; 8151d6f3cd8SDmitry Kravkov } 8161d6f3cd8SDmitry Kravkov 8176411280aSAriel Elior static inline int bnx2x_vf_pci_alloc(struct bnx2x *bp) {return 0; } 8183ec9f9caSAriel Elior static inline void bnx2x_pf_set_vfs_vlan(struct bnx2x *bp) {} 8193c76feffSAriel Elior static inline int bnx2x_sriov_configure(struct pci_dev *dev, int num_vfs) {return 0; } 8203c76feffSAriel Elior static inline int bnx2x_open_epilog(struct bnx2x *bp) {return 0; } 8216411280aSAriel Elior 8226411280aSAriel Elior #endif /* CONFIG_BNX2X_SRIOV */ 8231ab4434cSAriel Elior #endif /* bnx2x_sriov.h */ 824