2 *------------------------------------------------------------------
3 * Copyright (c) 2023 Intel and/or its affiliates.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *------------------------------------------------------------------
18 #ifndef _IDPF_VIRTCHNL_H_
19 #define _IDPF_VIRTCHNL_H_
21 #include <idpf/virtchnl2_lan_desc.h>
23 #define foreach_virtchnl2_status \
26 _ (-38, ERR_OPCODE_MISMATCH)
30 #define _(v, n) VIRTCHNL2_STATUS_##n = v,
31 foreach_virtchnl2_status
35 #define foreach_virtchnl2_op \
39 _ (501, CREATE_VPORT) \
40 _ (502, DESTROY_VPORT) \
41 _ (503, ENABLE_VPORT) \
42 _ (504, DISABLE_VPORT) \
43 _ (505, CONFIG_TX_QUEUES) \
44 _ (506, CONFIG_RX_QUEUES) \
45 _ (507, ENABLE_QUEUES) \
46 _ (508, DISABLE_QUEUES) \
49 _ (511, MAP_QUEUE_VECTOR) \
50 _ (512, UNMAP_QUEUE_VECTOR) \
51 _ (513, GET_RSS_KEY) \
52 _ (514, SET_RSS_KEY) \
53 _ (515, GET_RSS_LUT) \
54 _ (516, SET_RSS_LUT) \
55 _ (517, GET_RSS_HASH) \
56 _ (518, SET_RSS_HASH) \
57 _ (519, SET_SRIOV_VFS) \
58 _ (520, ALLOC_VECTORS) \
59 _ (521, DEALLOC_VECTORS) \
63 _ (526, GET_PTYPE_INFO) \
65 _ (533, DESTROY_ADI) \
67 _ (535, ADD_MAC_ADDR) \
68 _ (536, DEL_MAC_ADDR) \
69 _ (537, CONFIG_PROMISCUOUS_MODE)
73 #define _(v, n) VIRTCHNL2_OP_##n = v,
78 /* VIRTCHNL2_VPORT_TYPE
79 * Type of virtual port
81 #define foreach_virtchnl2_vport_type \
90 #define _(v, n) VIRTCHNL2_VPORT_TYPE_##n = v,
91 foreach_virtchnl2_vport_type
93 } virtchnl2_vport_type_t;
95 /* VIRTCHNL2_QUEUE_MODEL
98 #define VIRTCHNL2_QUEUE_MODEL_SINGLE 0
99 #define VIRTCHNL2_QUEUE_MODEL_SPLIT 1
101 #define foreach_idpf_checksum_cap_flag \
102 _ (0, TX_CSUM_L3_IPV4, "tx-csum-l3-ipv4") \
103 _ (1, TX_CSUM_L4_IPV4_TCP, "tx-csum-l4-ipv4-tcp") \
104 _ (2, TX_CSUM_L4_IPV4_UDP, "tx-csum-l4-ipv4-udp") \
105 _ (3, TX_CSUM_L4_IPV4_SCTP, "tx-csum-l4-ipv4-sctp") \
106 _ (4, TX_CSUM_L4_IPV6_TCP, "tx-csum-l4-ipv6-tcp") \
107 _ (5, TX_CSUM_L4_IPV6_UDP, "tx-csum-l4-ipv6-udp") \
108 _ (6, TX_CSUM_L4_IPV6_SCTP, "tx-csum-l4-ipv6-sctp") \
109 _ (7, TX_CSUM_GENERIC, "tx-csum-generic") \
110 _ (8, RX_CSUM_L3_IPV4, "rx-csum-l3-ipv4") \
111 _ (9, RX_CSUM_L4_IPV4_TCP, "rx-csum-l4-ipv4-tcp") \
112 _ (10, RX_CSUM_L4_IPV4_UDP, "rx-csum-l4-ipv4-udp") \
113 _ (11, RX_CSUM_L4_IPV4_SCTP, "rx-csum-l4-ipv4-sctp") \
114 _ (12, RX_CSUM_L4_IPV6_TCP, "rx-csum-l4-ipv6-tcp") \
115 _ (13, RX_CSUM_L4_IPV6_UDP, "rx-csum-l4-ipv6-udp") \
116 _ (14, RX_CSUM_L4_IPV6_SCTP, "rx-csum-l4-ipv6-sctp") \
117 _ (15, RX_CSUM_GENERIC, "rx-csum-generic") \
118 _ (16, TX_CSUM_L3_SINGLE_TUNNEL, "tx-csum-l3-single-tunnel") \
119 _ (17, TX_CSUM_L3_DOUBLE_TUNNEL, "tx-csum-l3-double-tunnel") \
120 _ (18, RX_CSUM_L3_SINGLE_TUNNEL, "rx-csum-l3-single-tunnel") \
121 _ (19, RX_CSUM_L3_DOUBLE_TUNNEL, "rx-csum-l3-double-tunnel") \
122 _ (20, TX_CSUM_L4_SINGLE_TUNNEL, "tx-csum-l4-single-tunnel") \
123 _ (21, TX_CSUM_L4_DOUBLE_TUNNEL, "tx-csum-l4-double-tunnel") \
124 _ (22, RX_CSUM_L4_SINGLE_TUNNEL, "rx-csum-l4-single-tunnel") \
125 _ (23, RX_CSUM_L4_DOUBLE_TUNNEL, "rx-csum-l4-double-tunnel")
129 #define _(a, b, c) VIRTCHNL2_CAP_##b = (1 << a),
130 foreach_idpf_checksum_cap_flag
132 } idpf_checksum_cap_flag_t;
134 #define foreach_idpf_seg_cap_flag \
135 _ (0, IPV4_TCP, "ipv4-tcp") \
136 _ (1, IPV4_UDP, "ipv4-udp") \
137 _ (2, IPV4_SCTP, "ipv4-sctp") \
138 _ (3, IPV6_TCP, "ipv6-tcp") \
139 _ (4, IPV6_UDP, "ipv6-udp") \
140 _ (5, IPV6_SCTP, "ipv6-sctp") \
141 _ (6, GENERIC, "generic") \
142 _ (7, TX_SINGLE_TUNNEL, "tx-single-tunnel") \
143 _ (8, TX_DOUBLE_TUNNEL, "tx-double-tunnel")
147 #define _(a, b, c) VIRTCHNL2_CAP_SEG_##b = (1 << a),
148 foreach_idpf_seg_cap_flag
150 } idpf_seg_cap_flag_t;
152 #define foreach_idpf_rss_cap_flag \
153 _ (0, IPV4_TCP, "ipv4-tcp") \
154 _ (1, IPV4_UDP, "ipv4-udp") \
155 _ (2, IPV4_SCTP, "ipv4-sctp") \
156 _ (3, IPV4_OTHER, "ipv4-other") \
157 _ (4, IPV6_TCP, "ipv6-tcp") \
158 _ (5, IPV6_UDP, "ipv6-udp") \
159 _ (6, IPV6_SCTP, "ipv6-sctp") \
160 _ (7, IPV6_OTHER, "ipv6-other") \
161 _ (8, IPV4_AH, "ipv4-ah") \
162 _ (9, IPV4_ESP, "ipv4-esp") \
163 _ (10, IPV4_AH_ESP, "ipv4-ah-esp") \
164 _ (11, IPV6_AH, "ipv6-ah") \
165 _ (12, IPV6_ESP, "ipv6-esp") \
166 _ (13, IPV6_AH_ESP, "ipv6-ah-esp")
170 #define _(a, b, c) VIRTCHNL2_CAP_RSS_##b = (1 << a),
171 foreach_idpf_rss_cap_flag
173 } idpf_rss_cap_flag_t;
175 #define foreach_idpf_hsplit_cap_flag \
176 _ (0, AT_L2, "at-l2") \
177 _ (1, AT_L3, "at-l3") \
178 _ (2, AT_L4V4, "at-l4v4") \
179 _ (3, AT_L4V6, "at-l4v6")
183 #define _(a, b, c) VIRTCHNL2_CAP_RX_HSPLIT_##b = (1 << a),
184 foreach_idpf_hsplit_cap_flag
186 } idpf_hsplit_cap_flag_t;
188 #define foreach_idpf_rsc_cap_flag \
189 _ (0, IPV4_TCP, "ipv4-tcp") \
190 _ (1, IPV4_SCTP, "ipv4-sctp") \
191 _ (2, IPV6_TCP, "ipv6-tcp") \
192 _ (3, IPV6_SCTP, "ipv6-sctp")
196 #define _(a, b, c) VIRTCHNL2_CAP_RSC_##b = (1 << a),
197 foreach_idpf_rsc_cap_flag
199 } idpf_rsc_cap_flag_t;
201 #define foreach_idpf_other_cap_flag \
202 _ (0, RDMA, "rdma") \
203 _ (1, SRIOV, "sriov") \
204 _ (2, MACFILTER, "macfilter") \
205 _ (3, FLOW_DIRECTOR, "flow-director") \
206 _ (4, SPLITQ_QSCHED, "spliteq-qsched") \
209 _ (7, WB_ON_ITR, "wb-on-itr") \
210 _ (8, PROMISC, "promisc") \
211 _ (9, LINK_SPEED, "link-speed") \
212 _ (10, INLINE_IPSEC, "inline-ipsec") \
213 _ (11, LARGE_NUM_QUEUES, "large-num-queues") \
214 _ (12, VLAN, "vlan") \
216 _ (15, ADV_RSS, "adv-rss") \
217 _ (16, FDIR, "fdir") \
218 _ (17, RX_FLEX_DESC, "rx-flex-desc") \
219 _ (18, PTYPE, "ptype") \
220 _ (19, LOOPBACK, "loopback") \
225 #define _(a, b, c) VIRTCHNL2_CAP_##b = (1 << a),
226 foreach_idpf_other_cap_flag
228 } idpf_other_cap_flag_t;
230 #define VIRTCHNL2_TXQ_SCHED_MODE_QUEUE 0
231 #define VIRTCHNL2_TXQ_SCHED_MODE_FLOW 1
233 #define VIRTCHNL2_TXQ_ENABLE_MISS_COMPL BIT (0)
235 #define VIRTCHNL2_RDMA_CPF 0
236 #define VIRTCHNL2_NVME_CPF 1
237 #define VIRTCHNL2_ATE_CPF 2
238 #define VIRTCHNL2_LCE_CPF 3
240 #define VIRTCHNL2_RXQ_RSC BIT (0)
241 #define VIRTCHNL2_RXQ_HDR_SPLIT BIT (1)
242 #define VIRTCHNL2_RXQ_IMMEDIATE_WRITE_BACK BIT (2)
243 #define VIRTCHNL2_RX_DESC_SIZE_16BYTE BIT (3)
244 #define VIRTCHNL2_RX_DESC_SIZE_32BYTE BIT (4)
246 #define foreach_virtchnl2_rss_alg \
247 _ (0, TOEPLITZ_ASYMMETRIC) \
248 _ (1, R_ASYMMETRIC) \
249 _ (2, TOEPLITZ_SYMMETRIC) \
254 #define _(v, n) VIRTCHNL2_RSS_ALG_##n = v,
255 foreach_virtchnl2_rss_alg
257 } virtchnl2_rss_alg_t;
259 #define foreach_virtchnl2_event \
262 _ (2, START_RESET_ADI) \
263 _ (3, FINISH_RESET_ADI)
267 #define _(v, n) VIRTCHNL2_EVENT_##n = v,
268 foreach_virtchnl2_event
270 } virtchnl2_event_name_t;
272 #define foreach_idpf_queue_type \
275 _ (2, TX_COMPLETION) \
281 _ (8, P2P_TX_COMPLETION) \
282 _ (9, P2P_RX_BUFFER) \
288 #define _(v, n) VIRTCHNL2_QUEUE_TYPE_##n = v,
289 foreach_idpf_queue_type
293 #define foreach_virtchnl2_itr_idx \
301 #define _(v, n) VIRTCHNL2_ITR_IDX_##n = v,
302 foreach_virtchnl2_itr_idx
304 } virtchnl2_itr_idx_t;
306 #define VIRTCHNL2_MAC_ADDR_PRIMARY 1
307 #define VIRTCHNL2_MAC_ADDR_EXTRA 2
309 #define VIRTCHNL2_UNICAST_PROMISC BIT (0)
310 #define VIRTCHNL2_MULTICAST_PROMISC BIT (1)
312 #define foreach_virtchnl2_proto_hdr \
349 _ (36, L2TPV2_CONTROL) \
371 _ (58, PFCP_SESSION) \
380 #define _(v, n) VIRTCHNL2_PROTO_HDR_##n = v,
381 foreach_virtchnl2_proto_hdr
383 } virtchnl2_proto_hdr_t;
385 #define VIRTCHNL2_VERSION_MAJOR_2 2
386 #define VIRTCHNL2_VERSION_MINOR_0 0
392 } virtchnl2_version_info_t;
394 STATIC_ASSERT_SIZEOF (virtchnl2_version_info_t, 8);
406 u16 mailbox_vector_id;
407 u16 num_allocated_vectors;
417 u16 default_num_vports;
421 u8 max_sg_bufs_per_tx_pkt;
427 u16 oem_cp_ver_major;
428 u16 oem_cp_ver_minor;
432 } virtchnl2_get_capabilities_t;
434 STATIC_ASSERT_SIZEOF (virtchnl2_get_capabilities_t, 80);
438 /* see VIRTCHNL2_QUEUE_TYPE definitions */
444 /* Queue tail register offset and spacing provided by CP */
446 u32 qtail_reg_spacing;
449 } virtchnl2_queue_reg_chunk_t;
451 STATIC_ASSERT_SIZEOF (virtchnl2_queue_reg_chunk_t, 32);
453 /* structure to specify several chunks of contiguous queues */
458 virtchnl2_queue_reg_chunk_t chunks[1];
459 } virtchnl2_queue_reg_chunks_t;
461 STATIC_ASSERT_SIZEOF (virtchnl2_queue_reg_chunks_t, 40);
463 #define VIRTCHNL2_ETH_LENGTH_OF_ADDRESS 6
479 u8 default_mac_addr[VIRTCHNL2_ETH_LENGTH_OF_ADDRESS];
484 #define MAX_Q_REGIONS 16
485 u32 max_qs_per_qregion[MAX_Q_REGIONS];
486 u32 qregion_total_qs;
497 virtchnl2_queue_reg_chunks_t chunks;
498 } virtchnl2_create_vport_t;
500 STATIC_ASSERT_SIZEOF (virtchnl2_create_vport_t, 192);
508 STATIC_ASSERT_SIZEOF (virtchnl2_vport_t, 8);
515 u16 relative_queue_id;
521 u16 tx_compl_queue_id;
523 u16 peer_rx_queue_id;
529 u32 egress_hdr_pasid;
530 u32 egress_buf_pasid;
533 } virtchnl2_txq_info_t;
535 STATIC_ASSERT_SIZEOF (virtchnl2_txq_info_t, 56);
543 virtchnl2_txq_info_t qinfo[1];
544 } virtchnl2_config_tx_queues_t;
546 STATIC_ASSERT_SIZEOF (virtchnl2_config_tx_queues_t, 72);
548 /* Receive queue config info */
560 u32 data_buffer_size;
564 u8 buffer_notif_stride;
567 u64 dma_head_wb_addr;
571 u16 rx_buffer_low_watermark;
581 u32 ingress_hdr_pasid;
582 u32 ingress_buf_pasid;
585 } virtchnl2_rxq_info_t;
587 STATIC_ASSERT_SIZEOF (virtchnl2_rxq_info_t, 88);
595 virtchnl2_rxq_info_t qinfo[1];
596 } virtchnl2_config_rx_queues_t;
598 STATIC_ASSERT_SIZEOF (virtchnl2_config_rx_queues_t, 112);
608 virtchnl2_queue_reg_chunks_t chunks;
609 } virtchnl2_add_queues_t;
611 STATIC_ASSERT_SIZEOF (virtchnl2_add_queues_t, 56);
620 u32 dynctl_reg_start;
621 u32 dynctl_reg_spacing;
624 u32 itrn_reg_spacing;
626 } virtchnl2_vector_chunk_t;
628 STATIC_ASSERT_SIZEOF (virtchnl2_vector_chunk_t, 32);
634 virtchnl2_vector_chunk_t vchunks[1];
635 } virtchnl2_vector_chunks_t;
637 STATIC_ASSERT_SIZEOF (virtchnl2_vector_chunks_t, 48);
643 virtchnl2_vector_chunks_t vchunks;
644 } virtchnl2_alloc_vectors_t;
646 STATIC_ASSERT_SIZEOF (virtchnl2_alloc_vectors_t, 64);
651 u16 lut_entries_start;
654 u32 lut[1]; /* RSS lookup table */
655 } virtchnl2_rss_lut_t;
657 STATIC_ASSERT_SIZEOF (virtchnl2_rss_lut_t, 16);
661 /* Packet Type Groups bitmap */
665 } virtchnl2_rss_hash_t;
667 STATIC_ASSERT_SIZEOF (virtchnl2_rss_hash_t, 16);
673 } virtchnl2_sriov_vfs_info_t;
675 STATIC_ASSERT_SIZEOF (virtchnl2_sriov_vfs_info_t, 4);
685 virtchnl2_queue_reg_chunks_t chunks;
686 virtchnl2_vector_chunks_t vchunks;
687 } virtchnl2_create_adi_t;
689 STATIC_ASSERT_SIZEOF (virtchnl2_create_adi_t, 168);
695 } virtchnl2_destroy_adi_t;
697 STATIC_ASSERT_SIZEOF (virtchnl2_destroy_adi_t, 4);
708 STATIC_ASSERT_SIZEOF (virtchnl2_ptype_t, 8);
715 virtchnl2_ptype_t ptype[1];
716 } virtchnl2_get_ptype_info_t;
718 STATIC_ASSERT_SIZEOF (virtchnl2_get_ptype_info_t, 16);
731 u64 rx_unknown_protocol;
738 u64 rx_invalid_frame_length;
739 u64 rx_overflow_drop;
740 } virtchnl2_vport_stats_t;
742 STATIC_ASSERT_SIZEOF (virtchnl2_vport_stats_t, 128);
754 STATIC_ASSERT_SIZEOF (virtchnl2_event_t, 16);
762 } virtchnl2_rss_key_t;
764 STATIC_ASSERT_SIZEOF (virtchnl2_rss_key_t, 8);
772 } virtchnl2_queue_chunk_t;
774 STATIC_ASSERT_SIZEOF (virtchnl2_queue_chunk_t, 16);
780 virtchnl2_queue_chunk_t chunks[1];
781 } virtchnl2_queue_chunks_t;
783 STATIC_ASSERT_SIZEOF (virtchnl2_queue_chunks_t, 24);
789 virtchnl2_queue_chunks_t chunks;
790 } virtchnl2_del_ena_dis_queues_t;
792 STATIC_ASSERT_SIZEOF (virtchnl2_del_ena_dis_queues_t, 32);
804 } virtchnl2_queue_vector_t;
806 STATIC_ASSERT_SIZEOF (virtchnl2_queue_vector_t, 24);
813 virtchnl2_queue_vector_t qv_maps[1];
814 } virtchnl2_queue_vector_maps_t;
816 STATIC_ASSERT_SIZEOF (virtchnl2_queue_vector_maps_t, 40);
823 } virtchnl2_loopback_t;
825 STATIC_ASSERT_SIZEOF (virtchnl2_loopback_t, 8);
829 u8 addr[VIRTCHNL2_ETH_LENGTH_OF_ADDRESS];
832 } virtchnl2_mac_addr_t;
834 STATIC_ASSERT_SIZEOF (virtchnl2_mac_addr_t, 8);
841 virtchnl2_mac_addr_t mac_addr_list[1];
842 } virtchnl2_mac_addr_list_t;
844 STATIC_ASSERT_SIZEOF (virtchnl2_mac_addr_list_t, 16);
851 } virtchnl2_promisc_info_t;
853 STATIC_ASSERT_SIZEOF (virtchnl2_promisc_info_t, 8);
855 #endif /* _IDPF_VIRTCHNL_H_ */