avf: add avf flow framework
[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
104 typedef enum
105 {
106 #define _(v,n) VIRTCHNL_OP_##n = v,
107   foreach_virtchnl_op
108 #undef _
109     VIRTCHNL_N_OPS,
110 } virtchnl_ops_t;
111
112 typedef enum
113 {
114   VIRTCHNL_STATUS_SUCCESS = 0,
115   VIRTCHNL_STATUS_ERR_PARAM = -5,
116   VIRTCHNL_STATUS_ERR_NO_MEMORY = -18,
117   VIRTCHNL_STATUS_ERR_OPCODE_MISMATCH = -38,
118   VIRTCHNL_STATUS_ERR_CQP_COMPL_ERROR = -39,
119   VIRTCHNL_STATUS_ERR_INVALID_VF_ID = -40,
120   VIRTCHNL_STATUS_ERR_ADMIN_QUEUE_ERROR = -53,
121   VIRTCHNL_STATUS_NOT_SUPPORTED = -64,
122 } virtchnl_status_code_t;
123
124 #define foreach_avf_vf_cap_flag                                               \
125   _ (0, OFFLOAD_L2, "l2")                                                     \
126   _ (1, OFFLOAD_IWARP, "iwarp")                                               \
127   _ (2, OFFLOAD_RSVD, "rsvd")                                                 \
128   _ (3, OFFLOAD_RSS_AQ, "rss-aq")                                             \
129   _ (4, OFFLOAD_RSS_REG, "rss-reg")                                           \
130   _ (5, OFFLOAD_WB_ON_ITR, "wb-on-itr")                                       \
131   _ (6, OFFLOAD_REQ_QUEUES, "req-queues")                                     \
132   _ (7, CAP_ADV_LINK_SPEED, "adv-link-speed")                                 \
133   _ (16, OFFLOAD_VLAN, "vlan")                                                \
134   _ (17, OFFLOAD_RX_POLLING, "rx-polling")                                    \
135   _ (18, OFFLOAD_RSS_PCTYPE_V2, "rss-pctype-v2")                              \
136   _ (19, OFFLOAD_RSS_PF, "rss-pf")                                            \
137   _ (20, OFFLOAD_ENCAP, "encap")                                              \
138   _ (21, OFFLOAD_ENCAP_CSUM, "encap-csum")                                    \
139   _ (22, OFFLOAD_RX_ENCAP_CSUM, "rx-encap-csum")                              \
140   _ (23, OFFLOAD_ADQ, "offload-adq")                                          \
141   _ (27, OFFLOAD_ADV_RSS_PF, "offload-adv-rss-pf")                            \
142   _ (28, OFFLOAD_FDIR_PF, "offload-fdir-pf")
143
144 typedef enum
145 {
146 #define _(a, b, c) VIRTCHNL_VF_##b = (1 << a),
147   foreach_avf_vf_cap_flag
148 #undef _
149 } avf_vf_cap_flag_t;
150
151 typedef enum
152 {
153   VIRTCHNL_VSI_TYPE_INVALID = 0,
154   VIRTCHNL_VSI_SRIOV = 6,
155 } virtchnl_vsi_type_t;
156
157 typedef enum
158 {
159   VIRTCHNL_VFR_INPROGRESS = 0,
160   VIRTCHNL_VFR_COMPLETED,
161   VIRTCHNL_VFR_VFACTIVE,
162 } virtchnl_vfr_states_t;
163
164 typedef struct
165 {
166   u16 vsi_id;
167   u16 num_queue_pairs;
168   virtchnl_vsi_type_t vsi_type;
169   u16 qset_handle;
170   u8 default_mac_addr[6];
171 } virtchnl_vsi_resource_t;
172
173 typedef struct
174 {
175   u16 num_vsis;
176   u16 num_queue_pairs;
177   u16 max_vectors;
178   u16 max_mtu;
179   u32 vf_offload_flags;
180   u32 rss_key_size;
181   u32 rss_lut_size;
182   virtchnl_vsi_resource_t vsi_res[1];
183 } virtchnl_vf_resource_t;
184
185 #define foreach_virtchnl_event_code \
186   _(0, UNKNOWN)                         \
187   _(1, LINK_CHANGE)                     \
188   _(2, RESET_IMPENDING)                 \
189   _(3, PF_DRIVER_CLOSE)
190
191 typedef enum
192 {
193 #define _(a,b) VIRTCHNL_EVENT_##b = (a),
194   foreach_virtchnl_event_code
195 #undef _
196 } virtchnl_event_codes_t;
197
198 #define foreach_virtchnl_link_speed \
199   _(0, 2_5GB, "2.5 Gbps")               \
200   _(1, 100MB, "100 Mbps")               \
201   _(2, 1GB, "1 Gbps")                   \
202   _(3, 10GB, "10 Gbps")                 \
203   _(4, 40GB, "40 Gbps")                 \
204   _(5, 20GB, "20 Gbps")                 \
205   _(6, 25GB, "25 Gbps")                 \
206   _(7, 5GB, "5 Gbps")
207
208 typedef enum
209 {
210   VIRTCHNL_LINK_SPEED_UNKNOWN = 0,
211 #define _(a,b,c) VIRTCHNL_LINK_SPEED_##b = (1 << a),
212   foreach_virtchnl_link_speed
213 #undef _
214 } virtchnl_link_speed_t;
215
216 typedef struct
217 {
218   virtchnl_event_codes_t event;
219   union
220   {
221     struct
222     {
223       virtchnl_link_speed_t link_speed;
224       u8 link_status;
225     } link_event;
226     struct
227     {
228       u32 link_speed;
229       u8 link_status;
230     } link_event_adv;
231   } event_data;
232   int severity;
233 } virtchnl_pf_event_t;
234
235 STATIC_ASSERT_SIZEOF (virtchnl_pf_event_t, 16);
236
237 typedef struct
238 {
239   u32 major;
240   u32 minor;
241 } virtchnl_version_info_t;
242
243 typedef struct
244 {
245   u16 flags;
246   u16 opcode;
247   u16 datalen;
248   u16 retval;
249   union
250   {
251     u32 cookie_hi;
252     virtchnl_ops_t v_opcode;
253   };
254   union
255   {
256     u32 cookie_lo;
257     virtchnl_status_code_t v_retval;
258   };
259   u32 param0;
260   u32 param1;
261   union
262   {
263     u32 param2;
264     u32 addr_hi;
265   };
266   union
267   {
268     u32 param3;
269     u32 addr_lo;
270   };
271 } avf_aq_desc_t;
272
273 STATIC_ASSERT_SIZEOF (avf_aq_desc_t, 32);
274
275 typedef struct
276 {
277   u16 vsi_id;
278   u16 queue_id;
279   u16 ring_len;
280   u64 dma_ring_addr;
281   u64 dma_headwb_addr;
282 } virtchnl_txq_info_t;
283
284 STATIC_ASSERT_SIZEOF (virtchnl_txq_info_t, 24);
285
286 typedef struct
287 {
288   u16 vsi_id;
289   u16 queue_id;
290   u32 ring_len;
291   u16 hdr_size;
292   u16 splithdr_enabled;
293   u32 databuffer_size;
294   u32 max_pkt_size;
295   u32 pad1;
296   u64 dma_ring_addr;
297   int rx_split_pos;
298   u32 pad2;
299 } virtchnl_rxq_info_t;
300
301 STATIC_ASSERT_SIZEOF (virtchnl_rxq_info_t, 40);
302
303 typedef struct
304 {
305   virtchnl_txq_info_t txq;
306   virtchnl_rxq_info_t rxq;
307 } virtchnl_queue_pair_info_t;
308
309 typedef struct
310 {
311   u16 vsi_id;
312   u16 num_queue_pairs;
313   u32 pad;
314   virtchnl_queue_pair_info_t qpair[1];
315 } virtchnl_vsi_queue_config_info_t;
316
317 STATIC_ASSERT_SIZEOF (virtchnl_vsi_queue_config_info_t, 72);
318
319 typedef struct
320 {
321   u16 vsi_id;
322   u16 pad;
323   u32 rx_queues;
324   u32 tx_queues;
325 } virtchnl_queue_select_t;
326
327 STATIC_ASSERT_SIZEOF (virtchnl_queue_select_t, 12);
328
329 typedef struct
330 {
331   u16 vsi_id;
332   u16 vector_id;
333   u16 rxq_map;
334   u16 txq_map;
335   u16 rxitr_idx;
336   u16 txitr_idx;
337 } virtchnl_vector_map_t;
338
339 typedef struct
340 {
341   u16 num_vectors;
342   virtchnl_vector_map_t vecmap[1];
343 } virtchnl_irq_map_info_t;
344
345 STATIC_ASSERT_SIZEOF (virtchnl_irq_map_info_t, 14);
346
347 typedef struct
348 {
349   u8 addr[6];
350   u8 pad[2];
351 } virtchnl_ether_addr_t;
352
353 typedef struct
354 {
355   u16 vsi_id;
356   u16 num_elements;
357   virtchnl_ether_addr_t list[1];
358 } virtchnl_ether_addr_list_t;
359
360 #define foreach_virtchnl_eth_stats \
361   _(rx_bytes)           \
362   _(rx_unicast)         \
363   _(rx_multicast)       \
364   _(rx_broadcast)       \
365   _(rx_discards)        \
366   _(rx_unknown_protocol)\
367   _(tx_bytes)           \
368   _(tx_unicast)         \
369   _(tx_multicast)       \
370   _(tx_broadcast)       \
371   _(tx_discards)        \
372   _(tx_errors)
373
374 typedef struct
375 {
376 #define _(s) u64 s;
377   foreach_virtchnl_eth_stats
378 #undef _
379 } virtchnl_eth_stats_t;
380
381 typedef struct
382 {
383   u16 vsi_id;
384   u16 key_len;
385   u8 key[1];
386 } virtchnl_rss_key_t;
387
388 STATIC_ASSERT_SIZEOF (virtchnl_rss_key_t, 6);
389
390 typedef struct
391 {
392   u16 vsi_id;
393   u16 lut_entries;
394   u8 lut[1];
395 } virtchnl_rss_lut_t;
396
397 STATIC_ASSERT_SIZEOF (virtchnl_rss_lut_t, 6);
398
399 /* VIRTCHNL_OP_REQUEST_QUEUES */
400 typedef struct
401 {
402   u16 num_queue_pairs;
403 } virtchnl_vf_res_request_t;
404
405 #endif /* AVF_VIRTCHNL_H */
406
407 /*
408  * fd.io coding-style-patch-verification: ON
409  *
410  * Local Variables:
411  * eval: (c-set-style "gnu")
412  * End:
413  */