1316485Sdavidcs/* 2337517Sdavidcs * Copyright (c) 2017-2018 Cavium, Inc. 3316485Sdavidcs * All rights reserved. 4316485Sdavidcs * 5316485Sdavidcs * Redistribution and use in source and binary forms, with or without 6316485Sdavidcs * modification, are permitted provided that the following conditions 7316485Sdavidcs * are met: 8316485Sdavidcs * 9316485Sdavidcs * 1. Redistributions of source code must retain the above copyright 10316485Sdavidcs * notice, this list of conditions and the following disclaimer. 11316485Sdavidcs * 2. Redistributions in binary form must reproduce the above copyright 12316485Sdavidcs * notice, this list of conditions and the following disclaimer in the 13316485Sdavidcs * documentation and/or other materials provided with the distribution. 14316485Sdavidcs * 15316485Sdavidcs * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16316485Sdavidcs * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17316485Sdavidcs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18316485Sdavidcs * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 19316485Sdavidcs * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20316485Sdavidcs * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21316485Sdavidcs * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22316485Sdavidcs * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23316485Sdavidcs * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24316485Sdavidcs * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25316485Sdavidcs * POSSIBILITY OF SUCH DAMAGE. 26316485Sdavidcs * 27316485Sdavidcs * $FreeBSD: stable/11/sys/dev/qlnx/qlnxe/ecore_vfpf_if.h 337517 2018-08-09 01:17:35Z davidcs $ 28316485Sdavidcs * 29316485Sdavidcs */ 30316485Sdavidcs 31320164Sdavidcs 32316485Sdavidcs#ifndef __ECORE_VF_PF_IF_H__ 33316485Sdavidcs#define __ECORE_VF_PF_IF_H__ 34316485Sdavidcs 35316485Sdavidcs#define T_ETH_INDIRECTION_TABLE_SIZE 128 /* @@@ TBD MichalK this should be HSI? */ 36316485Sdavidcs#define T_ETH_RSS_KEY_SIZE 10 /* @@@ TBD this should be HSI? */ 37320164Sdavidcs#ifndef LINUX_REMOVE 38337517Sdavidcs#ifndef ETH_ALEN 39316485Sdavidcs#define ETH_ALEN 6 /* @@@ TBD MichalK - should this be defined here?*/ 40320164Sdavidcs#endif 41337517Sdavidcs#endif 42316485Sdavidcs 43316485Sdavidcs/*********************************************** 44316485Sdavidcs * 45316485Sdavidcs * Common definitions for all HVs 46316485Sdavidcs * 47316485Sdavidcs **/ 48316485Sdavidcsstruct vf_pf_resc_request { 49316485Sdavidcs u8 num_rxqs; 50316485Sdavidcs u8 num_txqs; 51316485Sdavidcs u8 num_sbs; 52316485Sdavidcs u8 num_mac_filters; 53316485Sdavidcs u8 num_vlan_filters; 54316485Sdavidcs u8 num_mc_filters; /* No limit so superfluous */ 55316485Sdavidcs u8 num_cids; 56316485Sdavidcs u8 padding; 57316485Sdavidcs}; 58316485Sdavidcs 59316485Sdavidcsstruct hw_sb_info { 60316485Sdavidcs u16 hw_sb_id; /* aka absolute igu id, used to ack the sb */ 61316485Sdavidcs u8 sb_qid; /* used to update DHC for sb */ 62316485Sdavidcs u8 padding[5]; 63316485Sdavidcs}; 64316485Sdavidcs 65316485Sdavidcs/*********************************************** 66316485Sdavidcs * 67316485Sdavidcs * HW VF-PF channel definitions 68316485Sdavidcs * 69316485Sdavidcs * A.K.A VF-PF mailbox 70316485Sdavidcs * 71316485Sdavidcs **/ 72316485Sdavidcs#define TLV_BUFFER_SIZE 1024 73316485Sdavidcs 74316485Sdavidcs/* vf pf channel tlvs */ 75316485Sdavidcs/* general tlv header (used for both vf->pf request and pf->vf response) */ 76316485Sdavidcsstruct channel_tlv { 77316485Sdavidcs u16 type; 78316485Sdavidcs u16 length; 79316485Sdavidcs}; 80316485Sdavidcs 81316485Sdavidcs/* header of first vf->pf tlv carries the offset used to calculate reponse 82316485Sdavidcs * buffer address 83316485Sdavidcs */ 84316485Sdavidcsstruct vfpf_first_tlv { 85316485Sdavidcs struct channel_tlv tl; 86316485Sdavidcs u32 padding; 87316485Sdavidcs u64 reply_address; 88316485Sdavidcs}; 89316485Sdavidcs 90316485Sdavidcs/* header of pf->vf tlvs, carries the status of handling the request */ 91316485Sdavidcsstruct pfvf_tlv { 92316485Sdavidcs struct channel_tlv tl; 93316485Sdavidcs u8 status; 94316485Sdavidcs u8 padding[3]; 95316485Sdavidcs}; 96316485Sdavidcs 97316485Sdavidcs/* response tlv used for most tlvs */ 98316485Sdavidcsstruct pfvf_def_resp_tlv { 99316485Sdavidcs struct pfvf_tlv hdr; 100316485Sdavidcs}; 101316485Sdavidcs 102316485Sdavidcs/* used to terminate and pad a tlv list */ 103316485Sdavidcsstruct channel_list_end_tlv { 104316485Sdavidcs struct channel_tlv tl; 105316485Sdavidcs u8 padding[4]; 106316485Sdavidcs}; 107316485Sdavidcs 108316485Sdavidcs/* Acquire */ 109316485Sdavidcsstruct vfpf_acquire_tlv { 110316485Sdavidcs struct vfpf_first_tlv first_tlv; 111316485Sdavidcs 112316485Sdavidcs struct vf_pf_vfdev_info { 113320164Sdavidcs#ifndef LINUX_REMOVE 114316485Sdavidcs /* First bit was used on 8.7.x and 8.8.x versions, which had different 115316485Sdavidcs * FWs used but with the same faspath HSI. As this was prior to the 116316485Sdavidcs * fastpath versioning, wanted to have ability to override fw matching 117316485Sdavidcs * and allow them to interact. 118316485Sdavidcs */ 119320164Sdavidcs#endif 120316485Sdavidcs#define VFPF_ACQUIRE_CAP_PRE_FP_HSI (1 << 0) /* VF pre-FP hsi version */ 121316485Sdavidcs#define VFPF_ACQUIRE_CAP_100G (1 << 1) /* VF can support 100g */ 122316485Sdavidcs 123316485Sdavidcs /* A requirement for supporting multi-Tx queues on a single queue-zone, 124316485Sdavidcs * VF would pass qids as additional information whenever passing queue 125316485Sdavidcs * references. 126316485Sdavidcs * TODO - due to the CID limitations in Bar0, VFs currently don't pass 127316485Sdavidcs * this, and use the legacy CID scheme. 128316485Sdavidcs */ 129316485Sdavidcs#define VFPF_ACQUIRE_CAP_QUEUE_QIDS (1 << 2) 130337517Sdavidcs 131337517Sdavidcs /* The VF is using the physical bar. While this is mostly internal 132337517Sdavidcs * to the VF, might affect the number of CIDs supported assuming 133337517Sdavidcs * QUEUE_QIDS is set. 134337517Sdavidcs */ 135337517Sdavidcs#define VFPF_ACQUIRE_CAP_PHYSICAL_BAR (1 << 3) 136316485Sdavidcs u64 capabilities; 137316485Sdavidcs u8 fw_major; 138316485Sdavidcs u8 fw_minor; 139316485Sdavidcs u8 fw_revision; 140316485Sdavidcs u8 fw_engineering; 141316485Sdavidcs u32 driver_version; 142316485Sdavidcs u16 opaque_fid; /* ME register value */ 143316485Sdavidcs u8 os_type; /* VFPF_ACQUIRE_OS_* value */ 144316485Sdavidcs u8 eth_fp_hsi_major; 145316485Sdavidcs u8 eth_fp_hsi_minor; 146316485Sdavidcs u8 padding[3]; 147316485Sdavidcs } vfdev_info; 148316485Sdavidcs 149316485Sdavidcs struct vf_pf_resc_request resc_request; 150316485Sdavidcs 151316485Sdavidcs u64 bulletin_addr; 152316485Sdavidcs u32 bulletin_size; 153316485Sdavidcs u32 padding; 154316485Sdavidcs}; 155316485Sdavidcs 156316485Sdavidcs/* receive side scaling tlv */ 157316485Sdavidcsstruct vfpf_vport_update_rss_tlv { 158316485Sdavidcs struct channel_tlv tl; 159316485Sdavidcs 160316485Sdavidcs u8 update_rss_flags; 161316485Sdavidcs #define VFPF_UPDATE_RSS_CONFIG_FLAG (1 << 0) 162316485Sdavidcs #define VFPF_UPDATE_RSS_CAPS_FLAG (1 << 1) 163316485Sdavidcs #define VFPF_UPDATE_RSS_IND_TABLE_FLAG (1 << 2) 164316485Sdavidcs #define VFPF_UPDATE_RSS_KEY_FLAG (1 << 3) 165316485Sdavidcs 166316485Sdavidcs u8 rss_enable; 167316485Sdavidcs u8 rss_caps; 168316485Sdavidcs u8 rss_table_size_log; /* The table size is 2 ^ rss_table_size_log */ 169316485Sdavidcs u16 rss_ind_table[T_ETH_INDIRECTION_TABLE_SIZE]; 170316485Sdavidcs u32 rss_key[T_ETH_RSS_KEY_SIZE]; 171316485Sdavidcs}; 172316485Sdavidcs 173316485Sdavidcsstruct pfvf_storm_stats { 174316485Sdavidcs u32 address; 175316485Sdavidcs u32 len; 176316485Sdavidcs}; 177316485Sdavidcs 178316485Sdavidcsstruct pfvf_stats_info { 179316485Sdavidcs struct pfvf_storm_stats mstats; 180316485Sdavidcs struct pfvf_storm_stats pstats; 181316485Sdavidcs struct pfvf_storm_stats tstats; 182316485Sdavidcs struct pfvf_storm_stats ustats; 183316485Sdavidcs}; 184316485Sdavidcs 185316485Sdavidcs/* acquire response tlv - carries the allocated resources */ 186316485Sdavidcsstruct pfvf_acquire_resp_tlv { 187316485Sdavidcs struct pfvf_tlv hdr; 188316485Sdavidcs 189316485Sdavidcs struct pf_vf_pfdev_info { 190316485Sdavidcs u32 chip_num; 191316485Sdavidcs u32 mfw_ver; 192316485Sdavidcs 193316485Sdavidcs u16 fw_major; 194316485Sdavidcs u16 fw_minor; 195316485Sdavidcs u16 fw_rev; 196316485Sdavidcs u16 fw_eng; 197316485Sdavidcs 198316485Sdavidcs u64 capabilities; 199316485Sdavidcs#define PFVF_ACQUIRE_CAP_DEFAULT_UNTAGGED (1 << 0) 200316485Sdavidcs#define PFVF_ACQUIRE_CAP_100G (1 << 1) /* If set, 100g PF */ 201316485Sdavidcs/* There are old PF versions where the PF might mistakenly override the sanity 202316485Sdavidcs * mechanism [version-based] and allow a VF that can't be supported to pass 203316485Sdavidcs * the acquisition phase. 204316485Sdavidcs * To overcome this, PFs now indicate that they're past that point and the new 205316485Sdavidcs * VFs would fail probe on the older PFs that fail to do so. 206316485Sdavidcs */ 207320164Sdavidcs#ifndef LINUX_REMOVE 208320164Sdavidcs/* Said bug was in quest/serpens; Can't be certain no official release included 209320164Sdavidcs * the bug since the fix arrived very late in the programs. 210320164Sdavidcs */ 211320164Sdavidcs#endif 212316485Sdavidcs#define PFVF_ACQUIRE_CAP_POST_FW_OVERRIDE (1 << 2) 213316485Sdavidcs 214316485Sdavidcs /* PF expects queues to be received with additional qids */ 215316485Sdavidcs#define PFVF_ACQUIRE_CAP_QUEUE_QIDS (1 << 3) 216316485Sdavidcs 217316485Sdavidcs u16 db_size; 218316485Sdavidcs u8 indices_per_sb; 219316485Sdavidcs u8 os_type; 220316485Sdavidcs 221316485Sdavidcs /* These should match the PF's ecore_dev values */ 222316485Sdavidcs u16 chip_rev; 223316485Sdavidcs u8 dev_type; 224316485Sdavidcs 225337517Sdavidcs /* Doorbell bar size configured in HW: log(size) or 0 */ 226337517Sdavidcs u8 bar_size; 227316485Sdavidcs 228316485Sdavidcs struct pfvf_stats_info stats_info; 229316485Sdavidcs 230316485Sdavidcs u8 port_mac[ETH_ALEN]; 231316485Sdavidcs 232316485Sdavidcs /* It's possible PF had to configure an older fastpath HSI 233316485Sdavidcs * [in case VF is newer than PF]. This is communicated back 234316485Sdavidcs * to the VF. It can also be used in case of error due to 235316485Sdavidcs * non-matching versions to shed light in VF about failure. 236316485Sdavidcs */ 237316485Sdavidcs u8 major_fp_hsi; 238316485Sdavidcs u8 minor_fp_hsi; 239316485Sdavidcs } pfdev_info; 240316485Sdavidcs 241316485Sdavidcs struct pf_vf_resc { 242316485Sdavidcs /* in case of status NO_RESOURCE in message hdr, pf will fill 243316485Sdavidcs * this struct with suggested amount of resources for next 244316485Sdavidcs * acquire request 245316485Sdavidcs */ 246316485Sdavidcs #define PFVF_MAX_QUEUES_PER_VF 16 247316485Sdavidcs #define PFVF_MAX_SBS_PER_VF 16 248316485Sdavidcs struct hw_sb_info hw_sbs[PFVF_MAX_SBS_PER_VF]; 249316485Sdavidcs u8 hw_qid[PFVF_MAX_QUEUES_PER_VF]; 250316485Sdavidcs u8 cid[PFVF_MAX_QUEUES_PER_VF]; 251316485Sdavidcs 252316485Sdavidcs u8 num_rxqs; 253316485Sdavidcs u8 num_txqs; 254316485Sdavidcs u8 num_sbs; 255316485Sdavidcs u8 num_mac_filters; 256316485Sdavidcs u8 num_vlan_filters; 257316485Sdavidcs u8 num_mc_filters; 258316485Sdavidcs u8 num_cids; 259316485Sdavidcs u8 padding; 260316485Sdavidcs } resc; 261316485Sdavidcs 262316485Sdavidcs u32 bulletin_size; 263316485Sdavidcs u32 padding; 264316485Sdavidcs}; 265316485Sdavidcs 266316485Sdavidcsstruct pfvf_start_queue_resp_tlv { 267316485Sdavidcs struct pfvf_tlv hdr; 268316485Sdavidcs u32 offset; /* offset to consumer/producer of queue */ 269316485Sdavidcs u8 padding[4]; 270316485Sdavidcs}; 271316485Sdavidcs 272316485Sdavidcs/* Extended queue information - additional index for reference inside qzone. 273316485Sdavidcs * If commmunicated between VF/PF, each TLV relating to queues should be 274316485Sdavidcs * extended by one such [or have a future base TLV that already contains info]. 275316485Sdavidcs */ 276316485Sdavidcsstruct vfpf_qid_tlv { 277316485Sdavidcs struct channel_tlv tl; 278316485Sdavidcs u8 qid; 279316485Sdavidcs u8 padding[3]; 280316485Sdavidcs}; 281316485Sdavidcs 282316485Sdavidcs/* Setup Queue */ 283316485Sdavidcsstruct vfpf_start_rxq_tlv { 284316485Sdavidcs struct vfpf_first_tlv first_tlv; 285316485Sdavidcs 286316485Sdavidcs /* physical addresses */ 287316485Sdavidcs u64 rxq_addr; 288316485Sdavidcs u64 deprecated_sge_addr; 289316485Sdavidcs u64 cqe_pbl_addr; 290316485Sdavidcs 291316485Sdavidcs u16 cqe_pbl_size; 292316485Sdavidcs u16 hw_sb; 293316485Sdavidcs u16 rx_qid; 294316485Sdavidcs u16 hc_rate; /* desired interrupts per sec. */ 295316485Sdavidcs 296316485Sdavidcs u16 bd_max_bytes; 297316485Sdavidcs u16 stat_id; 298316485Sdavidcs u8 sb_index; 299316485Sdavidcs u8 padding[3]; 300316485Sdavidcs 301316485Sdavidcs}; 302316485Sdavidcs 303316485Sdavidcsstruct vfpf_start_txq_tlv { 304316485Sdavidcs struct vfpf_first_tlv first_tlv; 305316485Sdavidcs 306316485Sdavidcs /* physical addresses */ 307316485Sdavidcs u64 pbl_addr; 308316485Sdavidcs u16 pbl_size; 309316485Sdavidcs u16 stat_id; 310316485Sdavidcs u16 tx_qid; 311316485Sdavidcs u16 hw_sb; 312316485Sdavidcs 313316485Sdavidcs u32 flags; /* VFPF_QUEUE_FLG_X flags */ 314316485Sdavidcs u16 hc_rate; /* desired interrupts per sec. */ 315316485Sdavidcs u8 sb_index; 316316485Sdavidcs u8 padding[3]; 317316485Sdavidcs}; 318316485Sdavidcs 319316485Sdavidcs/* Stop RX Queue */ 320316485Sdavidcsstruct vfpf_stop_rxqs_tlv { 321316485Sdavidcs struct vfpf_first_tlv first_tlv; 322316485Sdavidcs 323316485Sdavidcs u16 rx_qid; 324316485Sdavidcs 325316485Sdavidcs /* While the API supports multiple Rx-queues on a single TLV 326316485Sdavidcs * message, in practice older VFs always used it as one [ecore]. 327316485Sdavidcs * And there are PFs [starting with the CHANNEL_TLV_QID] which 328316485Sdavidcs * would start assuming this is always a '1'. So in practice this 329316485Sdavidcs * field should be considered deprecated and *Always* set to '1'. 330316485Sdavidcs */ 331316485Sdavidcs u8 num_rxqs; 332316485Sdavidcs 333316485Sdavidcs u8 cqe_completion; 334316485Sdavidcs u8 padding[4]; 335316485Sdavidcs}; 336316485Sdavidcs 337316485Sdavidcs/* Stop TX Queues */ 338316485Sdavidcsstruct vfpf_stop_txqs_tlv { 339316485Sdavidcs struct vfpf_first_tlv first_tlv; 340316485Sdavidcs 341316485Sdavidcs u16 tx_qid; 342316485Sdavidcs 343316485Sdavidcs /* While the API supports multiple Tx-queues on a single TLV 344316485Sdavidcs * message, in practice older VFs always used it as one [ecore]. 345316485Sdavidcs * And there are PFs [starting with the CHANNEL_TLV_QID] which 346316485Sdavidcs * would start assuming this is always a '1'. So in practice this 347316485Sdavidcs * field should be considered deprecated and *Always* set to '1'. 348316485Sdavidcs */ 349316485Sdavidcs u8 num_txqs; 350316485Sdavidcs u8 padding[5]; 351316485Sdavidcs}; 352316485Sdavidcs 353316485Sdavidcsstruct vfpf_update_rxq_tlv { 354316485Sdavidcs struct vfpf_first_tlv first_tlv; 355316485Sdavidcs 356316485Sdavidcs u64 deprecated_sge_addr[PFVF_MAX_QUEUES_PER_VF]; 357316485Sdavidcs 358316485Sdavidcs u16 rx_qid; 359316485Sdavidcs u8 num_rxqs; 360316485Sdavidcs u8 flags; 361316485Sdavidcs #define VFPF_RXQ_UPD_INIT_SGE_DEPRECATE_FLAG (1 << 0) 362316485Sdavidcs #define VFPF_RXQ_UPD_COMPLETE_CQE_FLAG (1 << 1) 363316485Sdavidcs #define VFPF_RXQ_UPD_COMPLETE_EVENT_FLAG (1 << 2) 364316485Sdavidcs 365316485Sdavidcs u8 padding[4]; 366316485Sdavidcs}; 367316485Sdavidcs 368316485Sdavidcs/* Set Queue Filters */ 369316485Sdavidcsstruct vfpf_q_mac_vlan_filter { 370316485Sdavidcs u32 flags; 371316485Sdavidcs #define VFPF_Q_FILTER_DEST_MAC_VALID 0x01 372316485Sdavidcs #define VFPF_Q_FILTER_VLAN_TAG_VALID 0x02 373316485Sdavidcs #define VFPF_Q_FILTER_SET_MAC 0x100 /* set/clear */ 374316485Sdavidcs 375316485Sdavidcs u8 mac[ETH_ALEN]; 376316485Sdavidcs u16 vlan_tag; 377316485Sdavidcs 378316485Sdavidcs u8 padding[4]; 379316485Sdavidcs}; 380316485Sdavidcs 381316485Sdavidcs/* Start a vport */ 382316485Sdavidcsstruct vfpf_vport_start_tlv { 383316485Sdavidcs struct vfpf_first_tlv first_tlv; 384316485Sdavidcs 385316485Sdavidcs u64 sb_addr[PFVF_MAX_SBS_PER_VF]; 386316485Sdavidcs 387316485Sdavidcs u32 tpa_mode; 388316485Sdavidcs u16 dep1; 389316485Sdavidcs u16 mtu; 390316485Sdavidcs 391316485Sdavidcs u8 vport_id; 392316485Sdavidcs u8 inner_vlan_removal; 393316485Sdavidcs 394316485Sdavidcs u8 only_untagged; 395316485Sdavidcs u8 max_buffers_per_cqe; 396316485Sdavidcs 397337517Sdavidcs u8 zero_placement_offset; 398337517Sdavidcs u8 padding[3]; 399316485Sdavidcs}; 400316485Sdavidcs 401316485Sdavidcs/* Extended tlvs - need to add rss, mcast, accept mode tlvs */ 402316485Sdavidcsstruct vfpf_vport_update_activate_tlv { 403316485Sdavidcs struct channel_tlv tl; 404316485Sdavidcs u8 update_rx; 405316485Sdavidcs u8 update_tx; 406316485Sdavidcs u8 active_rx; 407316485Sdavidcs u8 active_tx; 408316485Sdavidcs}; 409316485Sdavidcs 410316485Sdavidcsstruct vfpf_vport_update_tx_switch_tlv { 411316485Sdavidcs struct channel_tlv tl; 412316485Sdavidcs u8 tx_switching; 413316485Sdavidcs u8 padding[3]; 414316485Sdavidcs}; 415316485Sdavidcs 416316485Sdavidcsstruct vfpf_vport_update_vlan_strip_tlv { 417316485Sdavidcs struct channel_tlv tl; 418316485Sdavidcs u8 remove_vlan; 419316485Sdavidcs u8 padding[3]; 420316485Sdavidcs}; 421316485Sdavidcs 422316485Sdavidcsstruct vfpf_vport_update_mcast_bin_tlv { 423316485Sdavidcs struct channel_tlv tl; 424316485Sdavidcs u8 padding[4]; 425316485Sdavidcs 426337517Sdavidcs /* This was a mistake; There are only 256 approx bins, 427337517Sdavidcs * and in HSI they're divided into 32-bit values. 428337517Sdavidcs * As old VFs used to set-bit to the values on its side, 429337517Sdavidcs * the upper half of the array is never expected to contain any data. 430337517Sdavidcs */ 431337517Sdavidcs u64 bins[4]; 432337517Sdavidcs u64 obsolete_bins[4]; 433316485Sdavidcs}; 434316485Sdavidcs 435316485Sdavidcsstruct vfpf_vport_update_accept_param_tlv { 436316485Sdavidcs struct channel_tlv tl; 437316485Sdavidcs u8 update_rx_mode; 438316485Sdavidcs u8 update_tx_mode; 439316485Sdavidcs u8 rx_accept_filter; 440316485Sdavidcs u8 tx_accept_filter; 441316485Sdavidcs}; 442316485Sdavidcs 443316485Sdavidcsstruct vfpf_vport_update_accept_any_vlan_tlv { 444316485Sdavidcs struct channel_tlv tl; 445316485Sdavidcs u8 update_accept_any_vlan_flg; 446316485Sdavidcs u8 accept_any_vlan; 447316485Sdavidcs 448316485Sdavidcs u8 padding[2]; 449316485Sdavidcs}; 450316485Sdavidcs 451316485Sdavidcsstruct vfpf_vport_update_sge_tpa_tlv { 452316485Sdavidcs struct channel_tlv tl; 453316485Sdavidcs 454316485Sdavidcs u16 sge_tpa_flags; 455316485Sdavidcs #define VFPF_TPA_IPV4_EN_FLAG (1 << 0) 456316485Sdavidcs #define VFPF_TPA_IPV6_EN_FLAG (1 << 1) 457316485Sdavidcs #define VFPF_TPA_PKT_SPLIT_FLAG (1 << 2) 458316485Sdavidcs #define VFPF_TPA_HDR_DATA_SPLIT_FLAG (1 << 3) 459316485Sdavidcs #define VFPF_TPA_GRO_CONSIST_FLAG (1 << 4) 460316485Sdavidcs 461316485Sdavidcs u8 update_sge_tpa_flags; 462316485Sdavidcs #define VFPF_UPDATE_SGE_DEPRECATED_FLAG (1 << 0) 463316485Sdavidcs #define VFPF_UPDATE_TPA_EN_FLAG (1 << 1) 464316485Sdavidcs #define VFPF_UPDATE_TPA_PARAM_FLAG (1 << 2) 465316485Sdavidcs 466316485Sdavidcs u8 max_buffers_per_cqe; 467316485Sdavidcs 468316485Sdavidcs u16 deprecated_sge_buff_size; 469316485Sdavidcs u16 tpa_max_size; 470316485Sdavidcs u16 tpa_min_size_to_start; 471316485Sdavidcs u16 tpa_min_size_to_cont; 472316485Sdavidcs 473316485Sdavidcs u8 tpa_max_aggs_num; 474316485Sdavidcs u8 padding[7]; 475316485Sdavidcs 476316485Sdavidcs}; 477316485Sdavidcs 478316485Sdavidcs/* Primary tlv as a header for various extended tlvs for 479316485Sdavidcs * various functionalities in vport update ramrod. 480316485Sdavidcs */ 481316485Sdavidcsstruct vfpf_vport_update_tlv { 482316485Sdavidcs struct vfpf_first_tlv first_tlv; 483316485Sdavidcs}; 484316485Sdavidcs 485316485Sdavidcsstruct vfpf_ucast_filter_tlv { 486316485Sdavidcs struct vfpf_first_tlv first_tlv; 487316485Sdavidcs 488316485Sdavidcs u8 opcode; 489316485Sdavidcs u8 type; 490316485Sdavidcs 491316485Sdavidcs u8 mac[ETH_ALEN]; 492316485Sdavidcs 493316485Sdavidcs u16 vlan; 494316485Sdavidcs u16 padding[3]; 495316485Sdavidcs}; 496316485Sdavidcs 497316485Sdavidcs/* tunnel update param tlv */ 498316485Sdavidcsstruct vfpf_update_tunn_param_tlv { 499316485Sdavidcs struct vfpf_first_tlv first_tlv; 500316485Sdavidcs 501316485Sdavidcs u8 tun_mode_update_mask; 502316485Sdavidcs u8 tunn_mode; 503316485Sdavidcs u8 update_tun_cls; 504316485Sdavidcs u8 vxlan_clss; 505316485Sdavidcs u8 l2gre_clss; 506316485Sdavidcs u8 ipgre_clss; 507316485Sdavidcs u8 l2geneve_clss; 508316485Sdavidcs u8 ipgeneve_clss; 509316485Sdavidcs u8 update_geneve_port; 510316485Sdavidcs u8 update_vxlan_port; 511316485Sdavidcs u16 geneve_port; 512316485Sdavidcs u16 vxlan_port; 513316485Sdavidcs u8 padding[2]; 514316485Sdavidcs}; 515316485Sdavidcs 516316485Sdavidcsstruct pfvf_update_tunn_param_tlv { 517316485Sdavidcs struct pfvf_tlv hdr; 518316485Sdavidcs 519316485Sdavidcs u16 tunn_feature_mask; 520316485Sdavidcs u8 vxlan_mode; 521316485Sdavidcs u8 l2geneve_mode; 522316485Sdavidcs u8 ipgeneve_mode; 523316485Sdavidcs u8 l2gre_mode; 524316485Sdavidcs u8 ipgre_mode; 525316485Sdavidcs u8 vxlan_clss; 526316485Sdavidcs u8 l2gre_clss; 527316485Sdavidcs u8 ipgre_clss; 528316485Sdavidcs u8 l2geneve_clss; 529316485Sdavidcs u8 ipgeneve_clss; 530316485Sdavidcs u16 vxlan_udp_port; 531316485Sdavidcs u16 geneve_udp_port; 532316485Sdavidcs}; 533316485Sdavidcs 534316485Sdavidcsstruct tlv_buffer_size { 535316485Sdavidcs u8 tlv_buffer[TLV_BUFFER_SIZE]; 536316485Sdavidcs}; 537316485Sdavidcs 538316485Sdavidcsstruct vfpf_update_coalesce { 539316485Sdavidcs struct vfpf_first_tlv first_tlv; 540316485Sdavidcs u16 rx_coal; 541316485Sdavidcs u16 tx_coal; 542316485Sdavidcs u16 qid; 543316485Sdavidcs u8 padding[2]; 544316485Sdavidcs}; 545316485Sdavidcs 546337517Sdavidcsstruct vfpf_read_coal_req_tlv { 547337517Sdavidcs struct vfpf_first_tlv first_tlv; 548337517Sdavidcs u16 qid; 549337517Sdavidcs u8 is_rx; 550337517Sdavidcs u8 padding[5]; 551337517Sdavidcs}; 552337517Sdavidcs 553337517Sdavidcsstruct pfvf_read_coal_resp_tlv { 554337517Sdavidcs struct pfvf_tlv hdr; 555337517Sdavidcs u16 coal; 556337517Sdavidcs u8 padding[6]; 557337517Sdavidcs}; 558337517Sdavidcs 559316485Sdavidcsunion vfpf_tlvs { 560316485Sdavidcs struct vfpf_first_tlv first_tlv; 561316485Sdavidcs struct vfpf_acquire_tlv acquire; 562316485Sdavidcs struct vfpf_start_rxq_tlv start_rxq; 563316485Sdavidcs struct vfpf_start_txq_tlv start_txq; 564316485Sdavidcs struct vfpf_stop_rxqs_tlv stop_rxqs; 565316485Sdavidcs struct vfpf_stop_txqs_tlv stop_txqs; 566316485Sdavidcs struct vfpf_update_rxq_tlv update_rxq; 567316485Sdavidcs struct vfpf_vport_start_tlv start_vport; 568316485Sdavidcs struct vfpf_vport_update_tlv vport_update; 569316485Sdavidcs struct vfpf_ucast_filter_tlv ucast_filter; 570316485Sdavidcs struct vfpf_update_tunn_param_tlv tunn_param_update; 571316485Sdavidcs struct vfpf_update_coalesce update_coalesce; 572337517Sdavidcs struct vfpf_read_coal_req_tlv read_coal_req; 573316485Sdavidcs struct tlv_buffer_size tlv_buf_size; 574316485Sdavidcs}; 575316485Sdavidcs 576316485Sdavidcsunion pfvf_tlvs { 577316485Sdavidcs struct pfvf_def_resp_tlv default_resp; 578316485Sdavidcs struct pfvf_acquire_resp_tlv acquire_resp; 579316485Sdavidcs struct tlv_buffer_size tlv_buf_size; 580316485Sdavidcs struct pfvf_start_queue_resp_tlv queue_start; 581316485Sdavidcs struct pfvf_update_tunn_param_tlv tunn_param_resp; 582337517Sdavidcs struct pfvf_read_coal_resp_tlv read_coal_resp; 583316485Sdavidcs}; 584316485Sdavidcs 585316485Sdavidcs/* This is a structure which is allocated in the VF, which the PF may update 586316485Sdavidcs * when it deems it necessary to do so. The bulletin board is sampled 587316485Sdavidcs * periodically by the VF. A copy per VF is maintained in the PF (to prevent 588316485Sdavidcs * loss of data upon multiple updates (or the need for read modify write)). 589316485Sdavidcs */ 590316485Sdavidcsenum ecore_bulletin_bit { 591316485Sdavidcs /* Alert the VF that a forced MAC was set by the PF */ 592316485Sdavidcs MAC_ADDR_FORCED = 0, 593316485Sdavidcs 594316485Sdavidcs /* The VF should not access the vfpf channel */ 595316485Sdavidcs VFPF_CHANNEL_INVALID = 1, 596316485Sdavidcs 597316485Sdavidcs /* Alert the VF that a forced VLAN was set by the PF */ 598316485Sdavidcs VLAN_ADDR_FORCED = 2, 599316485Sdavidcs 600316485Sdavidcs /* Indicate that `default_only_untagged' contains actual data */ 601316485Sdavidcs VFPF_BULLETIN_UNTAGGED_DEFAULT = 3, 602316485Sdavidcs VFPF_BULLETIN_UNTAGGED_DEFAULT_FORCED = 4, 603316485Sdavidcs 604316485Sdavidcs /* Alert the VF that suggested mac was sent by the PF. 605316485Sdavidcs * MAC_ADDR will be disabled in case MAC_ADDR_FORCED is set 606316485Sdavidcs */ 607316485Sdavidcs VFPF_BULLETIN_MAC_ADDR = 5 608316485Sdavidcs}; 609316485Sdavidcs 610316485Sdavidcsstruct ecore_bulletin_content { 611316485Sdavidcs /* crc of structure to ensure is not in mid-update */ 612316485Sdavidcs u32 crc; 613316485Sdavidcs 614316485Sdavidcs u32 version; 615316485Sdavidcs 616316485Sdavidcs /* bitmap indicating which fields hold valid values */ 617316485Sdavidcs u64 valid_bitmap; 618316485Sdavidcs 619316485Sdavidcs /* used for MAC_ADDR or MAC_ADDR_FORCED */ 620316485Sdavidcs u8 mac[ETH_ALEN]; 621316485Sdavidcs 622316485Sdavidcs /* If valid, 1 => only untagged Rx if no vlan is configured */ 623316485Sdavidcs u8 default_only_untagged; 624316485Sdavidcs u8 padding; 625316485Sdavidcs 626316485Sdavidcs /* The following is a 'copy' of ecore_mcp_link_state, 627316485Sdavidcs * ecore_mcp_link_params and ecore_mcp_link_capabilities. Since it's 628316485Sdavidcs * possible the structs will increase further along the road we cannot 629316485Sdavidcs * have it here; Instead we need to have all of its fields. 630316485Sdavidcs */ 631316485Sdavidcs u8 req_autoneg; 632316485Sdavidcs u8 req_autoneg_pause; 633316485Sdavidcs u8 req_forced_rx; 634316485Sdavidcs u8 req_forced_tx; 635316485Sdavidcs u8 padding2[4]; 636316485Sdavidcs 637316485Sdavidcs u32 req_adv_speed; 638316485Sdavidcs u32 req_forced_speed; 639316485Sdavidcs u32 req_loopback; 640316485Sdavidcs u32 padding3; 641316485Sdavidcs 642316485Sdavidcs u8 link_up; 643316485Sdavidcs u8 full_duplex; 644316485Sdavidcs u8 autoneg; 645316485Sdavidcs u8 autoneg_complete; 646316485Sdavidcs u8 parallel_detection; 647316485Sdavidcs u8 pfc_enabled; 648316485Sdavidcs u8 partner_tx_flow_ctrl_en; 649316485Sdavidcs u8 partner_rx_flow_ctrl_en; 650316485Sdavidcs 651316485Sdavidcs u8 partner_adv_pause; 652316485Sdavidcs u8 sfp_tx_fault; 653316485Sdavidcs u16 vxlan_udp_port; 654316485Sdavidcs u16 geneve_udp_port; 655316485Sdavidcs u8 padding4[2]; 656316485Sdavidcs 657316485Sdavidcs u32 speed; 658316485Sdavidcs u32 partner_adv_speed; 659316485Sdavidcs 660316485Sdavidcs u32 capability_speed; 661316485Sdavidcs 662316485Sdavidcs /* Forced vlan */ 663316485Sdavidcs u16 pvid; 664316485Sdavidcs u16 padding5; 665316485Sdavidcs}; 666316485Sdavidcs 667316485Sdavidcsstruct ecore_bulletin { 668316485Sdavidcs dma_addr_t phys; 669316485Sdavidcs struct ecore_bulletin_content *p_virt; 670316485Sdavidcs u32 size; 671316485Sdavidcs}; 672316485Sdavidcs 673316485Sdavidcsenum { 674316485Sdavidcs/*!!!!! Make sure to update STRINGS structure accordingly !!!!!*/ 675316485Sdavidcs 676316485Sdavidcs CHANNEL_TLV_NONE, /* ends tlv sequence */ 677316485Sdavidcs CHANNEL_TLV_ACQUIRE, 678316485Sdavidcs CHANNEL_TLV_VPORT_START, 679316485Sdavidcs CHANNEL_TLV_VPORT_UPDATE, 680316485Sdavidcs CHANNEL_TLV_VPORT_TEARDOWN, 681316485Sdavidcs CHANNEL_TLV_START_RXQ, 682316485Sdavidcs CHANNEL_TLV_START_TXQ, 683316485Sdavidcs CHANNEL_TLV_STOP_RXQS, 684316485Sdavidcs CHANNEL_TLV_STOP_TXQS, 685316485Sdavidcs CHANNEL_TLV_UPDATE_RXQ, 686316485Sdavidcs CHANNEL_TLV_INT_CLEANUP, 687316485Sdavidcs CHANNEL_TLV_CLOSE, 688316485Sdavidcs CHANNEL_TLV_RELEASE, 689316485Sdavidcs CHANNEL_TLV_LIST_END, 690316485Sdavidcs CHANNEL_TLV_UCAST_FILTER, 691316485Sdavidcs CHANNEL_TLV_VPORT_UPDATE_ACTIVATE, 692316485Sdavidcs CHANNEL_TLV_VPORT_UPDATE_TX_SWITCH, 693316485Sdavidcs CHANNEL_TLV_VPORT_UPDATE_VLAN_STRIP, 694316485Sdavidcs CHANNEL_TLV_VPORT_UPDATE_MCAST, 695316485Sdavidcs CHANNEL_TLV_VPORT_UPDATE_ACCEPT_PARAM, 696316485Sdavidcs CHANNEL_TLV_VPORT_UPDATE_RSS, 697316485Sdavidcs CHANNEL_TLV_VPORT_UPDATE_ACCEPT_ANY_VLAN, 698316485Sdavidcs CHANNEL_TLV_VPORT_UPDATE_SGE_TPA, 699316485Sdavidcs CHANNEL_TLV_UPDATE_TUNN_PARAM, 700316485Sdavidcs CHANNEL_TLV_COALESCE_UPDATE, 701316485Sdavidcs CHANNEL_TLV_QID, 702337517Sdavidcs CHANNEL_TLV_COALESCE_READ, 703316485Sdavidcs CHANNEL_TLV_MAX, 704316485Sdavidcs 705316485Sdavidcs /* Required for iterating over vport-update tlvs. 706316485Sdavidcs * Will break in case non-sequential vport-update tlvs. 707316485Sdavidcs */ 708316485Sdavidcs CHANNEL_TLV_VPORT_UPDATE_MAX = CHANNEL_TLV_VPORT_UPDATE_SGE_TPA + 1, 709316485Sdavidcs 710316485Sdavidcs/*!!!!! Make sure to update STRINGS structure accordingly !!!!!*/ 711316485Sdavidcs}; 712316485Sdavidcsextern const char *ecore_channel_tlvs_string[]; 713316485Sdavidcs 714316485Sdavidcs#endif /* __ECORE_VF_PF_IF_H__ */ 715