474 lines · c
1/* bnx2x_vfpf.h: Qlogic Everest network driver.2 *3 * Copyright (c) 2011-2013 Broadcom Corporation4 * Copyright (c) 2014 QLogic Corporation5 * All rights reserved6 *7 * Unless you and Qlogic execute a separate written software license8 * agreement governing use of this software, this software is licensed to you9 * under the terms of the GNU General Public License version 2 (the “GPL”),10 * available at http://www.gnu.org/licenses/gpl-2.0.html, with the following11 * added to such license:12 *13 * As a special exception, the copyright holders of this software give you14 * permission to link this software with independent modules, and to copy and15 * distribute the resulting executable under terms of your choice, provided that16 * you also meet, for each linked independent module, the terms and conditions17 * of the license of that module. An independent module is a module which is18 * not derived from this software. The special exception does not apply to any19 * modifications of the software.20 *21 * Maintained by: Ariel Elior <ariel.elior@qlogic.com>22 * Written by: Ariel Elior <ariel.elior@qlogic.com>23 */24#ifndef VF_PF_IF_H25#define VF_PF_IF_H26 27#ifdef CONFIG_BNX2X_SRIOV28 29/* Common definitions for all HVs */30struct vf_pf_resc_request {31 u8 num_rxqs;32 u8 num_txqs;33 u8 num_sbs;34 u8 num_mac_filters;35 u8 num_vlan_filters;36 u8 num_mc_filters; /* No limit so superfluous */37};38 39struct hw_sb_info {40 u8 hw_sb_id; /* aka absolute igu id, used to ack the sb */41 u8 sb_qid; /* used to update DHC for sb */42};43 44/* HW VF-PF channel definitions45 * A.K.A VF-PF mailbox46 */47#define TLV_BUFFER_SIZE 102448#define PF_VF_BULLETIN_SIZE 51249 50#define VFPF_QUEUE_FLG_TPA 0x000151#define VFPF_QUEUE_FLG_TPA_IPV6 0x000252#define VFPF_QUEUE_FLG_TPA_GRO 0x000453#define VFPF_QUEUE_FLG_CACHE_ALIGN 0x000854#define VFPF_QUEUE_FLG_STATS 0x001055#define VFPF_QUEUE_FLG_OV 0x002056#define VFPF_QUEUE_FLG_VLAN 0x004057#define VFPF_QUEUE_FLG_COS 0x008058#define VFPF_QUEUE_FLG_HC 0x010059#define VFPF_QUEUE_FLG_DHC 0x020060#define VFPF_QUEUE_FLG_LEADING_RSS 0x040061 62#define VFPF_QUEUE_DROP_IP_CS_ERR (1 << 0)63#define VFPF_QUEUE_DROP_TCP_CS_ERR (1 << 1)64#define VFPF_QUEUE_DROP_TTL0 (1 << 2)65#define VFPF_QUEUE_DROP_UDP_CS_ERR (1 << 3)66 67#define VFPF_RX_MASK_ACCEPT_NONE 0x0000000068#define VFPF_RX_MASK_ACCEPT_MATCHED_UNICAST 0x0000000169#define VFPF_RX_MASK_ACCEPT_MATCHED_MULTICAST 0x0000000270#define VFPF_RX_MASK_ACCEPT_ALL_UNICAST 0x0000000471#define VFPF_RX_MASK_ACCEPT_ALL_MULTICAST 0x0000000872#define VFPF_RX_MASK_ACCEPT_BROADCAST 0x0000001073#define VFPF_RX_MASK_ACCEPT_ANY_VLAN 0x0000002074 75#define BULLETIN_CONTENT_SIZE (sizeof(struct pf_vf_bulletin_content))76#define BULLETIN_CONTENT_LEGACY_SIZE (32)77#define BULLETIN_ATTEMPTS 5 /* crc failures before throwing towel */78#define BULLETIN_CRC_SEED 079 80enum {81 PFVF_STATUS_WAITING = 0,82 PFVF_STATUS_SUCCESS,83 PFVF_STATUS_FAILURE,84 PFVF_STATUS_NOT_SUPPORTED,85 PFVF_STATUS_NO_RESOURCE86};87 88/* vf pf channel tlvs */89/* general tlv header (used for both vf->pf request and pf->vf response) */90struct channel_tlv {91 u16 type;92 u16 length;93};94 95/* header of first vf->pf tlv carries the offset used to calculate response96 * buffer address97 */98struct vfpf_first_tlv {99 struct channel_tlv tl;100 u32 resp_msg_offset;101};102 103/* header of pf->vf tlvs, carries the status of handling the request */104struct pfvf_tlv {105 struct channel_tlv tl;106 u8 status;107 u8 padding[3];108};109 110/* response tlv used for most tlvs */111struct pfvf_general_resp_tlv {112 struct pfvf_tlv hdr;113};114 115/* used to terminate and pad a tlv list */116struct channel_list_end_tlv {117 struct channel_tlv tl;118 u8 padding[4];119};120 121/* Acquire */122struct vfpf_acquire_tlv {123 struct vfpf_first_tlv first_tlv;124 125 struct vf_pf_vfdev_info {126 /* the following fields are for debug purposes */127 u8 vf_id; /* ME register value */128 u8 vf_os; /* e.g. Linux, W2K8 */129#define VF_OS_SUBVERSION_MASK (0x1f)130#define VF_OS_MASK (0xe0)131#define VF_OS_SHIFT (5)132#define VF_OS_UNDEFINED (0 << VF_OS_SHIFT)133#define VF_OS_WINDOWS (1 << VF_OS_SHIFT)134 135 u8 fp_hsi_ver;136 u8 caps;137#define VF_CAP_SUPPORT_EXT_BULLETIN (1 << 0)138#define VF_CAP_SUPPORT_VLAN_FILTER (1 << 1)139 } vfdev_info;140 141 struct vf_pf_resc_request resc_request;142 143 aligned_u64 bulletin_addr;144};145 146/* simple operation request on queue */147struct vfpf_q_op_tlv {148 struct vfpf_first_tlv first_tlv;149 u8 vf_qid;150 u8 padding[3];151};152 153/* receive side scaling tlv */154struct vfpf_rss_tlv {155 struct vfpf_first_tlv first_tlv;156 u32 rss_flags;157#define VFPF_RSS_MODE_DISABLED (1 << 0)158#define VFPF_RSS_MODE_REGULAR (1 << 1)159#define VFPF_RSS_SET_SRCH (1 << 2)160#define VFPF_RSS_IPV4 (1 << 3)161#define VFPF_RSS_IPV4_TCP (1 << 4)162#define VFPF_RSS_IPV4_UDP (1 << 5)163#define VFPF_RSS_IPV6 (1 << 6)164#define VFPF_RSS_IPV6_TCP (1 << 7)165#define VFPF_RSS_IPV6_UDP (1 << 8)166 u8 rss_result_mask;167 u8 ind_table_size;168 u8 rss_key_size;169 u8 padding;170 u8 ind_table[T_ETH_INDIRECTION_TABLE_SIZE];171 u32 rss_key[T_ETH_RSS_KEY]; /* hash values */172};173 174/* acquire response tlv - carries the allocated resources */175struct pfvf_acquire_resp_tlv {176 struct pfvf_tlv hdr;177 struct pf_vf_pfdev_info {178 u32 chip_num;179 u32 pf_cap;180#define PFVF_CAP_RSS 0x00000001181#define PFVF_CAP_DHC 0x00000002182#define PFVF_CAP_TPA 0x00000004183#define PFVF_CAP_TPA_UPDATE 0x00000008184#define PFVF_CAP_VLAN_FILTER 0x00000010185 186 char fw_ver[32];187 u16 db_size;188 u8 indices_per_sb;189 u8 padding;190 } pfdev_info;191 struct pf_vf_resc {192 /* in case of status NO_RESOURCE in message hdr, pf will fill193 * this struct with suggested amount of resources for next194 * acquire request195 */196#define PFVF_MAX_QUEUES_PER_VF 16197#define PFVF_MAX_SBS_PER_VF 16198 struct hw_sb_info hw_sbs[PFVF_MAX_SBS_PER_VF];199 u8 hw_qid[PFVF_MAX_QUEUES_PER_VF];200 u8 num_rxqs;201 u8 num_txqs;202 u8 num_sbs;203 u8 num_mac_filters;204 u8 num_vlan_filters;205 u8 num_mc_filters;206 u8 permanent_mac_addr[ETH_ALEN];207 u8 current_mac_addr[ETH_ALEN];208 u8 padding[2];209 } resc;210};211 212struct vfpf_port_phys_id_resp_tlv {213 struct channel_tlv tl;214 u8 id[ETH_ALEN];215 u8 padding[2];216};217 218struct vfpf_fp_hsi_resp_tlv {219 struct channel_tlv tl;220 u8 is_supported;221 u8 padding[3];222};223 224#define VFPF_INIT_FLG_STATS_COALESCE (1 << 0) /* when set the VFs queues225 * stats will be coalesced on226 * the leading RSS queue227 */228 229/* Init VF */230struct vfpf_init_tlv {231 struct vfpf_first_tlv first_tlv;232 aligned_u64 sb_addr[PFVF_MAX_SBS_PER_VF]; /* vf_sb based */233 aligned_u64 spq_addr;234 aligned_u64 stats_addr;235 u16 stats_stride;236 u32 flags;237 u32 padding[2];238};239 240/* Setup Queue */241struct vfpf_setup_q_tlv {242 struct vfpf_first_tlv first_tlv;243 244 struct vf_pf_rxq_params {245 /* physical addresses */246 aligned_u64 rcq_addr;247 aligned_u64 rcq_np_addr;248 aligned_u64 rxq_addr;249 aligned_u64 sge_addr;250 251 /* sb + hc info */252 u8 vf_sb; /* index in hw_sbs[] */253 u8 sb_index; /* Index in the SB */254 u16 hc_rate; /* desired interrupts per sec. */255 /* valid iff VFPF_QUEUE_FLG_HC */256 /* rx buffer info */257 u16 mtu;258 u16 buf_sz;259 u16 flags; /* VFPF_QUEUE_FLG_X flags */260 u16 stat_id; /* valid iff VFPF_QUEUE_FLG_STATS */261 262 /* valid iff VFPF_QUEUE_FLG_TPA */263 u16 sge_buf_sz;264 u16 tpa_agg_sz;265 u8 max_sge_pkt;266 267 u8 drop_flags; /* VFPF_QUEUE_DROP_X, for Linux VMs268 * all the flags are turned off269 */270 271 u8 cache_line_log; /* VFPF_QUEUE_FLG_CACHE_ALIGN */272 u8 padding;273 } rxq;274 275 struct vf_pf_txq_params {276 /* physical addresses */277 aligned_u64 txq_addr;278 279 /* sb + hc info */280 u8 vf_sb; /* index in hw_sbs[] */281 u8 sb_index; /* Index in the SB */282 u16 hc_rate; /* desired interrupts per sec. */283 /* valid iff VFPF_QUEUE_FLG_HC */284 u32 flags; /* VFPF_QUEUE_FLG_X flags */285 u16 stat_id; /* valid iff VFPF_QUEUE_FLG_STATS */286 u8 traffic_type; /* see in setup_context() */287 u8 padding;288 } txq;289 290 u8 vf_qid; /* index in hw_qid[] */291 u8 param_valid;292#define VFPF_RXQ_VALID 0x01293#define VFPF_TXQ_VALID 0x02294 u8 padding[2];295};296 297/* Set Queue Filters */298struct vfpf_q_mac_vlan_filter {299 u32 flags;300#define VFPF_Q_FILTER_DEST_MAC_VALID 0x01301#define VFPF_Q_FILTER_VLAN_TAG_VALID 0x02302#define VFPF_Q_FILTER_SET 0x100 /* set/clear */303 u8 mac[ETH_ALEN];304 u16 vlan_tag;305};306 307/* configure queue filters */308struct vfpf_set_q_filters_tlv {309 struct vfpf_first_tlv first_tlv;310 311 u32 flags;312#define VFPF_SET_Q_FILTERS_MAC_VLAN_CHANGED 0x01313#define VFPF_SET_Q_FILTERS_MULTICAST_CHANGED 0x02314#define VFPF_SET_Q_FILTERS_RX_MASK_CHANGED 0x04315 316 u8 vf_qid; /* index in hw_qid[] */317 u8 n_mac_vlan_filters;318 u8 n_multicast;319 u8 padding;320 321#define PFVF_MAX_MAC_FILTERS 16322#define PFVF_MAX_VLAN_FILTERS 16323#define PFVF_MAX_FILTERS (PFVF_MAX_MAC_FILTERS +\324 PFVF_MAX_VLAN_FILTERS)325 struct vfpf_q_mac_vlan_filter filters[PFVF_MAX_FILTERS];326 327#define PFVF_MAX_MULTICAST_PER_VF 32328 u8 multicast[PFVF_MAX_MULTICAST_PER_VF][ETH_ALEN];329 330 u32 rx_mask; /* see mask constants at the top of the file */331};332 333struct vfpf_tpa_tlv {334 struct vfpf_first_tlv first_tlv;335 336 struct vf_pf_tpa_client_info {337 aligned_u64 sge_addr[PFVF_MAX_QUEUES_PER_VF];338 u8 update_ipv4;339 u8 update_ipv6;340 u8 max_tpa_queues;341 u8 max_sges_for_packet;342 u8 complete_on_both_clients;343 u8 dont_verify_thr;344 u8 tpa_mode;345 u16 sge_buff_size;346 u16 max_agg_size;347 u16 sge_pause_thr_low;348 u16 sge_pause_thr_high;349 } tpa_client_info;350};351 352/* close VF (disable VF) */353struct vfpf_close_tlv {354 struct vfpf_first_tlv first_tlv;355 u16 vf_id; /* for debug */356 u8 padding[2];357};358 359/* release the VF's acquired resources */360struct vfpf_release_tlv {361 struct vfpf_first_tlv first_tlv;362 u16 vf_id;363 u8 padding[2];364};365 366struct tlv_buffer_size {367 u8 tlv_buffer[TLV_BUFFER_SIZE];368};369 370union vfpf_tlvs {371 struct vfpf_first_tlv first_tlv;372 struct vfpf_acquire_tlv acquire;373 struct vfpf_init_tlv init;374 struct vfpf_close_tlv close;375 struct vfpf_q_op_tlv q_op;376 struct vfpf_setup_q_tlv setup_q;377 struct vfpf_set_q_filters_tlv set_q_filters;378 struct vfpf_release_tlv release;379 struct vfpf_rss_tlv update_rss;380 struct vfpf_tpa_tlv update_tpa;381 struct channel_list_end_tlv list_end;382 struct tlv_buffer_size tlv_buf_size;383};384 385union pfvf_tlvs {386 struct pfvf_general_resp_tlv general_resp;387 struct pfvf_acquire_resp_tlv acquire_resp;388 struct channel_list_end_tlv list_end;389 struct tlv_buffer_size tlv_buf_size;390};391 392/* This is a structure which is allocated in the VF, which the PF may update393 * when it deems it necessary to do so. The bulletin board is sampled394 * periodically by the VF. A copy per VF is maintained in the PF (to prevent395 * loss of data upon multiple updates (or the need for read modify write)).396 */397struct pf_vf_bulletin_size {398 u8 size[PF_VF_BULLETIN_SIZE];399};400 401struct pf_vf_bulletin_content {402 u32 crc; /* crc of structure to ensure is not in403 * mid-update404 */405 u16 version;406 u16 length;407 408 aligned_u64 valid_bitmap; /* bitmap indicating which fields409 * hold valid values410 */411 412#define MAC_ADDR_VALID 0 /* alert the vf that a new mac address413 * is available for it414 */415#define VLAN_VALID 1 /* when set, the vf should not access416 * the vfpf channel417 */418#define CHANNEL_DOWN 2 /* vfpf channel is disabled. VFs are not419 * to attempt to send messages on the420 * channel after this bit is set421 */422#define LINK_VALID 3 /* alert the VF thet a new link status423 * update is available for it424 */425 u8 mac[ETH_ALEN];426 u8 mac_padding[2];427 428 u16 vlan;429 u8 vlan_padding[6];430 431 u16 link_speed; /* Effective line speed */432 u8 link_speed_padding[6];433 u32 link_flags; /* VFPF_LINK_REPORT_XXX flags */434#define VFPF_LINK_REPORT_LINK_DOWN (1 << 0)435#define VFPF_LINK_REPORT_FULL_DUPLEX (1 << 1)436#define VFPF_LINK_REPORT_RX_FC_ON (1 << 2)437#define VFPF_LINK_REPORT_TX_FC_ON (1 << 3)438 u8 link_flags_padding[4];439};440 441union pf_vf_bulletin {442 struct pf_vf_bulletin_content content;443 struct pf_vf_bulletin_size size;444};445 446#define MAX_TLVS_IN_LIST 50447 448enum channel_tlvs {449 CHANNEL_TLV_NONE,450 CHANNEL_TLV_ACQUIRE,451 CHANNEL_TLV_INIT,452 CHANNEL_TLV_SETUP_Q,453 CHANNEL_TLV_SET_Q_FILTERS,454 CHANNEL_TLV_ACTIVATE_Q,455 CHANNEL_TLV_DEACTIVATE_Q,456 CHANNEL_TLV_TEARDOWN_Q,457 CHANNEL_TLV_CLOSE,458 CHANNEL_TLV_RELEASE,459 CHANNEL_TLV_UPDATE_RSS_DEPRECATED,460 CHANNEL_TLV_PF_RELEASE_VF,461 CHANNEL_TLV_LIST_END,462 CHANNEL_TLV_FLR,463 CHANNEL_TLV_PF_SET_MAC,464 CHANNEL_TLV_PF_SET_VLAN,465 CHANNEL_TLV_UPDATE_RSS,466 CHANNEL_TLV_PHYS_PORT_ID,467 CHANNEL_TLV_UPDATE_TPA,468 CHANNEL_TLV_FP_HSI_SUPPORT,469 CHANNEL_TLV_MAX470};471 472#endif /* CONFIG_BNX2X_SRIOV */473#endif /* VF_PF_IF_H */474