idpf: add native idpf driver plugin
[vpp.git] / src / plugins / idpf / virtchnl2.h
1 /*
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:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
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  *------------------------------------------------------------------
16  */
17
18 #ifndef _IDPF_VIRTCHNL_H_
19 #define _IDPF_VIRTCHNL_H_
20
21 #include <idpf/virtchnl2_lan_desc.h>
22
23 #define foreach_virtchnl2_status                                              \
24   _ (0, SUCCESS)                                                              \
25   _ (-5, ERR_PARAM)                                                           \
26   _ (-38, ERR_OPCODE_MISMATCH)
27
28 typedef enum
29 {
30 #define _(v, n) VIRTCHNL2_STATUS_##n = v,
31   foreach_virtchnl2_status
32 #undef _
33 } virtchnl2_status_t;
34
35 #define foreach_virtchnl2_op                                                  \
36   _ (0, UNKNOWN)                                                              \
37   _ (1, VERSION)                                                              \
38   _ (500, GET_CAPS)                                                           \
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)                                                     \
47   _ (509, ADD_QUEUES)                                                         \
48   _ (510, DEL_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)                                                    \
60   _ (522, EVENT)                                                              \
61   _ (523, GET_STATS)                                                          \
62   _ (524, RESET_VF)                                                           \
63   _ (526, GET_PTYPE_INFO)                                                     \
64   _ (532, CREATE_ADI)                                                         \
65   _ (533, DESTROY_ADI)                                                        \
66   _ (534, LOOPBACK)                                                           \
67   _ (535, ADD_MAC_ADDR)                                                       \
68   _ (536, DEL_MAC_ADDR)                                                       \
69   _ (537, CONFIG_PROMISCUOUS_MODE)
70
71 typedef enum
72 {
73 #define _(v, n) VIRTCHNL2_OP_##n = v,
74   foreach_virtchnl2_op
75 #undef _
76 } virtchnl2_op_t;
77
78 /* VIRTCHNL2_VPORT_TYPE
79  * Type of virtual port
80  */
81 #define foreach_virtchnl2_vport_type                                          \
82   _ (0, DEFAULT)                                                              \
83   _ (1, SRIOV)                                                                \
84   _ (2, SIOV)                                                                 \
85   _ (3, SUBDEV)                                                               \
86   _ (4, MNG)
87
88 typedef enum
89 {
90 #define _(v, n) VIRTCHNL2_VPORT_TYPE_##n = v,
91   foreach_virtchnl2_vport_type
92 #undef _
93 } virtchnl2_vport_type_t;
94
95 /* VIRTCHNL2_QUEUE_MODEL
96  * Type of queue model
97  */
98 #define VIRTCHNL2_QUEUE_MODEL_SINGLE 0
99 #define VIRTCHNL2_QUEUE_MODEL_SPLIT  1
100
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")
126
127 typedef enum
128 {
129 #define _(a, b, c) VIRTCHNL2_CAP_##b = (1 << a),
130   foreach_idpf_checksum_cap_flag
131 #undef _
132 } idpf_checksum_cap_flag_t;
133
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")
144
145 typedef enum
146 {
147 #define _(a, b, c) VIRTCHNL2_CAP_SEG_##b = (1 << a),
148   foreach_idpf_seg_cap_flag
149 #undef _
150 } idpf_seg_cap_flag_t;
151
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")
167
168 typedef enum
169 {
170 #define _(a, b, c) VIRTCHNL2_CAP_RSS_##b = (1 << a),
171   foreach_idpf_rss_cap_flag
172 #undef _
173 } idpf_rss_cap_flag_t;
174
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")
180
181 typedef enum
182 {
183 #define _(a, b, c) VIRTCHNL2_CAP_RX_HSPLIT_##b = (1 << a),
184   foreach_idpf_hsplit_cap_flag
185 #undef _
186 } idpf_hsplit_cap_flag_t;
187
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")
193
194 typedef enum
195 {
196 #define _(a, b, c) VIRTCHNL2_CAP_RSC_##b = (1 << a),
197   foreach_idpf_rsc_cap_flag
198 #undef _
199 } idpf_rsc_cap_flag_t;
200
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")                                      \
207   _ (5, CRC, "crc")                                                           \
208   _ (6, ADQ, "adq")                                                           \
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")                                                        \
215   _ (13, PTP, "ptp")                                                          \
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")                                                \
221   _ (20, OEM, "oem")
222
223 typedef enum
224 {
225 #define _(a, b, c) VIRTCHNL2_CAP_##b = (1 << a),
226   foreach_idpf_other_cap_flag
227 #undef _
228 } idpf_other_cap_flag_t;
229
230 #define VIRTCHNL2_TXQ_SCHED_MODE_QUEUE 0
231 #define VIRTCHNL2_TXQ_SCHED_MODE_FLOW  1
232
233 #define VIRTCHNL2_TXQ_ENABLE_MISS_COMPL BIT (0)
234
235 #define VIRTCHNL2_RDMA_CPF 0
236 #define VIRTCHNL2_NVME_CPF 1
237 #define VIRTCHNL2_ATE_CPF  2
238 #define VIRTCHNL2_LCE_CPF  3
239
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)
245
246 #define foreach_virtchnl2_rss_alg                                             \
247   _ (0, TOEPLITZ_ASYMMETRIC)                                                  \
248   _ (1, R_ASYMMETRIC)                                                         \
249   _ (2, TOEPLITZ_SYMMETRIC)                                                   \
250   _ (3, XOR_SYMMETRIC)
251
252 typedef enum
253 {
254 #define _(v, n) VIRTCHNL2_RSS_ALG_##n = v,
255   foreach_virtchnl2_rss_alg
256 #undef _
257 } virtchnl2_rss_alg_t;
258
259 #define foreach_virtchnl2_event                                               \
260   _ (0, UNKNOWN)                                                              \
261   _ (1, LINK_CHANGE)                                                          \
262   _ (2, START_RESET_ADI)                                                      \
263   _ (3, FINISH_RESET_ADI)
264
265 typedef enum
266 {
267 #define _(v, n) VIRTCHNL2_EVENT_##n = v,
268   foreach_virtchnl2_event
269 #undef _
270 } virtchnl2_event_name_t;
271
272 #define foreach_idpf_queue_type                                               \
273   _ (0, TX)                                                                   \
274   _ (1, RX)                                                                   \
275   _ (2, TX_COMPLETION)                                                        \
276   _ (3, RX_BUFFER)                                                            \
277   _ (4, CONFIG_TX)                                                            \
278   _ (5, CONFIG_RX)                                                            \
279   _ (6, P2P_TX)                                                               \
280   _ (7, P2P_RX)                                                               \
281   _ (8, P2P_TX_COMPLETION)                                                    \
282   _ (9, P2P_RX_BUFFER)                                                        \
283   _ (10, MBX_TX)                                                              \
284   _ (11, MBX_RX)
285
286 typedef enum
287 {
288 #define _(v, n) VIRTCHNL2_QUEUE_TYPE_##n = v,
289   foreach_idpf_queue_type
290 #undef _
291 } idpf_queue_type_t;
292
293 #define foreach_virtchnl2_itr_idx                                             \
294   _ (0, 0)                                                                    \
295   _ (1, 1)                                                                    \
296   _ (2, 2)                                                                    \
297   _ (3, NO_ITR)
298
299 typedef enum
300 {
301 #define _(v, n) VIRTCHNL2_ITR_IDX_##n = v,
302   foreach_virtchnl2_itr_idx
303 #undef _
304 } virtchnl2_itr_idx_t;
305
306 #define VIRTCHNL2_MAC_ADDR_PRIMARY 1
307 #define VIRTCHNL2_MAC_ADDR_EXTRA   2
308
309 #define VIRTCHNL2_UNICAST_PROMISC   BIT (0)
310 #define VIRTCHNL2_MULTICAST_PROMISC BIT (1)
311
312 #define foreach_virtchnl2_proto_hdr                                           \
313   _ (0, ANY)                                                                  \
314   _ (1, PRE_MAC)                                                              \
315   _ (2, MAC)                                                                  \
316   _ (3, POST_MAC)                                                             \
317   _ (4, ETHERTYPE)                                                            \
318   _ (5, VLAN)                                                                 \
319   _ (6, SVLAN)                                                                \
320   _ (7, CVLAN)                                                                \
321   _ (8, MPLS)                                                                 \
322   _ (9, UMPLS)                                                                \
323   _ (10, MMPLS)                                                               \
324   _ (11, PTP)                                                                 \
325   _ (12, CTRL)                                                                \
326   _ (13, LLDP)                                                                \
327   _ (14, ARP)                                                                 \
328   _ (15, ECP)                                                                 \
329   _ (16, EAPOL)                                                               \
330   _ (17, PPPOD)                                                               \
331   _ (18, PPPOE)                                                               \
332   _ (19, IPV4)                                                                \
333   _ (20, IPV4_FRAG)                                                           \
334   _ (21, IPV6)                                                                \
335   _ (22, IPV6_FRAG)                                                           \
336   _ (23, IPV6_EH)                                                             \
337   _ (24, UDP)                                                                 \
338   _ (25, TCP)                                                                 \
339   _ (26, SCTP)                                                                \
340   _ (27, ICMP)                                                                \
341   _ (28, ICMPV6)                                                              \
342   _ (29, IGMP)                                                                \
343   _ (30, AH)                                                                  \
344   _ (31, ESP)                                                                 \
345   _ (32, IKE)                                                                 \
346   _ (33, NATT_KEEP)                                                           \
347   _ (34, PAY)                                                                 \
348   _ (35, L2TPV2)                                                              \
349   _ (36, L2TPV2_CONTROL)                                                      \
350   _ (37, L2TPV3)                                                              \
351   _ (38, GTP)                                                                 \
352   _ (39, GTP_EH)                                                              \
353   _ (40, GTPCV2)                                                              \
354   _ (41, GTPC_TEID)                                                           \
355   _ (42, GTPU)                                                                \
356   _ (43, GTPU_UL)                                                             \
357   _ (44, GTPU_DL)                                                             \
358   _ (45, ECPRI)                                                               \
359   _ (46, VRRP)                                                                \
360   _ (47, OSPF)                                                                \
361   _ (48, TUN)                                                                 \
362   _ (49, GRE)                                                                 \
363   _ (50, NVGRE)                                                               \
364   _ (51, VXLAN)                                                               \
365   _ (52, VXLAN_GPE)                                                           \
366   _ (53, GENEVE)                                                              \
367   _ (54, NSH)                                                                 \
368   _ (55, QUIC)                                                                \
369   _ (56, PFCP)                                                                \
370   _ (57, PFCP_NODE)                                                           \
371   _ (58, PFCP_SESSION)                                                        \
372   _ (59, RTP)                                                                 \
373   _ (60, ROCE)                                                                \
374   _ (61, ROCEV1)                                                              \
375   _ (62, ROCEV2)                                                              \
376   _ (65535, NO_PROTO)
377
378 typedef enum
379 {
380 #define _(v, n) VIRTCHNL2_PROTO_HDR_##n = v,
381   foreach_virtchnl2_proto_hdr
382 #undef _
383 } virtchnl2_proto_hdr_t;
384
385 #define VIRTCHNL2_VERSION_MAJOR_2 2
386 #define VIRTCHNL2_VERSION_MINOR_0 0
387
388 typedef struct
389 {
390   u32 major;
391   u32 minor;
392 } virtchnl2_version_info_t;
393
394 STATIC_ASSERT_SIZEOF (virtchnl2_version_info_t, 8);
395
396 typedef struct
397 {
398   u32 csum_caps;
399   u32 seg_caps;
400   u32 hsplit_caps;
401   u32 rsc_caps;
402   u64 rss_caps;
403   u64 other_caps;
404
405   u32 mailbox_dyn_ctl;
406   u16 mailbox_vector_id;
407   u16 num_allocated_vectors;
408
409   u16 max_rx_q;
410   u16 max_tx_q;
411   u16 max_rx_bufq;
412   u16 max_tx_complq;
413
414   u16 max_sriov_vfs;
415
416   u16 max_vports;
417   u16 default_num_vports;
418
419   u16 max_tx_hdr_size;
420
421   u8 max_sg_bufs_per_tx_pkt;
422
423   u8 itr_idx_map;
424
425   u16 pad1;
426
427   u16 oem_cp_ver_major;
428   u16 oem_cp_ver_minor;
429   u32 device_type;
430
431   u8 reserved[12];
432 } virtchnl2_get_capabilities_t;
433
434 STATIC_ASSERT_SIZEOF (virtchnl2_get_capabilities_t, 80);
435
436 typedef struct
437 {
438   /* see VIRTCHNL2_QUEUE_TYPE definitions */
439   u32 type;
440   u32 start_queue_id;
441   u32 num_queues;
442   u32 pad;
443
444   /* Queue tail register offset and spacing provided by CP */
445   u64 qtail_reg_start;
446   u32 qtail_reg_spacing;
447
448   u8 reserved[4];
449 } virtchnl2_queue_reg_chunk_t;
450
451 STATIC_ASSERT_SIZEOF (virtchnl2_queue_reg_chunk_t, 32);
452
453 /* structure to specify several chunks of contiguous queues */
454 typedef struct
455 {
456   u16 num_chunks;
457   u8 reserved[6];
458   virtchnl2_queue_reg_chunk_t chunks[1];
459 } virtchnl2_queue_reg_chunks_t;
460
461 STATIC_ASSERT_SIZEOF (virtchnl2_queue_reg_chunks_t, 40);
462
463 #define VIRTCHNL2_ETH_LENGTH_OF_ADDRESS 6
464
465 typedef struct
466 {
467   u16 vport_type;
468   u16 txq_model;
469   u16 rxq_model;
470   u16 num_tx_q;
471   u16 num_tx_complq;
472   u16 num_rx_q;
473   u16 num_rx_bufq;
474   u16 default_rx_q;
475   u16 vport_index;
476
477   u16 max_mtu;
478   u32 vport_id;
479   u8 default_mac_addr[VIRTCHNL2_ETH_LENGTH_OF_ADDRESS];
480   u16 pad;
481   u64 rx_desc_ids;
482   u64 tx_desc_ids;
483
484 #define MAX_Q_REGIONS 16
485   u32 max_qs_per_qregion[MAX_Q_REGIONS];
486   u32 qregion_total_qs;
487   u16 qregion_type;
488   u16 pad2;
489
490   u32 rss_algorithm;
491   u16 rss_key_size;
492   u16 rss_lut_size;
493
494   u32 rx_split_pos;
495
496   u8 reserved[20];
497   virtchnl2_queue_reg_chunks_t chunks;
498 } virtchnl2_create_vport_t;
499
500 STATIC_ASSERT_SIZEOF (virtchnl2_create_vport_t, 192);
501
502 typedef struct
503 {
504   u32 vport_id;
505   u8 reserved[4];
506 } virtchnl2_vport_t;
507
508 STATIC_ASSERT_SIZEOF (virtchnl2_vport_t, 8);
509
510 typedef struct
511 {
512   u64 dma_ring_addr;
513   u32 type;
514   u32 queue_id;
515   u16 relative_queue_id;
516   u16 model;
517   u16 sched_mode;
518   u16 qflags;
519   u16 ring_len;
520
521   u16 tx_compl_queue_id;
522   u16 peer_type;
523   u16 peer_rx_queue_id;
524
525   u16 qregion_id;
526   u8 pad[2];
527
528   u32 egress_pasid;
529   u32 egress_hdr_pasid;
530   u32 egress_buf_pasid;
531
532   u8 reserved[8];
533 } virtchnl2_txq_info_t;
534
535 STATIC_ASSERT_SIZEOF (virtchnl2_txq_info_t, 56);
536
537 typedef struct
538 {
539   u32 vport_id;
540   u16 num_qinfo;
541
542   u8 reserved[10];
543   virtchnl2_txq_info_t qinfo[1];
544 } virtchnl2_config_tx_queues_t;
545
546 STATIC_ASSERT_SIZEOF (virtchnl2_config_tx_queues_t, 72);
547
548 /* Receive queue config info */
549 typedef struct
550 {
551   u64 desc_ids;
552   u64 dma_ring_addr;
553
554   u32 type;
555   u32 queue_id;
556
557   u16 model;
558
559   u16 hdr_buffer_size;
560   u32 data_buffer_size;
561   u32 max_pkt_size;
562
563   u16 ring_len;
564   u8 buffer_notif_stride;
565   u8 pad[1];
566
567   u64 dma_head_wb_addr;
568
569   u16 qflags;
570
571   u16 rx_buffer_low_watermark;
572
573   u16 rx_bufq1_id;
574   u16 rx_bufq2_id;
575   u8 bufq2_ena;
576   u8 pad2;
577
578   u16 qregion_id;
579
580   u32 ingress_pasid;
581   u32 ingress_hdr_pasid;
582   u32 ingress_buf_pasid;
583
584   u8 reserved[16];
585 } virtchnl2_rxq_info_t;
586
587 STATIC_ASSERT_SIZEOF (virtchnl2_rxq_info_t, 88);
588
589 typedef struct
590 {
591   u32 vport_id;
592   u16 num_qinfo;
593
594   u8 reserved[18];
595   virtchnl2_rxq_info_t qinfo[1];
596 } virtchnl2_config_rx_queues_t;
597
598 STATIC_ASSERT_SIZEOF (virtchnl2_config_rx_queues_t, 112);
599
600 typedef struct
601 {
602   u32 vport_id;
603   u16 num_tx_q;
604   u16 num_tx_complq;
605   u16 num_rx_q;
606   u16 num_rx_bufq;
607   u8 reserved[4];
608   virtchnl2_queue_reg_chunks_t chunks;
609 } virtchnl2_add_queues_t;
610
611 STATIC_ASSERT_SIZEOF (virtchnl2_add_queues_t, 56);
612
613 typedef struct
614 {
615   u16 start_vector_id;
616   u16 start_evv_id;
617   u16 num_vectors;
618   u16 pad1;
619
620   u32 dynctl_reg_start;
621   u32 dynctl_reg_spacing;
622
623   u32 itrn_reg_start;
624   u32 itrn_reg_spacing;
625   u8 reserved[8];
626 } virtchnl2_vector_chunk_t;
627
628 STATIC_ASSERT_SIZEOF (virtchnl2_vector_chunk_t, 32);
629
630 typedef struct
631 {
632   u16 num_vchunks;
633   u8 reserved[14];
634   virtchnl2_vector_chunk_t vchunks[1];
635 } virtchnl2_vector_chunks_t;
636
637 STATIC_ASSERT_SIZEOF (virtchnl2_vector_chunks_t, 48);
638
639 typedef struct
640 {
641   u16 num_vectors;
642   u8 reserved[14];
643   virtchnl2_vector_chunks_t vchunks;
644 } virtchnl2_alloc_vectors_t;
645
646 STATIC_ASSERT_SIZEOF (virtchnl2_alloc_vectors_t, 64);
647
648 typedef struct
649 {
650   u32 vport_id;
651   u16 lut_entries_start;
652   u16 lut_entries;
653   u8 reserved[4];
654   u32 lut[1]; /* RSS lookup table */
655 } virtchnl2_rss_lut_t;
656
657 STATIC_ASSERT_SIZEOF (virtchnl2_rss_lut_t, 16);
658
659 typedef struct
660 {
661   /* Packet Type Groups bitmap */
662   u64 ptype_groups;
663   u32 vport_id;
664   u8 reserved[4];
665 } virtchnl2_rss_hash_t;
666
667 STATIC_ASSERT_SIZEOF (virtchnl2_rss_hash_t, 16);
668
669 typedef struct
670 {
671   u16 num_vfs;
672   u16 pad;
673 } virtchnl2_sriov_vfs_info_t;
674
675 STATIC_ASSERT_SIZEOF (virtchnl2_sriov_vfs_info_t, 4);
676
677 typedef struct
678 {
679   u32 pasid;
680   u16 mbx_id;
681   u16 mbx_vec_id;
682   u16 adi_id;
683   u8 reserved[64];
684   u8 pad[6];
685   virtchnl2_queue_reg_chunks_t chunks;
686   virtchnl2_vector_chunks_t vchunks;
687 } virtchnl2_create_adi_t;
688
689 STATIC_ASSERT_SIZEOF (virtchnl2_create_adi_t, 168);
690
691 typedef struct
692 {
693   u16 adi_id;
694   u8 reserved[2];
695 } virtchnl2_destroy_adi_t;
696
697 STATIC_ASSERT_SIZEOF (virtchnl2_destroy_adi_t, 4);
698
699 typedef struct
700 {
701   u16 ptype_id_10;
702   u8 ptype_id_8;
703   u8 proto_id_count;
704   u16 pad;
705   u16 proto_id[1];
706 } virtchnl2_ptype_t;
707
708 STATIC_ASSERT_SIZEOF (virtchnl2_ptype_t, 8);
709
710 typedef struct
711 {
712   u16 start_ptype_id;
713   u16 num_ptypes;
714   u32 pad;
715   virtchnl2_ptype_t ptype[1];
716 } virtchnl2_get_ptype_info_t;
717
718 STATIC_ASSERT_SIZEOF (virtchnl2_get_ptype_info_t, 16);
719
720 typedef struct
721 {
722   u32 vport_id;
723   u8 pad[4];
724
725   u64 rx_bytes;
726   u64 rx_unicast;
727   u64 rx_multicast;
728   u64 rx_broadcast;
729   u64 rx_discards;
730   u64 rx_errors;
731   u64 rx_unknown_protocol;
732   u64 tx_bytes;
733   u64 tx_unicast;
734   u64 tx_multicast;
735   u64 tx_broadcast;
736   u64 tx_discards;
737   u64 tx_errors;
738   u64 rx_invalid_frame_length;
739   u64 rx_overflow_drop;
740 } virtchnl2_vport_stats_t;
741
742 STATIC_ASSERT_SIZEOF (virtchnl2_vport_stats_t, 128);
743
744 typedef struct
745 {
746   u32 event;
747   u32 link_speed;
748   u32 vport_id;
749   u8 link_status;
750   u8 pad[1];
751   u16 adi_id;
752 } virtchnl2_event_t;
753
754 STATIC_ASSERT_SIZEOF (virtchnl2_event_t, 16);
755
756 typedef struct
757 {
758   u32 vport_id;
759   u16 key_len;
760   u8 pad;
761   u8 key[1];
762 } virtchnl2_rss_key_t;
763
764 STATIC_ASSERT_SIZEOF (virtchnl2_rss_key_t, 8);
765
766 typedef struct
767 {
768   u32 type;
769   u32 start_queue_id;
770   u32 num_queues;
771   u8 reserved[4];
772 } virtchnl2_queue_chunk_t;
773
774 STATIC_ASSERT_SIZEOF (virtchnl2_queue_chunk_t, 16);
775
776 typedef struct
777 {
778   u16 num_chunks;
779   u8 reserved[6];
780   virtchnl2_queue_chunk_t chunks[1];
781 } virtchnl2_queue_chunks_t;
782
783 STATIC_ASSERT_SIZEOF (virtchnl2_queue_chunks_t, 24);
784
785 typedef struct
786 {
787   u32 vport_id;
788   u8 reserved[4];
789   virtchnl2_queue_chunks_t chunks;
790 } virtchnl2_del_ena_dis_queues_t;
791
792 STATIC_ASSERT_SIZEOF (virtchnl2_del_ena_dis_queues_t, 32);
793
794 typedef struct
795 {
796   u32 queue_id;
797   u16 vector_id;
798   u8 pad[2];
799
800   u32 itr_idx;
801
802   u32 queue_type;
803   u8 reserved[8];
804 } virtchnl2_queue_vector_t;
805
806 STATIC_ASSERT_SIZEOF (virtchnl2_queue_vector_t, 24);
807
808 typedef struct
809 {
810   u32 vport_id;
811   u16 num_qv_maps;
812   u8 pad[10];
813   virtchnl2_queue_vector_t qv_maps[1];
814 } virtchnl2_queue_vector_maps_t;
815
816 STATIC_ASSERT_SIZEOF (virtchnl2_queue_vector_maps_t, 40);
817
818 typedef struct
819 {
820   u32 vport_id;
821   u8 enable;
822   u8 pad[3];
823 } virtchnl2_loopback_t;
824
825 STATIC_ASSERT_SIZEOF (virtchnl2_loopback_t, 8);
826
827 typedef struct
828 {
829   u8 addr[VIRTCHNL2_ETH_LENGTH_OF_ADDRESS];
830   u8 type;
831   u8 pad;
832 } virtchnl2_mac_addr_t;
833
834 STATIC_ASSERT_SIZEOF (virtchnl2_mac_addr_t, 8);
835
836 typedef struct
837 {
838   u32 vport_id;
839   u16 num_mac_addr;
840   u8 pad[2];
841   virtchnl2_mac_addr_t mac_addr_list[1];
842 } virtchnl2_mac_addr_list_t;
843
844 STATIC_ASSERT_SIZEOF (virtchnl2_mac_addr_list_t, 16);
845
846 typedef struct
847 {
848   u32 vport_id;
849   u16 flags;
850   u8 pad[2];
851 } virtchnl2_promisc_info_t;
852
853 STATIC_ASSERT_SIZEOF (virtchnl2_promisc_info_t, 8);
854
855 #endif /* _IDPF_VIRTCHNL_H_ */