2 * Copyright (c) 2016 QLogic Corporation.
6 * See LICENSE.qede_pmd for copyright and licensing details.
9 #ifndef __ECORE_VF_PF_IF_H__
10 #define __ECORE_VF_PF_IF_H__
12 /* @@@ TBD MichalK this should be HSI? */
13 #define T_ETH_INDIRECTION_TABLE_SIZE 128
14 #define T_ETH_RSS_KEY_SIZE 10 /* @@@ TBD this should be HSI? */
16 /***********************************************
18 * Common definitions for all HVs
21 struct vf_pf_resc_request {
27 u8 num_mc_filters; /* No limit so superfluous */
33 u16 hw_sb_id; /* aka absolute igu id, used to ack the sb */
34 u8 sb_qid; /* used to update DHC for sb */
38 /***********************************************
40 * HW VF-PF channel definitions
45 #define TLV_BUFFER_SIZE 1024
47 /* vf pf channel tlvs */
48 /* general tlv header (used for both vf->pf request and pf->vf response) */
54 /* header of first vf->pf tlv carries the offset used to calculate response
57 struct vfpf_first_tlv {
58 struct channel_tlv tl;
63 /* header of pf->vf tlvs, carries the status of handling the request */
65 struct channel_tlv tl;
70 /* response tlv used for most tlvs */
71 struct pfvf_def_resp_tlv {
75 /* used to terminate and pad a tlv list */
76 struct channel_list_end_tlv {
77 struct channel_tlv tl;
82 struct vfpf_acquire_tlv {
83 struct vfpf_first_tlv first_tlv;
85 struct vf_pf_vfdev_info {
87 /* First bit was used on 8.7.x and 8.8.x versions, which had different
88 * FWs used but with the same faspath HSI. As this was prior to the
89 * fastpath versioning, wanted to have ability to override fw matching
90 * and allow them to interact.
93 /* VF pre-FP hsi version */
94 #define VFPF_ACQUIRE_CAP_PRE_FP_HSI (1 << 0)
95 #define VFPF_ACQUIRE_CAP_100G (1 << 1) /* VF can support 100g */
97 /* A requirement for supporting multi-Tx queues on a single queue-zone,
98 * VF would pass qids as additional information whenever passing queue
100 * TODO - due to the CID limitations in Bar0, VFs currently don't pass
101 * this, and use the legacy CID scheme.
103 #define VFPF_ACQUIRE_CAP_QUEUE_QIDS (1 << 2)
105 /* The VF is using the physical bar. While this is mostly internal
106 * to the VF, might affect the number of CIDs supported assuming
109 #define VFPF_ACQUIRE_CAP_PHYSICAL_BAR (1 << 3)
116 u16 opaque_fid; /* ME register value */
117 u8 os_type; /* VFPF_ACQUIRE_OS_* value */
123 struct vf_pf_resc_request resc_request;
130 /* receive side scaling tlv */
131 struct vfpf_vport_update_rss_tlv {
132 struct channel_tlv tl;
135 #define VFPF_UPDATE_RSS_CONFIG_FLAG (1 << 0)
136 #define VFPF_UPDATE_RSS_CAPS_FLAG (1 << 1)
137 #define VFPF_UPDATE_RSS_IND_TABLE_FLAG (1 << 2)
138 #define VFPF_UPDATE_RSS_KEY_FLAG (1 << 3)
142 u8 rss_table_size_log; /* The table size is 2 ^ rss_table_size_log */
143 u16 rss_ind_table[T_ETH_INDIRECTION_TABLE_SIZE];
144 u32 rss_key[T_ETH_RSS_KEY_SIZE];
147 struct pfvf_storm_stats {
152 struct pfvf_stats_info {
153 struct pfvf_storm_stats mstats;
154 struct pfvf_storm_stats pstats;
155 struct pfvf_storm_stats tstats;
156 struct pfvf_storm_stats ustats;
159 /* acquire response tlv - carries the allocated resources */
160 struct pfvf_acquire_resp_tlv {
163 struct pf_vf_pfdev_info {
173 #define PFVF_ACQUIRE_CAP_DEFAULT_UNTAGGED (1 << 0)
174 #define PFVF_ACQUIRE_CAP_100G (1 << 1) /* If set, 100g PF */
175 /* There are old PF versions where the PF might mistakenly override the sanity
176 * mechanism [version-based] and allow a VF that can't be supported to pass
177 * the acquisition phase.
178 * To overcome this, PFs now indicate that they're past that point and the new
179 * VFs would fail probe on the older PFs that fail to do so.
182 /* Said bug was in quest/serpens; Can't be certain no official release included
183 * the bug since the fix arrived very late in the programs.
186 #define PFVF_ACQUIRE_CAP_POST_FW_OVERRIDE (1 << 2)
188 /* PF expects queues to be received with additional qids */
189 #define PFVF_ACQUIRE_CAP_QUEUE_QIDS (1 << 3)
195 /* These should match the PF's ecore_dev values */
199 /* Doorbell bar size configured in HW: log(size) or 0 */
202 struct pfvf_stats_info stats_info;
204 u8 port_mac[ETH_ALEN];
206 /* It's possible PF had to configure an older fastpath HSI
207 * [in case VF is newer than PF]. This is communicated back
208 * to the VF. It can also be used in case of error due to
209 * non-matching versions to shed light in VF about failure.
216 /* in case of status NO_RESOURCE in message hdr, pf will fill
217 * this struct with suggested amount of resources for next
220 #define PFVF_MAX_QUEUES_PER_VF 16
221 #define PFVF_MAX_SBS_PER_VF 16
222 struct hw_sb_info hw_sbs[PFVF_MAX_SBS_PER_VF];
223 u8 hw_qid[PFVF_MAX_QUEUES_PER_VF];
224 u8 cid[PFVF_MAX_QUEUES_PER_VF];
240 struct pfvf_start_queue_resp_tlv {
242 u32 offset; /* offset to consumer/producer of queue */
246 /* Extended queue information - additional index for reference inside qzone.
247 * If commmunicated between VF/PF, each TLV relating to queues should be
248 * extended by one such [or have a future base TLV that already contains info].
250 struct vfpf_qid_tlv {
251 struct channel_tlv tl;
257 struct vfpf_start_rxq_tlv {
258 struct vfpf_first_tlv first_tlv;
260 /* physical addresses */
262 u64 deprecated_sge_addr;
268 u16 hc_rate; /* desired interrupts per sec. */
277 struct vfpf_start_txq_tlv {
278 struct vfpf_first_tlv first_tlv;
280 /* physical addresses */
287 u32 flags; /* VFPF_QUEUE_FLG_X flags */
288 u16 hc_rate; /* desired interrupts per sec. */
294 struct vfpf_stop_rxqs_tlv {
295 struct vfpf_first_tlv first_tlv;
299 /* While the API supports multiple Rx-queues on a single TLV
300 * message, in practice older VFs always used it as one [ecore].
301 * And there are PFs [starting with the CHANNEL_TLV_QID] which
302 * would start assuming this is always a '1'. So in practice this
303 * field should be considered deprecated and *Always* set to '1'.
312 struct vfpf_stop_txqs_tlv {
313 struct vfpf_first_tlv first_tlv;
317 /* While the API supports multiple Tx-queues on a single TLV
318 * message, in practice older VFs always used it as one [ecore].
319 * And there are PFs [starting with the CHANNEL_TLV_QID] which
320 * would start assuming this is always a '1'. So in practice this
321 * field should be considered deprecated and *Always* set to '1'.
327 struct vfpf_update_rxq_tlv {
328 struct vfpf_first_tlv first_tlv;
330 u64 deprecated_sge_addr[PFVF_MAX_QUEUES_PER_VF];
335 #define VFPF_RXQ_UPD_INIT_SGE_DEPRECATE_FLAG (1 << 0)
336 #define VFPF_RXQ_UPD_COMPLETE_CQE_FLAG (1 << 1)
337 #define VFPF_RXQ_UPD_COMPLETE_EVENT_FLAG (1 << 2)
342 /* Set Queue Filters */
343 struct vfpf_q_mac_vlan_filter {
345 #define VFPF_Q_FILTER_DEST_MAC_VALID 0x01
346 #define VFPF_Q_FILTER_VLAN_TAG_VALID 0x02
347 #define VFPF_Q_FILTER_SET_MAC 0x100 /* set/clear */
356 struct vfpf_vport_start_tlv {
357 struct vfpf_first_tlv first_tlv;
359 u64 sb_addr[PFVF_MAX_SBS_PER_VF];
366 u8 inner_vlan_removal;
369 u8 max_buffers_per_cqe;
374 /* Extended tlvs - need to add rss, mcast, accept mode tlvs */
375 struct vfpf_vport_update_activate_tlv {
376 struct channel_tlv tl;
383 struct vfpf_vport_update_tx_switch_tlv {
384 struct channel_tlv tl;
389 struct vfpf_vport_update_vlan_strip_tlv {
390 struct channel_tlv tl;
395 struct vfpf_vport_update_mcast_bin_tlv {
396 struct channel_tlv tl;
399 /* This was a mistake; There are only 256 approx bins,
400 * and in HSI they're divided into 32-bit values.
401 * As old VFs used to set-bit to the values on its side,
402 * the upper half of the array is never expected to contain any data.
405 u64 obsolete_bins[4];
408 struct vfpf_vport_update_accept_param_tlv {
409 struct channel_tlv tl;
416 struct vfpf_vport_update_accept_any_vlan_tlv {
417 struct channel_tlv tl;
418 u8 update_accept_any_vlan_flg;
424 struct vfpf_vport_update_sge_tpa_tlv {
425 struct channel_tlv tl;
428 #define VFPF_TPA_IPV4_EN_FLAG (1 << 0)
429 #define VFPF_TPA_IPV6_EN_FLAG (1 << 1)
430 #define VFPF_TPA_PKT_SPLIT_FLAG (1 << 2)
431 #define VFPF_TPA_HDR_DATA_SPLIT_FLAG (1 << 3)
432 #define VFPF_TPA_GRO_CONSIST_FLAG (1 << 4)
433 #define VFPF_TPA_TUNN_IPV4_EN_FLAG (1 << 5)
434 #define VFPF_TPA_TUNN_IPV6_EN_FLAG (1 << 6)
436 u8 update_sge_tpa_flags;
437 #define VFPF_UPDATE_SGE_DEPRECATED_FLAG (1 << 0)
438 #define VFPF_UPDATE_TPA_EN_FLAG (1 << 1)
439 #define VFPF_UPDATE_TPA_PARAM_FLAG (1 << 2)
441 u8 max_buffers_per_cqe;
443 u16 deprecated_sge_buff_size;
445 u16 tpa_min_size_to_start;
446 u16 tpa_min_size_to_cont;
453 /* Primary tlv as a header for various extended tlvs for
454 * various functionalities in vport update ramrod.
456 struct vfpf_vport_update_tlv {
457 struct vfpf_first_tlv first_tlv;
460 struct vfpf_ucast_filter_tlv {
461 struct vfpf_first_tlv first_tlv;
472 /* tunnel update param tlv */
473 struct vfpf_update_tunn_param_tlv {
474 struct vfpf_first_tlv first_tlv;
476 u8 tun_mode_update_mask;
484 u8 update_geneve_port;
485 u8 update_vxlan_port;
491 struct pfvf_update_tunn_param_tlv {
494 u16 tunn_feature_mask;
509 struct tlv_buffer_size {
510 u8 tlv_buffer[TLV_BUFFER_SIZE];
513 struct vfpf_update_coalesce {
514 struct vfpf_first_tlv first_tlv;
521 struct vfpf_read_coal_req_tlv {
522 struct vfpf_first_tlv first_tlv;
528 struct pfvf_read_coal_resp_tlv {
535 struct vfpf_first_tlv first_tlv;
536 struct vfpf_acquire_tlv acquire;
537 struct vfpf_start_rxq_tlv start_rxq;
538 struct vfpf_start_txq_tlv start_txq;
539 struct vfpf_stop_rxqs_tlv stop_rxqs;
540 struct vfpf_stop_txqs_tlv stop_txqs;
541 struct vfpf_update_rxq_tlv update_rxq;
542 struct vfpf_vport_start_tlv start_vport;
543 struct vfpf_vport_update_tlv vport_update;
544 struct vfpf_ucast_filter_tlv ucast_filter;
545 struct vfpf_update_tunn_param_tlv tunn_param_update;
546 struct vfpf_update_coalesce update_coalesce;
547 struct vfpf_read_coal_req_tlv read_coal_req;
548 struct tlv_buffer_size tlv_buf_size;
552 struct pfvf_def_resp_tlv default_resp;
553 struct pfvf_acquire_resp_tlv acquire_resp;
554 struct tlv_buffer_size tlv_buf_size;
555 struct pfvf_start_queue_resp_tlv queue_start;
556 struct pfvf_update_tunn_param_tlv tunn_param_resp;
557 struct pfvf_read_coal_resp_tlv read_coal_resp;
560 /* This is a structure which is allocated in the VF, which the PF may update
561 * when it deems it necessary to do so. The bulletin board is sampled
562 * periodically by the VF. A copy per VF is maintained in the PF (to prevent
563 * loss of data upon multiple updates (or the need for read modify write)).
565 enum ecore_bulletin_bit {
566 /* Alert the VF that a forced MAC was set by the PF */
569 /* The VF should not access the vfpf channel */
570 VFPF_CHANNEL_INVALID = 1,
572 /* Alert the VF that a forced VLAN was set by the PF */
573 VLAN_ADDR_FORCED = 2,
575 /* Indicate that `default_only_untagged' contains actual data */
576 VFPF_BULLETIN_UNTAGGED_DEFAULT = 3,
577 VFPF_BULLETIN_UNTAGGED_DEFAULT_FORCED = 4,
579 /* Alert the VF that suggested mac was sent by the PF.
580 * MAC_ADDR will be disabled in case MAC_ADDR_FORCED is set
582 VFPF_BULLETIN_MAC_ADDR = 5
585 struct ecore_bulletin_content {
586 /* crc of structure to ensure is not in mid-update */
591 /* bitmap indicating which fields hold valid values */
594 /* used for MAC_ADDR or MAC_ADDR_FORCED */
597 /* If valid, 1 => only untagged Rx if no vlan is configured */
598 u8 default_only_untagged;
601 /* The following is a 'copy' of ecore_mcp_link_state,
602 * ecore_mcp_link_params and ecore_mcp_link_capabilities. Since it's
603 * possible the structs will increase further along the road we cannot
604 * have it here; Instead we need to have all of its fields.
607 u8 req_autoneg_pause;
613 u32 req_forced_speed;
621 u8 parallel_detection;
623 u8 partner_tx_flow_ctrl_en;
624 u8 partner_rx_flow_ctrl_en;
626 u8 partner_adv_pause;
633 u32 partner_adv_speed;
635 u32 capability_speed;
642 struct ecore_bulletin {
644 struct ecore_bulletin_content *p_virt;
649 /*!!!!! Make sure to update STRINGS structure accordingly !!!!!*/
651 CHANNEL_TLV_NONE, /* ends tlv sequence */
653 CHANNEL_TLV_VPORT_START,
654 CHANNEL_TLV_VPORT_UPDATE,
655 CHANNEL_TLV_VPORT_TEARDOWN,
656 CHANNEL_TLV_START_RXQ,
657 CHANNEL_TLV_START_TXQ,
658 CHANNEL_TLV_STOP_RXQS,
659 CHANNEL_TLV_STOP_TXQS,
660 CHANNEL_TLV_UPDATE_RXQ,
661 CHANNEL_TLV_INT_CLEANUP,
664 CHANNEL_TLV_LIST_END,
665 CHANNEL_TLV_UCAST_FILTER,
666 CHANNEL_TLV_VPORT_UPDATE_ACTIVATE,
667 CHANNEL_TLV_VPORT_UPDATE_TX_SWITCH,
668 CHANNEL_TLV_VPORT_UPDATE_VLAN_STRIP,
669 CHANNEL_TLV_VPORT_UPDATE_MCAST,
670 CHANNEL_TLV_VPORT_UPDATE_ACCEPT_PARAM,
671 CHANNEL_TLV_VPORT_UPDATE_RSS,
672 CHANNEL_TLV_VPORT_UPDATE_ACCEPT_ANY_VLAN,
673 CHANNEL_TLV_VPORT_UPDATE_SGE_TPA,
674 CHANNEL_TLV_UPDATE_TUNN_PARAM,
675 CHANNEL_TLV_COALESCE_UPDATE,
677 CHANNEL_TLV_COALESCE_READ,
680 /* Required for iterating over vport-update tlvs.
681 * Will break in case non-sequential vport-update tlvs.
683 CHANNEL_TLV_VPORT_UPDATE_MAX = CHANNEL_TLV_VPORT_UPDATE_SGE_TPA + 1,
685 /*!!!!! Make sure to update STRINGS structure accordingly !!!!!*/
687 extern const char *ecore_channel_tlvs_string[];
689 #endif /* __ECORE_VF_PF_IF_H__ */