2 * Copyright (c) 2017-2018 Cavium, Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
32 #ifndef __ECORE_VF_PF_IF_H__
33 #define __ECORE_VF_PF_IF_H__
35 #define T_ETH_INDIRECTION_TABLE_SIZE 128 /* @@@ TBD MichalK this should be HSI? */
36 #define T_ETH_RSS_KEY_SIZE 10 /* @@@ TBD this should be HSI? */
39 #define ETH_ALEN 6 /* @@@ TBD MichalK - should this be defined here?*/
43 /***********************************************
45 * Common definitions for all HVs
48 struct vf_pf_resc_request {
54 u8 num_mc_filters; /* No limit so superfluous */
60 u16 hw_sb_id; /* aka absolute igu id, used to ack the sb */
61 u8 sb_qid; /* used to update DHC for sb */
65 /***********************************************
67 * HW VF-PF channel definitions
72 #define TLV_BUFFER_SIZE 1024
74 /* vf pf channel tlvs */
75 /* general tlv header (used for both vf->pf request and pf->vf response) */
81 /* header of first vf->pf tlv carries the offset used to calculate reponse
84 struct vfpf_first_tlv {
85 struct channel_tlv tl;
90 /* header of pf->vf tlvs, carries the status of handling the request */
92 struct channel_tlv tl;
97 /* response tlv used for most tlvs */
98 struct pfvf_def_resp_tlv {
102 /* used to terminate and pad a tlv list */
103 struct channel_list_end_tlv {
104 struct channel_tlv tl;
109 struct vfpf_acquire_tlv {
110 struct vfpf_first_tlv first_tlv;
112 struct vf_pf_vfdev_info {
114 /* First bit was used on 8.7.x and 8.8.x versions, which had different
115 * FWs used but with the same faspath HSI. As this was prior to the
116 * fastpath versioning, wanted to have ability to override fw matching
117 * and allow them to interact.
120 #define VFPF_ACQUIRE_CAP_PRE_FP_HSI (1 << 0) /* VF pre-FP hsi version */
121 #define VFPF_ACQUIRE_CAP_100G (1 << 1) /* VF can support 100g */
123 /* A requirement for supporting multi-Tx queues on a single queue-zone,
124 * VF would pass qids as additional information whenever passing queue
126 * TODO - due to the CID limitations in Bar0, VFs currently don't pass
127 * this, and use the legacy CID scheme.
129 #define VFPF_ACQUIRE_CAP_QUEUE_QIDS (1 << 2)
131 /* The VF is using the physical bar. While this is mostly internal
132 * to the VF, might affect the number of CIDs supported assuming
135 #define VFPF_ACQUIRE_CAP_PHYSICAL_BAR (1 << 3)
142 u16 opaque_fid; /* ME register value */
143 u8 os_type; /* VFPF_ACQUIRE_OS_* value */
149 struct vf_pf_resc_request resc_request;
156 /* receive side scaling tlv */
157 struct vfpf_vport_update_rss_tlv {
158 struct channel_tlv tl;
161 #define VFPF_UPDATE_RSS_CONFIG_FLAG (1 << 0)
162 #define VFPF_UPDATE_RSS_CAPS_FLAG (1 << 1)
163 #define VFPF_UPDATE_RSS_IND_TABLE_FLAG (1 << 2)
164 #define VFPF_UPDATE_RSS_KEY_FLAG (1 << 3)
168 u8 rss_table_size_log; /* The table size is 2 ^ rss_table_size_log */
169 u16 rss_ind_table[T_ETH_INDIRECTION_TABLE_SIZE];
170 u32 rss_key[T_ETH_RSS_KEY_SIZE];
173 struct pfvf_storm_stats {
178 struct pfvf_stats_info {
179 struct pfvf_storm_stats mstats;
180 struct pfvf_storm_stats pstats;
181 struct pfvf_storm_stats tstats;
182 struct pfvf_storm_stats ustats;
185 /* acquire response tlv - carries the allocated resources */
186 struct pfvf_acquire_resp_tlv {
189 struct pf_vf_pfdev_info {
199 #define PFVF_ACQUIRE_CAP_DEFAULT_UNTAGGED (1 << 0)
200 #define PFVF_ACQUIRE_CAP_100G (1 << 1) /* If set, 100g PF */
201 /* There are old PF versions where the PF might mistakenly override the sanity
202 * mechanism [version-based] and allow a VF that can't be supported to pass
203 * the acquisition phase.
204 * To overcome this, PFs now indicate that they're past that point and the new
205 * VFs would fail probe on the older PFs that fail to do so.
208 /* Said bug was in quest/serpens; Can't be certain no official release included
209 * the bug since the fix arrived very late in the programs.
212 #define PFVF_ACQUIRE_CAP_POST_FW_OVERRIDE (1 << 2)
214 /* PF expects queues to be received with additional qids */
215 #define PFVF_ACQUIRE_CAP_QUEUE_QIDS (1 << 3)
221 /* These should match the PF's ecore_dev values */
225 /* Doorbell bar size configured in HW: log(size) or 0 */
228 struct pfvf_stats_info stats_info;
230 u8 port_mac[ETH_ALEN];
232 /* It's possible PF had to configure an older fastpath HSI
233 * [in case VF is newer than PF]. This is communicated back
234 * to the VF. It can also be used in case of error due to
235 * non-matching versions to shed light in VF about failure.
242 /* in case of status NO_RESOURCE in message hdr, pf will fill
243 * this struct with suggested amount of resources for next
246 #define PFVF_MAX_QUEUES_PER_VF 16
247 #define PFVF_MAX_SBS_PER_VF 16
248 struct hw_sb_info hw_sbs[PFVF_MAX_SBS_PER_VF];
249 u8 hw_qid[PFVF_MAX_QUEUES_PER_VF];
250 u8 cid[PFVF_MAX_QUEUES_PER_VF];
266 struct pfvf_start_queue_resp_tlv {
268 u32 offset; /* offset to consumer/producer of queue */
272 /* Extended queue information - additional index for reference inside qzone.
273 * If commmunicated between VF/PF, each TLV relating to queues should be
274 * extended by one such [or have a future base TLV that already contains info].
276 struct vfpf_qid_tlv {
277 struct channel_tlv tl;
283 struct vfpf_start_rxq_tlv {
284 struct vfpf_first_tlv first_tlv;
286 /* physical addresses */
288 u64 deprecated_sge_addr;
294 u16 hc_rate; /* desired interrupts per sec. */
303 struct vfpf_start_txq_tlv {
304 struct vfpf_first_tlv first_tlv;
306 /* physical addresses */
313 u32 flags; /* VFPF_QUEUE_FLG_X flags */
314 u16 hc_rate; /* desired interrupts per sec. */
320 struct vfpf_stop_rxqs_tlv {
321 struct vfpf_first_tlv first_tlv;
325 /* While the API supports multiple Rx-queues on a single TLV
326 * message, in practice older VFs always used it as one [ecore].
327 * And there are PFs [starting with the CHANNEL_TLV_QID] which
328 * would start assuming this is always a '1'. So in practice this
329 * field should be considered deprecated and *Always* set to '1'.
338 struct vfpf_stop_txqs_tlv {
339 struct vfpf_first_tlv first_tlv;
343 /* While the API supports multiple Tx-queues on a single TLV
344 * message, in practice older VFs always used it as one [ecore].
345 * And there are PFs [starting with the CHANNEL_TLV_QID] which
346 * would start assuming this is always a '1'. So in practice this
347 * field should be considered deprecated and *Always* set to '1'.
353 struct vfpf_update_rxq_tlv {
354 struct vfpf_first_tlv first_tlv;
356 u64 deprecated_sge_addr[PFVF_MAX_QUEUES_PER_VF];
361 #define VFPF_RXQ_UPD_INIT_SGE_DEPRECATE_FLAG (1 << 0)
362 #define VFPF_RXQ_UPD_COMPLETE_CQE_FLAG (1 << 1)
363 #define VFPF_RXQ_UPD_COMPLETE_EVENT_FLAG (1 << 2)
368 /* Set Queue Filters */
369 struct vfpf_q_mac_vlan_filter {
371 #define VFPF_Q_FILTER_DEST_MAC_VALID 0x01
372 #define VFPF_Q_FILTER_VLAN_TAG_VALID 0x02
373 #define VFPF_Q_FILTER_SET_MAC 0x100 /* set/clear */
382 struct vfpf_vport_start_tlv {
383 struct vfpf_first_tlv first_tlv;
385 u64 sb_addr[PFVF_MAX_SBS_PER_VF];
392 u8 inner_vlan_removal;
395 u8 max_buffers_per_cqe;
397 u8 zero_placement_offset;
401 /* Extended tlvs - need to add rss, mcast, accept mode tlvs */
402 struct vfpf_vport_update_activate_tlv {
403 struct channel_tlv tl;
410 struct vfpf_vport_update_tx_switch_tlv {
411 struct channel_tlv tl;
416 struct vfpf_vport_update_vlan_strip_tlv {
417 struct channel_tlv tl;
422 struct vfpf_vport_update_mcast_bin_tlv {
423 struct channel_tlv tl;
426 /* This was a mistake; There are only 256 approx bins,
427 * and in HSI they're divided into 32-bit values.
428 * As old VFs used to set-bit to the values on its side,
429 * the upper half of the array is never expected to contain any data.
432 u64 obsolete_bins[4];
435 struct vfpf_vport_update_accept_param_tlv {
436 struct channel_tlv tl;
443 struct vfpf_vport_update_accept_any_vlan_tlv {
444 struct channel_tlv tl;
445 u8 update_accept_any_vlan_flg;
451 struct vfpf_vport_update_sge_tpa_tlv {
452 struct channel_tlv tl;
455 #define VFPF_TPA_IPV4_EN_FLAG (1 << 0)
456 #define VFPF_TPA_IPV6_EN_FLAG (1 << 1)
457 #define VFPF_TPA_PKT_SPLIT_FLAG (1 << 2)
458 #define VFPF_TPA_HDR_DATA_SPLIT_FLAG (1 << 3)
459 #define VFPF_TPA_GRO_CONSIST_FLAG (1 << 4)
461 u8 update_sge_tpa_flags;
462 #define VFPF_UPDATE_SGE_DEPRECATED_FLAG (1 << 0)
463 #define VFPF_UPDATE_TPA_EN_FLAG (1 << 1)
464 #define VFPF_UPDATE_TPA_PARAM_FLAG (1 << 2)
466 u8 max_buffers_per_cqe;
468 u16 deprecated_sge_buff_size;
470 u16 tpa_min_size_to_start;
471 u16 tpa_min_size_to_cont;
478 /* Primary tlv as a header for various extended tlvs for
479 * various functionalities in vport update ramrod.
481 struct vfpf_vport_update_tlv {
482 struct vfpf_first_tlv first_tlv;
485 struct vfpf_ucast_filter_tlv {
486 struct vfpf_first_tlv first_tlv;
497 /* tunnel update param tlv */
498 struct vfpf_update_tunn_param_tlv {
499 struct vfpf_first_tlv first_tlv;
501 u8 tun_mode_update_mask;
509 u8 update_geneve_port;
510 u8 update_vxlan_port;
516 struct pfvf_update_tunn_param_tlv {
519 u16 tunn_feature_mask;
534 struct tlv_buffer_size {
535 u8 tlv_buffer[TLV_BUFFER_SIZE];
538 struct vfpf_update_coalesce {
539 struct vfpf_first_tlv first_tlv;
546 struct vfpf_read_coal_req_tlv {
547 struct vfpf_first_tlv first_tlv;
553 struct pfvf_read_coal_resp_tlv {
560 struct vfpf_first_tlv first_tlv;
561 struct vfpf_acquire_tlv acquire;
562 struct vfpf_start_rxq_tlv start_rxq;
563 struct vfpf_start_txq_tlv start_txq;
564 struct vfpf_stop_rxqs_tlv stop_rxqs;
565 struct vfpf_stop_txqs_tlv stop_txqs;
566 struct vfpf_update_rxq_tlv update_rxq;
567 struct vfpf_vport_start_tlv start_vport;
568 struct vfpf_vport_update_tlv vport_update;
569 struct vfpf_ucast_filter_tlv ucast_filter;
570 struct vfpf_update_tunn_param_tlv tunn_param_update;
571 struct vfpf_update_coalesce update_coalesce;
572 struct vfpf_read_coal_req_tlv read_coal_req;
573 struct tlv_buffer_size tlv_buf_size;
577 struct pfvf_def_resp_tlv default_resp;
578 struct pfvf_acquire_resp_tlv acquire_resp;
579 struct tlv_buffer_size tlv_buf_size;
580 struct pfvf_start_queue_resp_tlv queue_start;
581 struct pfvf_update_tunn_param_tlv tunn_param_resp;
582 struct pfvf_read_coal_resp_tlv read_coal_resp;
585 /* This is a structure which is allocated in the VF, which the PF may update
586 * when it deems it necessary to do so. The bulletin board is sampled
587 * periodically by the VF. A copy per VF is maintained in the PF (to prevent
588 * loss of data upon multiple updates (or the need for read modify write)).
590 enum ecore_bulletin_bit {
591 /* Alert the VF that a forced MAC was set by the PF */
594 /* The VF should not access the vfpf channel */
595 VFPF_CHANNEL_INVALID = 1,
597 /* Alert the VF that a forced VLAN was set by the PF */
598 VLAN_ADDR_FORCED = 2,
600 /* Indicate that `default_only_untagged' contains actual data */
601 VFPF_BULLETIN_UNTAGGED_DEFAULT = 3,
602 VFPF_BULLETIN_UNTAGGED_DEFAULT_FORCED = 4,
604 /* Alert the VF that suggested mac was sent by the PF.
605 * MAC_ADDR will be disabled in case MAC_ADDR_FORCED is set
607 VFPF_BULLETIN_MAC_ADDR = 5
610 struct ecore_bulletin_content {
611 /* crc of structure to ensure is not in mid-update */
616 /* bitmap indicating which fields hold valid values */
619 /* used for MAC_ADDR or MAC_ADDR_FORCED */
622 /* If valid, 1 => only untagged Rx if no vlan is configured */
623 u8 default_only_untagged;
626 /* The following is a 'copy' of ecore_mcp_link_state,
627 * ecore_mcp_link_params and ecore_mcp_link_capabilities. Since it's
628 * possible the structs will increase further along the road we cannot
629 * have it here; Instead we need to have all of its fields.
632 u8 req_autoneg_pause;
638 u32 req_forced_speed;
646 u8 parallel_detection;
648 u8 partner_tx_flow_ctrl_en;
649 u8 partner_rx_flow_ctrl_en;
651 u8 partner_adv_pause;
658 u32 partner_adv_speed;
660 u32 capability_speed;
667 struct ecore_bulletin {
669 struct ecore_bulletin_content *p_virt;
674 /*!!!!! Make sure to update STRINGS structure accordingly !!!!!*/
676 CHANNEL_TLV_NONE, /* ends tlv sequence */
678 CHANNEL_TLV_VPORT_START,
679 CHANNEL_TLV_VPORT_UPDATE,
680 CHANNEL_TLV_VPORT_TEARDOWN,
681 CHANNEL_TLV_START_RXQ,
682 CHANNEL_TLV_START_TXQ,
683 CHANNEL_TLV_STOP_RXQS,
684 CHANNEL_TLV_STOP_TXQS,
685 CHANNEL_TLV_UPDATE_RXQ,
686 CHANNEL_TLV_INT_CLEANUP,
689 CHANNEL_TLV_LIST_END,
690 CHANNEL_TLV_UCAST_FILTER,
691 CHANNEL_TLV_VPORT_UPDATE_ACTIVATE,
692 CHANNEL_TLV_VPORT_UPDATE_TX_SWITCH,
693 CHANNEL_TLV_VPORT_UPDATE_VLAN_STRIP,
694 CHANNEL_TLV_VPORT_UPDATE_MCAST,
695 CHANNEL_TLV_VPORT_UPDATE_ACCEPT_PARAM,
696 CHANNEL_TLV_VPORT_UPDATE_RSS,
697 CHANNEL_TLV_VPORT_UPDATE_ACCEPT_ANY_VLAN,
698 CHANNEL_TLV_VPORT_UPDATE_SGE_TPA,
699 CHANNEL_TLV_UPDATE_TUNN_PARAM,
700 CHANNEL_TLV_COALESCE_UPDATE,
702 CHANNEL_TLV_COALESCE_READ,
705 /* Required for iterating over vport-update tlvs.
706 * Will break in case non-sequential vport-update tlvs.
708 CHANNEL_TLV_VPORT_UPDATE_MAX = CHANNEL_TLV_VPORT_UPDATE_SGE_TPA + 1,
710 /*!!!!! Make sure to update STRINGS structure accordingly !!!!!*/
712 extern const char *ecore_channel_tlvs_string[];
714 #endif /* __ECORE_VF_PF_IF_H__ */