wireguard: add dos mitigation support
[vpp.git] / src / plugins / avf / virtchnl.h
1 /*
2  *------------------------------------------------------------------
3  * Copyright (c) 2018 Cisco 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 _AVF_VIRTCHNL_H_
19 #define _AVF_VIRTCHNL_H_
20
21 #define VIRTCHNL_VERSION_MAJOR 1
22 #define VIRTCHNL_VERSION_MINOR 1
23
24 #define foreach_avf_promisc_flags \
25   _(0, UNICAST_PROMISC, "unicast") \
26   _(1, MULTICAST_PROMISC, "multicast")
27
28 enum
29 {
30 #define _(a, b, c) FLAG_VF_ ##b = (1 << a),
31   foreach_avf_promisc_flags
32 #undef _
33 };
34
35 #define AVFINT_DYN_CTLN(x)  (0x00003800 + (0x4 * x))
36 #define AVFINT_ICR0         0x00004800
37 #define AVFINT_ICR0_ENA1    0x00005000
38 #define AVFINT_DYN_CTL0     0x00005C00
39 #define AVF_ARQBAH          0x00006000
40 #define AVF_ATQH            0x00006400
41 #define AVF_ATQLEN          0x00006800
42 #define AVF_ARQBAL          0x00006C00
43 #define AVF_ARQT            0x00007000
44 #define AVF_ARQH            0x00007400
45 #define AVF_ATQBAH          0x00007800
46 #define AVF_ATQBAL          0x00007C00
47 #define AVF_ARQLEN          0x00008000
48 #define AVF_ATQT            0x00008400
49 #define AVFGEN_RSTAT        0x00008800
50 #define AVF_QTX_TAIL(q)     (0x00000000 + (0x4 * q))
51 #define AVF_QRX_TAIL(q)     (0x00002000 + (0x4 * q))
52
53 #define AVF_AQ_F_DD  (1 << 0)
54 #define AVF_AQ_F_CMP (1 << 1)
55 #define AVF_AQ_F_ERR (1 << 2)
56 #define AVF_AQ_F_VFE (1 << 3)
57 #define AVF_AQ_F_LB  (1 << 9)
58 #define AVF_AQ_F_RD  (1 << 10)
59 #define AVF_AQ_F_VFC (1 << 11)
60 #define AVF_AQ_F_BUF (1 << 12)
61 #define AVF_AQ_F_SI  (1 << 13)
62 #define AVF_AQ_F_EI  (1 << 14)
63 #define AVF_AQ_F_FE  (1 << 15)
64
65 #define foreach_virtchnl_op                                                   \
66   _ (0, UNKNOWN)                                                              \
67   _ (1, VERSION)                                                              \
68   _ (2, RESET_VF)                                                             \
69   _ (3, GET_VF_RESOURCES)                                                     \
70   _ (4, CONFIG_TX_QUEUE)                                                      \
71   _ (5, CONFIG_RX_QUEUE)                                                      \
72   _ (6, CONFIG_VSI_QUEUES)                                                    \
73   _ (7, CONFIG_IRQ_MAP)                                                       \
74   _ (8, ENABLE_QUEUES)                                                        \
75   _ (9, DISABLE_QUEUES)                                                       \
76   _ (10, ADD_ETH_ADDR)                                                        \
77   _ (11, DEL_ETH_ADDR)                                                        \
78   _ (12, ADD_VLAN)                                                            \
79   _ (13, DEL_VLAN)                                                            \
80   _ (14, CONFIG_PROMISCUOUS_MODE)                                             \
81   _ (15, GET_STATS)                                                           \
82   _ (16, RSVD)                                                                \
83   _ (17, EVENT)                                                               \
84   _ (18, UNDEF_18)                                                            \
85   _ (19, UNDEF_19)                                                            \
86   _ (20, IWARP)                                                               \
87   _ (21, CONFIG_IWARP_IRQ_MAP)                                                \
88   _ (22, RELEASE_IWARP_IRQ_MAP)                                               \
89   _ (23, CONFIG_RSS_KEY)                                                      \
90   _ (24, CONFIG_RSS_LUT)                                                      \
91   _ (25, GET_RSS_HENA_CAPS)                                                   \
92   _ (26, SET_RSS_HENA)                                                        \
93   _ (27, ENABLE_VLAN_STRIPPING)                                               \
94   _ (28, DISABLE_VLAN_STRIPPING)                                              \
95   _ (29, REQUEST_QUEUES)                                                      \
96   _ (30, ENABLE_CHANNELS)                                                     \
97   _ (31, DISABLE_CHANNELS)                                                    \
98   _ (32, ADD_CLOUD_FILTER)                                                    \
99   _ (33, DEL_CLOUD_FILTER)                                                    \
100   _ (47, ADD_FDIR_FILTER)                                                     \
101   _ (48, DEL_FDIR_FILTER)                                                     \
102   _ (49, QUERY_FDIR_FILTER)                                                   \
103   _ (50, GET_MAX_RSS_QREGION)                                                 \
104   _ (51, GET_OFFLOAD_VLAN_V2_CAPS)                                            \
105   _ (52, ADD_VLAN_V2)                                                         \
106   _ (53, DEL_VLAN_V2)                                                         \
107   _ (54, ENABLE_VLAN_STRIPPING_V2)                                            \
108   _ (55, DISABLE_VLAN_STRIPPING_V2)                                           \
109   _ (56, ENABLE_VLAN_INSERTION_V2)                                            \
110   _ (57, DISABLE_VLAN_INSERTION_V2)                                           \
111   _ (58, ENABLE_VLAN_FILTERING_V2)                                            \
112   _ (59, DISABLE_VLAN_FILTERING_V2)                                           \
113   _ (107, ENABLE_QUEUES_V2)                                                   \
114   _ (108, DISABLE_QUEUES_V2)                                                  \
115   _ (111, MAP_QUEUE_VECTOR)
116
117 typedef enum
118 {
119 #define _(v,n) VIRTCHNL_OP_##n = v,
120   foreach_virtchnl_op
121 #undef _
122     VIRTCHNL_N_OPS,
123 } virtchnl_ops_t;
124
125 typedef enum
126 {
127   VIRTCHNL_STATUS_SUCCESS = 0,
128   VIRTCHNL_STATUS_ERR_PARAM = -5,
129   VIRTCHNL_STATUS_ERR_NO_MEMORY = -18,
130   VIRTCHNL_STATUS_ERR_OPCODE_MISMATCH = -38,
131   VIRTCHNL_STATUS_ERR_CQP_COMPL_ERROR = -39,
132   VIRTCHNL_STATUS_ERR_INVALID_VF_ID = -40,
133   VIRTCHNL_STATUS_ERR_ADMIN_QUEUE_ERROR = -53,
134   VIRTCHNL_STATUS_NOT_SUPPORTED = -64,
135 } virtchnl_status_code_t;
136
137 #define foreach_avf_vf_cap_flag                                               \
138   _ (0, OFFLOAD_L2, "l2")                                                     \
139   _ (1, OFFLOAD_IWARP, "iwarp")                                               \
140   _ (2, OFFLOAD_RSVD, "rsvd")                                                 \
141   _ (3, OFFLOAD_RSS_AQ, "rss-aq")                                             \
142   _ (4, OFFLOAD_RSS_REG, "rss-reg")                                           \
143   _ (5, OFFLOAD_WB_ON_ITR, "wb-on-itr")                                       \
144   _ (6, OFFLOAD_REQ_QUEUES, "req-queues")                                     \
145   _ (7, CAP_ADV_LINK_SPEED, "adv-link-speed")                                 \
146   _ (9, LARGE_NUM_QPAIRS, "large-num-qpairs")                                 \
147   _ (15, OFFLOAD_VLAN_V2, "vlan-v2")                                          \
148   _ (16, OFFLOAD_VLAN, "vlan")                                                \
149   _ (17, OFFLOAD_RX_POLLING, "rx-polling")                                    \
150   _ (18, OFFLOAD_RSS_PCTYPE_V2, "rss-pctype-v2")                              \
151   _ (19, OFFLOAD_RSS_PF, "rss-pf")                                            \
152   _ (20, OFFLOAD_ENCAP, "encap")                                              \
153   _ (21, OFFLOAD_ENCAP_CSUM, "encap-csum")                                    \
154   _ (22, OFFLOAD_RX_ENCAP_CSUM, "rx-encap-csum")                              \
155   _ (23, OFFLOAD_ADQ, "offload-adq")                                          \
156   _ (24, OFFLOAD_ADQ_v2, "offload-adq-v2")                                    \
157   _ (25, OFFLOAD_USO, "offload-uso")                                          \
158   _ (26, OFFLOAD_RX_FLEX_DESC, "offload-rx-flex-desc")                        \
159   _ (27, OFFLOAD_ADV_RSS_PF, "offload-adv-rss-pf")                            \
160   _ (28, OFFLOAD_FDIR_PF, "offload-fdir-pf")                                  \
161   _ (30, CAP_DCF, "dcf")
162
163 typedef enum
164 {
165 #define _(a, b, c) VIRTCHNL_VF_##b = (1 << a),
166   foreach_avf_vf_cap_flag
167 #undef _
168 } avf_vf_cap_flag_t;
169
170 typedef enum
171 {
172   VIRTCHNL_VSI_TYPE_INVALID = 0,
173   VIRTCHNL_VSI_SRIOV = 6,
174 } virtchnl_vsi_type_t;
175
176 typedef enum
177 {
178   VIRTCHNL_VFR_INPROGRESS = 0,
179   VIRTCHNL_VFR_COMPLETED,
180   VIRTCHNL_VFR_VFACTIVE,
181 } virtchnl_vfr_states_t;
182
183 typedef struct
184 {
185   u16 vsi_id;
186   u16 num_queue_pairs;
187   virtchnl_vsi_type_t vsi_type;
188   u16 qset_handle;
189   u8 default_mac_addr[6];
190 } virtchnl_vsi_resource_t;
191
192 typedef struct
193 {
194   u16 num_vsis;
195   u16 num_queue_pairs;
196   u16 max_vectors;
197   u16 max_mtu;
198   u32 vf_cap_flags;
199   u32 rss_key_size;
200   u32 rss_lut_size;
201   virtchnl_vsi_resource_t vsi_res[1];
202 } virtchnl_vf_resource_t;
203
204 #define foreach_virtchnl_event_code \
205   _(0, UNKNOWN)                         \
206   _(1, LINK_CHANGE)                     \
207   _(2, RESET_IMPENDING)                 \
208   _(3, PF_DRIVER_CLOSE)
209
210 typedef enum
211 {
212 #define _(a,b) VIRTCHNL_EVENT_##b = (a),
213   foreach_virtchnl_event_code
214 #undef _
215 } virtchnl_event_codes_t;
216
217 #define foreach_virtchnl_link_speed \
218   _(0, 2_5GB, "2.5 Gbps")               \
219   _(1, 100MB, "100 Mbps")               \
220   _(2, 1GB, "1 Gbps")                   \
221   _(3, 10GB, "10 Gbps")                 \
222   _(4, 40GB, "40 Gbps")                 \
223   _(5, 20GB, "20 Gbps")                 \
224   _(6, 25GB, "25 Gbps")                 \
225   _(7, 5GB, "5 Gbps")
226
227 typedef enum
228 {
229   VIRTCHNL_LINK_SPEED_UNKNOWN = 0,
230 #define _(a,b,c) VIRTCHNL_LINK_SPEED_##b = (1 << a),
231   foreach_virtchnl_link_speed
232 #undef _
233 } virtchnl_link_speed_t;
234
235 typedef struct
236 {
237   virtchnl_event_codes_t event;
238   union
239   {
240     struct
241     {
242       virtchnl_link_speed_t link_speed;
243       u8 link_status;
244     } link_event;
245     struct
246     {
247       u32 link_speed;
248       u8 link_status;
249     } link_event_adv;
250   } event_data;
251   int severity;
252 } virtchnl_pf_event_t;
253
254 STATIC_ASSERT_SIZEOF (virtchnl_pf_event_t, 16);
255
256 typedef struct
257 {
258   u32 major;
259   u32 minor;
260 } virtchnl_version_info_t;
261
262 typedef struct
263 {
264   u16 flags;
265   u16 opcode;
266   u16 datalen;
267   u16 retval;
268   union
269   {
270     u32 cookie_hi;
271     virtchnl_ops_t v_opcode;
272   };
273   union
274   {
275     u32 cookie_lo;
276     virtchnl_status_code_t v_retval;
277   };
278   u32 param0;
279   u32 param1;
280   union
281   {
282     u32 param2;
283     u32 addr_hi;
284   };
285   union
286   {
287     u32 param3;
288     u32 addr_lo;
289   };
290 } avf_aq_desc_t;
291
292 STATIC_ASSERT_SIZEOF (avf_aq_desc_t, 32);
293
294 typedef struct
295 {
296   u16 vsi_id;
297   u16 queue_id;
298   u16 ring_len;
299   u64 dma_ring_addr;
300   u64 dma_headwb_addr;
301 } virtchnl_txq_info_t;
302
303 STATIC_ASSERT_SIZEOF (virtchnl_txq_info_t, 24);
304
305 typedef struct
306 {
307   u16 vsi_id;
308   u16 queue_id;
309   u32 ring_len;
310   u16 hdr_size;
311   u16 splithdr_enabled;
312   u32 databuffer_size;
313   u32 max_pkt_size;
314   u32 pad1;
315   u64 dma_ring_addr;
316   int rx_split_pos;
317   u32 pad2;
318 } virtchnl_rxq_info_t;
319
320 STATIC_ASSERT_SIZEOF (virtchnl_rxq_info_t, 40);
321
322 typedef struct
323 {
324   virtchnl_txq_info_t txq;
325   virtchnl_rxq_info_t rxq;
326 } virtchnl_queue_pair_info_t;
327
328 typedef struct
329 {
330   u16 vsi_id;
331   u16 num_queue_pairs;
332   u32 pad;
333   virtchnl_queue_pair_info_t qpair[1];
334 } virtchnl_vsi_queue_config_info_t;
335
336 STATIC_ASSERT_SIZEOF (virtchnl_vsi_queue_config_info_t, 72);
337
338 typedef struct
339 {
340   u16 vsi_id;
341   u16 pad;
342   u32 rx_queues;
343   u32 tx_queues;
344 } virtchnl_queue_select_t;
345
346 STATIC_ASSERT_SIZEOF (virtchnl_queue_select_t, 12);
347
348 typedef struct
349 {
350   u16 vsi_id;
351   u16 vector_id;
352   u16 rxq_map;
353   u16 txq_map;
354   u16 rxitr_idx;
355   u16 txitr_idx;
356 } virtchnl_vector_map_t;
357
358 typedef struct
359 {
360   u16 num_vectors;
361   virtchnl_vector_map_t vecmap[1];
362 } virtchnl_irq_map_info_t;
363
364 STATIC_ASSERT_SIZEOF (virtchnl_irq_map_info_t, 14);
365
366 typedef struct
367 {
368   u8 addr[6];
369   u8 pad[2];
370 } virtchnl_ether_addr_t;
371
372 typedef struct
373 {
374   u16 vsi_id;
375   u16 num_elements;
376   virtchnl_ether_addr_t list[1];
377 } virtchnl_ether_addr_list_t;
378
379 #define foreach_virtchnl_eth_stats \
380   _(rx_bytes)           \
381   _(rx_unicast)         \
382   _(rx_multicast)       \
383   _(rx_broadcast)       \
384   _(rx_discards)        \
385   _(rx_unknown_protocol)\
386   _(tx_bytes)           \
387   _(tx_unicast)         \
388   _(tx_multicast)       \
389   _(tx_broadcast)       \
390   _(tx_discards)        \
391   _(tx_errors)
392
393 typedef struct
394 {
395 #define _(s) u64 s;
396   foreach_virtchnl_eth_stats
397 #undef _
398 } virtchnl_eth_stats_t;
399
400 typedef struct
401 {
402   u16 vsi_id;
403   u16 key_len;
404   u8 key[1];
405 } virtchnl_rss_key_t;
406
407 STATIC_ASSERT_SIZEOF (virtchnl_rss_key_t, 6);
408
409 typedef struct
410 {
411   u16 vsi_id;
412   u16 lut_entries;
413   u8 lut[1];
414 } virtchnl_rss_lut_t;
415
416 STATIC_ASSERT_SIZEOF (virtchnl_rss_lut_t, 6);
417
418 /* VIRTCHNL_OP_REQUEST_QUEUES */
419 typedef struct
420 {
421   u16 num_queue_pairs;
422 } virtchnl_vf_res_request_t;
423
424 typedef struct
425 {
426   u32 outer;
427   u32 inner;
428 } virtchnl_vlan_supported_caps_t;
429
430 typedef struct
431 {
432   virtchnl_vlan_supported_caps_t filtering_support;
433   u32 ethertype_init;
434   u16 max_filters;
435   u8 pad[2];
436 } virtchnl_vlan_filtering_caps_t;
437
438 typedef struct virtchnl_vlan_offload_caps
439 {
440   virtchnl_vlan_supported_caps_t stripping_support;
441   virtchnl_vlan_supported_caps_t insertion_support;
442   u32 ethertype_init;
443   u8 ethertype_match;
444   u8 pad[3];
445 } virtchnl_vlan_offload_caps_t;
446
447 typedef struct
448 {
449   virtchnl_vlan_filtering_caps_t filtering;
450   virtchnl_vlan_offload_caps_t offloads;
451 } virtchnl_vlan_caps_t;
452
453 #define foreach_virtchnl_vlan_support_bit                                     \
454   _ (0, ETHERTYPE_8100, "dot1Q")                                              \
455   _ (1, ETHERTYPE_88A8, "dot1AD")                                             \
456   _ (2, ETHERTYPE_9100, "QinQ")                                               \
457   _ (8, TAG_LOCATION_L2TAG1, "l2tag1")                                        \
458   _ (9, TAG_LOCATION_L2TAG2, "l2tag2")                                        \
459   _ (10, TAG_LOCATION_L2TAG2_2, "l2tag2_2")                                   \
460   _ (24, PRIO, "prio")                                                        \
461   _ (28, FILTER_MASK, "filter-mask")                                          \
462   _ (29, ETHERTYPE_AND, "etype-and")                                          \
463   _ (30, ETHERTYPE_XOR, "etype-xor")                                          \
464   _ (31, TOGGLE, "toggle")
465
466 typedef enum
467 {
468   VIRTCHNL_VLAN_UNSUPPORTED = 0,
469 #define _(a, b, c) VIRTCHNL_VLAN_##b = (1 << a),
470   foreach_virtchnl_vlan_support_bit
471 #undef _
472 } virtchnl_vlan_support_t;
473
474 typedef struct
475 {
476   u32 outer_ethertype_setting;
477   u32 inner_ethertype_setting;
478   u16 vport_id;
479   u8 pad[6];
480 } virtchnl_vlan_setting_t;
481
482 #endif /* AVF_VIRTCHNL_H */
483
484 /*
485  * fd.io coding-style-patch-verification: ON
486  *
487  * Local Variables:
488  * eval: (c-set-style "gnu")
489  * End:
490  */