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