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