FD.io VPP  v19.01.3-6-g70449b9b9
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_RXD_STATUS(x) (1ULL << x)
26 #define AVF_RXD_STATUS_DD AVF_RXD_STATUS(0)
27 #define AVF_RXD_STATUS_EOP AVF_RXD_STATUS(1)
28 #define AVF_RXD_ERROR_SHIFT 19
29 #define AVF_RXD_PTYPE_SHIFT 30
30 #define AVF_RXD_LEN_SHIFT 38
31 #define AVF_RX_MAX_DESC_IN_CHAIN 5
32 
33 #define AVF_RXD_ERROR_IPE (1ULL << (AVF_RXD_ERROR_SHIFT + 3))
34 #define AVF_RXD_ERROR_L4E (1ULL << (AVF_RXD_ERROR_SHIFT + 4))
35 
36 #define AVF_TXD_CMD(x) (1 << (x + 4))
37 #define AVF_TXD_CMD_EOP AVF_TXD_CMD(0)
38 #define AVF_TXD_CMD_RS AVF_TXD_CMD(1)
39 #define AVF_TXD_CMD_RSV AVF_TXD_CMD(2)
40 
41 #define foreach_avf_device_flags \
42  _(0, INITIALIZED, "initialized") \
43  _(1, ERROR, "error") \
44  _(2, ADMIN_UP, "admin-up") \
45  _(3, VA_DMA, "vaddr-dma") \
46  _(4, LINK_UP, "link-up") \
47  _(5, SHARED_TXQ_LOCK, "shared-txq-lock") \
48  _(6, ELOG, "elog")
49 
50 enum
51 {
52 #define _(a, b, c) AVF_DEVICE_F_##b = (1 << a),
54 #undef _
55 };
56 
57 typedef volatile struct
58 {
59  union
60  {
61  struct
62  {
63  u64 mirr:13;
64  u64 rsv1:3;
65  u64 l2tag1:16;
67  u64 status:19;
69  u64 rsv2:3;
71  u64 length:26;
72  };
73  u64 qword[4];
74 #ifdef CLIB_HAVE_VEC256
75  u64x4 as_u64x4;
76 #endif
77  };
79 
81 
82 typedef volatile struct
83 {
84  union
85  {
86  u64 qword[2];
87 #ifdef CLIB_HAVE_VEC128
88  u64x2 as_u64x2;
89 #endif
90  };
92 
94 
95 typedef struct
96 {
97  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
98  volatile u32 *qrx_tail;
105 } avf_rxq_t;
106 
107 typedef struct
108 {
109  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
110  volatile u32 *qtx_tail;
118 } avf_txq_t;
119 
120 typedef struct
121 {
122  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
125 
131  void *bar0;
133 
134  /* queues */
139 
140  /* Admin queues */
143  void *atq_bufs;
144  void *arq_bufs;
150 
153  u8 hwaddr[6];
160 
161  /* stats */
163 
164  /* error */
166 } avf_device_t;
167 
168 #define AVF_RX_VECTOR_SZ VLIB_FRAME_SIZE
169 
170 enum
171 {
176 
177 typedef struct
178 {
181 } avf_rx_tail_t;
182 
183 typedef struct
184 {
185  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
191 
192 typedef struct
193 {
195 
198 
200 } avf_main_t;
201 
202 extern avf_main_t avf_main;
203 
204 typedef struct
205 {
206  vlib_pci_addr_t addr;
212  /* return */
213  int rv;
217 
220 
223 
224 /* format.c */
228 
229 static inline u32
230 avf_get_u32 (void *start, int offset)
231 {
232  return *(u32 *) (((u8 *) start) + offset);
233 }
234 
235 static inline u64
236 avf_get_u64 (void *start, int offset)
237 {
238  return *(u64 *) (((u8 *) start) + offset);
239 }
240 
241 static inline u32
242 avf_get_u32_bits (void *start, int offset, int first, int last)
243 {
244  u32 value = avf_get_u32 (start, offset);
245  if ((last == 0) && (first == 31))
246  return value;
247  value >>= last;
248  value &= (1 << (first - last + 1)) - 1;
249  return value;
250 }
251 
252 static inline u64
253 avf_get_u64_bits (void *start, int offset, int first, int last)
254 {
255  u64 value = avf_get_u64 (start, offset);
256  if ((last == 0) && (first == 63))
257  return value;
258  value >>= last;
259  value &= (1 << (first - last + 1)) - 1;
260  return value;
261 }
262 
263 static inline void
264 avf_set_u32 (void *start, int offset, u32 value)
265 {
266  (*(u32 *) (((u8 *) start) + offset)) = value;
267 }
268 
269 static inline void
271 {
272  *(volatile u32 *) ((u8 *) ad->bar0 + addr) = val;
273 }
274 
275 static inline u32
277 {
278  return *(volatile u32 *) (ad->bar0 + addr);
279 }
280 
281 static inline void
283 {
285  asm volatile ("":::"memory");
286 }
287 
290 {
291  return (d->qword[1] & AVF_RXD_STATUS_EOP) == 0;
292 }
293 
296 {
297  return (d->qword[1] & AVF_RXD_STATUS_DD) == 0;
298 }
299 
300 typedef struct
301 {
306 
307 #define foreach_avf_tx_func_error \
308 _(NO_FREE_SLOTS, "no free tx slots")
309 
310 typedef enum
311 {
312 #define _(f,s) AVF_TX_ERROR_##f,
314 #undef _
317 
318 #endif /* AVF_H */
319 
320 /*
321  * fd.io coding-style-patch-verification: ON
322  *
323  * Local Variables:
324  * eval: (c-set-style "gnu")
325  * End:
326  */
u8 int_mode
Definition: avf.h:104
u32 hw_if_index
Definition: avf.h:128
u32 vlib_log_class_t
Definition: log.h:21
#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:253
clib_error_t * error
Definition: avf.h:165
u64 mirr
Definition: avf.h:63
u64 atq_bufs_pa
Definition: avf.h:145
unsigned long u64
Definition: types.h:89
virtchnl_link_speed_t link_speed
Definition: avf.h:159
static u64 avf_get_u64(void *start, int offset)
Definition: avf.h:236
static heap_elt_t * last(heap_header_t *h)
Definition: heap.c:53
format_function_t format_avf_device
Definition: avf.h:225
vlib_pci_addr_t addr
Definition: avf.h:206
u32 dev_instance
Definition: avf.h:126
virtchnl_link_speed_t
Definition: virtchnl.h:188
u32 next_index
Definition: avf.h:302
#define AVF_RXD_STATUS_DD
Definition: avf.h:26
avf_device_t * devices
Definition: avf.h:196
struct _vnet_device_class vnet_device_class_t
format_function_t format_avf_input_trace
Definition: avf.h:227
vhost_vring_addr_t addr
Definition: vhost_user.h:121
volatile u32 * qtx_tail
Definition: avf.h:110
#define foreach_avf_device_flags
Definition: avf.h:41
unsigned char u8
Definition: types.h:56
vnet_device_class_t avf_device_class
u8 *() format_function_t(u8 *s, va_list *args)
Definition: format.h:48
u16 * rs_slots
Definition: avf.h:117
#define static_always_inline
Definition: clib.h:99
clib_spinlock_t lock
Definition: avf.h:113
static u32 avf_reg_read(avf_device_t *ad, u32 addr)
Definition: avf.h:276
static u32 avf_get_u32_bits(void *start, int offset, int first, int last)
Definition: avf.h:242
volatile u32 * qrx_tail
Definition: avf.h:98
unsigned int u32
Definition: types.h:88
vlib_pci_dev_handle_t pci_dev_handle
Definition: avf.h:129
void * arq_bufs
Definition: avf.h:144
avf_aq_desc_t * arq
Definition: avf.h:142
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:1191
static heap_elt_t * first(heap_header_t *h)
Definition: heap.c:59
u32 hw_if_index
Definition: avf.h:303
u8 * name
Definition: avf.h:132
static u32 avf_get_u32(void *start, int offset)
Definition: avf.h:230
unsigned short u16
Definition: types.h:57
u32 vlib_pci_dev_handle_t
Definition: pci.h:97
u64 qword[4]
Definition: avf.h:73
#define AVF_RX_VECTOR_SZ
Definition: avf.h:168
static void avf_reg_flush(avf_device_t *ad)
Definition: avf.h:282
#define AVF_RXD_STATUS_EOP
Definition: avf.h:27
u16 n_rx_queues
Definition: avf.h:138
u16 atq_next_slot
Definition: avf.h:147
u32 numa_node
Definition: avf.h:130
vlib_main_t * vm
Definition: buffer.c:301
vlib_node_registration_t avf_input_node
(constructor) VLIB_REGISTER_NODE (avf_input_node)
Definition: input.c:448
static_always_inline int avf_rxd_is_not_dd(avf_rx_desc_t *d)
Definition: avf.h:295
u64 length
Definition: avf.h:71
avf_tx_func_error_t
Definition: avf.h:310
Definition: avf.h:95
enum @401 avf_process_event_t
u64 l2tag1
Definition: avf.h:65
vlib_log_class_t log_class
Definition: avf.h:199
avf_tx_desc_t * descs
Definition: avf.h:114
u64 status
Definition: avf.h:67
u64 rsv1
Definition: avf.h:64
u64 filter_status
Definition: avf.h:66
u16 vsi_id
Definition: avf.h:151
u32 per_interface_next_index
Definition: avf.h:124
u32 feature_bitmap
Definition: avf.h:152
u32 * bufs
Definition: avf.h:115
avf_aq_desc_t * atq
Definition: avf.h:141
u32 flags
Definition: avf.h:123
Definition: avf.h:107
static void avf_set_u32(void *start, int offset, u32 value)
Definition: avf.h:264
u32 * bufs
Definition: avf.h:102
void * bar0
Definition: avf.h:131
vlib_buffer_t buffer_template
Definition: avf.h:189
u16 n_enqueued
Definition: avf.h:116
u16 n_enqueued
Definition: avf.h:103
virtchnl_pf_event_t * events
Definition: avf.h:149
static void avf_reg_write(avf_device_t *ad, u32 addr, u32 val)
Definition: avf.h:270
avf_main_t avf_main
Definition: device.c:37
virtchnl_eth_stats_t eth_stats
Definition: avf.h:162
void * atq_bufs
Definition: avf.h:143
#define AVFGEN_RSTAT
Definition: virtchnl.h:39
u16 msg_id_base
Definition: avf.h:194
u16 num_queue_pairs
Definition: avf.h:154
u16 next
Definition: avf.h:111
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:1134
u32 rss_lut_size
Definition: avf.h:158
u16 n_tx_queues
Definition: avf.h:137
format_function_t format_avf_device_name
Definition: avf.h:226
#define foreach_avf_tx_func_error
Definition: avf.h:307
u16 size
Definition: avf.h:100
u16 arq_next_slot
Definition: avf.h:148
avf_rxq_t * rxqs
Definition: avf.h:135
u64 error
Definition: avf.h:68
struct clib_bihash_value offset
template key/value backing page structure
u64x4
Definition: vector_avx2.h:121
clib_error_t * error
Definition: avf.h:215
avf_per_thread_data_t * per_thread_data
Definition: avf.h:197
u16 size
Definition: avf.h:112
u32 sw_if_index
Definition: avf.h:127
u64 rsv2
Definition: avf.h:69
u64 arq_bufs_pa
Definition: avf.h:146
u64 ptype
Definition: avf.h:70
static_always_inline int avf_rxd_is_not_eop(avf_rx_desc_t *d)
Definition: avf.h:289
STATIC_ASSERT_SIZEOF(avf_rx_desc_t, 32)
#define AVF_RX_MAX_DESC_IN_CHAIN
Definition: avf.h:31
u16 next
Definition: avf.h:99
avf_txq_t * txqs
Definition: avf.h:136
avf_rx_desc_t * descs
Definition: avf.h:101
u16 max_vectors
Definition: avf.h:155
u32 rss_key_size
Definition: avf.h:157
u16 max_mtu
Definition: avf.h:156