iavf: interrupt mode support
[vpp.git] / src / plugins / dev_iavf / virtchnl.h
1 /* SPDX-License-Identifier: Apache-2.0
2  * Copyright (c) 2023 Cisco Systems, Inc.
3  */
4
5 #ifndef _IIAVF_VIRTCHNL_H_
6 #define _IIAVF_VIRTCHNL_H_
7
8 #define VIRTCHNL_VERSION_MAJOR 1
9 #define VIRTCHNL_VERSION_MINOR 1
10
11 #define foreach_iavf_promisc_flags                                            \
12   _ (0, UNICAST_PROMISC, "unicast")                                           \
13   _ (1, MULTICAST_PROMISC, "multicast")
14
15 enum
16 {
17 #define _(a, b, c) FLAG_VF_##b = (1 << a),
18   foreach_iavf_promisc_flags
19 #undef _
20 };
21
22 #define IAVF_VFINT_DYN_CTLN(x) (0x00003800 + (0x4 * x))
23 #define IAVF_VFINT_ICR0        0x00004800
24 #define IAVF_VFINT_ICR0_ENA1   0x00005000
25 #define IAVF_VFINT_DYN_CTL0    0x00005C00
26 #define IAVF_ARQBAH            0x00006000
27 #define IAVF_ATQH              0x00006400
28 #define IAVF_ATQLEN            0x00006800
29 #define IAVF_ARQBAL            0x00006C00
30 #define IAVF_ARQT              0x00007000
31 #define IAVF_ARQH              0x00007400
32 #define IAVF_ATQBAH            0x00007800
33 #define IAVF_ATQBAL            0x00007C00
34 #define IAVF_ARQLEN            0x00008000
35 #define IAVF_ATQT              0x00008400
36 #define IAVF_VFGEN_RSTAT       0x00008800
37 #define IAVF_QTX_TAIL(q)       (0x00000000 + (0x4 * q))
38 #define IAVF_QRX_TAIL(q)       (0x00002000 + (0x4 * q))
39
40 #define foreach_virtchnl_op                                                   \
41   _ (0, UNKNOWN)                                                              \
42   _ (1, VERSION)                                                              \
43   _ (2, RESET_VF)                                                             \
44   _ (3, GET_VF_RESOURCES)                                                     \
45   _ (4, CONFIG_TX_QUEUE)                                                      \
46   _ (5, CONFIG_RX_QUEUE)                                                      \
47   _ (6, CONFIG_VSI_QUEUES)                                                    \
48   _ (7, CONFIG_IRQ_MAP)                                                       \
49   _ (8, ENABLE_QUEUES)                                                        \
50   _ (9, DISABLE_QUEUES)                                                       \
51   _ (10, ADD_ETH_ADDR)                                                        \
52   _ (11, DEL_ETH_ADDR)                                                        \
53   _ (12, ADD_VLAN)                                                            \
54   _ (13, DEL_VLAN)                                                            \
55   _ (14, CONFIG_PROMISCUOUS_MODE)                                             \
56   _ (15, GET_STATS)                                                           \
57   _ (16, RSVD)                                                                \
58   _ (17, EVENT)                                                               \
59   _ (18, UNDEF_18)                                                            \
60   _ (19, UNDEF_19)                                                            \
61   _ (20, IWARP)                                                               \
62   _ (21, CONFIG_IWARP_IRQ_MAP)                                                \
63   _ (22, RELEASE_IWARP_IRQ_MAP)                                               \
64   _ (23, CONFIG_RSS_KEY)                                                      \
65   _ (24, CONFIG_RSS_LUT)                                                      \
66   _ (25, GET_RSS_HENA_CAPS)                                                   \
67   _ (26, SET_RSS_HENA)                                                        \
68   _ (27, ENABLE_VLAN_STRIPPING)                                               \
69   _ (28, DISABLE_VLAN_STRIPPING)                                              \
70   _ (29, REQUEST_QUEUES)                                                      \
71   _ (30, ENABLE_CHANNELS)                                                     \
72   _ (31, DISABLE_CHANNELS)                                                    \
73   _ (32, ADD_CLOUD_FILTER)                                                    \
74   _ (33, DEL_CLOUD_FILTER)                                                    \
75   _ (45, ADD_RSS_CFG)                                                         \
76   _ (46, DEL_RSS_CFG)                                                         \
77   _ (47, ADD_FDIR_FILTER)                                                     \
78   _ (48, DEL_FDIR_FILTER)                                                     \
79   _ (49, QUERY_FDIR_FILTER)                                                   \
80   _ (50, GET_MAX_RSS_QREGION)                                                 \
81   _ (51, GET_OFFLOAD_VLAN_V2_CAPS)                                            \
82   _ (52, ADD_VLAN_V2)                                                         \
83   _ (53, DEL_VLAN_V2)                                                         \
84   _ (54, ENABLE_VLAN_STRIPPING_V2)                                            \
85   _ (55, DISABLE_VLAN_STRIPPING_V2)                                           \
86   _ (56, ENABLE_VLAN_INSERTION_V2)                                            \
87   _ (57, DISABLE_VLAN_INSERTION_V2)                                           \
88   _ (58, ENABLE_VLAN_FILTERING_V2)                                            \
89   _ (59, DISABLE_VLAN_FILTERING_V2)                                           \
90   _ (107, ENABLE_QUEUES_V2)                                                   \
91   _ (108, DISABLE_QUEUES_V2)                                                  \
92   _ (111, MAP_QUEUE_VECTOR)
93
94 typedef enum
95 {
96 #define _(v, n) VIRTCHNL_OP_##n = v,
97   foreach_virtchnl_op
98 #undef _
99     VIRTCHNL_N_OPS,
100 } virtchnl_op_t;
101
102 #define foreach_virtchnl_status                                               \
103   _ (0, SUCCESS)                                                              \
104   _ (-5, ERR_PARAM)                                                           \
105   _ (-18, ERR_NO_MEMORY)                                                      \
106   _ (-38, ERR_OPCODE_MISMATCH)                                                \
107   _ (-39, ERR_CQP_COMPL_ERROR)                                                \
108   _ (-40, ERR_INVALID_VF_ID)                                                  \
109   _ (-53, ERR_ADMIN_QUEUE_ERROR)                                              \
110   _ (-64, NOT_SUPPORTED)
111
112 typedef enum
113 {
114 #define _(a, b) VIRTCHNL_STATUS_##b = a,
115   foreach_virtchnl_status
116 #undef _
117 } virtchnl_status_t;
118
119 #define foreach_iavf_vf_cap_flag                                              \
120   _ (0, OFFLOAD_L2, "l2")                                                     \
121   _ (1, OFFLOAD_IWARP, "iwarp")                                               \
122   _ (2, OFFLOAD_RSVD, "rsvd")                                                 \
123   _ (3, OFFLOAD_RSS_AQ, "rss-aq")                                             \
124   _ (4, OFFLOAD_RSS_REG, "rss-reg")                                           \
125   _ (5, OFFLOAD_WB_ON_ITR, "wb-on-itr")                                       \
126   _ (6, OFFLOAD_REQ_QUEUES, "req-queues")                                     \
127   _ (7, CAP_ADV_LINK_SPEED, "adv-link-speed")                                 \
128   _ (9, LARGE_NUM_QPAIRS, "large-num-qpairs")                                 \
129   _ (15, OFFLOAD_VLAN_V2, "vlan-v2")                                          \
130   _ (16, OFFLOAD_VLAN, "vlan")                                                \
131   _ (17, OFFLOAD_RX_POLLING, "rx-polling")                                    \
132   _ (18, OFFLOAD_RSS_PCTYPE_V2, "rss-pctype-v2")                              \
133   _ (19, OFFLOAD_RSS_PF, "rss-pf")                                            \
134   _ (20, OFFLOAD_ENCAP, "encap")                                              \
135   _ (21, OFFLOAD_ENCAP_CSUM, "encap-csum")                                    \
136   _ (22, OFFLOAD_RX_ENCAP_CSUM, "rx-encap-csum")                              \
137   _ (23, OFFLOAD_ADQ, "offload-adq")                                          \
138   _ (24, OFFLOAD_ADQ_v2, "offload-adq-v2")                                    \
139   _ (25, OFFLOAD_USO, "offload-uso")                                          \
140   _ (26, OFFLOAD_RX_FLEX_DESC, "offload-rx-flex-desc")                        \
141   _ (27, OFFLOAD_ADV_RSS_PF, "offload-adv-rss-pf")                            \
142   _ (28, OFFLOAD_FDIR_PF, "offload-fdir-pf")                                  \
143   _ (30, CAP_DCF, "dcf")
144
145 typedef enum
146 {
147 #define _(a, b, c) VIRTCHNL_VF_##b = (1 << a),
148   foreach_iavf_vf_cap_flag
149 #undef _
150 } iavf_vf_cap_flag_t;
151
152 typedef enum
153 {
154   VIRTCHNL_VSI_TYPE_INVALID = 0,
155   VIRTCHNL_VSI_SRIOV = 6,
156 } virtchnl_vsi_type_t;
157
158 typedef enum
159 {
160   VIRTCHNL_VFR_INPROGRESS = 0,
161   VIRTCHNL_VFR_COMPLETED,
162   VIRTCHNL_VFR_VFACTIVE,
163 } virtchnl_vfr_states_t;
164
165 typedef struct
166 {
167   u16 vsi_id;
168   u16 num_queue_pairs;
169   virtchnl_vsi_type_t vsi_type;
170   u16 qset_handle;
171   u8 default_mac_addr[6];
172 } virtchnl_vsi_resource_t;
173
174 typedef struct
175 {
176   u16 num_vsis;
177   u16 num_queue_pairs;
178   u16 max_vectors;
179   u16 max_mtu;
180   u32 vf_cap_flags;
181   u32 rss_key_size;
182   u32 rss_lut_size;
183   virtchnl_vsi_resource_t vsi_res[1];
184 } virtchnl_vf_resource_t;
185
186 #define foreach_virtchnl_event_code                                           \
187   _ (0, UNKNOWN)                                                              \
188   _ (1, LINK_CHANGE)                                                          \
189   _ (2, RESET_IMPENDING)                                                      \
190   _ (3, PF_DRIVER_CLOSE)
191
192 typedef enum
193 {
194 #define _(a, b) VIRTCHNL_EVENT_##b = (a),
195   foreach_virtchnl_event_code
196 #undef _
197 } virtchnl_event_codes_t;
198
199 #define foreach_virtchnl_link_speed                                           \
200   _ (0, 2_5GB, "2.5 Gbps")                                                    \
201   _ (1, 100MB, "100 Mbps")                                                    \
202   _ (2, 1GB, "1 Gbps")                                                        \
203   _ (3, 10GB, "10 Gbps")                                                      \
204   _ (4, 40GB, "40 Gbps")                                                      \
205   _ (5, 20GB, "20 Gbps")                                                      \
206   _ (6, 25GB, "25 Gbps")                                                      \
207   _ (7, 5GB, "5 Gbps")
208
209 typedef enum
210 {
211   VIRTCHNL_LINK_SPEED_UNKNOWN = 0,
212 #define _(a, b, c) VIRTCHNL_LINK_SPEED_##b = (1 << a),
213   foreach_virtchnl_link_speed
214 #undef _
215 } virtchnl_link_speed_t;
216
217 typedef struct
218 {
219   virtchnl_event_codes_t event;
220   union
221   {
222     struct
223     {
224       virtchnl_link_speed_t link_speed;
225       u8 link_status;
226     } link_event;
227     struct
228     {
229       u32 link_speed;
230       u8 link_status;
231     } link_event_adv;
232   } event_data;
233   int severity;
234 } virtchnl_pf_event_t;
235
236 STATIC_ASSERT_SIZEOF (virtchnl_pf_event_t, 16);
237
238 typedef struct
239 {
240   u32 major;
241   u32 minor;
242 } virtchnl_version_info_t;
243
244 #define foreach_iavf_aq_desc_flag                                             \
245   _ (1, dd)                                                                   \
246   _ (1, cmp)                                                                  \
247   _ (1, err)                                                                  \
248   _ (1, vfe)                                                                  \
249   _ (5, reserved)                                                             \
250   _ (1, lb)                                                                   \
251   _ (1, rd)                                                                   \
252   _ (1, vfc)                                                                  \
253   _ (1, buf)                                                                  \
254   _ (1, si)                                                                   \
255   _ (1, ie)                                                                   \
256   _ (1, fe)
257
258 typedef union
259 {
260   struct
261   {
262 #define _(n, s) u16 s : n;
263     foreach_iavf_aq_desc_flag
264 #undef _
265   };
266   u16 as_u16;
267 } iavf_aq_desc_flags_t;
268
269 STATIC_ASSERT_SIZEOF (iavf_aq_desc_flags_t, 2);
270
271 typedef enum
272 {
273   IIAVF_AQ_DESC_OP_QUEUE_SHUTDOWN = 0x0003,
274   IIAVF_AQ_DESC_OP_SEND_TO_PF = 0x0801,
275   IIAVF_AQ_DESC_OP_MESSAGE_FROM_PF = 0x0802,
276 } __clib_packed iavf_aq_desc_op_t;
277
278 #define foreach_iavf_aq_desc_retval                                           \
279   _ (0, OK)                                                                   \
280   _ (1, EPERM)                                                                \
281   _ (2, ENOENT)                                                               \
282   _ (3, ESRCH)                                                                \
283   _ (4, EINTR)                                                                \
284   _ (5, EIO)                                                                  \
285   _ (6, ENXIO)                                                                \
286   _ (7, E2BIG)                                                                \
287   _ (8, EAGAIN)                                                               \
288   _ (9, ENOMEM)                                                               \
289   _ (10, EACCES)                                                              \
290   _ (11, EFAULT)                                                              \
291   _ (12, EBUSY)                                                               \
292   _ (13, EEXIST)                                                              \
293   _ (14, EINVAL)                                                              \
294   _ (15, ENOTTY)                                                              \
295   _ (16, ENOSPC)                                                              \
296   _ (17, ENOSYS)                                                              \
297   _ (18, ERANGE)                                                              \
298   _ (19, EFLUSHED)                                                            \
299   _ (20, BAD_ADDR)                                                            \
300   _ (21, EMODE)                                                               \
301   _ (22, EFBIG)                                                               \
302   _ (23, ESBCOMP)                                                             \
303   _ (24, ENOSEC)                                                              \
304   _ (25, EBADSIG)                                                             \
305   _ (26, ESVN)                                                                \
306   _ (27, EBADMAN)                                                             \
307   _ (28, EBADBUF)                                                             \
308   _ (29, EACCES_BMCU)
309
310 typedef enum
311 {
312 #define _(a, b) IIAVF_AQ_DESC_RETVAL_##b = a,
313   foreach_iavf_aq_desc_retval
314 #undef _
315 } __clib_packed iavf_aq_desc_retval_t;
316
317 typedef struct
318 {
319   iavf_aq_desc_flags_t flags;
320   iavf_aq_desc_op_t opcode;
321   u16 datalen;
322   u16 retval;
323   union
324   {
325     u32 cookie_hi;
326     virtchnl_op_t v_opcode;
327   };
328   union
329   {
330     u32 cookie_lo;
331     virtchnl_status_t v_retval;
332   };
333   union
334   {
335     u8 driver_unloading : 1;
336     u32 param0;
337   };
338   u32 param1;
339   union
340   {
341     u32 param2;
342     u32 addr_hi;
343   };
344   union
345   {
346     u32 param3;
347     u32 addr_lo;
348   };
349 } iavf_aq_desc_t;
350
351 STATIC_ASSERT_SIZEOF (iavf_aq_desc_t, 32);
352
353 typedef struct
354 {
355   u16 vsi_id;
356   u16 queue_id;
357   u16 ring_len;
358   u64 dma_ring_addr;
359   u64 dma_headwb_addr;
360 } virtchnl_txq_info_t;
361
362 STATIC_ASSERT_SIZEOF (virtchnl_txq_info_t, 24);
363
364 typedef struct
365 {
366   u16 vsi_id;
367   u16 queue_id;
368   u32 ring_len;
369   u16 hdr_size;
370   u16 splithdr_enabled;
371   u32 databuffer_size;
372   u32 max_pkt_size;
373   u8 crc_disable;
374   u8 rxdid;
375   u8 pad[2];
376   u64 dma_ring_addr;
377   i32 rx_split_pos;
378   u32 pad2;
379 } virtchnl_rxq_info_t;
380
381 STATIC_ASSERT_SIZEOF (virtchnl_rxq_info_t, 40);
382
383 typedef struct
384 {
385   virtchnl_txq_info_t txq;
386   virtchnl_rxq_info_t rxq;
387 } virtchnl_queue_pair_info_t;
388
389 STATIC_ASSERT_SIZEOF (virtchnl_queue_pair_info_t, 64);
390
391 typedef struct
392 {
393   u16 vsi_id;
394   u16 num_queue_pairs;
395   u32 pad;
396   virtchnl_queue_pair_info_t qpair[1];
397 } virtchnl_vsi_queue_config_info_t;
398
399 STATIC_ASSERT_SIZEOF (virtchnl_vsi_queue_config_info_t, 72);
400
401 typedef struct
402 {
403   u16 vsi_id;
404   u16 pad;
405   u32 rx_queues;
406   u32 tx_queues;
407 } virtchnl_queue_select_t;
408
409 STATIC_ASSERT_SIZEOF (virtchnl_queue_select_t, 12);
410
411 typedef struct
412 {
413   u16 vsi_id;
414   u16 vector_id;
415   u16 rxq_map;
416   u16 txq_map;
417   u16 rxitr_idx;
418   u16 txitr_idx;
419 } virtchnl_vector_map_t;
420
421 typedef struct
422 {
423   u16 num_vectors;
424   virtchnl_vector_map_t vecmap[1];
425 } virtchnl_irq_map_info_t;
426
427 STATIC_ASSERT_SIZEOF (virtchnl_irq_map_info_t, 14);
428
429 typedef struct
430 {
431   u8 addr[6];
432   union
433   {
434     struct
435     {
436       u8 primary : 1;
437       u8 extra : 1;
438     };
439     u8 type;
440   };
441   u8 pad[1];
442 } virtchnl_ether_addr_t;
443
444 typedef struct
445 {
446   u16 vsi_id;
447   u16 num_elements;
448   virtchnl_ether_addr_t list[1];
449 } virtchnl_ether_addr_list_t;
450
451 #define foreach_virtchnl_eth_stats                                            \
452   _ (rx_bytes)                                                                \
453   _ (rx_unicast)                                                              \
454   _ (rx_multicast)                                                            \
455   _ (rx_broadcast)                                                            \
456   _ (rx_discards)                                                             \
457   _ (rx_unknown_protocol)                                                     \
458   _ (tx_bytes)                                                                \
459   _ (tx_unicast)                                                              \
460   _ (tx_multicast)                                                            \
461   _ (tx_broadcast)                                                            \
462   _ (tx_discards)                                                             \
463   _ (tx_errors)
464
465 typedef struct
466 {
467 #define _(s) u64 s;
468   foreach_virtchnl_eth_stats
469 #undef _
470 } virtchnl_eth_stats_t;
471
472 typedef struct
473 {
474   u16 vsi_id;
475   u16 key_len;
476   u8 key[1];
477 } virtchnl_rss_key_t;
478
479 STATIC_ASSERT_SIZEOF (virtchnl_rss_key_t, 6);
480
481 typedef struct
482 {
483   u16 vsi_id;
484   u16 lut_entries;
485   u8 lut[1];
486 } virtchnl_rss_lut_t;
487
488 STATIC_ASSERT_SIZEOF (virtchnl_rss_lut_t, 6);
489
490 /* VIRTCHNL_OP_REQUEST_QUEUES */
491 typedef struct
492 {
493   u16 num_queue_pairs;
494 } virtchnl_vf_res_request_t;
495
496 typedef struct
497 {
498   u32 outer;
499   u32 inner;
500 } virtchnl_vlan_supported_caps_t;
501
502 typedef struct
503 {
504   virtchnl_vlan_supported_caps_t filtering_support;
505   u32 ethertype_init;
506   u16 max_filters;
507   u8 pad[2];
508 } virtchnl_vlan_filtering_caps_t;
509
510 typedef struct virtchnl_vlan_offload_caps
511 {
512   virtchnl_vlan_supported_caps_t stripping_support;
513   virtchnl_vlan_supported_caps_t insertion_support;
514   u32 ethertype_init;
515   u8 ethertype_match;
516   u8 pad[3];
517 } virtchnl_vlan_offload_caps_t;
518
519 typedef struct
520 {
521   virtchnl_vlan_filtering_caps_t filtering;
522   virtchnl_vlan_offload_caps_t offloads;
523 } virtchnl_vlan_caps_t;
524
525 #define foreach_virtchnl_vlan_support_bit                                     \
526   _ (0, ETHERTYPE_8100, "dot1Q")                                              \
527   _ (1, ETHERTYPE_88A8, "dot1AD")                                             \
528   _ (2, ETHERTYPE_9100, "QinQ")                                               \
529   _ (8, TAG_LOCATION_L2TAG1, "l2tag1")                                        \
530   _ (9, TAG_LOCATION_L2TAG2, "l2tag2")                                        \
531   _ (10, TAG_LOCATION_L2TAG2_2, "l2tag2_2")                                   \
532   _ (24, PRIO, "prio")                                                        \
533   _ (28, FILTER_MASK, "filter-mask")                                          \
534   _ (29, ETHERTYPE_AND, "etype-and")                                          \
535   _ (30, ETHERTYPE_XOR, "etype-xor")                                          \
536   _ (31, TOGGLE, "toggle")
537
538 typedef enum
539 {
540   VIRTCHNL_VLAN_UNSUPPORTED = 0,
541 #define _(a, b, c) VIRTCHNL_VLAN_##b = (1 << a),
542   foreach_virtchnl_vlan_support_bit
543 #undef _
544 } virtchnl_vlan_support_caps_t;
545
546 typedef struct
547 {
548   u32 outer_ethertype_setting;
549   u32 inner_ethertype_setting;
550   u16 vport_id;
551   u8 pad[6];
552 } virtchnl_vlan_setting_t;
553
554 typedef struct
555 {
556   u16 vsi_id;
557   union
558   {
559     struct
560     {
561       u16 unicast_promisc : 1;
562       u16 multicast_promisc : 1;
563     };
564     u16 flags;
565   };
566 } virtchnl_promisc_info_t;
567
568 STATIC_ASSERT_SIZEOF (virtchnl_promisc_info_t, 4);
569
570 #endif /* IAVF_VIRTCHNL_H */