diff options
Diffstat (limited to 'src/plugins/dev_iavf/virtchnl.h')
-rw-r--r-- | src/plugins/dev_iavf/virtchnl.h | 570 |
1 files changed, 570 insertions, 0 deletions
diff --git a/src/plugins/dev_iavf/virtchnl.h b/src/plugins/dev_iavf/virtchnl.h new file mode 100644 index 00000000000..d1410129ba1 --- /dev/null +++ b/src/plugins/dev_iavf/virtchnl.h @@ -0,0 +1,570 @@ +/* SPDX-License-Identifier: Apache-2.0 + * Copyright (c) 2023 Cisco Systems, Inc. + */ + +#ifndef _IIAVF_VIRTCHNL_H_ +#define _IIAVF_VIRTCHNL_H_ + +#define VIRTCHNL_VERSION_MAJOR 1 +#define VIRTCHNL_VERSION_MINOR 1 + +#define foreach_iavf_promisc_flags \ + _ (0, UNICAST_PROMISC, "unicast") \ + _ (1, MULTICAST_PROMISC, "multicast") + +enum +{ +#define _(a, b, c) FLAG_VF_##b = (1 << a), + foreach_iavf_promisc_flags +#undef _ +}; + +#define AVFINT_DYN_CTLN(x) (0x00003800 + (0x4 * x)) +#define AVFINT_ICR0 0x00004800 +#define AVFINT_ICR0_ENA1 0x00005000 +#define AVFINT_DYN_CTL0 0x00005C00 +#define IAVF_ARQBAH 0x00006000 +#define IAVF_ATQH 0x00006400 +#define IAVF_ATQLEN 0x00006800 +#define IAVF_ARQBAL 0x00006C00 +#define IAVF_ARQT 0x00007000 +#define IAVF_ARQH 0x00007400 +#define IAVF_ATQBAH 0x00007800 +#define IAVF_ATQBAL 0x00007C00 +#define IAVF_ARQLEN 0x00008000 +#define IAVF_ATQT 0x00008400 +#define VFGEN_RSTAT 0x00008800 +#define IAVF_QTX_TAIL(q) (0x00000000 + (0x4 * q)) +#define IAVF_QRX_TAIL(q) (0x00002000 + (0x4 * q)) + +#define foreach_virtchnl_op \ + _ (0, UNKNOWN) \ + _ (1, VERSION) \ + _ (2, RESET_VF) \ + _ (3, GET_VF_RESOURCES) \ + _ (4, CONFIG_TX_QUEUE) \ + _ (5, CONFIG_RX_QUEUE) \ + _ (6, CONFIG_VSI_QUEUES) \ + _ (7, CONFIG_IRQ_MAP) \ + _ (8, ENABLE_QUEUES) \ + _ (9, DISABLE_QUEUES) \ + _ (10, ADD_ETH_ADDR) \ + _ (11, DEL_ETH_ADDR) \ + _ (12, ADD_VLAN) \ + _ (13, DEL_VLAN) \ + _ (14, CONFIG_PROMISCUOUS_MODE) \ + _ (15, GET_STATS) \ + _ (16, RSVD) \ + _ (17, EVENT) \ + _ (18, UNDEF_18) \ + _ (19, UNDEF_19) \ + _ (20, IWARP) \ + _ (21, CONFIG_IWARP_IRQ_MAP) \ + _ (22, RELEASE_IWARP_IRQ_MAP) \ + _ (23, CONFIG_RSS_KEY) \ + _ (24, CONFIG_RSS_LUT) \ + _ (25, GET_RSS_HENA_CAPS) \ + _ (26, SET_RSS_HENA) \ + _ (27, ENABLE_VLAN_STRIPPING) \ + _ (28, DISABLE_VLAN_STRIPPING) \ + _ (29, REQUEST_QUEUES) \ + _ (30, ENABLE_CHANNELS) \ + _ (31, DISABLE_CHANNELS) \ + _ (32, ADD_CLOUD_FILTER) \ + _ (33, DEL_CLOUD_FILTER) \ + _ (45, ADD_RSS_CFG) \ + _ (46, DEL_RSS_CFG) \ + _ (47, ADD_FDIR_FILTER) \ + _ (48, DEL_FDIR_FILTER) \ + _ (49, QUERY_FDIR_FILTER) \ + _ (50, GET_MAX_RSS_QREGION) \ + _ (51, GET_OFFLOAD_VLAN_V2_CAPS) \ + _ (52, ADD_VLAN_V2) \ + _ (53, DEL_VLAN_V2) \ + _ (54, ENABLE_VLAN_STRIPPING_V2) \ + _ (55, DISABLE_VLAN_STRIPPING_V2) \ + _ (56, ENABLE_VLAN_INSERTION_V2) \ + _ (57, DISABLE_VLAN_INSERTION_V2) \ + _ (58, ENABLE_VLAN_FILTERING_V2) \ + _ (59, DISABLE_VLAN_FILTERING_V2) \ + _ (107, ENABLE_QUEUES_V2) \ + _ (108, DISABLE_QUEUES_V2) \ + _ (111, MAP_QUEUE_VECTOR) + +typedef enum +{ +#define _(v, n) VIRTCHNL_OP_##n = v, + foreach_virtchnl_op +#undef _ + VIRTCHNL_N_OPS, +} virtchnl_op_t; + +#define foreach_virtchnl_status \ + _ (0, SUCCESS) \ + _ (-5, ERR_PARAM) \ + _ (-18, ERR_NO_MEMORY) \ + _ (-38, ERR_OPCODE_MISMATCH) \ + _ (-39, ERR_CQP_COMPL_ERROR) \ + _ (-40, ERR_INVALID_VF_ID) \ + _ (-53, ERR_ADMIN_QUEUE_ERROR) \ + _ (-64, NOT_SUPPORTED) + +typedef enum +{ +#define _(a, b) VIRTCHNL_STATUS_##b = a, + foreach_virtchnl_status +#undef _ +} virtchnl_status_t; + +#define foreach_iavf_vf_cap_flag \ + _ (0, OFFLOAD_L2, "l2") \ + _ (1, OFFLOAD_IWARP, "iwarp") \ + _ (2, OFFLOAD_RSVD, "rsvd") \ + _ (3, OFFLOAD_RSS_AQ, "rss-aq") \ + _ (4, OFFLOAD_RSS_REG, "rss-reg") \ + _ (5, OFFLOAD_WB_ON_ITR, "wb-on-itr") \ + _ (6, OFFLOAD_REQ_QUEUES, "req-queues") \ + _ (7, CAP_ADV_LINK_SPEED, "adv-link-speed") \ + _ (9, LARGE_NUM_QPAIRS, "large-num-qpairs") \ + _ (15, OFFLOAD_VLAN_V2, "vlan-v2") \ + _ (16, OFFLOAD_VLAN, "vlan") \ + _ (17, OFFLOAD_RX_POLLING, "rx-polling") \ + _ (18, OFFLOAD_RSS_PCTYPE_V2, "rss-pctype-v2") \ + _ (19, OFFLOAD_RSS_PF, "rss-pf") \ + _ (20, OFFLOAD_ENCAP, "encap") \ + _ (21, OFFLOAD_ENCAP_CSUM, "encap-csum") \ + _ (22, OFFLOAD_RX_ENCAP_CSUM, "rx-encap-csum") \ + _ (23, OFFLOAD_ADQ, "offload-adq") \ + _ (24, OFFLOAD_ADQ_v2, "offload-adq-v2") \ + _ (25, OFFLOAD_USO, "offload-uso") \ + _ (26, OFFLOAD_RX_FLEX_DESC, "offload-rx-flex-desc") \ + _ (27, OFFLOAD_ADV_RSS_PF, "offload-adv-rss-pf") \ + _ (28, OFFLOAD_FDIR_PF, "offload-fdir-pf") \ + _ (30, CAP_DCF, "dcf") + +typedef enum +{ +#define _(a, b, c) VIRTCHNL_VF_##b = (1 << a), + foreach_iavf_vf_cap_flag +#undef _ +} iavf_vf_cap_flag_t; + +typedef enum +{ + VIRTCHNL_VSI_TYPE_INVALID = 0, + VIRTCHNL_VSI_SRIOV = 6, +} virtchnl_vsi_type_t; + +typedef enum +{ + VIRTCHNL_VFR_INPROGRESS = 0, + VIRTCHNL_VFR_COMPLETED, + VIRTCHNL_VFR_VFACTIVE, +} virtchnl_vfr_states_t; + +typedef struct +{ + u16 vsi_id; + u16 num_queue_pairs; + virtchnl_vsi_type_t vsi_type; + u16 qset_handle; + u8 default_mac_addr[6]; +} virtchnl_vsi_resource_t; + +typedef struct +{ + u16 num_vsis; + u16 num_queue_pairs; + u16 max_vectors; + u16 max_mtu; + u32 vf_cap_flags; + u32 rss_key_size; + u32 rss_lut_size; + virtchnl_vsi_resource_t vsi_res[1]; +} virtchnl_vf_resource_t; + +#define foreach_virtchnl_event_code \ + _ (0, UNKNOWN) \ + _ (1, LINK_CHANGE) \ + _ (2, RESET_IMPENDING) \ + _ (3, PF_DRIVER_CLOSE) + +typedef enum +{ +#define _(a, b) VIRTCHNL_EVENT_##b = (a), + foreach_virtchnl_event_code +#undef _ +} virtchnl_event_codes_t; + +#define foreach_virtchnl_link_speed \ + _ (0, 2_5GB, "2.5 Gbps") \ + _ (1, 100MB, "100 Mbps") \ + _ (2, 1GB, "1 Gbps") \ + _ (3, 10GB, "10 Gbps") \ + _ (4, 40GB, "40 Gbps") \ + _ (5, 20GB, "20 Gbps") \ + _ (6, 25GB, "25 Gbps") \ + _ (7, 5GB, "5 Gbps") + +typedef enum +{ + VIRTCHNL_LINK_SPEED_UNKNOWN = 0, +#define _(a, b, c) VIRTCHNL_LINK_SPEED_##b = (1 << a), + foreach_virtchnl_link_speed +#undef _ +} virtchnl_link_speed_t; + +typedef struct +{ + virtchnl_event_codes_t event; + union + { + struct + { + virtchnl_link_speed_t link_speed; + u8 link_status; + } link_event; + struct + { + u32 link_speed; + u8 link_status; + } link_event_adv; + } event_data; + int severity; +} virtchnl_pf_event_t; + +STATIC_ASSERT_SIZEOF (virtchnl_pf_event_t, 16); + +typedef struct +{ + u32 major; + u32 minor; +} virtchnl_version_info_t; + +#define foreach_iavf_aq_desc_flag \ + _ (1, dd) \ + _ (1, cmp) \ + _ (1, err) \ + _ (1, vfe) \ + _ (5, reserved) \ + _ (1, lb) \ + _ (1, rd) \ + _ (1, vfc) \ + _ (1, buf) \ + _ (1, si) \ + _ (1, ie) \ + _ (1, fe) + +typedef union +{ + struct + { +#define _(n, s) u16 s : n; + foreach_iavf_aq_desc_flag +#undef _ + }; + u16 as_u16; +} iavf_aq_desc_flags_t; + +STATIC_ASSERT_SIZEOF (iavf_aq_desc_flags_t, 2); + +typedef enum +{ + IIAVF_AQ_DESC_OP_QUEUE_SHUTDOWN = 0x0003, + IIAVF_AQ_DESC_OP_SEND_TO_PF = 0x0801, + IIAVF_AQ_DESC_OP_MESSAGE_FROM_PF = 0x0802, +} __clib_packed iavf_aq_desc_op_t; + +#define foreach_iavf_aq_desc_retval \ + _ (0, OK) \ + _ (1, EPERM) \ + _ (2, ENOENT) \ + _ (3, ESRCH) \ + _ (4, EINTR) \ + _ (5, EIO) \ + _ (6, ENXIO) \ + _ (7, E2BIG) \ + _ (8, EAGAIN) \ + _ (9, ENOMEM) \ + _ (10, EACCES) \ + _ (11, EFAULT) \ + _ (12, EBUSY) \ + _ (13, EEXIST) \ + _ (14, EINVAL) \ + _ (15, ENOTTY) \ + _ (16, ENOSPC) \ + _ (17, ENOSYS) \ + _ (18, ERANGE) \ + _ (19, EFLUSHED) \ + _ (20, BAD_ADDR) \ + _ (21, EMODE) \ + _ (22, EFBIG) \ + _ (23, ESBCOMP) \ + _ (24, ENOSEC) \ + _ (25, EBADSIG) \ + _ (26, ESVN) \ + _ (27, EBADMAN) \ + _ (28, EBADBUF) \ + _ (29, EACCES_BMCU) + +typedef enum +{ +#define _(a, b) IIAVF_AQ_DESC_RETVAL_##b = a, + foreach_iavf_aq_desc_retval +#undef _ +} __clib_packed iavf_aq_desc_retval_t; + +typedef struct +{ + iavf_aq_desc_flags_t flags; + iavf_aq_desc_op_t opcode; + u16 datalen; + u16 retval; + union + { + u32 cookie_hi; + virtchnl_op_t v_opcode; + }; + union + { + u32 cookie_lo; + virtchnl_status_t v_retval; + }; + union + { + u8 driver_unloading : 1; + u32 param0; + }; + u32 param1; + union + { + u32 param2; + u32 addr_hi; + }; + union + { + u32 param3; + u32 addr_lo; + }; +} iavf_aq_desc_t; + +STATIC_ASSERT_SIZEOF (iavf_aq_desc_t, 32); + +typedef struct +{ + u16 vsi_id; + u16 queue_id; + u16 ring_len; + u64 dma_ring_addr; + u64 dma_headwb_addr; +} virtchnl_txq_info_t; + +STATIC_ASSERT_SIZEOF (virtchnl_txq_info_t, 24); + +typedef struct +{ + u16 vsi_id; + u16 queue_id; + u32 ring_len; + u16 hdr_size; + u16 splithdr_enabled; + u32 databuffer_size; + u32 max_pkt_size; + u8 crc_disable; + u8 rxdid; + u8 pad[2]; + u64 dma_ring_addr; + i32 rx_split_pos; + u32 pad2; +} virtchnl_rxq_info_t; + +STATIC_ASSERT_SIZEOF (virtchnl_rxq_info_t, 40); + +typedef struct +{ + virtchnl_txq_info_t txq; + virtchnl_rxq_info_t rxq; +} virtchnl_queue_pair_info_t; + +STATIC_ASSERT_SIZEOF (virtchnl_queue_pair_info_t, 64); + +typedef struct +{ + u16 vsi_id; + u16 num_queue_pairs; + u32 pad; + virtchnl_queue_pair_info_t qpair[1]; +} virtchnl_vsi_queue_config_info_t; + +STATIC_ASSERT_SIZEOF (virtchnl_vsi_queue_config_info_t, 72); + +typedef struct +{ + u16 vsi_id; + u16 pad; + u32 rx_queues; + u32 tx_queues; +} virtchnl_queue_select_t; + +STATIC_ASSERT_SIZEOF (virtchnl_queue_select_t, 12); + +typedef struct +{ + u16 vsi_id; + u16 vector_id; + u16 rxq_map; + u16 txq_map; + u16 rxitr_idx; + u16 txitr_idx; +} virtchnl_vector_map_t; + +typedef struct +{ + u16 num_vectors; + virtchnl_vector_map_t vecmap[1]; +} virtchnl_irq_map_info_t; + +STATIC_ASSERT_SIZEOF (virtchnl_irq_map_info_t, 14); + +typedef struct +{ + u8 addr[6]; + union + { + struct + { + u8 primary : 1; + u8 extra : 1; + }; + u8 type; + }; + u8 pad[1]; +} virtchnl_ether_addr_t; + +typedef struct +{ + u16 vsi_id; + u16 num_elements; + virtchnl_ether_addr_t list[1]; +} virtchnl_ether_addr_list_t; + +#define foreach_virtchnl_eth_stats \ + _ (rx_bytes) \ + _ (rx_unicast) \ + _ (rx_multicast) \ + _ (rx_broadcast) \ + _ (rx_discards) \ + _ (rx_unknown_protocol) \ + _ (tx_bytes) \ + _ (tx_unicast) \ + _ (tx_multicast) \ + _ (tx_broadcast) \ + _ (tx_discards) \ + _ (tx_errors) + +typedef struct +{ +#define _(s) u64 s; + foreach_virtchnl_eth_stats +#undef _ +} virtchnl_eth_stats_t; + +typedef struct +{ + u16 vsi_id; + u16 key_len; + u8 key[1]; +} virtchnl_rss_key_t; + +STATIC_ASSERT_SIZEOF (virtchnl_rss_key_t, 6); + +typedef struct +{ + u16 vsi_id; + u16 lut_entries; + u8 lut[1]; +} virtchnl_rss_lut_t; + +STATIC_ASSERT_SIZEOF (virtchnl_rss_lut_t, 6); + +/* VIRTCHNL_OP_REQUEST_QUEUES */ +typedef struct +{ + u16 num_queue_pairs; +} virtchnl_vf_res_request_t; + +typedef struct +{ + u32 outer; + u32 inner; +} virtchnl_vlan_supported_caps_t; + +typedef struct +{ + virtchnl_vlan_supported_caps_t filtering_support; + u32 ethertype_init; + u16 max_filters; + u8 pad[2]; +} virtchnl_vlan_filtering_caps_t; + +typedef struct virtchnl_vlan_offload_caps +{ + virtchnl_vlan_supported_caps_t stripping_support; + virtchnl_vlan_supported_caps_t insertion_support; + u32 ethertype_init; + u8 ethertype_match; + u8 pad[3]; +} virtchnl_vlan_offload_caps_t; + +typedef struct +{ + virtchnl_vlan_filtering_caps_t filtering; + virtchnl_vlan_offload_caps_t offloads; +} virtchnl_vlan_caps_t; + +#define foreach_virtchnl_vlan_support_bit \ + _ (0, ETHERTYPE_8100, "dot1Q") \ + _ (1, ETHERTYPE_88A8, "dot1AD") \ + _ (2, ETHERTYPE_9100, "QinQ") \ + _ (8, TAG_LOCATION_L2TAG1, "l2tag1") \ + _ (9, TAG_LOCATION_L2TAG2, "l2tag2") \ + _ (10, TAG_LOCATION_L2TAG2_2, "l2tag2_2") \ + _ (24, PRIO, "prio") \ + _ (28, FILTER_MASK, "filter-mask") \ + _ (29, ETHERTYPE_AND, "etype-and") \ + _ (30, ETHERTYPE_XOR, "etype-xor") \ + _ (31, TOGGLE, "toggle") + +typedef enum +{ + VIRTCHNL_VLAN_UNSUPPORTED = 0, +#define _(a, b, c) VIRTCHNL_VLAN_##b = (1 << a), + foreach_virtchnl_vlan_support_bit +#undef _ +} virtchnl_vlan_support_caps_t; + +typedef struct +{ + u32 outer_ethertype_setting; + u32 inner_ethertype_setting; + u16 vport_id; + u8 pad[6]; +} virtchnl_vlan_setting_t; + +typedef struct +{ + u16 vsi_id; + union + { + struct + { + u16 unicast_promisc : 1; + u16 multicast_promisc : 1; + }; + u16 flags; + }; +} virtchnl_promisc_info_t; + +STATIC_ASSERT_SIZEOF (virtchnl_promisc_info_t, 4); + +#endif /* IAVF_VIRTCHNL_H */ |