FD.io VPP  v18.07-rc0-415-g6c78436
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 #include <avf/virtchnl.h>
19 
20 #include <vlib/log.h>
21 
22 #define foreach_avf_device_flags \
23  _(0, INITIALIZED, "initialized") \
24  _(1, ERROR, "error") \
25  _(2, ADMIN_UP, "admin-up") \
26  _(3, IOVA, "iova") \
27  _(4, LINK_UP, "link-up") \
28  _(5, SHARED_TXQ_LOCK, "shared-txq-lock") \
29  _(6, ELOG, "elog")
30 
31 enum
32 {
33 #define _(a, b, c) AVF_DEVICE_F_##b = (1 << a),
35 #undef _
36 };
37 
38 typedef struct
39 {
40  u64 qword[4];
42 
44 
45 typedef struct
46 {
47  union
48  {
49  u64 qword[2];
50  u64x2 as_u64x2;
51  };
53 
55 
56 typedef struct
57 {
58  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
59  volatile u32 *qrx_tail;
65 } avf_rxq_t;
66 
67 typedef struct
68 {
69  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
70  volatile u32 *qtx_tail;
77 } avf_txq_t;
78 
79 typedef struct
80 {
81  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
84 
89  void *bar0;
90 
91  /* queues */
94 
95  /* Admin queues */
98  void *atq_bufs;
99  void *arq_bufs;
105 
108  u8 hwaddr[6];
115 
116  /* stats */
118 
119  /* error */
121 } avf_device_t;
122 
123 typedef struct
124 {
130 
132 
133 #define AVF_RX_VECTOR_SZ VLIB_FRAME_SIZE
134 
135 enum
136 {
141 
142 typedef struct
143 {
144  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
149 
150 typedef struct
151 {
155 } avf_ptype_t;
156 
157 STATIC_ASSERT (VNET_DEVICE_INPUT_N_NEXT_NODES < 256, "too many next nodes");
158 
159 typedef struct
160 {
165 
167 
168  /* 256 element array for ptype based lookup */
170 } avf_main_t;
171 
172 extern avf_main_t avf_main;
173 
174 typedef struct
175 {
176  vlib_pci_addr_t addr;
178  /* return */
179  int rv;
182 
185 
189  vlib_frame_t * frame);
190 
191 /* format.c */
195 
196 static inline u32
197 avf_get_u32 (void *start, int offset)
198 {
199  return *(u32 *) (((u8 *) start) + offset);
200 }
201 
202 static inline u64
203 avf_get_u64 (void *start, int offset)
204 {
205  return *(u64 *) (((u8 *) start) + offset);
206 }
207 
208 static inline u32
209 avf_get_u32_bits (void *start, int offset, int first, int last)
210 {
211  u32 value = avf_get_u32 (start, offset);
212  if ((last == 0) && (first == 31))
213  return value;
214  value >>= last;
215  value &= (1 << (first - last + 1)) - 1;
216  return value;
217 }
218 
219 static inline u64
220 avf_get_u64_bits (void *start, int offset, int first, int last)
221 {
222  u64 value = avf_get_u64 (start, offset);
223  if ((last == 0) && (first == 63))
224  return value;
225  value >>= last;
226  value &= (1 << (first - last + 1)) - 1;
227  return value;
228 }
229 
230 static inline void
231 avf_set_u32 (void *start, int offset, u32 value)
232 {
233  (*(u32 *) (((u8 *) start) + offset)) = value;
234 }
235 
236 static inline void
238 {
239  *(volatile u32 *) ((u8 *) ad->bar0 + addr) = val;
240 }
241 
242 static inline u32
244 {
245  return *(volatile u32 *) (ad->bar0 + addr);
246 }
247 
248 static inline void
250 {
252  asm volatile ("":::"memory");
253 }
254 
255 typedef struct
256 {
261 
262 /*
263  * fd.io coding-style-patch-verification: ON
264  *
265  * Local Variables:
266  * eval: (c-set-style "gnu")
267  * End:
268  */
u8 next_node
Definition: avf.h:152
u32 hw_if_index
Definition: avf.h:87
u32 vlib_log_class_t
Definition: log.h:21
#define CLIB_CACHE_LINE_ALIGN_MARK(mark)
Definition: cache.h:63
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:220
avf_ptype_t * ptypes
Definition: avf.h:169
u64x2 as_u64x2
Definition: avf.h:50
clib_error_t * error
Definition: avf.h:120
u64 atq_bufs_pa
Definition: avf.h:100
unsigned long u64
Definition: types.h:89
virtchnl_link_speed_t link_speed
Definition: avf.h:114
static u64 avf_get_u64(void *start, int offset)
Definition: avf.h:203
static heap_elt_t * last(heap_header_t *h)
Definition: heap.c:53
format_function_t format_avf_device
Definition: avf.h:192
vlib_pci_addr_t addr
Definition: avf.h:176
u32 dev_instance
Definition: avf.h:85
virtchnl_link_speed_t
Definition: virtchnl.h:169
u32 next_index
Definition: avf.h:257
u8 *( format_function_t)(u8 *s, va_list *args)
Definition: format.h:48
avf_device_t * devices
Definition: avf.h:161
struct _vnet_device_class vnet_device_class_t
format_function_t format_avf_input_trace
Definition: avf.h:194
volatile u32 * qtx_tail
Definition: avf.h:70
#define foreach_avf_device_flags
Definition: avf.h:22
unsigned char u8
Definition: types.h:56
vnet_device_class_t avf_device_class
enum @368 avf_process_event_t
avf_rx_vector_entry_t rxve
Definition: avf.h:259
clib_spinlock_t lock
Definition: avf.h:73
static u32 avf_reg_read(avf_device_t *ad, u32 addr)
Definition: avf.h:243
static u32 avf_get_u32_bits(void *start, int offset, int first, int last)
Definition: avf.h:209
volatile u32 * qrx_tail
Definition: avf.h:59
int physmem_region_alloc
Definition: avf.h:164
unsigned int u32
Definition: types.h:88
vlib_pci_dev_handle_t pci_dev_handle
Definition: avf.h:88
u32 status
Definition: avf.h:125
void * arq_bufs
Definition: avf.h:99
avf_aq_desc_t * arq
Definition: avf.h:97
void avf_create_if(vlib_main_t *vm, avf_create_if_args_t *args)
Definition: device.c:1062
static heap_elt_t * first(heap_header_t *h)
Definition: heap.c:59
u32 hw_if_index
Definition: avf.h:258
i8 buffer_advance
Definition: avf.h:153
static u32 avf_get_u32(void *start, int offset)
Definition: avf.h:197
unsigned short u16
Definition: types.h:57
u32 vlib_pci_dev_handle_t
Definition: pci.h:97
u8 ptype
Definition: avf.h:127
#define AVF_RX_VECTOR_SZ
Definition: avf.h:133
signed char i8
Definition: types.h:45
static void avf_reg_flush(avf_device_t *ad)
Definition: avf.h:249
u16 atq_next_slot
Definition: avf.h:102
vlib_main_t * vm
Definition: buffer.c:294
vlib_node_registration_t avf_input_node
(constructor) VLIB_REGISTER_NODE (avf_input_node)
Definition: input.c:535
Definition: avf.h:123
Definition: avf.h:56
u32 flags
Definition: avf.h:154
vlib_log_class_t log_class
Definition: avf.h:166
avf_tx_desc_t * descs
Definition: avf.h:74
u16 vsi_id
Definition: avf.h:106
u32 per_interface_next_index
Definition: avf.h:83
u32 feature_bitmap
Definition: avf.h:107
u32 * bufs
Definition: avf.h:75
avf_aq_desc_t * atq
Definition: avf.h:96
u32 flags
Definition: avf.h:82
u8 error
Definition: avf.h:128
Definition: avf.h:67
static void avf_set_u32(void *start, int offset, u32 value)
Definition: avf.h:231
u32 * bufs
Definition: avf.h:63
void * bar0
Definition: avf.h:89
vlib_buffer_t buffer_template
Definition: avf.h:147
virtchnl_pf_event_t * events
Definition: avf.h:104
static void avf_reg_write(avf_device_t *ad, u32 addr, u32 val)
Definition: avf.h:237
avf_main_t avf_main
Definition: device.c:36
virtchnl_eth_stats_t eth_stats
Definition: avf.h:117
void * atq_bufs
Definition: avf.h:98
#define AVFGEN_RSTAT
Definition: virtchnl.h:36
u16 num_queue_pairs
Definition: avf.h:109
u16 next
Definition: avf.h:71
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:1007
u32 rss_lut_size
Definition: avf.h:113
format_function_t format_avf_device_name
Definition: avf.h:193
u64 uword
Definition: types.h:112
u16 size
Definition: avf.h:61
u16 arq_next_slot
Definition: avf.h:103
avf_rxq_t * rxqs
Definition: avf.h:92
struct clib_bihash_value offset
template key/value backing page structure
clib_error_t * error
Definition: avf.h:180
avf_per_thread_data_t * per_thread_data
Definition: avf.h:162
u16 size
Definition: avf.h:72
u32 sw_if_index
Definition: avf.h:86
u64 arq_bufs_pa
Definition: avf.h:101
vhost_vring_addr_t addr
Definition: vhost-user.h:83
u16 n_bufs
Definition: avf.h:76
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:163
u16 next
Definition: avf.h:60
uword avf_interface_tx(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
Definition: output.c:38
avf_txq_t * txqs
Definition: avf.h:93
avf_rx_desc_t * descs
Definition: avf.h:62
u16 length
Definition: avf.h:126
u16 n_bufs
Definition: avf.h:64
u16 max_vectors
Definition: avf.h:110
u32 rss_key_size
Definition: avf.h:112
u16 max_mtu
Definition: avf.h:111