FD.io VPP  v21.01.1
Vector Packet Processing
avf.h
Go to the documentation of this file.
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_H_
19 #define _AVF_H_
20 
21 #include <avf/virtchnl.h>
22 
23 #include <vppinfra/types.h>
25 #include <vppinfra/lock.h>
26 
27 #include <vlib/log.h>
28 #include <vlib/pci/pci.h>
29 
30 #include <vnet/interface.h>
31 
32 #define AVF_QUEUE_SZ_MAX 4096
33 #define AVF_QUEUE_SZ_MIN 64
34 
35 #define AVF_AQ_ENQ_SUSPEND_TIME 50e-6
36 #define AVF_AQ_ENQ_MAX_WAIT_TIME 250e-3
37 
38 #define AVF_RESET_SUSPEND_TIME 20e-3
39 #define AVF_RESET_MAX_WAIT_TIME 1
40 
41 #define AVF_SEND_TO_PF_SUSPEND_TIME 10e-3
42 #define AVF_SEND_TO_PF_MAX_WAIT_TIME 1
43 
44 #define AVF_RXD_STATUS(x) (1ULL << x)
45 #define AVF_RXD_STATUS_DD AVF_RXD_STATUS(0)
46 #define AVF_RXD_STATUS_EOP AVF_RXD_STATUS(1)
47 #define AVF_RXD_ERROR_SHIFT 19
48 #define AVF_RXD_PTYPE_SHIFT 30
49 #define AVF_RXD_LEN_SHIFT 38
50 #define AVF_RX_MAX_DESC_IN_CHAIN 5
51 
52 #define AVF_RXD_ERROR_IPE (1ULL << (AVF_RXD_ERROR_SHIFT + 3))
53 #define AVF_RXD_ERROR_L4E (1ULL << (AVF_RXD_ERROR_SHIFT + 4))
54 
55 #define AVF_TXD_CMD(x) (1 << (x + 4))
56 #define AVF_TXD_CMD_EXT(x, val) ((u64)val << (x + 4))
57 #define AVF_TXD_CMD_EOP AVF_TXD_CMD(0)
58 #define AVF_TXD_CMD_RS AVF_TXD_CMD(1)
59 #define AVF_TXD_CMD_RSV AVF_TXD_CMD(2)
60 
61 #define AVF_TXD_CMD_IIPT_NONE AVF_TXD_CMD_EXT(5, 0)
62 #define AVF_TXD_CMD_IIPT_IPV6 AVF_TXD_CMD_EXT(5, 1)
63 #define AVF_TXD_CMD_IIPT_IPV4_NO_CSUM AVF_TXD_CMD_EXT(5, 2)
64 #define AVF_TXD_CMD_IIPT_IPV4 AVF_TXD_CMD_EXT(5, 3)
65 
66 #define AVF_TXD_CMD_L4T_UNKNOWN AVF_TXD_CMD_EXT(8, 0)
67 #define AVF_TXD_CMD_L4T_TCP AVF_TXD_CMD_EXT(8, 1)
68 #define AVF_TXD_CMD_L4T_SCTP AVF_TXD_CMD_EXT(8, 2)
69 #define AVF_TXD_CMD_L4T_UDP AVF_TXD_CMD_EXT(8, 3)
70 
71 #define AVF_TXD_OFFSET(x,factor,val) (((u64)val/(u64)factor) << (16 + x))
72 #define AVF_TXD_OFFSET_MACLEN(val) AVF_TXD_OFFSET( 0, 2, val)
73 #define AVF_TXD_OFFSET_IPLEN(val) AVF_TXD_OFFSET( 7, 4, val)
74 #define AVF_TXD_OFFSET_L4LEN(val) AVF_TXD_OFFSET(14, 4, val)
75 
76 #define AVF_TXD_DTYP_CTX 0x1ULL
77 #define AVF_TXD_CTX_CMD_TSO AVF_TXD_CMD(0)
78 #define AVF_TXD_CTX_SEG(val,x) (((u64)val) << (30 + x))
79 #define AVF_TXD_CTX_SEG_TLEN(val) AVF_TXD_CTX_SEG(val,0)
80 #define AVF_TXD_CTX_SEG_MSS(val) AVF_TXD_CTX_SEG(val,20)
81 
82 
84 
85 #define avf_log_err(dev, f, ...) \
86  vlib_log (VLIB_LOG_LEVEL_ERR, avf_log.class, "%U: " f, \
87  format_vlib_pci_addr, &dev->pci_addr, \
88  ## __VA_ARGS__)
89 
90 #define avf_log_warn(dev, f, ...) \
91  vlib_log (VLIB_LOG_LEVEL_WARNING, avf_log.class, "%U: " f, \
92  format_vlib_pci_addr, &dev->pci_addr, \
93  ## __VA_ARGS__)
94 
95 #define avf_log_debug(dev, f, ...) \
96  vlib_log (VLIB_LOG_LEVEL_DEBUG, avf_log.class, "%U: " f, \
97  format_vlib_pci_addr, &dev->pci_addr, \
98  ## __VA_ARGS__)
99 
100 #define foreach_avf_device_flags \
101  _(0, INITIALIZED, "initialized") \
102  _(1, ERROR, "error") \
103  _(2, ADMIN_UP, "admin-up") \
104  _(3, VA_DMA, "vaddr-dma") \
105  _(4, LINK_UP, "link-up") \
106  _(5, SHARED_TXQ_LOCK, "shared-txq-lock") \
107  _(6, ELOG, "elog") \
108  _(7, PROMISC, "promisc") \
109  _(8, RX_INT, "rx-interrupts")
110 
111 enum
112 {
113 #define _(a, b, c) AVF_DEVICE_F_##b = (1 << a),
115 #undef _
116 };
117 
118 typedef volatile struct
119 {
120  union
121  {
122  struct
123  {
124  u64 mirr:13;
133  };
134  u64 qword[4];
135 #ifdef CLIB_HAVE_VEC256
136  u64x4 as_u64x4;
137 #endif
138  };
139 } avf_rx_desc_t;
140 
142 
143 typedef volatile struct
144 {
145  union
146  {
147  u64 qword[2];
148 #ifdef CLIB_HAVE_VEC128
149  u64x2 as_u64x2;
150 #endif
151  };
152 } avf_tx_desc_t;
153 
155 
156 typedef struct
157 {
158  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
159  volatile u32 *qrx_tail;
167 } avf_rxq_t;
168 
169 typedef struct
170 {
171  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
172  volatile u32 *qtx_tail;
181 } avf_txq_t;
182 
183 typedef struct
184 {
185  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
188 
194  void *bar0;
196 
197  /* queues */
202 
203  /* Admin queues */
206  void *atq_bufs;
207  void *arq_bufs;
213 
216  u8 hwaddr[6];
224  vlib_pci_addr_t pci_addr;
225 
226  /* stats */
229 
230  /* error */
232 } avf_device_t;
233 
234 #define AVF_RX_VECTOR_SZ VLIB_FRAME_SIZE
235 
236 typedef enum
237 {
243 
244 typedef enum
245 {
249 
250 typedef struct
251 {
255  u8 eth_addr[6];
256  int is_add, is_enable;
259 
260 typedef struct
261 {
264 } avf_rx_tail_t;
265 
266 typedef struct
267 {
268  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
274 
275 typedef struct
276 {
278 
281 } avf_main_t;
282 
283 extern avf_main_t avf_main;
284 
285 typedef struct
286 {
287  vlib_pci_addr_t addr;
293  /* return */
294  int rv;
298 
300 
304 
305 /* format.c */
309 
311 avf_get_device (u32 dev_instance)
312 {
313  return pool_elt_at_index (avf_main.devices, dev_instance)[0];
314 }
315 
316 static inline u32
317 avf_get_u32 (void *start, int offset)
318 {
319  return *(u32 *) (((u8 *) start) + offset);
320 }
321 
322 static inline u64
323 avf_get_u64 (void *start, int offset)
324 {
325  return *(u64 *) (((u8 *) start) + offset);
326 }
327 
328 static inline u32
329 avf_get_u32_bits (void *start, int offset, int first, int last)
330 {
331  u32 value = avf_get_u32 (start, offset);
332  if ((last == 0) && (first == 31))
333  return value;
334  value >>= last;
335  value &= (1 << (first - last + 1)) - 1;
336  return value;
337 }
338 
339 static inline u64
340 avf_get_u64_bits (void *start, int offset, int first, int last)
341 {
342  u64 value = avf_get_u64 (start, offset);
343  if ((last == 0) && (first == 63))
344  return value;
345  value >>= last;
346  value &= (1 << (first - last + 1)) - 1;
347  return value;
348 }
349 
350 static inline void
351 avf_set_u32 (void *start, int offset, u32 value)
352 {
353  (*(u32 *) (((u8 *) start) + offset)) = value;
354 }
355 
356 static inline void
358 {
359  *(volatile u32 *) ((u8 *) ad->bar0 + addr) = val;
360 }
361 
362 static inline u32
364 {
365  return *(volatile u32 *) (ad->bar0 + addr);
366 }
367 
368 static inline void
370 {
372  asm volatile ("":::"memory");
373 }
374 
377 {
378  return (d->qword[1] & AVF_RXD_STATUS_EOP) == 0;
379 }
380 
383 {
384  return (d->qword[1] & AVF_RXD_STATUS_DD) == 0;
385 }
386 
387 typedef struct
388 {
394 
395 #define foreach_avf_tx_func_error \
396  _(SEGMENT_SIZE_EXCEEDED, "segment size exceeded") \
397  _(NO_FREE_SLOTS, "no free tx slots")
398 
399 typedef enum
400 {
401 #define _(f,s) AVF_TX_ERROR_##f,
403 #undef _
406 
407 #endif /* AVF_H */
408 
409 /*
410  * fd.io coding-style-patch-verification: ON
411  *
412  * Local Variables:
413  * eval: (c-set-style "gnu")
414  * End:
415  */
u8 int_mode
Definition: avf.h:165
u32 hw_if_index
Definition: avf.h:191
#define CLIB_CACHE_LINE_ALIGN_MARK(mark)
Definition: cache.h:60
u32 ctx_desc_placeholder_bi
Definition: avf.h:175
static u64 avf_get_u64_bits(void *start, int offset, int first, int last)
Definition: avf.h:340
clib_error_t * error
Definition: avf.h:231
u64 mirr
Definition: avf.h:124
u64 atq_bufs_pa
Definition: avf.h:208
unsigned long u64
Definition: types.h:89
u16 n_rx_irqs
Definition: avf.h:219
virtchnl_link_speed_t link_speed
Definition: avf.h:223
static u64 avf_get_u64(void *start, int offset)
Definition: avf.h:323
avf_process_req_type_t type
Definition: avf.h:252
static heap_elt_t * last(heap_header_t *h)
Definition: heap.c:53
format_function_t format_avf_device
Definition: avf.h:306
vlib_pci_addr_t addr
Definition: avf.h:287
u32 dev_instance
Definition: avf.h:189
vlib_main_t * vm
Definition: in2out_ed.c:1580
virtchnl_link_speed_t
Definition: virtchnl.h:205
#define AVF_RXD_STATUS_DD
Definition: avf.h:45
struct _vnet_device_class vnet_device_class_t
format_function_t format_avf_input_trace
Definition: avf.h:308
vhost_vring_addr_t addr
Definition: vhost_user.h:111
volatile u32 * qtx_tail
Definition: avf.h:172
clib_error_t * error
Definition: avf.h:257
#define foreach_avf_device_flags
Definition: avf.h:100
unsigned char u8
Definition: types.h:56
vnet_device_class_t avf_device_class
u8 buffer_pool_index
Definition: avf.h:166
u8 *() format_function_t(u8 *s, va_list *args)
Definition: format.h:48
u32 calling_process_index
Definition: avf.h:254
u16 * rs_slots
Definition: avf.h:180
#define static_always_inline
Definition: clib.h:109
clib_spinlock_t lock
Definition: avf.h:176
static u32 avf_reg_read(avf_device_t *ad, u32 addr)
Definition: avf.h:363
static u32 avf_get_u32_bits(void *start, int offset, int first, int last)
Definition: avf.h:329
volatile u32 * qrx_tail
Definition: avf.h:159
unsigned int u32
Definition: types.h:88
vlib_log_class_registration_t avf_log
vlib_pci_dev_handle_t pci_dev_handle
Definition: avf.h:192
int is_enable
Definition: avf.h:256
void * arq_bufs
Definition: avf.h:207
avf_aq_desc_t * arq
Definition: avf.h:205
epu8_epi32 epu16_epi32 u64x2
Definition: vector_sse42.h:691
void avf_create_if(vlib_main_t *vm, avf_create_if_args_t *args)
Definition: device.c:1508
static heap_elt_t * first(heap_header_t *h)
Definition: heap.c:59
u16 next_index
Definition: avf.h:390
u32 hw_if_index
Definition: avf.h:391
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:546
u8 * name
Definition: avf.h:195
virtchnl_eth_stats_t last_cleared_eth_stats
Definition: avf.h:228
static u32 avf_get_u32(void *start, int offset)
Definition: avf.h:317
unsigned short u16
Definition: types.h:57
u64 qword[4]
Definition: avf.h:134
#define AVF_RX_VECTOR_SZ
Definition: avf.h:234
static void avf_reg_flush(avf_device_t *ad)
Definition: avf.h:369
u32 vlib_pci_dev_handle_t
Definition: pci.h:97
#define AVF_RXD_STATUS_EOP
Definition: avf.h:46
avf_device_t ** devices
Definition: avf.h:279
u16 n_rx_queues
Definition: avf.h:201
vlib_node_registration_t avf_process_node
(constructor) VLIB_REGISTER_NODE (avf_process_node)
Definition: device.c:1326
u16 atq_next_slot
Definition: avf.h:210
u32 numa_node
Definition: avf.h:193
vlib_node_registration_t avf_input_node
(constructor) VLIB_REGISTER_NODE (avf_input_node)
Definition: input.c:465
static_always_inline int avf_rxd_is_not_dd(avf_rx_desc_t *d)
Definition: avf.h:382
u64 length
Definition: avf.h:132
avf_tx_func_error_t
Definition: avf.h:399
Definition: avf.h:156
u64 l2tag1
Definition: avf.h:126
avf_tx_desc_t * descs
Definition: avf.h:177
u64 status
Definition: avf.h:128
u64 rsv1
Definition: avf.h:125
u64 filter_status
Definition: avf.h:127
static_always_inline avf_device_t * avf_get_device(u32 dev_instance)
Definition: avf.h:311
u16 vsi_id
Definition: avf.h:214
u32 per_interface_next_index
Definition: avf.h:187
u32 feature_bitmap
Definition: avf.h:215
u32 * bufs
Definition: avf.h:178
u8 value
Definition: qos.api:54
avf_process_req_type_t
Definition: avf.h:244
avf_aq_desc_t * atq
Definition: avf.h:204
u32 flags
Definition: avf.h:186
Definition: avf.h:169
static void avf_set_u32(void *start, int offset, u32 value)
Definition: avf.h:351
u32 * bufs
Definition: avf.h:163
void * bar0
Definition: avf.h:194
vlib_buffer_t buffer_template
Definition: avf.h:272
u16 n_enqueued
Definition: avf.h:179
u16 n_enqueued
Definition: avf.h:164
virtchnl_pf_event_t * events
Definition: avf.h:212
static void avf_reg_write(avf_device_t *ad, u32 addr, u32 val)
Definition: avf.h:357
avf_main_t avf_main
Definition: device.c:43
virtchnl_eth_stats_t eth_stats
Definition: avf.h:227
void * atq_bufs
Definition: avf.h:206
#define AVFGEN_RSTAT
Definition: virtchnl.h:49
u16 msg_id_base
Definition: avf.h:277
u16 num_queue_pairs
Definition: avf.h:217
u16 next
Definition: avf.h:173
u32 dev_instance
Definition: avf.h:253
struct _vlib_node_registration vlib_node_registration_t
template key/value backing page structure
Definition: bihash_doc.h:44
avf_process_event_t
Definition: avf.h:236
u32 rss_lut_size
Definition: avf.h:222
u16 n_tx_queues
Definition: avf.h:200
format_function_t format_avf_device_name
Definition: avf.h:307
VLIB buffer representation.
Definition: buffer.h:102
#define foreach_avf_tx_func_error
Definition: avf.h:395
u16 size
Definition: avf.h:161
u16 arq_next_slot
Definition: avf.h:211
avf_rxq_t * rxqs
Definition: avf.h:198
u64 error
Definition: avf.h:129
struct clib_bihash_value offset
template key/value backing page structure
u64x4
Definition: vector_avx2.h:121
clib_error_t * error
Definition: avf.h:296
avf_per_thread_data_t * per_thread_data
Definition: avf.h:280
u16 size
Definition: avf.h:174
vlib_pci_addr_t pci_addr
Definition: avf.h:224
u32 sw_if_index
Definition: avf.h:190
u64 rsv2
Definition: avf.h:130
u64 arq_bufs_pa
Definition: avf.h:209
u64 ptype
Definition: avf.h:131
static_always_inline int avf_rxd_is_not_eop(avf_rx_desc_t *d)
Definition: avf.h:376
STATIC_ASSERT_SIZEOF(avf_rx_desc_t, 32)
#define AVF_RX_MAX_DESC_IN_CHAIN
Definition: avf.h:50
u16 next
Definition: avf.h:160
avf_txq_t * txqs
Definition: avf.h:199
avf_rx_desc_t * descs
Definition: avf.h:162
u16 max_vectors
Definition: avf.h:218
u32 rss_key_size
Definition: avf.h:221
u16 max_mtu
Definition: avf.h:220