1 /* SPDX-License-Identifier: Apache-2.0
2 * Copyright (c) 2023 Cisco Systems, Inc.
8 #include <vppinfra/clib.h>
9 #include <vppinfra/error_bootstrap.h>
10 #include <vppinfra/format.h>
11 #include <vnet/vnet.h>
12 #include <vnet/dev/dev.h>
13 #include <dev_iavf/iavf_desc.h>
14 #include <dev_iavf/virtchnl.h>
16 #define IAVF_ITR_INT 250
17 #define IAVF_RX_MAX_DESC_IN_CHAIN 5
18 #define IAVF_MAX_RSS_KEY_SIZE 52
19 #define IAVF_MAX_RSS_LUT_SIZE 64
20 #define IIAVF_AQ_POLL_INTERVAL 0.2
21 #define IIAVF_AQ_BUF_SIZE 4096
23 typedef struct iavf_adminq_dma_mem iavf_adminq_dma_mem_t;
31 iavf_adminq_dma_mem_t *aq_mem;
34 virtchnl_pf_event_t *events;
42 } iavf_flow_lookup_entry_t;
48 iavf_flow_lookup_entry_t *flow_lookup_entries;
49 u64 intr_mode_per_rxq_bitmap;
63 iavf_tx_desc_t *descs;
67 iavf_tx_desc_t *tmp_descs;
76 iavf_rx_desc_t *descs;
87 u64 qw1s[IAVF_RX_MAX_DESC_IN_CHAIN];
91 vnet_dev_rv_t iavf_aq_alloc (vlib_main_t *, vnet_dev_t *);
92 void iavf_aq_init (vlib_main_t *, vnet_dev_t *);
93 void iavf_aq_poll_on (vlib_main_t *, vnet_dev_t *);
94 void iavf_aq_poll_off (vlib_main_t *, vnet_dev_t *);
95 void iavf_aq_deinit (vlib_main_t *, vnet_dev_t *);
96 void iavf_aq_free (vlib_main_t *, vnet_dev_t *);
97 vnet_dev_rv_t iavf_aq_atq_enq (vlib_main_t *, vnet_dev_t *, iavf_aq_desc_t *,
98 const u8 *, u16, f64);
99 int iavf_aq_arq_next_acq (vlib_main_t *, vnet_dev_t *, iavf_aq_desc_t **,
101 void iavf_aq_arq_next_rel (vlib_main_t *, vnet_dev_t *);
102 format_function_t format_virtchnl_op_name;
103 format_function_t format_virtchnl_status;
106 format_function_t format_iavf_vf_cap_flags;
107 format_function_t format_iavf_rx_trace;
108 format_function_t format_iavf_port_status;
111 vnet_dev_rv_t iavf_port_init (vlib_main_t *, vnet_dev_port_t *);
112 vnet_dev_rv_t iavf_port_start (vlib_main_t *, vnet_dev_port_t *);
113 void iavf_port_stop (vlib_main_t *, vnet_dev_port_t *);
114 vnet_dev_rv_t iavf_port_cfg_change (vlib_main_t *, vnet_dev_port_t *,
115 vnet_dev_port_cfg_change_req_t *);
116 vnet_dev_rv_t iavf_port_cfg_change_validate (vlib_main_t *, vnet_dev_port_t *,
117 vnet_dev_port_cfg_change_req_t *);
120 vnet_dev_rv_t iavf_rx_queue_alloc (vlib_main_t *, vnet_dev_rx_queue_t *);
121 vnet_dev_rv_t iavf_tx_queue_alloc (vlib_main_t *, vnet_dev_tx_queue_t *);
122 vnet_dev_rv_t iavf_rx_queue_start (vlib_main_t *, vnet_dev_rx_queue_t *);
123 vnet_dev_rv_t iavf_tx_queue_start (vlib_main_t *, vnet_dev_tx_queue_t *);
124 void iavf_rx_queue_stop (vlib_main_t *, vnet_dev_rx_queue_t *);
125 void iavf_tx_queue_stop (vlib_main_t *, vnet_dev_tx_queue_t *);
126 void iavf_rx_queue_free (vlib_main_t *, vnet_dev_rx_queue_t *);
127 void iavf_tx_queue_free (vlib_main_t *, vnet_dev_tx_queue_t *);
130 void iavf_port_poll_stats (vlib_main_t *, vnet_dev_port_t *);
131 void iavf_port_add_counters (vlib_main_t *, vnet_dev_port_t *);
136 iavf_get_u32 (void *start, int offset)
138 return *(u32 *) (((u8 *) start) + offset);
142 iavf_reg_write (iavf_device_t *ad, u32 addr, u32 val)
144 __atomic_store_n ((u32 *) ((u8 *) ad->bar0 + addr), val, __ATOMIC_RELEASE);
148 iavf_reg_read (iavf_device_t *ad, u32 addr)
150 return __atomic_load_n ((u32 *) (ad->bar0 + addr), __ATOMIC_RELAXED);
155 iavf_reg_flush (iavf_device_t *ad)
157 iavf_reg_read (ad, IAVF_VFGEN_RSTAT);
158 asm volatile("" ::: "memory");
161 #define log_debug(dev, f, ...) \
162 vlib_log (VLIB_LOG_LEVEL_DEBUG, iavf_log.class, "%U" f, \
163 format_vnet_dev_log, (dev), \
164 clib_string_skip_prefix (__func__, "iavf_"), ##__VA_ARGS__)
165 #define log_info(dev, f, ...) \
166 vlib_log (VLIB_LOG_LEVEL_INFO, iavf_log.class, "%U: " f, \
167 format_vnet_dev_addr, (dev), ##__VA_ARGS__)
168 #define log_notice(dev, f, ...) \
169 vlib_log (VLIB_LOG_LEVEL_NOTICE, iavf_log.class, "%U: " f, \
170 format_vnet_dev_addr, (dev), ##__VA_ARGS__)
171 #define log_warn(dev, f, ...) \
172 vlib_log (VLIB_LOG_LEVEL_WARNING, iavf_log.class, "%U: " f, \
173 format_vnet_dev_addr, (dev), ##__VA_ARGS__)
174 #define log_err(dev, f, ...) \
175 vlib_log (VLIB_LOG_LEVEL_ERR, iavf_log.class, "%U: " f, \
176 format_vnet_dev_addr, (dev), ##__VA_ARGS__)
179 #define IAVF_RX_VECTOR_SZ VLIB_FRAME_SIZE
183 u64 qw1s[IAVF_RX_MAX_DESC_IN_CHAIN - 1];
184 u32 buffers[IAVF_RX_MAX_DESC_IN_CHAIN - 1];
189 CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
190 vlib_buffer_t *bufs[IAVF_RX_VECTOR_SZ];
191 u16 next[IAVF_RX_VECTOR_SZ];
192 u64 qw1s[IAVF_RX_VECTOR_SZ];
193 u32 flow_ids[IAVF_RX_VECTOR_SZ];
194 iavf_rx_tail_t tails[IAVF_RX_VECTOR_SZ];
197 #define foreach_iavf_tx_node_counter \
198 _ (SEG_SZ_EXCEEDED, seg_sz_exceeded, ERROR, "segment size exceeded") \
199 _ (NO_FREE_SLOTS, no_free_slots, ERROR, "no free tx slots")
203 #define _(f, n, s, d) IAVF_TX_NODE_CTR_##f,
204 foreach_iavf_tx_node_counter
206 } iavf_tx_node_counter_t;
208 #define foreach_iavf_rx_node_counter \
209 _ (BUFFER_ALLOC, buffer_alloc, ERROR, "buffer alloc error")
213 #define _(f, n, s, d) IAVF_RX_NODE_CTR_##f,
214 foreach_iavf_rx_node_counter
216 } iavf_rx_node_counter_t;
218 #endif /* _IIAVF_H_ */