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 */ 77*e8379c79SYuval Mintz unsigned long accept_flags; /* last accept flags configured */ 78290ca2bbSAriel Elior 79290ca2bbSAriel Elior /* Queue Slow-path State object */ 80290ca2bbSAriel Elior struct bnx2x_queue_sp_obj sp_obj; 81290ca2bbSAriel Elior 82290ca2bbSAriel Elior u32 cid; 83290ca2bbSAriel Elior u16 index; 84290ca2bbSAriel Elior u16 sb_idx; 85b9871bcfSAriel Elior bool is_leading; 86290ca2bbSAriel Elior }; 87290ca2bbSAriel Elior 88290ca2bbSAriel Elior /* struct bnx2x_vfop_qctor_params - prepare queue construction parameters: 89290ca2bbSAriel Elior * q-init, q-setup and SB index 90290ca2bbSAriel Elior */ 91290ca2bbSAriel Elior struct bnx2x_vfop_qctor_params { 92290ca2bbSAriel Elior struct bnx2x_queue_state_params qstate; 93290ca2bbSAriel Elior struct bnx2x_queue_setup_params prep_qsetup; 94290ca2bbSAriel Elior }; 95290ca2bbSAriel Elior 96290ca2bbSAriel Elior /* VFOP parameters (one copy per VF) */ 97290ca2bbSAriel Elior union bnx2x_vfop_params { 98290ca2bbSAriel Elior struct bnx2x_vlan_mac_ramrod_params vlan_mac; 99290ca2bbSAriel Elior struct bnx2x_rx_mode_ramrod_params rx_mode; 100290ca2bbSAriel Elior struct bnx2x_mcast_ramrod_params mcast; 101290ca2bbSAriel Elior struct bnx2x_config_rss_params rss; 102290ca2bbSAriel Elior struct bnx2x_vfop_qctor_params qctor; 103290ca2bbSAriel Elior }; 104290ca2bbSAriel Elior 105290ca2bbSAriel Elior /* forward */ 106290ca2bbSAriel Elior struct bnx2x_virtf; 107fd1fc79dSAriel Elior 108fd1fc79dSAriel Elior /* VFOP definitions */ 109fd1fc79dSAriel Elior typedef void (*vfop_handler_t)(struct bnx2x *bp, struct bnx2x_virtf *vf); 110fd1fc79dSAriel Elior 1118db573baSAriel Elior struct bnx2x_vfop_cmd { 1128db573baSAriel Elior vfop_handler_t done; 1138db573baSAriel Elior bool block; 1148db573baSAriel Elior }; 1158db573baSAriel Elior 116fd1fc79dSAriel Elior /* VFOP queue filters command additional arguments */ 117fd1fc79dSAriel Elior struct bnx2x_vfop_filter { 118fd1fc79dSAriel Elior struct list_head link; 119fd1fc79dSAriel Elior int type; 120fd1fc79dSAriel Elior #define BNX2X_VFOP_FILTER_MAC 1 121fd1fc79dSAriel Elior #define BNX2X_VFOP_FILTER_VLAN 2 122fd1fc79dSAriel Elior 123fd1fc79dSAriel Elior bool add; 124fd1fc79dSAriel Elior u8 *mac; 125fd1fc79dSAriel Elior u16 vid; 126fd1fc79dSAriel Elior }; 127fd1fc79dSAriel Elior 128fd1fc79dSAriel Elior struct bnx2x_vfop_filters { 129fd1fc79dSAriel Elior int add_cnt; 130fd1fc79dSAriel Elior struct list_head head; 131fd1fc79dSAriel Elior struct bnx2x_vfop_filter filters[]; 132fd1fc79dSAriel Elior }; 133fd1fc79dSAriel Elior 134fd1fc79dSAriel Elior /* transient list allocated, built and saved until its 135fd1fc79dSAriel Elior * passed to the SP-VERBs layer. 136fd1fc79dSAriel Elior */ 137fd1fc79dSAriel Elior struct bnx2x_vfop_args_mcast { 138fd1fc79dSAriel Elior int mc_num; 139fd1fc79dSAriel Elior struct bnx2x_mcast_list_elem *mc; 140fd1fc79dSAriel Elior }; 141fd1fc79dSAriel Elior 142fd1fc79dSAriel Elior struct bnx2x_vfop_args_qctor { 143fd1fc79dSAriel Elior int qid; 144fd1fc79dSAriel Elior u16 sb_idx; 145fd1fc79dSAriel Elior }; 146fd1fc79dSAriel Elior 147fd1fc79dSAriel Elior struct bnx2x_vfop_args_qdtor { 148fd1fc79dSAriel Elior int qid; 149fd1fc79dSAriel Elior struct eth_context *cxt; 150fd1fc79dSAriel Elior }; 151fd1fc79dSAriel Elior 152fd1fc79dSAriel Elior struct bnx2x_vfop_args_defvlan { 153fd1fc79dSAriel Elior int qid; 154fd1fc79dSAriel Elior bool enable; 155fd1fc79dSAriel Elior u16 vid; 156fd1fc79dSAriel Elior u8 prio; 157fd1fc79dSAriel Elior }; 158fd1fc79dSAriel Elior 159fd1fc79dSAriel Elior struct bnx2x_vfop_args_qx { 160fd1fc79dSAriel Elior int qid; 161fd1fc79dSAriel Elior bool en_add; 162fd1fc79dSAriel Elior }; 163fd1fc79dSAriel Elior 164fd1fc79dSAriel Elior struct bnx2x_vfop_args_filters { 165fd1fc79dSAriel Elior struct bnx2x_vfop_filters *multi_filter; 166fd1fc79dSAriel Elior atomic_t *credit; /* non NULL means 'don't consume credit' */ 167fd1fc79dSAriel Elior }; 168fd1fc79dSAriel Elior 169fd1fc79dSAriel Elior union bnx2x_vfop_args { 170fd1fc79dSAriel Elior struct bnx2x_vfop_args_mcast mc_list; 171fd1fc79dSAriel Elior struct bnx2x_vfop_args_qctor qctor; 172fd1fc79dSAriel Elior struct bnx2x_vfop_args_qdtor qdtor; 173fd1fc79dSAriel Elior struct bnx2x_vfop_args_defvlan defvlan; 174fd1fc79dSAriel Elior struct bnx2x_vfop_args_qx qx; 175fd1fc79dSAriel Elior struct bnx2x_vfop_args_filters filters; 176fd1fc79dSAriel Elior }; 177fd1fc79dSAriel Elior 178fd1fc79dSAriel Elior struct bnx2x_vfop { 179fd1fc79dSAriel Elior struct list_head link; 180fd1fc79dSAriel Elior int rc; /* return code */ 181fd1fc79dSAriel Elior int state; /* next state */ 182fd1fc79dSAriel Elior union bnx2x_vfop_args args; /* extra arguments */ 183fd1fc79dSAriel Elior union bnx2x_vfop_params *op_p; /* ramrod params */ 184fd1fc79dSAriel Elior 185fd1fc79dSAriel Elior /* state machine callbacks */ 186fd1fc79dSAriel Elior vfop_handler_t transition; 187fd1fc79dSAriel Elior vfop_handler_t done; 188fd1fc79dSAriel Elior }; 189fd1fc79dSAriel Elior 190290ca2bbSAriel Elior /* vf context */ 191290ca2bbSAriel Elior struct bnx2x_virtf { 192290ca2bbSAriel Elior u16 cfg_flags; 193290ca2bbSAriel Elior #define VF_CFG_STATS 0x0001 194290ca2bbSAriel Elior #define VF_CFG_FW_FC 0x0002 195290ca2bbSAriel Elior #define VF_CFG_TPA 0x0004 196290ca2bbSAriel Elior #define VF_CFG_INT_SIMD 0x0008 197290ca2bbSAriel Elior #define VF_CACHE_LINE 0x0010 1983ec9f9caSAriel Elior #define VF_CFG_VLAN 0x0020 199b9871bcfSAriel Elior #define VF_CFG_STATS_COALESCE 0x0040 200290ca2bbSAriel Elior 201290ca2bbSAriel Elior u8 state; 202290ca2bbSAriel Elior #define VF_FREE 0 /* VF ready to be acquired holds no resc */ 20316a5fd92SYuval Mintz #define VF_ACQUIRED 1 /* VF acquired, but not initialized */ 204290ca2bbSAriel Elior #define VF_ENABLED 2 /* VF Enabled */ 205290ca2bbSAriel Elior #define VF_RESET 3 /* VF FLR'd, pending cleanup */ 206290ca2bbSAriel Elior 207290ca2bbSAriel Elior /* non 0 during flr cleanup */ 208290ca2bbSAriel Elior u8 flr_clnup_stage; 209290ca2bbSAriel Elior #define VF_FLR_CLN 1 /* reclaim resources and do 'final cleanup' 210290ca2bbSAriel Elior * sans the end-wait 211290ca2bbSAriel Elior */ 212290ca2bbSAriel Elior #define VF_FLR_ACK 2 /* ACK flr notification */ 213290ca2bbSAriel Elior #define VF_FLR_EPILOG 3 /* wait for VF remnants to dissipate in the HW 214290ca2bbSAriel Elior * ~ final cleanup' end wait 215290ca2bbSAriel Elior */ 216290ca2bbSAriel Elior 217290ca2bbSAriel Elior /* dma */ 218290ca2bbSAriel Elior dma_addr_t fw_stat_map; /* valid iff VF_CFG_STATS */ 219b9871bcfSAriel Elior u16 stats_stride; 220290ca2bbSAriel Elior dma_addr_t spq_map; 221290ca2bbSAriel Elior dma_addr_t bulletin_map; 222290ca2bbSAriel Elior 223290ca2bbSAriel Elior /* Allocated resources counters. Before the VF is acquired, the 224290ca2bbSAriel Elior * counters hold the following values: 225290ca2bbSAriel Elior * 226290ca2bbSAriel Elior * - xxq_count = 0 as the queues memory is not allocated yet. 227290ca2bbSAriel Elior * 228290ca2bbSAriel Elior * - sb_count = The number of status blocks configured for this VF in 229290ca2bbSAriel Elior * the IGU CAM. Initially read during probe. 230290ca2bbSAriel Elior * 231290ca2bbSAriel Elior * - xx_rules_count = The number of rules statically and equally 232290ca2bbSAriel Elior * allocated for each VF, during PF load. 233290ca2bbSAriel Elior */ 234290ca2bbSAriel Elior struct vf_pf_resc_request alloc_resc; 235290ca2bbSAriel Elior #define vf_rxq_count(vf) ((vf)->alloc_resc.num_rxqs) 236290ca2bbSAriel Elior #define vf_txq_count(vf) ((vf)->alloc_resc.num_txqs) 237290ca2bbSAriel Elior #define vf_sb_count(vf) ((vf)->alloc_resc.num_sbs) 238290ca2bbSAriel Elior #define vf_mac_rules_cnt(vf) ((vf)->alloc_resc.num_mac_filters) 239290ca2bbSAriel Elior #define vf_vlan_rules_cnt(vf) ((vf)->alloc_resc.num_vlan_filters) 240290ca2bbSAriel Elior #define vf_mc_rules_cnt(vf) ((vf)->alloc_resc.num_mc_filters) 241290ca2bbSAriel Elior 242290ca2bbSAriel Elior u8 sb_count; /* actual number of SBs */ 243290ca2bbSAriel Elior u8 igu_base_id; /* base igu status block id */ 244290ca2bbSAriel Elior 245290ca2bbSAriel Elior struct bnx2x_vf_queue *vfqs; 246b9871bcfSAriel Elior #define LEADING_IDX 0 247b9871bcfSAriel Elior #define bnx2x_vfq_is_leading(vfq) ((vfq)->index == LEADING_IDX) 248290ca2bbSAriel Elior #define bnx2x_vfq(vf, nr, var) ((vf)->vfqs[(nr)].var) 249b9871bcfSAriel Elior #define bnx2x_leading_vfq(vf, var) ((vf)->vfqs[LEADING_IDX].var) 250290ca2bbSAriel Elior 251290ca2bbSAriel Elior u8 index; /* index in the vf array */ 252290ca2bbSAriel Elior u8 abs_vfid; 253290ca2bbSAriel Elior u8 sp_cl_id; 254290ca2bbSAriel Elior u32 error; /* 0 means all's-well */ 255290ca2bbSAriel Elior 256290ca2bbSAriel Elior /* BDF */ 257290ca2bbSAriel Elior unsigned int bus; 258290ca2bbSAriel Elior unsigned int devfn; 259290ca2bbSAriel Elior 260290ca2bbSAriel Elior /* bars */ 261290ca2bbSAriel Elior struct bnx2x_vf_bar bars[PCI_SRIOV_NUM_BARS]; 262290ca2bbSAriel Elior 263290ca2bbSAriel Elior /* set-mac ramrod state 1-pending, 0-done */ 264290ca2bbSAriel Elior unsigned long filter_state; 265290ca2bbSAriel Elior 266290ca2bbSAriel Elior /* leading rss client id ~~ the client id of the first rxq, must be 267290ca2bbSAriel Elior * set for each txq. 268290ca2bbSAriel Elior */ 269290ca2bbSAriel Elior int leading_rss; 270290ca2bbSAriel Elior 271290ca2bbSAriel Elior /* MCAST object */ 272290ca2bbSAriel Elior struct bnx2x_mcast_obj mcast_obj; 273290ca2bbSAriel Elior 274290ca2bbSAriel Elior /* RSS configuration object */ 275290ca2bbSAriel Elior struct bnx2x_rss_config_obj rss_conf_obj; 276290ca2bbSAriel Elior 277290ca2bbSAriel Elior /* slow-path operations */ 278290ca2bbSAriel Elior atomic_t op_in_progress; 279290ca2bbSAriel Elior int op_rc; 280290ca2bbSAriel Elior bool op_wait_blocking; 281290ca2bbSAriel Elior struct list_head op_list_head; 282290ca2bbSAriel Elior union bnx2x_vfop_params op_params; 283290ca2bbSAriel Elior struct mutex op_mutex; /* one vfop at a time mutex */ 284290ca2bbSAriel Elior enum channel_tlvs op_current; 285290ca2bbSAriel Elior }; 286290ca2bbSAriel Elior 287290ca2bbSAriel Elior #define BNX2X_NR_VIRTFN(bp) ((bp)->vfdb->sriov.nr_virtfn) 288290ca2bbSAriel Elior 289290ca2bbSAriel Elior #define for_each_vf(bp, var) \ 290290ca2bbSAriel Elior for ((var) = 0; (var) < BNX2X_NR_VIRTFN(bp); (var)++) 291290ca2bbSAriel Elior 2928ca5e17eSAriel Elior #define for_each_vfq(vf, var) \ 2938ca5e17eSAriel Elior for ((var) = 0; (var) < vf_rxq_count(vf); (var)++) 2948ca5e17eSAriel Elior 2958ca5e17eSAriel Elior #define for_each_vf_sb(vf, var) \ 2968ca5e17eSAriel Elior for ((var) = 0; (var) < vf_sb_count(vf); (var)++) 2978ca5e17eSAriel Elior 298b93288d5SAriel Elior #define is_vf_multi(vf) (vf_rxq_count(vf) > 1) 299b93288d5SAriel Elior 300b56e9670SAriel Elior #define HW_VF_HANDLE(bp, abs_vfid) \ 301b56e9670SAriel Elior (u16)(BP_ABS_FUNC((bp)) | (1<<3) | ((u16)(abs_vfid) << 4)) 302b56e9670SAriel Elior 303b56e9670SAriel Elior #define FW_PF_MAX_HANDLE 8 304b56e9670SAriel Elior 305b56e9670SAriel Elior #define FW_VF_HANDLE(abs_vfid) \ 306b56e9670SAriel Elior (abs_vfid + FW_PF_MAX_HANDLE) 307b56e9670SAriel Elior 3088ca5e17eSAriel Elior /* locking and unlocking the channel mutex */ 3098ca5e17eSAriel Elior void bnx2x_lock_vf_pf_channel(struct bnx2x *bp, struct bnx2x_virtf *vf, 3108ca5e17eSAriel Elior enum channel_tlvs tlv); 3118ca5e17eSAriel Elior 3128ca5e17eSAriel Elior void bnx2x_unlock_vf_pf_channel(struct bnx2x *bp, struct bnx2x_virtf *vf, 3138ca5e17eSAriel Elior enum channel_tlvs expected_tlv); 3148ca5e17eSAriel Elior 315b56e9670SAriel Elior /* VF mail box (aka vf-pf channel) */ 316b56e9670SAriel Elior 317b56e9670SAriel Elior /* a container for the bi-directional vf<-->pf messages. 318b56e9670SAriel Elior * The actual response will be placed according to the offset parameter 319b56e9670SAriel Elior * provided in the request 320b56e9670SAriel Elior */ 321b56e9670SAriel Elior 322b56e9670SAriel Elior #define MBX_MSG_ALIGN 8 323b56e9670SAriel Elior #define MBX_MSG_ALIGNED_SIZE (roundup(sizeof(struct bnx2x_vf_mbx_msg), \ 324b56e9670SAriel Elior MBX_MSG_ALIGN)) 325b56e9670SAriel Elior 3261ab4434cSAriel Elior struct bnx2x_vf_mbx_msg { 3271ab4434cSAriel Elior union vfpf_tlvs req; 3281ab4434cSAriel Elior union pfvf_tlvs resp; 3291ab4434cSAriel Elior }; 3301ab4434cSAriel Elior 331290ca2bbSAriel Elior struct bnx2x_vf_mbx { 332290ca2bbSAriel Elior struct bnx2x_vf_mbx_msg *msg; 333290ca2bbSAriel Elior dma_addr_t msg_mapping; 334290ca2bbSAriel Elior 335290ca2bbSAriel Elior /* VF GPA address */ 336290ca2bbSAriel Elior u32 vf_addr_lo; 337290ca2bbSAriel Elior u32 vf_addr_hi; 338290ca2bbSAriel Elior 339290ca2bbSAriel Elior struct vfpf_first_tlv first_tlv; /* saved VF request header */ 340290ca2bbSAriel Elior 341290ca2bbSAriel Elior u8 flags; 342290ca2bbSAriel Elior #define VF_MSG_INPROCESS 0x1 /* failsafe - the FW should prevent 343290ca2bbSAriel Elior * more then one pending msg 344290ca2bbSAriel Elior */ 345290ca2bbSAriel Elior }; 346290ca2bbSAriel Elior 347b56e9670SAriel Elior struct bnx2x_vf_sp { 348b56e9670SAriel Elior union { 349b56e9670SAriel Elior struct eth_classify_rules_ramrod_data e2; 350b56e9670SAriel Elior } mac_rdata; 351b56e9670SAriel Elior 352b56e9670SAriel Elior union { 353b56e9670SAriel Elior struct eth_classify_rules_ramrod_data e2; 354b56e9670SAriel Elior } vlan_rdata; 355b56e9670SAriel Elior 356b56e9670SAriel Elior union { 357b56e9670SAriel Elior struct eth_filter_rules_ramrod_data e2; 358b56e9670SAriel Elior } rx_mode_rdata; 359b56e9670SAriel Elior 360b56e9670SAriel Elior union { 361b56e9670SAriel Elior struct eth_multicast_rules_ramrod_data e2; 362b56e9670SAriel Elior } mcast_rdata; 363b56e9670SAriel Elior 364b56e9670SAriel Elior union { 365b56e9670SAriel Elior struct client_init_ramrod_data init_data; 366b56e9670SAriel Elior struct client_update_ramrod_data update_data; 367b56e9670SAriel Elior } q_data; 368b9871bcfSAriel Elior 369b9871bcfSAriel Elior union { 370b9871bcfSAriel Elior struct eth_rss_update_ramrod_data e2; 371b9871bcfSAriel Elior } rss_rdata; 372b56e9670SAriel Elior }; 373b56e9670SAriel Elior 374290ca2bbSAriel Elior struct hw_dma { 375290ca2bbSAriel Elior void *addr; 376290ca2bbSAriel Elior dma_addr_t mapping; 377290ca2bbSAriel Elior size_t size; 378290ca2bbSAriel Elior }; 379290ca2bbSAriel Elior 380290ca2bbSAriel Elior struct bnx2x_vfdb { 381290ca2bbSAriel Elior #define BP_VFDB(bp) ((bp)->vfdb) 382290ca2bbSAriel Elior /* vf array */ 383290ca2bbSAriel Elior struct bnx2x_virtf *vfs; 384290ca2bbSAriel Elior #define BP_VF(bp, idx) (&((bp)->vfdb->vfs[(idx)])) 385290ca2bbSAriel Elior #define bnx2x_vf(bp, idx, var) ((bp)->vfdb->vfs[(idx)].var) 386290ca2bbSAriel Elior 387290ca2bbSAriel Elior /* queue array - for all vfs */ 388290ca2bbSAriel Elior struct bnx2x_vf_queue *vfqs; 389290ca2bbSAriel Elior 390290ca2bbSAriel Elior /* vf HW contexts */ 391290ca2bbSAriel Elior struct hw_dma context[BNX2X_VF_CIDS/ILT_PAGE_CIDS]; 392290ca2bbSAriel Elior #define BP_VF_CXT_PAGE(bp, i) (&(bp)->vfdb->context[(i)]) 393290ca2bbSAriel Elior 394290ca2bbSAriel Elior /* SR-IOV information */ 395290ca2bbSAriel Elior struct bnx2x_sriov sriov; 396290ca2bbSAriel Elior struct hw_dma mbx_dma; 397290ca2bbSAriel Elior #define BP_VF_MBX_DMA(bp) (&((bp)->vfdb->mbx_dma)) 398290ca2bbSAriel Elior struct bnx2x_vf_mbx mbxs[BNX2X_MAX_NUM_OF_VFS]; 399290ca2bbSAriel Elior #define BP_VF_MBX(bp, vfid) (&((bp)->vfdb->mbxs[(vfid)])) 400290ca2bbSAriel Elior 401abc5a021SAriel Elior struct hw_dma bulletin_dma; 402abc5a021SAriel Elior #define BP_VF_BULLETIN_DMA(bp) (&((bp)->vfdb->bulletin_dma)) 403abc5a021SAriel Elior #define BP_VF_BULLETIN(bp, vf) \ 404abc5a021SAriel Elior (((struct pf_vf_bulletin_content *)(BP_VF_BULLETIN_DMA(bp)->addr)) \ 405abc5a021SAriel Elior + (vf)) 406abc5a021SAriel Elior 407290ca2bbSAriel Elior struct hw_dma sp_dma; 408290ca2bbSAriel Elior #define bnx2x_vf_sp(bp, vf, field) ((bp)->vfdb->sp_dma.addr + \ 409290ca2bbSAriel Elior (vf)->index * sizeof(struct bnx2x_vf_sp) + \ 410290ca2bbSAriel Elior offsetof(struct bnx2x_vf_sp, field)) 411290ca2bbSAriel Elior #define bnx2x_vf_sp_map(bp, vf, field) ((bp)->vfdb->sp_dma.mapping + \ 412290ca2bbSAriel Elior (vf)->index * sizeof(struct bnx2x_vf_sp) + \ 413290ca2bbSAriel Elior offsetof(struct bnx2x_vf_sp, field)) 414290ca2bbSAriel Elior 415290ca2bbSAriel Elior #define FLRD_VFS_DWORDS (BNX2X_MAX_NUM_OF_VFS / 32) 416290ca2bbSAriel Elior u32 flrd_vfs[FLRD_VFS_DWORDS]; 417b9871bcfSAriel Elior 418b9871bcfSAriel Elior /* the number of msix vectors belonging to this PF designated for VFs */ 419b9871bcfSAriel Elior u16 vf_sbs_pool; 420b9871bcfSAriel Elior u16 first_vf_igu_entry; 421290ca2bbSAriel Elior }; 422290ca2bbSAriel Elior 423fd1fc79dSAriel Elior /* queue access */ 424fd1fc79dSAriel Elior static inline struct bnx2x_vf_queue *vfq_get(struct bnx2x_virtf *vf, u8 index) 425fd1fc79dSAriel Elior { 426fd1fc79dSAriel Elior return &(vf->vfqs[index]); 427fd1fc79dSAriel Elior } 428fd1fc79dSAriel Elior 4298ca5e17eSAriel Elior /* FW ids */ 430b56e9670SAriel Elior static inline u8 vf_igu_sb(struct bnx2x_virtf *vf, u16 sb_idx) 431b56e9670SAriel Elior { 432b56e9670SAriel Elior return vf->igu_base_id + sb_idx; 433b56e9670SAriel Elior } 434b56e9670SAriel Elior 4358ca5e17eSAriel Elior static inline u8 vf_hc_qzone(struct bnx2x_virtf *vf, u16 sb_idx) 4368ca5e17eSAriel Elior { 4378ca5e17eSAriel Elior return vf_igu_sb(vf, sb_idx); 4388ca5e17eSAriel Elior } 4398ca5e17eSAriel Elior 4408ca5e17eSAriel Elior static u8 vfq_cl_id(struct bnx2x_virtf *vf, struct bnx2x_vf_queue *q) 4418ca5e17eSAriel Elior { 4428ca5e17eSAriel Elior return vf->igu_base_id + q->index; 4438ca5e17eSAriel Elior } 4448ca5e17eSAriel Elior 4458db573baSAriel Elior static inline u8 vfq_stat_id(struct bnx2x_virtf *vf, struct bnx2x_vf_queue *q) 4468db573baSAriel Elior { 447b9871bcfSAriel Elior if (vf->cfg_flags & VF_CFG_STATS_COALESCE) 448b9871bcfSAriel Elior return vf->leading_rss; 449b9871bcfSAriel Elior else 4508db573baSAriel Elior return vfq_cl_id(vf, q); 4518db573baSAriel Elior } 4528db573baSAriel Elior 4538ca5e17eSAriel Elior static inline u8 vfq_qzone_id(struct bnx2x_virtf *vf, struct bnx2x_vf_queue *q) 4548ca5e17eSAriel Elior { 4558ca5e17eSAriel Elior return vfq_cl_id(vf, q); 4568ca5e17eSAriel Elior } 4578ca5e17eSAriel Elior 458290ca2bbSAriel Elior /* global iov routines */ 459290ca2bbSAriel Elior int bnx2x_iov_init_ilt(struct bnx2x *bp, u16 line); 460290ca2bbSAriel Elior int bnx2x_iov_init_one(struct bnx2x *bp, int int_mode_param, int num_vfs_param); 461290ca2bbSAriel Elior void bnx2x_iov_remove_one(struct bnx2x *bp); 462b56e9670SAriel Elior void bnx2x_iov_free_mem(struct bnx2x *bp); 463b56e9670SAriel Elior int bnx2x_iov_alloc_mem(struct bnx2x *bp); 464b56e9670SAriel Elior int bnx2x_iov_nic_init(struct bnx2x *bp); 465f1929b01SAriel Elior int bnx2x_iov_chip_cleanup(struct bnx2x *bp); 466b56e9670SAriel Elior void bnx2x_iov_init_dq(struct bnx2x *bp); 467b56e9670SAriel Elior void bnx2x_iov_init_dmae(struct bnx2x *bp); 468fd1fc79dSAriel Elior void bnx2x_iov_set_queue_sp_obj(struct bnx2x *bp, int vf_cid, 469fd1fc79dSAriel Elior struct bnx2x_queue_sp_obj **q_obj); 470fd1fc79dSAriel Elior void bnx2x_iov_sp_event(struct bnx2x *bp, int vf_cid, bool queue_work); 471fd1fc79dSAriel Elior int bnx2x_iov_eq_sp_event(struct bnx2x *bp, union event_ring_elem *elem); 47267c431a5SAriel Elior void bnx2x_iov_adjust_stats_req(struct bnx2x *bp); 47367c431a5SAriel Elior void bnx2x_iov_storm_stats_update(struct bnx2x *bp); 474fd1fc79dSAriel Elior void bnx2x_iov_sp_task(struct bnx2x *bp); 475fd1fc79dSAriel Elior /* global vf mailbox routines */ 476fd1fc79dSAriel Elior void bnx2x_vf_mbx(struct bnx2x *bp, struct vf_pf_event_data *vfpf_event); 477b56e9670SAriel Elior void bnx2x_vf_enable_mbx(struct bnx2x *bp, u8 abs_vfid); 478954ea748SAriel Elior 479954ea748SAriel Elior /* CORE VF API */ 480954ea748SAriel Elior typedef u8 bnx2x_mac_addr_t[ETH_ALEN]; 481954ea748SAriel Elior 4828ca5e17eSAriel Elior /* acquire */ 4838ca5e17eSAriel Elior int bnx2x_vf_acquire(struct bnx2x *bp, struct bnx2x_virtf *vf, 4848ca5e17eSAriel Elior struct vf_pf_resc_request *resc); 485b93288d5SAriel Elior /* init */ 486b93288d5SAriel Elior int bnx2x_vf_init(struct bnx2x *bp, struct bnx2x_virtf *vf, 487b93288d5SAriel Elior dma_addr_t *sb_map); 4888db573baSAriel Elior 4898db573baSAriel Elior /* VFOP generic helpers */ 4908db573baSAriel Elior #define bnx2x_vfop_default(state) do { \ 4918db573baSAriel Elior BNX2X_ERR("Bad state %d\n", (state)); \ 4928db573baSAriel Elior vfop->rc = -EINVAL; \ 4938db573baSAriel Elior goto op_err; \ 4948db573baSAriel Elior } while (0) 4958db573baSAriel Elior 4968db573baSAriel Elior enum { 4978db573baSAriel Elior VFOP_DONE, 4988db573baSAriel Elior VFOP_CONT, 4998db573baSAriel Elior VFOP_VERIFY_PEND, 5008db573baSAriel Elior }; 5018db573baSAriel Elior 5028db573baSAriel Elior #define bnx2x_vfop_finalize(vf, rc, next) do { \ 5038db573baSAriel Elior if ((rc) < 0) \ 5048db573baSAriel Elior goto op_err; \ 5058db573baSAriel Elior else if ((rc) > 0) \ 5068db573baSAriel Elior goto op_pending; \ 5078db573baSAriel Elior else if ((next) == VFOP_DONE) \ 5088db573baSAriel Elior goto op_done; \ 5098db573baSAriel Elior else if ((next) == VFOP_VERIFY_PEND) \ 5108db573baSAriel Elior BNX2X_ERR("expected pending\n"); \ 5118db573baSAriel Elior else { \ 5126bf07b8eSYuval Mintz DP(BNX2X_MSG_IOV, "no ramrod. Scheduling\n"); \ 5138db573baSAriel Elior atomic_set(&vf->op_in_progress, 1); \ 5148db573baSAriel Elior queue_delayed_work(bnx2x_wq, &bp->sp_task, 0); \ 5158db573baSAriel Elior return; \ 5168db573baSAriel Elior } \ 5178db573baSAriel Elior } while (0) 5188db573baSAriel Elior 5198db573baSAriel Elior #define bnx2x_vfop_opset(first_state, trans_hndlr, done_hndlr) \ 5208db573baSAriel Elior do { \ 5218db573baSAriel Elior vfop->state = first_state; \ 5228db573baSAriel Elior vfop->op_p = &vf->op_params; \ 5238db573baSAriel Elior vfop->transition = trans_hndlr; \ 5248db573baSAriel Elior vfop->done = done_hndlr; \ 5258db573baSAriel Elior } while (0) 5268db573baSAriel Elior 527fd1fc79dSAriel Elior static inline struct bnx2x_vfop *bnx2x_vfop_cur(struct bnx2x *bp, 528fd1fc79dSAriel Elior struct bnx2x_virtf *vf) 529fd1fc79dSAriel Elior { 530fd1fc79dSAriel Elior WARN(!mutex_is_locked(&vf->op_mutex), "about to access vf op linked list but mutex was not locked!"); 531fd1fc79dSAriel Elior WARN_ON(list_empty(&vf->op_list_head)); 532fd1fc79dSAriel Elior return list_first_entry(&vf->op_list_head, struct bnx2x_vfop, link); 533fd1fc79dSAriel Elior } 534fd1fc79dSAriel Elior 5358db573baSAriel Elior static inline struct bnx2x_vfop *bnx2x_vfop_add(struct bnx2x *bp, 5368db573baSAriel Elior struct bnx2x_virtf *vf) 5378db573baSAriel Elior { 5388db573baSAriel Elior struct bnx2x_vfop *vfop = kzalloc(sizeof(*vfop), GFP_KERNEL); 5398db573baSAriel Elior 5408db573baSAriel Elior WARN(!mutex_is_locked(&vf->op_mutex), "about to access vf op linked list but mutex was not locked!"); 5418db573baSAriel Elior if (vfop) { 5428db573baSAriel Elior INIT_LIST_HEAD(&vfop->link); 5438db573baSAriel Elior list_add(&vfop->link, &vf->op_list_head); 5448db573baSAriel Elior } 5458db573baSAriel Elior return vfop; 5468db573baSAriel Elior } 5478db573baSAriel Elior 5488db573baSAriel Elior static inline void bnx2x_vfop_end(struct bnx2x *bp, struct bnx2x_virtf *vf, 5498db573baSAriel Elior struct bnx2x_vfop *vfop) 5508db573baSAriel Elior { 5518db573baSAriel Elior /* rc < 0 - error, otherwise set to 0 */ 5528db573baSAriel Elior DP(BNX2X_MSG_IOV, "rc was %d\n", vfop->rc); 5538db573baSAriel Elior if (vfop->rc >= 0) 5548db573baSAriel Elior vfop->rc = 0; 5558db573baSAriel Elior DP(BNX2X_MSG_IOV, "rc is now %d\n", vfop->rc); 5568db573baSAriel Elior 5578db573baSAriel Elior /* unlink the current op context and propagate error code 5588db573baSAriel Elior * must be done before invoking the 'done()' handler 5598db573baSAriel Elior */ 5608db573baSAriel Elior WARN(!mutex_is_locked(&vf->op_mutex), 5618db573baSAriel Elior "about to access vf op linked list but mutex was not locked!"); 5628db573baSAriel Elior list_del(&vfop->link); 5638db573baSAriel Elior 5648db573baSAriel Elior if (list_empty(&vf->op_list_head)) { 5658db573baSAriel Elior DP(BNX2X_MSG_IOV, "list was empty %d\n", vfop->rc); 5668db573baSAriel Elior vf->op_rc = vfop->rc; 5678db573baSAriel Elior DP(BNX2X_MSG_IOV, "copying rc vf->op_rc %d, vfop->rc %d\n", 5688db573baSAriel Elior vf->op_rc, vfop->rc); 5698db573baSAriel Elior } else { 5708db573baSAriel Elior struct bnx2x_vfop *cur_vfop; 5718db573baSAriel Elior 5728db573baSAriel Elior DP(BNX2X_MSG_IOV, "list not empty %d\n", vfop->rc); 5738db573baSAriel Elior cur_vfop = bnx2x_vfop_cur(bp, vf); 5748db573baSAriel Elior cur_vfop->rc = vfop->rc; 5758db573baSAriel Elior DP(BNX2X_MSG_IOV, "copying rc vf->op_rc %d, vfop->rc %d\n", 5768db573baSAriel Elior vf->op_rc, vfop->rc); 5778db573baSAriel Elior } 5788db573baSAriel Elior 5798db573baSAriel Elior /* invoke done handler */ 5808db573baSAriel Elior if (vfop->done) { 5818db573baSAriel Elior DP(BNX2X_MSG_IOV, "calling done handler\n"); 5828db573baSAriel Elior vfop->done(bp, vf); 583f1929b01SAriel Elior } else { 584f1929b01SAriel Elior /* there is no done handler for the operation to unlock 585f1929b01SAriel Elior * the mutex. Must have gotten here from PF initiated VF RELEASE 586f1929b01SAriel Elior */ 587f1929b01SAriel Elior bnx2x_unlock_vf_pf_channel(bp, vf, CHANNEL_TLV_PF_RELEASE_VF); 5888db573baSAriel Elior } 5898db573baSAriel Elior 5908db573baSAriel Elior DP(BNX2X_MSG_IOV, "done handler complete. vf->op_rc %d, vfop->rc %d\n", 5918db573baSAriel Elior vf->op_rc, vfop->rc); 5928db573baSAriel Elior 5938db573baSAriel Elior /* if this is the last nested op reset the wait_blocking flag 5948db573baSAriel Elior * to release any blocking wrappers, only after 'done()' is invoked 5958db573baSAriel Elior */ 5968db573baSAriel Elior if (list_empty(&vf->op_list_head)) { 5978db573baSAriel Elior DP(BNX2X_MSG_IOV, "list was empty after done %d\n", vfop->rc); 5988db573baSAriel Elior vf->op_wait_blocking = false; 5998db573baSAriel Elior } 6008db573baSAriel Elior 6018db573baSAriel Elior kfree(vfop); 6028db573baSAriel Elior } 6038db573baSAriel Elior 6048db573baSAriel Elior static inline int bnx2x_vfop_wait_blocking(struct bnx2x *bp, 6058db573baSAriel Elior struct bnx2x_virtf *vf) 6068db573baSAriel Elior { 6078db573baSAriel Elior /* can take a while if any port is running */ 6088db573baSAriel Elior int cnt = 5000; 6098db573baSAriel Elior 6108db573baSAriel Elior might_sleep(); 6118db573baSAriel Elior while (cnt--) { 6128db573baSAriel Elior if (vf->op_wait_blocking == false) { 6138db573baSAriel Elior #ifdef BNX2X_STOP_ON_ERROR 6148db573baSAriel Elior DP(BNX2X_MSG_IOV, "exit (cnt %d)\n", 5000 - cnt); 6158db573baSAriel Elior #endif 6168db573baSAriel Elior return 0; 6178db573baSAriel Elior } 6188db573baSAriel Elior usleep_range(1000, 2000); 6198db573baSAriel Elior 6208db573baSAriel Elior if (bp->panic) 6218db573baSAriel Elior return -EIO; 6228db573baSAriel Elior } 6238db573baSAriel Elior 6248db573baSAriel Elior /* timeout! */ 6258db573baSAriel Elior #ifdef BNX2X_STOP_ON_ERROR 6268db573baSAriel Elior bnx2x_panic(); 6278db573baSAriel Elior #endif 6288db573baSAriel Elior 6298db573baSAriel Elior return -EBUSY; 6308db573baSAriel Elior } 6318db573baSAriel Elior 6328db573baSAriel Elior static inline int bnx2x_vfop_transition(struct bnx2x *bp, 6338db573baSAriel Elior struct bnx2x_virtf *vf, 6348db573baSAriel Elior vfop_handler_t transition, 6358db573baSAriel Elior bool block) 6368db573baSAriel Elior { 6378db573baSAriel Elior if (block) 6388db573baSAriel Elior vf->op_wait_blocking = true; 6398db573baSAriel Elior transition(bp, vf); 6408db573baSAriel Elior if (block) 6418db573baSAriel Elior return bnx2x_vfop_wait_blocking(bp, vf); 6428db573baSAriel Elior return 0; 6438db573baSAriel Elior } 6448db573baSAriel Elior 6458db573baSAriel Elior /* VFOP queue construction helpers */ 6468db573baSAriel Elior void bnx2x_vfop_qctor_dump_tx(struct bnx2x *bp, struct bnx2x_virtf *vf, 6478db573baSAriel Elior struct bnx2x_queue_init_params *init_params, 6488db573baSAriel Elior struct bnx2x_queue_setup_params *setup_params, 6498db573baSAriel Elior u16 q_idx, u16 sb_idx); 6508db573baSAriel Elior 6518db573baSAriel Elior void bnx2x_vfop_qctor_dump_rx(struct bnx2x *bp, struct bnx2x_virtf *vf, 6528db573baSAriel Elior struct bnx2x_queue_init_params *init_params, 6538db573baSAriel Elior struct bnx2x_queue_setup_params *setup_params, 6548db573baSAriel Elior u16 q_idx, u16 sb_idx); 6558db573baSAriel Elior 6568db573baSAriel Elior void bnx2x_vfop_qctor_prep(struct bnx2x *bp, 6578db573baSAriel Elior struct bnx2x_virtf *vf, 6588db573baSAriel Elior struct bnx2x_vf_queue *q, 6598db573baSAriel Elior struct bnx2x_vfop_qctor_params *p, 6608db573baSAriel Elior unsigned long q_type); 661954ea748SAriel Elior int bnx2x_vfop_mac_list_cmd(struct bnx2x *bp, 662954ea748SAriel Elior struct bnx2x_virtf *vf, 663954ea748SAriel Elior struct bnx2x_vfop_cmd *cmd, 664954ea748SAriel Elior struct bnx2x_vfop_filters *macs, 665954ea748SAriel Elior int qid, bool drv_only); 666954ea748SAriel Elior 667954ea748SAriel Elior int bnx2x_vfop_vlan_set_cmd(struct bnx2x *bp, 668954ea748SAriel Elior struct bnx2x_virtf *vf, 669954ea748SAriel Elior struct bnx2x_vfop_cmd *cmd, 670954ea748SAriel Elior int qid, u16 vid, bool add); 671954ea748SAriel Elior 672954ea748SAriel Elior int bnx2x_vfop_vlan_list_cmd(struct bnx2x *bp, 673954ea748SAriel Elior struct bnx2x_virtf *vf, 674954ea748SAriel Elior struct bnx2x_vfop_cmd *cmd, 675954ea748SAriel Elior struct bnx2x_vfop_filters *vlans, 676954ea748SAriel Elior int qid, bool drv_only); 677954ea748SAriel Elior 6788db573baSAriel Elior int bnx2x_vfop_qsetup_cmd(struct bnx2x *bp, 6798db573baSAriel Elior struct bnx2x_virtf *vf, 6808db573baSAriel Elior struct bnx2x_vfop_cmd *cmd, 6818db573baSAriel Elior int qid); 6828db573baSAriel Elior 683463a68a7SAriel Elior int bnx2x_vfop_qdown_cmd(struct bnx2x *bp, 684463a68a7SAriel Elior struct bnx2x_virtf *vf, 685463a68a7SAriel Elior struct bnx2x_vfop_cmd *cmd, 686463a68a7SAriel Elior int qid); 687463a68a7SAriel Elior 688954ea748SAriel Elior int bnx2x_vfop_mcast_cmd(struct bnx2x *bp, 689954ea748SAriel Elior struct bnx2x_virtf *vf, 690954ea748SAriel Elior struct bnx2x_vfop_cmd *cmd, 691954ea748SAriel Elior bnx2x_mac_addr_t *mcasts, 692954ea748SAriel Elior int mcast_num, bool drv_only); 693954ea748SAriel Elior 694954ea748SAriel Elior int bnx2x_vfop_rxmode_cmd(struct bnx2x *bp, 695954ea748SAriel Elior struct bnx2x_virtf *vf, 696954ea748SAriel Elior struct bnx2x_vfop_cmd *cmd, 697954ea748SAriel Elior int qid, unsigned long accept_flags); 698954ea748SAriel Elior 69999e9d211SAriel Elior int bnx2x_vfop_close_cmd(struct bnx2x *bp, 70099e9d211SAriel Elior struct bnx2x_virtf *vf, 70199e9d211SAriel Elior struct bnx2x_vfop_cmd *cmd); 70299e9d211SAriel Elior 703f1929b01SAriel Elior int bnx2x_vfop_release_cmd(struct bnx2x *bp, 704f1929b01SAriel Elior struct bnx2x_virtf *vf, 705f1929b01SAriel Elior struct bnx2x_vfop_cmd *cmd); 706f1929b01SAriel Elior 707b9871bcfSAriel Elior int bnx2x_vfop_rss_cmd(struct bnx2x *bp, 708b9871bcfSAriel Elior struct bnx2x_virtf *vf, 709b9871bcfSAriel Elior struct bnx2x_vfop_cmd *cmd); 710b9871bcfSAriel Elior 711f1929b01SAriel Elior /* VF release ~ VF close + VF release-resources 712f1929b01SAriel Elior * 713f1929b01SAriel Elior * Release is the ultimate SW shutdown and is called whenever an 714f1929b01SAriel Elior * irrecoverable error is encountered. 715f1929b01SAriel Elior */ 716f1929b01SAriel Elior void bnx2x_vf_release(struct bnx2x *bp, struct bnx2x_virtf *vf, bool block); 717290ca2bbSAriel Elior int bnx2x_vf_idx_by_abs_fid(struct bnx2x *bp, u16 abs_vfid); 7188ca5e17eSAriel Elior u8 bnx2x_vf_max_queue_cnt(struct bnx2x *bp, struct bnx2x_virtf *vf); 719d16132ceSAriel Elior 720d16132ceSAriel Elior /* FLR routines */ 721d16132ceSAriel Elior 722b56e9670SAriel Elior /* VF FLR helpers */ 723b56e9670SAriel Elior int bnx2x_vf_flr_clnup_epilog(struct bnx2x *bp, u8 abs_vfid); 724b56e9670SAriel Elior void bnx2x_vf_enable_access(struct bnx2x *bp, u8 abs_vfid); 725d16132ceSAriel Elior 726d16132ceSAriel Elior /* Handles an FLR (or VF_DISABLE) notification form the MCP */ 727d16132ceSAriel Elior void bnx2x_vf_handle_flr_event(struct bnx2x *bp); 728d16132ceSAriel Elior 729be1f1ffaSAriel Elior void bnx2x_add_tlv(struct bnx2x *bp, void *tlvs_list, u16 offset, u16 type, 730be1f1ffaSAriel Elior u16 length); 731be1f1ffaSAriel Elior void bnx2x_vfpf_prep(struct bnx2x *bp, struct vfpf_first_tlv *first_tlv, 732be1f1ffaSAriel Elior u16 type, u16 length); 7331d6f3cd8SDmitry Kravkov void bnx2x_vfpf_finalize(struct bnx2x *bp, struct vfpf_first_tlv *first_tlv); 734be1f1ffaSAriel Elior void bnx2x_dp_tlv_list(struct bnx2x *bp, void *tlvs_list); 735fd1fc79dSAriel Elior 736fd1fc79dSAriel Elior bool bnx2x_tlv_supported(u16 tlvtype); 737fd1fc79dSAriel Elior 738abc5a021SAriel Elior u32 bnx2x_crc_vf_bulletin(struct bnx2x *bp, 739abc5a021SAriel Elior struct pf_vf_bulletin_content *bulletin); 740abc5a021SAriel Elior int bnx2x_post_vf_bulletin(struct bnx2x *bp, int vf); 741abc5a021SAriel Elior 742abc5a021SAriel Elior enum sample_bulletin_result bnx2x_sample_bulletin(struct bnx2x *bp); 743abc5a021SAriel Elior 7446411280aSAriel Elior /* VF side vfpf channel functions */ 7456411280aSAriel Elior int bnx2x_vfpf_acquire(struct bnx2x *bp, u8 tx_count, u8 rx_count); 7466411280aSAriel Elior int bnx2x_vfpf_release(struct bnx2x *bp); 7476411280aSAriel Elior int bnx2x_vfpf_release(struct bnx2x *bp); 7486411280aSAriel Elior int bnx2x_vfpf_init(struct bnx2x *bp); 7496411280aSAriel Elior void bnx2x_vfpf_close_vf(struct bnx2x *bp); 75060cad4e6SAriel Elior int bnx2x_vfpf_setup_q(struct bnx2x *bp, struct bnx2x_fastpath *fp, 75160cad4e6SAriel Elior bool is_leading); 7526411280aSAriel Elior int bnx2x_vfpf_teardown_queue(struct bnx2x *bp, int qidx); 753f8f4f61aSDmitry Kravkov int bnx2x_vfpf_config_mac(struct bnx2x *bp, u8 *addr, u8 vf_qid, bool set); 75460cad4e6SAriel Elior int bnx2x_vfpf_config_rss(struct bnx2x *bp, 75560cad4e6SAriel Elior struct bnx2x_config_rss_params *params); 7566411280aSAriel Elior int bnx2x_vfpf_set_mcast(struct net_device *dev); 7576411280aSAriel Elior int bnx2x_vfpf_storm_rx_mode(struct bnx2x *bp); 7586411280aSAriel Elior 7596411280aSAriel Elior static inline void bnx2x_vf_fill_fw_str(struct bnx2x *bp, char *buf, 7606411280aSAriel Elior size_t buf_len) 7616411280aSAriel Elior { 7626411280aSAriel Elior strlcpy(buf, bp->acquire_resp.pfdev_info.fw_ver, buf_len); 7636411280aSAriel Elior } 7646411280aSAriel Elior 7656411280aSAriel Elior static inline int bnx2x_vf_ustorm_prods_offset(struct bnx2x *bp, 7666411280aSAriel Elior struct bnx2x_fastpath *fp) 7676411280aSAriel Elior { 7686411280aSAriel Elior return PXP_VF_ADDR_USDM_QUEUES_START + 7696411280aSAriel Elior bp->acquire_resp.resc.hw_qid[fp->index] * 7706411280aSAriel Elior sizeof(struct ustorm_queue_zone_data); 7716411280aSAriel Elior } 7726411280aSAriel Elior 7736411280aSAriel Elior enum sample_bulletin_result bnx2x_sample_bulletin(struct bnx2x *bp); 77437173488SYuval Mintz void bnx2x_timer_sriov(struct bnx2x *bp); 7751d6f3cd8SDmitry Kravkov void __iomem *bnx2x_vf_doorbells(struct bnx2x *bp); 7766411280aSAriel Elior int bnx2x_vf_pci_alloc(struct bnx2x *bp); 7773c76feffSAriel Elior int bnx2x_enable_sriov(struct bnx2x *bp); 7783c76feffSAriel Elior void bnx2x_disable_sriov(struct bnx2x *bp); 7796411280aSAriel Elior static inline int bnx2x_vf_headroom(struct bnx2x *bp) 7806411280aSAriel Elior { 781b9871bcfSAriel Elior return bp->vfdb->sriov.nr_virtfn * BNX2X_CIDS_PER_VF; 7826411280aSAriel Elior } 7833ec9f9caSAriel Elior void bnx2x_pf_set_vfs_vlan(struct bnx2x *bp); 7843c76feffSAriel Elior int bnx2x_sriov_configure(struct pci_dev *dev, int num_vfs); 78578c3bcc5SAriel Elior void bnx2x_iov_channel_down(struct bnx2x *bp); 7866411280aSAriel Elior 7876411280aSAriel Elior #else /* CONFIG_BNX2X_SRIOV */ 7886411280aSAriel Elior 7896411280aSAriel Elior static inline void bnx2x_iov_set_queue_sp_obj(struct bnx2x *bp, int vf_cid, 7906411280aSAriel Elior struct bnx2x_queue_sp_obj **q_obj) {} 7916411280aSAriel Elior static inline void bnx2x_iov_sp_event(struct bnx2x *bp, int vf_cid, 7926411280aSAriel Elior bool queue_work) {} 7936411280aSAriel Elior static inline void bnx2x_vf_handle_flr_event(struct bnx2x *bp) {} 7946411280aSAriel Elior static inline int bnx2x_iov_eq_sp_event(struct bnx2x *bp, 7956411280aSAriel Elior union event_ring_elem *elem) {return 1; } 7966411280aSAriel Elior static inline void bnx2x_iov_sp_task(struct bnx2x *bp) {} 7976411280aSAriel Elior static inline void bnx2x_vf_mbx(struct bnx2x *bp, 7986411280aSAriel Elior struct vf_pf_event_data *vfpf_event) {} 7996411280aSAriel Elior static inline int bnx2x_iov_init_ilt(struct bnx2x *bp, u16 line) {return line; } 8006411280aSAriel Elior static inline void bnx2x_iov_init_dq(struct bnx2x *bp) {} 8016411280aSAriel Elior static inline int bnx2x_iov_alloc_mem(struct bnx2x *bp) {return 0; } 802580d9d08SYuval Mintz static inline void bnx2x_iov_free_mem(struct bnx2x *bp) {} 8036411280aSAriel Elior static inline int bnx2x_iov_chip_cleanup(struct bnx2x *bp) {return 0; } 8046411280aSAriel Elior static inline void bnx2x_iov_init_dmae(struct bnx2x *bp) {} 8056411280aSAriel Elior static inline int bnx2x_iov_init_one(struct bnx2x *bp, int int_mode_param, 8066411280aSAriel Elior int num_vfs_param) {return 0; } 8076411280aSAriel Elior static inline void bnx2x_iov_remove_one(struct bnx2x *bp) {} 8083c76feffSAriel Elior static inline int bnx2x_enable_sriov(struct bnx2x *bp) {return 0; } 8093c76feffSAriel Elior static inline void bnx2x_disable_sriov(struct bnx2x *bp) {} 8106411280aSAriel Elior static inline int bnx2x_vfpf_acquire(struct bnx2x *bp, 8116411280aSAriel Elior u8 tx_count, u8 rx_count) {return 0; } 8126411280aSAriel Elior static inline int bnx2x_vfpf_release(struct bnx2x *bp) {return 0; } 8136411280aSAriel Elior static inline int bnx2x_vfpf_init(struct bnx2x *bp) {return 0; } 8146411280aSAriel Elior static inline void bnx2x_vfpf_close_vf(struct bnx2x *bp) {} 81560cad4e6SAriel Elior static inline int bnx2x_vfpf_setup_q(struct bnx2x *bp, struct bnx2x_fastpath *fp, bool is_leading) {return 0; } 8166411280aSAriel Elior static inline int bnx2x_vfpf_teardown_queue(struct bnx2x *bp, int qidx) {return 0; } 817f8f4f61aSDmitry Kravkov static inline int bnx2x_vfpf_config_mac(struct bnx2x *bp, u8 *addr, 818f8f4f61aSDmitry Kravkov u8 vf_qid, bool set) {return 0; } 8199b0be651SDmitry Kravkov static inline int bnx2x_vfpf_config_rss(struct bnx2x *bp, 8209b0be651SDmitry Kravkov struct bnx2x_config_rss_params *params) {return 0; } 8216411280aSAriel Elior static inline int bnx2x_vfpf_set_mcast(struct net_device *dev) {return 0; } 8226411280aSAriel Elior static inline int bnx2x_vfpf_storm_rx_mode(struct bnx2x *bp) {return 0; } 8236411280aSAriel Elior static inline int bnx2x_iov_nic_init(struct bnx2x *bp) {return 0; } 8246411280aSAriel Elior static inline int bnx2x_vf_headroom(struct bnx2x *bp) {return 0; } 8256411280aSAriel Elior static inline void bnx2x_iov_adjust_stats_req(struct bnx2x *bp) {} 8266411280aSAriel Elior static inline void bnx2x_vf_fill_fw_str(struct bnx2x *bp, char *buf, 8276411280aSAriel Elior size_t buf_len) {} 8286411280aSAriel Elior static inline int bnx2x_vf_ustorm_prods_offset(struct bnx2x *bp, 8296411280aSAriel Elior struct bnx2x_fastpath *fp) {return 0; } 8306411280aSAriel Elior static inline enum sample_bulletin_result bnx2x_sample_bulletin(struct bnx2x *bp) 8316411280aSAriel Elior { 8326411280aSAriel Elior return PFVF_BULLETIN_UNCHANGED; 8336411280aSAriel Elior } 83437173488SYuval Mintz static inline void bnx2x_timer_sriov(struct bnx2x *bp) {} 8356411280aSAriel Elior 8361d6f3cd8SDmitry Kravkov static inline void __iomem *bnx2x_vf_doorbells(struct bnx2x *bp) 8371d6f3cd8SDmitry Kravkov { 8381d6f3cd8SDmitry Kravkov return NULL; 8391d6f3cd8SDmitry Kravkov } 8401d6f3cd8SDmitry Kravkov 8416411280aSAriel Elior static inline int bnx2x_vf_pci_alloc(struct bnx2x *bp) {return 0; } 8423ec9f9caSAriel Elior static inline void bnx2x_pf_set_vfs_vlan(struct bnx2x *bp) {} 8433c76feffSAriel Elior static inline int bnx2x_sriov_configure(struct pci_dev *dev, int num_vfs) {return 0; } 84478c3bcc5SAriel Elior static inline void bnx2x_iov_channel_down(struct bnx2x *bp) {} 8456411280aSAriel Elior 8466411280aSAriel Elior #endif /* CONFIG_BNX2X_SRIOV */ 8471ab4434cSAriel Elior #endif /* bnx2x_sriov.h */ 848