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.
31 #ifndef __ECORE_VF_PF_IF_H__
32 #define __ECORE_VF_PF_IF_H__
34 #define T_ETH_INDIRECTION_TABLE_SIZE 128 /* @@@ TBD MichalK this should be HSI? */
35 #define T_ETH_RSS_KEY_SIZE 10 /* @@@ TBD this should be HSI? */
36 #define ETH_ALEN 6 /* @@@ TBD MichalK - should this be defined here?*/
38 /***********************************************
40 * Common definitions for all HVs
43 struct vf_pf_resc_request {
49 u8 num_mc_filters; /* No limit so superfluous */
55 u16 hw_sb_id; /* aka absolute igu id, used to ack the sb */
56 u8 sb_qid; /* used to update DHC for sb */
60 /***********************************************
62 * HW VF-PF channel definitions
67 #define TLV_BUFFER_SIZE 1024
69 /* vf pf channel tlvs */
70 /* general tlv header (used for both vf->pf request and pf->vf response) */
76 /* header of first vf->pf tlv carries the offset used to calculate reponse
79 struct vfpf_first_tlv {
80 struct channel_tlv tl;
85 /* header of pf->vf tlvs, carries the status of handling the request */
87 struct channel_tlv tl;
92 /* response tlv used for most tlvs */
93 struct pfvf_def_resp_tlv {
97 /* used to terminate and pad a tlv list */
98 struct channel_list_end_tlv {
99 struct channel_tlv tl;
104 struct vfpf_acquire_tlv {
105 struct vfpf_first_tlv first_tlv;
107 struct vf_pf_vfdev_info {
108 /* First bit was used on 8.7.x and 8.8.x versions, which had different
109 * FWs used but with the same faspath HSI. As this was prior to the
110 * fastpath versioning, wanted to have ability to override fw matching
111 * and allow them to interact.
113 #define VFPF_ACQUIRE_CAP_PRE_FP_HSI (1 << 0) /* VF pre-FP hsi version */
114 #define VFPF_ACQUIRE_CAP_100G (1 << 1) /* VF can support 100g */
116 /* A requirement for supporting multi-Tx queues on a single queue-zone,
117 * VF would pass qids as additional information whenever passing queue
119 * TODO - due to the CID limitations in Bar0, VFs currently don't pass
120 * this, and use the legacy CID scheme.
122 #define VFPF_ACQUIRE_CAP_QUEUE_QIDS (1 << 2)
129 u16 opaque_fid; /* ME register value */
130 u8 os_type; /* VFPF_ACQUIRE_OS_* value */
136 struct vf_pf_resc_request resc_request;
143 /* receive side scaling tlv */
144 struct vfpf_vport_update_rss_tlv {
145 struct channel_tlv tl;
148 #define VFPF_UPDATE_RSS_CONFIG_FLAG (1 << 0)
149 #define VFPF_UPDATE_RSS_CAPS_FLAG (1 << 1)
150 #define VFPF_UPDATE_RSS_IND_TABLE_FLAG (1 << 2)
151 #define VFPF_UPDATE_RSS_KEY_FLAG (1 << 3)
155 u8 rss_table_size_log; /* The table size is 2 ^ rss_table_size_log */
156 u16 rss_ind_table[T_ETH_INDIRECTION_TABLE_SIZE];
157 u32 rss_key[T_ETH_RSS_KEY_SIZE];
160 struct pfvf_storm_stats {
165 struct pfvf_stats_info {
166 struct pfvf_storm_stats mstats;
167 struct pfvf_storm_stats pstats;
168 struct pfvf_storm_stats tstats;
169 struct pfvf_storm_stats ustats;
172 /* acquire response tlv - carries the allocated resources */
173 struct pfvf_acquire_resp_tlv {
176 struct pf_vf_pfdev_info {
186 #define PFVF_ACQUIRE_CAP_DEFAULT_UNTAGGED (1 << 0)
187 #define PFVF_ACQUIRE_CAP_100G (1 << 1) /* If set, 100g PF */
188 /* There are old PF versions where the PF might mistakenly override the sanity
189 * mechanism [version-based] and allow a VF that can't be supported to pass
190 * the acquisition phase.
191 * To overcome this, PFs now indicate that they're past that point and the new
192 * VFs would fail probe on the older PFs that fail to do so.
194 #define PFVF_ACQUIRE_CAP_POST_FW_OVERRIDE (1 << 2)
196 /* PF expects queues to be received with additional qids */
197 #define PFVF_ACQUIRE_CAP_QUEUE_QIDS (1 << 3)
203 /* These should match the PF's ecore_dev values */
209 struct pfvf_stats_info stats_info;
211 u8 port_mac[ETH_ALEN];
213 /* It's possible PF had to configure an older fastpath HSI
214 * [in case VF is newer than PF]. This is communicated back
215 * to the VF. It can also be used in case of error due to
216 * non-matching versions to shed light in VF about failure.
223 /* in case of status NO_RESOURCE in message hdr, pf will fill
224 * this struct with suggested amount of resources for next
227 #define PFVF_MAX_QUEUES_PER_VF 16
228 #define PFVF_MAX_SBS_PER_VF 16
229 struct hw_sb_info hw_sbs[PFVF_MAX_SBS_PER_VF];
230 u8 hw_qid[PFVF_MAX_QUEUES_PER_VF];
231 u8 cid[PFVF_MAX_QUEUES_PER_VF];
247 struct pfvf_start_queue_resp_tlv {
249 u32 offset; /* offset to consumer/producer of queue */
253 /* Extended queue information - additional index for reference inside qzone.
254 * If commmunicated between VF/PF, each TLV relating to queues should be
255 * extended by one such [or have a future base TLV that already contains info].
257 struct vfpf_qid_tlv {
258 struct channel_tlv tl;
264 struct vfpf_start_rxq_tlv {
265 struct vfpf_first_tlv first_tlv;
267 /* physical addresses */
269 u64 deprecated_sge_addr;
275 u16 hc_rate; /* desired interrupts per sec. */
284 struct vfpf_start_txq_tlv {
285 struct vfpf_first_tlv first_tlv;
287 /* physical addresses */
294 u32 flags; /* VFPF_QUEUE_FLG_X flags */
295 u16 hc_rate; /* desired interrupts per sec. */
301 struct vfpf_stop_rxqs_tlv {
302 struct vfpf_first_tlv first_tlv;
306 /* While the API supports multiple Rx-queues on a single TLV
307 * message, in practice older VFs always used it as one [ecore].
308 * And there are PFs [starting with the CHANNEL_TLV_QID] which
309 * would start assuming this is always a '1'. So in practice this
310 * field should be considered deprecated and *Always* set to '1'.
319 struct vfpf_stop_txqs_tlv {
320 struct vfpf_first_tlv first_tlv;
324 /* While the API supports multiple Tx-queues on a single TLV
325 * message, in practice older VFs always used it as one [ecore].
326 * And there are PFs [starting with the CHANNEL_TLV_QID] which
327 * would start assuming this is always a '1'. So in practice this
328 * field should be considered deprecated and *Always* set to '1'.
334 struct vfpf_update_rxq_tlv {
335 struct vfpf_first_tlv first_tlv;
337 u64 deprecated_sge_addr[PFVF_MAX_QUEUES_PER_VF];
342 #define VFPF_RXQ_UPD_INIT_SGE_DEPRECATE_FLAG (1 << 0)
343 #define VFPF_RXQ_UPD_COMPLETE_CQE_FLAG (1 << 1)
344 #define VFPF_RXQ_UPD_COMPLETE_EVENT_FLAG (1 << 2)
349 /* Set Queue Filters */
350 struct vfpf_q_mac_vlan_filter {
352 #define VFPF_Q_FILTER_DEST_MAC_VALID 0x01
353 #define VFPF_Q_FILTER_VLAN_TAG_VALID 0x02
354 #define VFPF_Q_FILTER_SET_MAC 0x100 /* set/clear */
363 struct vfpf_vport_start_tlv {
364 struct vfpf_first_tlv first_tlv;
366 u64 sb_addr[PFVF_MAX_SBS_PER_VF];
373 u8 inner_vlan_removal;
376 u8 max_buffers_per_cqe;
381 /* Extended tlvs - need to add rss, mcast, accept mode tlvs */
382 struct vfpf_vport_update_activate_tlv {
383 struct channel_tlv tl;
390 struct vfpf_vport_update_tx_switch_tlv {
391 struct channel_tlv tl;
396 struct vfpf_vport_update_vlan_strip_tlv {
397 struct channel_tlv tl;
402 struct vfpf_vport_update_mcast_bin_tlv {
403 struct channel_tlv tl;
409 struct vfpf_vport_update_accept_param_tlv {
410 struct channel_tlv tl;
417 struct vfpf_vport_update_accept_any_vlan_tlv {
418 struct channel_tlv tl;
419 u8 update_accept_any_vlan_flg;
425 struct vfpf_vport_update_sge_tpa_tlv {
426 struct channel_tlv tl;
429 #define VFPF_TPA_IPV4_EN_FLAG (1 << 0)
430 #define VFPF_TPA_IPV6_EN_FLAG (1 << 1)
431 #define VFPF_TPA_PKT_SPLIT_FLAG (1 << 2)
432 #define VFPF_TPA_HDR_DATA_SPLIT_FLAG (1 << 3)
433 #define VFPF_TPA_GRO_CONSIST_FLAG (1 << 4)
435 u8 update_sge_tpa_flags;
436 #define VFPF_UPDATE_SGE_DEPRECATED_FLAG (1 << 0)
437 #define VFPF_UPDATE_TPA_EN_FLAG (1 << 1)
438 #define VFPF_UPDATE_TPA_PARAM_FLAG (1 << 2)
440 u8 max_buffers_per_cqe;
442 u16 deprecated_sge_buff_size;
444 u16 tpa_min_size_to_start;
445 u16 tpa_min_size_to_cont;
452 /* Primary tlv as a header for various extended tlvs for
453 * various functionalities in vport update ramrod.
455 struct vfpf_vport_update_tlv {
456 struct vfpf_first_tlv first_tlv;
459 struct vfpf_ucast_filter_tlv {
460 struct vfpf_first_tlv first_tlv;
471 /* tunnel update param tlv */
472 struct vfpf_update_tunn_param_tlv {
473 struct vfpf_first_tlv first_tlv;
475 u8 tun_mode_update_mask;
483 u8 update_geneve_port;
484 u8 update_vxlan_port;
490 struct pfvf_update_tunn_param_tlv {
493 u16 tunn_feature_mask;
508 struct tlv_buffer_size {
509 u8 tlv_buffer[TLV_BUFFER_SIZE];
512 struct vfpf_update_coalesce {
513 struct vfpf_first_tlv first_tlv;
521 struct vfpf_first_tlv first_tlv;
522 struct vfpf_acquire_tlv acquire;
523 struct vfpf_start_rxq_tlv start_rxq;
524 struct vfpf_start_txq_tlv start_txq;
525 struct vfpf_stop_rxqs_tlv stop_rxqs;
526 struct vfpf_stop_txqs_tlv stop_txqs;
527 struct vfpf_update_rxq_tlv update_rxq;
528 struct vfpf_vport_start_tlv start_vport;
529 struct vfpf_vport_update_tlv vport_update;
530 struct vfpf_ucast_filter_tlv ucast_filter;
531 struct vfpf_update_tunn_param_tlv tunn_param_update;
532 struct vfpf_update_coalesce update_coalesce;
533 struct tlv_buffer_size tlv_buf_size;
537 struct pfvf_def_resp_tlv default_resp;
538 struct pfvf_acquire_resp_tlv acquire_resp;
539 struct tlv_buffer_size tlv_buf_size;
540 struct pfvf_start_queue_resp_tlv queue_start;
541 struct pfvf_update_tunn_param_tlv tunn_param_resp;
544 /* This is a structure which is allocated in the VF, which the PF may update
545 * when it deems it necessary to do so. The bulletin board is sampled
546 * periodically by the VF. A copy per VF is maintained in the PF (to prevent
547 * loss of data upon multiple updates (or the need for read modify write)).
549 enum ecore_bulletin_bit {
550 /* Alert the VF that a forced MAC was set by the PF */
553 /* The VF should not access the vfpf channel */
554 VFPF_CHANNEL_INVALID = 1,
556 /* Alert the VF that a forced VLAN was set by the PF */
557 VLAN_ADDR_FORCED = 2,
559 /* Indicate that `default_only_untagged' contains actual data */
560 VFPF_BULLETIN_UNTAGGED_DEFAULT = 3,
561 VFPF_BULLETIN_UNTAGGED_DEFAULT_FORCED = 4,
563 /* Alert the VF that suggested mac was sent by the PF.
564 * MAC_ADDR will be disabled in case MAC_ADDR_FORCED is set
566 VFPF_BULLETIN_MAC_ADDR = 5
569 struct ecore_bulletin_content {
570 /* crc of structure to ensure is not in mid-update */
575 /* bitmap indicating which fields hold valid values */
578 /* used for MAC_ADDR or MAC_ADDR_FORCED */
581 /* If valid, 1 => only untagged Rx if no vlan is configured */
582 u8 default_only_untagged;
585 /* The following is a 'copy' of ecore_mcp_link_state,
586 * ecore_mcp_link_params and ecore_mcp_link_capabilities. Since it's
587 * possible the structs will increase further along the road we cannot
588 * have it here; Instead we need to have all of its fields.
591 u8 req_autoneg_pause;
597 u32 req_forced_speed;
605 u8 parallel_detection;
607 u8 partner_tx_flow_ctrl_en;
608 u8 partner_rx_flow_ctrl_en;
610 u8 partner_adv_pause;
617 u32 partner_adv_speed;
619 u32 capability_speed;
626 struct ecore_bulletin {
628 struct ecore_bulletin_content *p_virt;
633 /*!!!!! Make sure to update STRINGS structure accordingly !!!!!*/
635 CHANNEL_TLV_NONE, /* ends tlv sequence */
637 CHANNEL_TLV_VPORT_START,
638 CHANNEL_TLV_VPORT_UPDATE,
639 CHANNEL_TLV_VPORT_TEARDOWN,
640 CHANNEL_TLV_START_RXQ,
641 CHANNEL_TLV_START_TXQ,
642 CHANNEL_TLV_STOP_RXQS,
643 CHANNEL_TLV_STOP_TXQS,
644 CHANNEL_TLV_UPDATE_RXQ,
645 CHANNEL_TLV_INT_CLEANUP,
648 CHANNEL_TLV_LIST_END,
649 CHANNEL_TLV_UCAST_FILTER,
650 CHANNEL_TLV_VPORT_UPDATE_ACTIVATE,
651 CHANNEL_TLV_VPORT_UPDATE_TX_SWITCH,
652 CHANNEL_TLV_VPORT_UPDATE_VLAN_STRIP,
653 CHANNEL_TLV_VPORT_UPDATE_MCAST,
654 CHANNEL_TLV_VPORT_UPDATE_ACCEPT_PARAM,
655 CHANNEL_TLV_VPORT_UPDATE_RSS,
656 CHANNEL_TLV_VPORT_UPDATE_ACCEPT_ANY_VLAN,
657 CHANNEL_TLV_VPORT_UPDATE_SGE_TPA,
658 CHANNEL_TLV_UPDATE_TUNN_PARAM,
659 CHANNEL_TLV_COALESCE_UPDATE,
663 /* Required for iterating over vport-update tlvs.
664 * Will break in case non-sequential vport-update tlvs.
666 CHANNEL_TLV_VPORT_UPDATE_MAX = CHANNEL_TLV_VPORT_UPDATE_SGE_TPA + 1,
668 /*!!!!! Make sure to update STRINGS structure accordingly !!!!!*/
670 extern const char *ecore_channel_tlvs_string[];
672 #endif /* __ECORE_VF_PF_IF_H__ */