FD.io VPP  v18.10-34-gcce845e
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 foreach_avf_device_flags \
26  _(0, INITIALIZED, "initialized") \
27  _(1, ERROR, "error") \
28  _(2, ADMIN_UP, "admin-up") \
29  _(3, IOVA, "iova") \
30  _(4, LINK_UP, "link-up") \
31  _(5, SHARED_TXQ_LOCK, "shared-txq-lock") \
32  _(6, ELOG, "elog")
33 
34 enum
35 {
36 #define _(a, b, c) AVF_DEVICE_F_##b = (1 << a),
38 #undef _
39 };
40 
41 typedef volatile struct
42 {
43  union
44  {
45  struct
46  {
47  u64 mirr:13;
48  u64 rsv1:3;
49  u64 l2tag1:16;
50  u64 filter_status:32;
51  u64 status:19;
52  u64 error:8;
53  u64 rsv2:3;
54  u64 ptype:8;
55  u64 length:26;
56  };
57  u64 qword[4];
58 #ifdef CLIB_HAVE_VEC256
59  u64x4 as_u64x4;
60 #endif
61  };
63 
65 
66 typedef volatile struct
67 {
68  union
69  {
70  u64 qword[2];
71 #ifdef CLIB_HAVE_VEC128
72  u64x2 as_u64x2;
73 #endif
74  };
76 
78 
79 typedef struct
80 {
81  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
82  volatile u32 *qrx_tail;
89 } avf_rxq_t;
90 
91 typedef struct
92 {
93  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
94  volatile u32 *qtx_tail;
101 } avf_txq_t;
102 
103 typedef struct
104 {
105  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
108 
113  void *bar0;
114 
115  /* queues */
120 
121  /* Admin queues */
124  void *atq_bufs;
125  void *arq_bufs;
131 
134  u8 hwaddr[6];
141 
142  /* stats */
144 
145  /* error */
147 } avf_device_t;
148 
149 typedef struct
150 {
156 
158 
159 #define AVF_RX_VECTOR_SZ VLIB_FRAME_SIZE
160 
161 enum
162 {
167 
168 typedef struct
169 {
170  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
175 
176 typedef struct
177 {
181 } avf_ptype_t;
182 
183 STATIC_ASSERT (VNET_DEVICE_INPUT_N_NEXT_NODES < 256, "too many next nodes");
184 
185 typedef struct
186 {
188 
193 
195 
196  /* 256 element array for ptype based lookup */
198 } avf_main_t;
199 
200 extern avf_main_t avf_main;
201 
202 typedef struct
203 {
204  vlib_pci_addr_t addr;
209  /* return */
210  int rv;
214 
217 
220 
221 /* format.c */
225 
226 static inline u32
227 avf_get_u32 (void *start, int offset)
228 {
229  return *(u32 *) (((u8 *) start) + offset);
230 }
231 
232 static inline u64
233 avf_get_u64 (void *start, int offset)
234 {
235  return *(u64 *) (((u8 *) start) + offset);
236 }
237 
238 static inline u32
239 avf_get_u32_bits (void *start, int offset, int first, int last)
240 {
241  u32 value = avf_get_u32 (start, offset);
242  if ((last == 0) && (first == 31))
243  return value;
244  value >>= last;
245  value &= (1 << (first - last + 1)) - 1;
246  return value;
247 }
248 
249 static inline u64
250 avf_get_u64_bits (void *start, int offset, int first, int last)
251 {
252  u64 value = avf_get_u64 (start, offset);
253  if ((last == 0) && (first == 63))
254  return value;
255  value >>= last;
256  value &= (1 << (first - last + 1)) - 1;
257  return value;
258 }
259 
260 static inline void
261 avf_set_u32 (void *start, int offset, u32 value)
262 {
263  (*(u32 *) (((u8 *) start) + offset)) = value;
264 }
265 
266 static inline void
268 {
269  *(volatile u32 *) ((u8 *) ad->bar0 + addr) = val;
270 }
271 
272 static inline u32
274 {
275  return *(volatile u32 *) (ad->bar0 + addr);
276 }
277 
278 static inline void
280 {
282  asm volatile ("":::"memory");
283 }
284 
285 typedef struct
286 {
291 
292 #define foreach_avf_tx_func_error \
293 _(NO_FREE_SLOTS, "no free tx slots")
294 
295 typedef enum
296 {
297 #define _(f,s) AVF_TX_ERROR_##f,
299 #undef _
302 
303 #endif /* AVF_H */
304 
305 /*
306  * fd.io coding-style-patch-verification: ON
307  *
308  * Local Variables:
309  * eval: (c-set-style "gnu")
310  * End:
311  */
u8 next_node
Definition: avf.h:178
u8 int_mode
Definition: avf.h:88
u32 hw_if_index
Definition: avf.h:111
u32 vlib_log_class_t
Definition: log.h:21
#define CLIB_CACHE_LINE_ALIGN_MARK(mark)
Definition: cache.h:60
STATIC_ASSERT(VNET_DEVICE_INPUT_N_NEXT_NODES< 256,"too many next nodes")
static u64 avf_get_u64_bits(void *start, int offset, int first, int last)
Definition: avf.h:250
avf_ptype_t * ptypes
Definition: avf.h:197
clib_error_t * error
Definition: avf.h:146
u64 atq_bufs_pa
Definition: avf.h:126
unsigned long u64
Definition: types.h:89
virtchnl_link_speed_t link_speed
Definition: avf.h:140
static u64 avf_get_u64(void *start, int offset)
Definition: avf.h:233
static heap_elt_t * last(heap_header_t *h)
Definition: heap.c:53
format_function_t format_avf_device
Definition: avf.h:222
vlib_pci_addr_t addr
Definition: avf.h:204
u32 dev_instance
Definition: avf.h:109
virtchnl_link_speed_t
Definition: virtchnl.h:179
u32 next_index
Definition: avf.h:287
u8 *( format_function_t)(u8 *s, va_list *args)
Definition: format.h:48
avf_device_t * devices
Definition: avf.h:189
struct _vnet_device_class vnet_device_class_t
format_function_t format_avf_input_trace
Definition: avf.h:224
vhost_vring_addr_t addr
Definition: vhost_user.h:121
volatile u32 * qtx_tail
Definition: avf.h:94
#define foreach_avf_device_flags
Definition: avf.h:25
unsigned char u8
Definition: types.h:56
vnet_device_class_t avf_device_class
avf_rx_vector_entry_t rxve
Definition: avf.h:289
clib_spinlock_t lock
Definition: avf.h:97
static u32 avf_reg_read(avf_device_t *ad, u32 addr)
Definition: avf.h:273
static u32 avf_get_u32_bits(void *start, int offset, int first, int last)
Definition: avf.h:239
volatile u32 * qrx_tail
Definition: avf.h:82
int physmem_region_alloc
Definition: avf.h:192
unsigned int u32
Definition: types.h:88
vlib_pci_dev_handle_t pci_dev_handle
Definition: avf.h:112
u32 status
Definition: avf.h:151
void * arq_bufs
Definition: avf.h:125
avf_aq_desc_t * arq
Definition: avf.h:123
epu8_epi32 epu16_epi32 u64x2
Definition: vector_sse42.h:640
void avf_create_if(vlib_main_t *vm, avf_create_if_args_t *args)
Definition: device.c:1174
static heap_elt_t * first(heap_header_t *h)
Definition: heap.c:59
u32 hw_if_index
Definition: avf.h:288
i8 buffer_advance
Definition: avf.h:179
static u32 avf_get_u32(void *start, int offset)
Definition: avf.h:227
unsigned short u16
Definition: types.h:57
u32 vlib_pci_dev_handle_t
Definition: pci.h:97
u8 ptype
Definition: avf.h:153
#define AVF_RX_VECTOR_SZ
Definition: avf.h:159
signed char i8
Definition: types.h:45
static void avf_reg_flush(avf_device_t *ad)
Definition: avf.h:279
u16 n_rx_queues
Definition: avf.h:119
u16 atq_next_slot
Definition: avf.h:128
vlib_main_t * vm
Definition: buffer.c:294
enum @397 avf_process_event_t
vlib_node_registration_t avf_input_node
(constructor) VLIB_REGISTER_NODE (avf_input_node)
Definition: input.c:534
Definition: avf.h:149
avf_tx_func_error_t
Definition: avf.h:295
Definition: avf.h:79
u32 flags
Definition: avf.h:180
vlib_log_class_t log_class
Definition: avf.h:194
avf_tx_desc_t * descs
Definition: avf.h:98
u16 vsi_id
Definition: avf.h:132
u32 per_interface_next_index
Definition: avf.h:107
u32 feature_bitmap
Definition: avf.h:133
u32 * bufs
Definition: avf.h:99
avf_aq_desc_t * atq
Definition: avf.h:122
u32 flags
Definition: avf.h:106
u8 error
Definition: avf.h:154
Definition: avf.h:91
static void avf_set_u32(void *start, int offset, u32 value)
Definition: avf.h:261
u32 * bufs
Definition: avf.h:86
void * bar0
Definition: avf.h:113
vlib_buffer_t buffer_template
Definition: avf.h:173
u16 n_enqueued
Definition: avf.h:100
u16 n_enqueued
Definition: avf.h:87
virtchnl_pf_event_t * events
Definition: avf.h:130
static void avf_reg_write(avf_device_t *ad, u32 addr, u32 val)
Definition: avf.h:267
avf_main_t avf_main
Definition: device.c:36
virtchnl_eth_stats_t eth_stats
Definition: avf.h:143
void * atq_bufs
Definition: avf.h:124
#define AVFGEN_RSTAT
Definition: virtchnl.h:39
u16 msg_id_base
Definition: avf.h:187
u16 num_queue_pairs
Definition: avf.h:135
u16 next
Definition: avf.h:95
struct _vlib_node_registration vlib_node_registration_t
template key/value backing page structure
Definition: bihash_doc.h:44
void avf_delete_if(vlib_main_t *vm, avf_device_t *ad)
Definition: device.c:1119
u32 rss_lut_size
Definition: avf.h:139
u16 n_tx_queues
Definition: avf.h:118
format_function_t format_avf_device_name
Definition: avf.h:223
#define foreach_avf_tx_func_error
Definition: avf.h:292
u16 size
Definition: avf.h:84
u16 arq_next_slot
Definition: avf.h:129
avf_rxq_t * rxqs
Definition: avf.h:116
struct clib_bihash_value offset
template key/value backing page structure
u64x4
Definition: vector_avx2.h:121
clib_error_t * error
Definition: avf.h:212
avf_per_thread_data_t * per_thread_data
Definition: avf.h:190
u16 size
Definition: avf.h:96
u32 sw_if_index
Definition: avf.h:110
u64 arq_bufs_pa
Definition: avf.h:127
STATIC_ASSERT_SIZEOF(avf_rx_desc_t, 32)
u8 vlib_physmem_region_index_t
Definition: physmem.h:43
vlib_physmem_region_index_t physmem_region
Definition: avf.h:191
u16 next
Definition: avf.h:83
avf_txq_t * txqs
Definition: avf.h:117
avf_rx_desc_t * descs
Definition: avf.h:85
u16 length
Definition: avf.h:152
u16 max_vectors
Definition: avf.h:136
u32 rss_key_size
Definition: avf.h:138
u16 max_mtu
Definition: avf.h:137