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)
110 u16 opaque_fid; /* ME register value */
111 u8 os_type; /* VFPF_ACQUIRE_OS_* value */
117 struct vf_pf_resc_request resc_request;
124 /* receive side scaling tlv */
125 struct vfpf_vport_update_rss_tlv {
126 struct channel_tlv tl;
129 #define VFPF_UPDATE_RSS_CONFIG_FLAG (1 << 0)
130 #define VFPF_UPDATE_RSS_CAPS_FLAG (1 << 1)
131 #define VFPF_UPDATE_RSS_IND_TABLE_FLAG (1 << 2)
132 #define VFPF_UPDATE_RSS_KEY_FLAG (1 << 3)
136 u8 rss_table_size_log; /* The table size is 2 ^ rss_table_size_log */
137 u16 rss_ind_table[T_ETH_INDIRECTION_TABLE_SIZE];
138 u32 rss_key[T_ETH_RSS_KEY_SIZE];
141 struct pfvf_storm_stats {
146 struct pfvf_stats_info {
147 struct pfvf_storm_stats mstats;
148 struct pfvf_storm_stats pstats;
149 struct pfvf_storm_stats tstats;
150 struct pfvf_storm_stats ustats;
153 /* acquire response tlv - carries the allocated resources */
154 struct pfvf_acquire_resp_tlv {
157 struct pf_vf_pfdev_info {
167 #define PFVF_ACQUIRE_CAP_DEFAULT_UNTAGGED (1 << 0)
168 #define PFVF_ACQUIRE_CAP_100G (1 << 1) /* If set, 100g PF */
169 /* There are old PF versions where the PF might mistakenly override the sanity
170 * mechanism [version-based] and allow a VF that can't be supported to pass
171 * the acquisition phase.
172 * To overcome this, PFs now indicate that they're past that point and the new
173 * VFs would fail probe on the older PFs that fail to do so.
176 /* Said bug was in quest/serpens; Can't be certain no official release included
177 * the bug since the fix arrived very late in the programs.
180 #define PFVF_ACQUIRE_CAP_POST_FW_OVERRIDE (1 << 2)
182 /* PF expects queues to be received with additional qids */
183 #define PFVF_ACQUIRE_CAP_QUEUE_QIDS (1 << 3)
189 /* These should match the PF's ecore_dev values */
195 struct pfvf_stats_info stats_info;
197 u8 port_mac[ETH_ALEN];
199 /* It's possible PF had to configure an older fastpath HSI
200 * [in case VF is newer than PF]. This is communicated back
201 * to the VF. It can also be used in case of error due to
202 * non-matching versions to shed light in VF about failure.
209 /* in case of status NO_RESOURCE in message hdr, pf will fill
210 * this struct with suggested amount of resources for next
213 #define PFVF_MAX_QUEUES_PER_VF 16
214 #define PFVF_MAX_SBS_PER_VF 16
215 struct hw_sb_info hw_sbs[PFVF_MAX_SBS_PER_VF];
216 u8 hw_qid[PFVF_MAX_QUEUES_PER_VF];
217 u8 cid[PFVF_MAX_QUEUES_PER_VF];
233 struct pfvf_start_queue_resp_tlv {
235 u32 offset; /* offset to consumer/producer of queue */
239 /* Extended queue information - additional index for reference inside qzone.
240 * If commmunicated between VF/PF, each TLV relating to queues should be
241 * extended by one such [or have a future base TLV that already contains info].
243 struct vfpf_qid_tlv {
244 struct channel_tlv tl;
250 struct vfpf_start_rxq_tlv {
251 struct vfpf_first_tlv first_tlv;
253 /* physical addresses */
255 u64 deprecated_sge_addr;
261 u16 hc_rate; /* desired interrupts per sec. */
270 struct vfpf_start_txq_tlv {
271 struct vfpf_first_tlv first_tlv;
273 /* physical addresses */
280 u32 flags; /* VFPF_QUEUE_FLG_X flags */
281 u16 hc_rate; /* desired interrupts per sec. */
287 struct vfpf_stop_rxqs_tlv {
288 struct vfpf_first_tlv first_tlv;
292 /* While the API supports multiple Rx-queues on a single TLV
293 * message, in practice older VFs always used it as one [ecore].
294 * And there are PFs [starting with the CHANNEL_TLV_QID] which
295 * would start assuming this is always a '1'. So in practice this
296 * field should be considered deprecated and *Always* set to '1'.
305 struct vfpf_stop_txqs_tlv {
306 struct vfpf_first_tlv first_tlv;
310 /* While the API supports multiple Tx-queues on a single TLV
311 * message, in practice older VFs always used it as one [ecore].
312 * And there are PFs [starting with the CHANNEL_TLV_QID] which
313 * would start assuming this is always a '1'. So in practice this
314 * field should be considered deprecated and *Always* set to '1'.
320 struct vfpf_update_rxq_tlv {
321 struct vfpf_first_tlv first_tlv;
323 u64 deprecated_sge_addr[PFVF_MAX_QUEUES_PER_VF];
328 #define VFPF_RXQ_UPD_INIT_SGE_DEPRECATE_FLAG (1 << 0)
329 #define VFPF_RXQ_UPD_COMPLETE_CQE_FLAG (1 << 1)
330 #define VFPF_RXQ_UPD_COMPLETE_EVENT_FLAG (1 << 2)
335 /* Set Queue Filters */
336 struct vfpf_q_mac_vlan_filter {
338 #define VFPF_Q_FILTER_DEST_MAC_VALID 0x01
339 #define VFPF_Q_FILTER_VLAN_TAG_VALID 0x02
340 #define VFPF_Q_FILTER_SET_MAC 0x100 /* set/clear */
349 struct vfpf_vport_start_tlv {
350 struct vfpf_first_tlv first_tlv;
352 u64 sb_addr[PFVF_MAX_SBS_PER_VF];
359 u8 inner_vlan_removal;
362 u8 max_buffers_per_cqe;
367 /* Extended tlvs - need to add rss, mcast, accept mode tlvs */
368 struct vfpf_vport_update_activate_tlv {
369 struct channel_tlv tl;
376 struct vfpf_vport_update_tx_switch_tlv {
377 struct channel_tlv tl;
382 struct vfpf_vport_update_vlan_strip_tlv {
383 struct channel_tlv tl;
388 struct vfpf_vport_update_mcast_bin_tlv {
389 struct channel_tlv tl;
395 struct vfpf_vport_update_accept_param_tlv {
396 struct channel_tlv tl;
403 struct vfpf_vport_update_accept_any_vlan_tlv {
404 struct channel_tlv tl;
405 u8 update_accept_any_vlan_flg;
411 struct vfpf_vport_update_sge_tpa_tlv {
412 struct channel_tlv tl;
415 #define VFPF_TPA_IPV4_EN_FLAG (1 << 0)
416 #define VFPF_TPA_IPV6_EN_FLAG (1 << 1)
417 #define VFPF_TPA_PKT_SPLIT_FLAG (1 << 2)
418 #define VFPF_TPA_HDR_DATA_SPLIT_FLAG (1 << 3)
419 #define VFPF_TPA_GRO_CONSIST_FLAG (1 << 4)
421 u8 update_sge_tpa_flags;
422 #define VFPF_UPDATE_SGE_DEPRECATED_FLAG (1 << 0)
423 #define VFPF_UPDATE_TPA_EN_FLAG (1 << 1)
424 #define VFPF_UPDATE_TPA_PARAM_FLAG (1 << 2)
426 u8 max_buffers_per_cqe;
428 u16 deprecated_sge_buff_size;
430 u16 tpa_min_size_to_start;
431 u16 tpa_min_size_to_cont;
438 /* Primary tlv as a header for various extended tlvs for
439 * various functionalities in vport update ramrod.
441 struct vfpf_vport_update_tlv {
442 struct vfpf_first_tlv first_tlv;
445 struct vfpf_ucast_filter_tlv {
446 struct vfpf_first_tlv first_tlv;
457 /* tunnel update param tlv */
458 struct vfpf_update_tunn_param_tlv {
459 struct vfpf_first_tlv first_tlv;
461 u8 tun_mode_update_mask;
469 u8 update_geneve_port;
470 u8 update_vxlan_port;
476 struct pfvf_update_tunn_param_tlv {
479 u16 tunn_feature_mask;
494 struct tlv_buffer_size {
495 u8 tlv_buffer[TLV_BUFFER_SIZE];
498 struct vfpf_update_coalesce {
499 struct vfpf_first_tlv first_tlv;
507 struct vfpf_first_tlv first_tlv;
508 struct vfpf_acquire_tlv acquire;
509 struct vfpf_start_rxq_tlv start_rxq;
510 struct vfpf_start_txq_tlv start_txq;
511 struct vfpf_stop_rxqs_tlv stop_rxqs;
512 struct vfpf_stop_txqs_tlv stop_txqs;
513 struct vfpf_update_rxq_tlv update_rxq;
514 struct vfpf_vport_start_tlv start_vport;
515 struct vfpf_vport_update_tlv vport_update;
516 struct vfpf_ucast_filter_tlv ucast_filter;
517 struct vfpf_update_tunn_param_tlv tunn_param_update;
518 struct vfpf_update_coalesce update_coalesce;
519 struct tlv_buffer_size tlv_buf_size;
523 struct pfvf_def_resp_tlv default_resp;
524 struct pfvf_acquire_resp_tlv acquire_resp;
525 struct tlv_buffer_size tlv_buf_size;
526 struct pfvf_start_queue_resp_tlv queue_start;
527 struct pfvf_update_tunn_param_tlv tunn_param_resp;
530 /* This is a structure which is allocated in the VF, which the PF may update
531 * when it deems it necessary to do so. The bulletin board is sampled
532 * periodically by the VF. A copy per VF is maintained in the PF (to prevent
533 * loss of data upon multiple updates (or the need for read modify write)).
535 enum ecore_bulletin_bit {
536 /* Alert the VF that a forced MAC was set by the PF */
539 /* The VF should not access the vfpf channel */
540 VFPF_CHANNEL_INVALID = 1,
542 /* Alert the VF that a forced VLAN was set by the PF */
543 VLAN_ADDR_FORCED = 2,
545 /* Indicate that `default_only_untagged' contains actual data */
546 VFPF_BULLETIN_UNTAGGED_DEFAULT = 3,
547 VFPF_BULLETIN_UNTAGGED_DEFAULT_FORCED = 4,
549 /* Alert the VF that suggested mac was sent by the PF.
550 * MAC_ADDR will be disabled in case MAC_ADDR_FORCED is set
552 VFPF_BULLETIN_MAC_ADDR = 5
555 struct ecore_bulletin_content {
556 /* crc of structure to ensure is not in mid-update */
561 /* bitmap indicating which fields hold valid values */
564 /* used for MAC_ADDR or MAC_ADDR_FORCED */
567 /* If valid, 1 => only untagged Rx if no vlan is configured */
568 u8 default_only_untagged;
571 /* The following is a 'copy' of ecore_mcp_link_state,
572 * ecore_mcp_link_params and ecore_mcp_link_capabilities. Since it's
573 * possible the structs will increase further along the road we cannot
574 * have it here; Instead we need to have all of its fields.
577 u8 req_autoneg_pause;
583 u32 req_forced_speed;
591 u8 parallel_detection;
593 u8 partner_tx_flow_ctrl_en;
594 u8 partner_rx_flow_ctrl_en;
596 u8 partner_adv_pause;
603 u32 partner_adv_speed;
605 u32 capability_speed;
612 struct ecore_bulletin {
614 struct ecore_bulletin_content *p_virt;
619 /*!!!!! Make sure to update STRINGS structure accordingly !!!!!*/
621 CHANNEL_TLV_NONE, /* ends tlv sequence */
623 CHANNEL_TLV_VPORT_START,
624 CHANNEL_TLV_VPORT_UPDATE,
625 CHANNEL_TLV_VPORT_TEARDOWN,
626 CHANNEL_TLV_START_RXQ,
627 CHANNEL_TLV_START_TXQ,
628 CHANNEL_TLV_STOP_RXQS,
629 CHANNEL_TLV_STOP_TXQS,
630 CHANNEL_TLV_UPDATE_RXQ,
631 CHANNEL_TLV_INT_CLEANUP,
634 CHANNEL_TLV_LIST_END,
635 CHANNEL_TLV_UCAST_FILTER,
636 CHANNEL_TLV_VPORT_UPDATE_ACTIVATE,
637 CHANNEL_TLV_VPORT_UPDATE_TX_SWITCH,
638 CHANNEL_TLV_VPORT_UPDATE_VLAN_STRIP,
639 CHANNEL_TLV_VPORT_UPDATE_MCAST,
640 CHANNEL_TLV_VPORT_UPDATE_ACCEPT_PARAM,
641 CHANNEL_TLV_VPORT_UPDATE_RSS,
642 CHANNEL_TLV_VPORT_UPDATE_ACCEPT_ANY_VLAN,
643 CHANNEL_TLV_VPORT_UPDATE_SGE_TPA,
644 CHANNEL_TLV_UPDATE_TUNN_PARAM,
645 CHANNEL_TLV_COALESCE_UPDATE,
649 /* Required for iterating over vport-update tlvs.
650 * Will break in case non-sequential vport-update tlvs.
652 CHANNEL_TLV_VPORT_UPDATE_MAX = CHANNEL_TLV_VPORT_UPDATE_SGE_TPA + 1,
654 /*!!!!! Make sure to update STRINGS structure accordingly !!!!!*/
656 extern const char *ecore_channel_tlvs_string[];
658 #endif /* __ECORE_VF_PF_IF_H__ */