FD.io VPP  v20.09-rc2-28-g3c5414029
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 <vlib/log.h>
24 
25 #define AVF_AQ_ENQ_SUSPEND_TIME 50e-6
26 #define AVF_AQ_ENQ_MAX_WAIT_TIME 250e-3
27 
28 #define AVF_RESET_SUSPEND_TIME 20e-3
29 #define AVF_RESET_MAX_WAIT_TIME 1
30 
31 #define AVF_SEND_TO_PF_SUSPEND_TIME 10e-3
32 #define AVF_SEND_TO_PF_MAX_WAIT_TIME 1
33 
34 #define AVF_RXD_STATUS(x) (1ULL << x)
35 #define AVF_RXD_STATUS_DD AVF_RXD_STATUS(0)
36 #define AVF_RXD_STATUS_EOP AVF_RXD_STATUS(1)
37 #define AVF_RXD_ERROR_SHIFT 19
38 #define AVF_RXD_PTYPE_SHIFT 30
39 #define AVF_RXD_LEN_SHIFT 38
40 #define AVF_RX_MAX_DESC_IN_CHAIN 5
41 
42 #define AVF_RXD_ERROR_IPE (1ULL << (AVF_RXD_ERROR_SHIFT + 3))
43 #define AVF_RXD_ERROR_L4E (1ULL << (AVF_RXD_ERROR_SHIFT + 4))
44 
45 #define AVF_TXD_CMD(x) (1 << (x + 4))
46 #define AVF_TXD_CMD_EOP AVF_TXD_CMD(0)
47 #define AVF_TXD_CMD_RS AVF_TXD_CMD(1)
48 #define AVF_TXD_CMD_RSV AVF_TXD_CMD(2)
49 
50 #define avf_log_err(dev, f, ...) \
51  vlib_log (VLIB_LOG_LEVEL_ERR, avf_main.log_class, "%U: " f, \
52  format_vlib_pci_addr, &dev->pci_addr, \
53  ## __VA_ARGS__)
54 
55 #define avf_log_warn(dev, f, ...) \
56  vlib_log (VLIB_LOG_LEVEL_WARNING, avf_main.log_class, "%U: " f, \
57  format_vlib_pci_addr, &dev->pci_addr, \
58  ## __VA_ARGS__)
59 
60 #define avf_log_debug(dev, f, ...) \
61  vlib_log (VLIB_LOG_LEVEL_DEBUG, avf_main.log_class, "%U: " f, \
62  format_vlib_pci_addr, &dev->pci_addr, \
63  ## __VA_ARGS__)
64 
65 #define foreach_avf_device_flags \
66  _(0, INITIALIZED, "initialized") \
67  _(1, ERROR, "error") \
68  _(2, ADMIN_UP, "admin-up") \
69  _(3, VA_DMA, "vaddr-dma") \
70  _(4, LINK_UP, "link-up") \
71  _(5, SHARED_TXQ_LOCK, "shared-txq-lock") \
72  _(6, ELOG, "elog") \
73  _(7, PROMISC, "promisc") \
74  _(8, RX_INT, "rx-interrupts")
75 
76 enum
77 {
78 #define _(a, b, c) AVF_DEVICE_F_##b = (1 << a),
80 #undef _
81 };
82 
83 typedef volatile struct
84 {
85  union
86  {
87  struct
88  {
89  u64 mirr:13;
90  u64 rsv1:3;
91  u64 l2tag1:16;
93  u64 status:19;
95  u64 rsv2:3;
97  u64 length:26;
98  };
99  u64 qword[4];
100 #ifdef CLIB_HAVE_VEC256
101  u64x4 as_u64x4;
102 #endif
103  };
104 } avf_rx_desc_t;
105 
107 
108 typedef volatile struct
109 {
110  union
111  {
112  u64 qword[2];
113 #ifdef CLIB_HAVE_VEC128
114  u64x2 as_u64x2;
115 #endif
116  };
117 } avf_tx_desc_t;
118 
120 
121 typedef struct
122 {
123  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
124  volatile u32 *qrx_tail;
132 } avf_rxq_t;
133 
134 typedef struct
135 {
136  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
137  volatile u32 *qtx_tail;
145 } avf_txq_t;
146 
147 typedef struct
148 {
149  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
152 
158  void *bar0;
160 
161  /* queues */
166 
167  /* Admin queues */
170  void *atq_bufs;
171  void *arq_bufs;
177 
180  u8 hwaddr[6];
188  vlib_pci_addr_t pci_addr;
189 
190  /* stats */
193 
194  /* error */
196 } avf_device_t;
197 
198 #define AVF_RX_VECTOR_SZ VLIB_FRAME_SIZE
199 
200 typedef enum
201 {
208 
209 typedef struct
210 {
213 } avf_rx_tail_t;
214 
215 typedef struct
216 {
217  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
223 
224 typedef struct
225 {
227 
230 
232 } avf_main_t;
233 
234 extern avf_main_t avf_main;
235 
236 typedef struct
237 {
238  vlib_pci_addr_t addr;
244  /* return */
245  int rv;
249 
251 
255 
256 /* format.c */
260 
262 avf_get_device (u32 dev_instance)
263 {
264  return pool_elt_at_index (avf_main.devices, dev_instance)[0];
265 }
266 
267 static inline u32
268 avf_get_u32 (void *start, int offset)
269 {
270  return *(u32 *) (((u8 *) start) + offset);
271 }
272 
273 static inline u64
274 avf_get_u64 (void *start, int offset)
275 {
276  return *(u64 *) (((u8 *) start) + offset);
277 }
278 
279 static inline u32
280 avf_get_u32_bits (void *start, int offset, int first, int last)
281 {
282  u32 value = avf_get_u32 (start, offset);
283  if ((last == 0) && (first == 31))
284  return value;
285  value >>= last;
286  value &= (1 << (first - last + 1)) - 1;
287  return value;
288 }
289 
290 static inline u64
291 avf_get_u64_bits (void *start, int offset, int first, int last)
292 {
293  u64 value = avf_get_u64 (start, offset);
294  if ((last == 0) && (first == 63))
295  return value;
296  value >>= last;
297  value &= (1 << (first - last + 1)) - 1;
298  return value;
299 }
300 
301 static inline void
302 avf_set_u32 (void *start, int offset, u32 value)
303 {
304  (*(u32 *) (((u8 *) start) + offset)) = value;
305 }
306 
307 static inline void
309 {
310  *(volatile u32 *) ((u8 *) ad->bar0 + addr) = val;
311 }
312 
313 static inline u32
315 {
316  return *(volatile u32 *) (ad->bar0 + addr);
317 }
318 
319 static inline void
321 {
323  asm volatile ("":::"memory");
324 }
325 
328 {
329  return (d->qword[1] & AVF_RXD_STATUS_EOP) == 0;
330 }
331 
334 {
335  return (d->qword[1] & AVF_RXD_STATUS_DD) == 0;
336 }
337 
338 typedef struct
339 {
345 
346 #define foreach_avf_tx_func_error \
347  _(SEGMENT_SIZE_EXCEEDED, "segment size exceeded") \
348  _(NO_FREE_SLOTS, "no free tx slots")
349 
350 typedef enum
351 {
352 #define _(f,s) AVF_TX_ERROR_##f,
354 #undef _
357 
358 #endif /* AVF_H */
359 
360 /*
361  * fd.io coding-style-patch-verification: ON
362  *
363  * Local Variables:
364  * eval: (c-set-style "gnu")
365  * End:
366  */
u8 int_mode
Definition: avf.h:130
u32 hw_if_index
Definition: avf.h:155
#define CLIB_CACHE_LINE_ALIGN_MARK(mark)
Definition: cache.h:60
static u64 avf_get_u64_bits(void *start, int offset, int first, int last)
Definition: avf.h:291
clib_error_t * error
Definition: avf.h:195
u64 mirr
Definition: avf.h:89
u64 atq_bufs_pa
Definition: avf.h:172
unsigned long u64
Definition: types.h:89
u16 n_rx_irqs
Definition: avf.h:183
virtchnl_link_speed_t link_speed
Definition: avf.h:187
static u64 avf_get_u64(void *start, int offset)
Definition: avf.h:274
static heap_elt_t * last(heap_header_t *h)
Definition: heap.c:53
format_function_t format_avf_device
Definition: avf.h:257
vlib_pci_addr_t addr
Definition: avf.h:238
u32 dev_instance
Definition: avf.h:153
vlib_main_t * vm
Definition: in2out_ed.c:1582
virtchnl_link_speed_t
Definition: virtchnl.h:205
#define AVF_RXD_STATUS_DD
Definition: avf.h:35
struct _vnet_device_class vnet_device_class_t
format_function_t format_avf_input_trace
Definition: avf.h:259
vhost_vring_addr_t addr
Definition: vhost_user.h:111
volatile u32 * qtx_tail
Definition: avf.h:137
#define foreach_avf_device_flags
Definition: avf.h:65
unsigned char u8
Definition: types.h:56
vnet_device_class_t avf_device_class
u8 buffer_pool_index
Definition: avf.h:131
u8 *() format_function_t(u8 *s, va_list *args)
Definition: format.h:48
u32 vlib_log_class_t
Definition: vlib.h:51
u16 * rs_slots
Definition: avf.h:144
#define static_always_inline
Definition: clib.h:108
clib_spinlock_t lock
Definition: avf.h:140
static u32 avf_reg_read(avf_device_t *ad, u32 addr)
Definition: avf.h:314
static u32 avf_get_u32_bits(void *start, int offset, int first, int last)
Definition: avf.h:280
volatile u32 * qrx_tail
Definition: avf.h:124
unsigned int u32
Definition: types.h:88
vlib_pci_dev_handle_t pci_dev_handle
Definition: avf.h:156
void * arq_bufs
Definition: avf.h:171
avf_aq_desc_t * arq
Definition: avf.h:169
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:1422
static heap_elt_t * first(heap_header_t *h)
Definition: heap.c:59
u16 next_index
Definition: avf.h:341
u32 hw_if_index
Definition: avf.h:342
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:534
u8 * name
Definition: avf.h:159
virtchnl_eth_stats_t last_cleared_eth_stats
Definition: avf.h:192
static u32 avf_get_u32(void *start, int offset)
Definition: avf.h:268
unsigned short u16
Definition: types.h:57
u64 qword[4]
Definition: avf.h:99
#define AVF_RX_VECTOR_SZ
Definition: avf.h:198
static void avf_reg_flush(avf_device_t *ad)
Definition: avf.h:320
u32 vlib_pci_dev_handle_t
Definition: pci.h:97
#define AVF_RXD_STATUS_EOP
Definition: avf.h:36
avf_device_t ** devices
Definition: avf.h:228
u16 n_rx_queues
Definition: avf.h:165
vlib_node_registration_t avf_process_node
(constructor) VLIB_REGISTER_NODE (avf_process_node)
Definition: device.c:1279
u16 atq_next_slot
Definition: avf.h:174
u32 numa_node
Definition: avf.h:157
vlib_node_registration_t avf_input_node
(constructor) VLIB_REGISTER_NODE (avf_input_node)
Definition: input.c:462
static_always_inline int avf_rxd_is_not_dd(avf_rx_desc_t *d)
Definition: avf.h:333
u64 length
Definition: avf.h:97
avf_tx_func_error_t
Definition: avf.h:350
Definition: avf.h:121
u64 l2tag1
Definition: avf.h:91
vlib_log_class_t log_class
Definition: avf.h:231
avf_tx_desc_t * descs
Definition: avf.h:141
u64 status
Definition: avf.h:93
u64 rsv1
Definition: avf.h:90
u64 filter_status
Definition: avf.h:92
static_always_inline avf_device_t * avf_get_device(u32 dev_instance)
Definition: avf.h:262
u16 vsi_id
Definition: avf.h:178
u32 per_interface_next_index
Definition: avf.h:151
u32 feature_bitmap
Definition: avf.h:179
u32 * bufs
Definition: avf.h:142
u8 value
Definition: qos.api:54
avf_aq_desc_t * atq
Definition: avf.h:168
u32 flags
Definition: avf.h:150
Definition: avf.h:134
static void avf_set_u32(void *start, int offset, u32 value)
Definition: avf.h:302
u32 * bufs
Definition: avf.h:128
void * bar0
Definition: avf.h:158
vlib_buffer_t buffer_template
Definition: avf.h:221
u16 n_enqueued
Definition: avf.h:143
u16 n_enqueued
Definition: avf.h:129
virtchnl_pf_event_t * events
Definition: avf.h:176
static void avf_reg_write(avf_device_t *ad, u32 addr, u32 val)
Definition: avf.h:308
avf_main_t avf_main
Definition: device.c:37
virtchnl_eth_stats_t eth_stats
Definition: avf.h:191
void * atq_bufs
Definition: avf.h:170
#define AVFGEN_RSTAT
Definition: virtchnl.h:49
u16 msg_id_base
Definition: avf.h:226
u16 num_queue_pairs
Definition: avf.h:181
u16 next
Definition: avf.h:138
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:200
u32 rss_lut_size
Definition: avf.h:186
u16 n_tx_queues
Definition: avf.h:164
format_function_t format_avf_device_name
Definition: avf.h:258
VLIB buffer representation.
Definition: buffer.h:102
#define foreach_avf_tx_func_error
Definition: avf.h:346
u16 size
Definition: avf.h:126
u16 arq_next_slot
Definition: avf.h:175
avf_rxq_t * rxqs
Definition: avf.h:162
u64 error
Definition: avf.h:94
struct clib_bihash_value offset
template key/value backing page structure
u64x4
Definition: vector_avx2.h:121
clib_error_t * error
Definition: avf.h:247
avf_per_thread_data_t * per_thread_data
Definition: avf.h:229
u16 size
Definition: avf.h:139
vlib_pci_addr_t pci_addr
Definition: avf.h:188
u32 sw_if_index
Definition: avf.h:154
u64 rsv2
Definition: avf.h:95
u64 arq_bufs_pa
Definition: avf.h:173
u64 ptype
Definition: avf.h:96
static_always_inline int avf_rxd_is_not_eop(avf_rx_desc_t *d)
Definition: avf.h:327
STATIC_ASSERT_SIZEOF(avf_rx_desc_t, 32)
#define AVF_RX_MAX_DESC_IN_CHAIN
Definition: avf.h:40
u16 next
Definition: avf.h:125
avf_txq_t * txqs
Definition: avf.h:163
avf_rx_desc_t * descs
Definition: avf.h:127
u16 max_vectors
Definition: avf.h:182
u32 rss_key_size
Definition: avf.h:185
u16 max_mtu
Definition: avf.h:184