Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright (C), 2025, Wuxi Stars Micro System Technologies Co., Ltd.
3 : : */
4 : :
5 : : #ifndef SXE2_ETHDEV_H
6 : : #define SXE2_ETHDEV_H
7 : :
8 : : #include <rte_compat.h>
9 : : #include <rte_kvargs.h>
10 : : #include <rte_time.h>
11 : : #include <ethdev_driver.h>
12 : : #include <ethdev_pci.h>
13 : : #include <rte_tm_driver.h>
14 : : #include <rte_io.h>
15 : :
16 : : #include "sxe2_common.h"
17 : : #include "sxe2_vsi.h"
18 : : #include "sxe2_rss.h"
19 : : #include "sxe2_irq.h"
20 : : #include "sxe2_queue.h"
21 : : #include "sxe2_mac.h"
22 : : #include "sxe2_osal.h"
23 : : #include "sxe2_security.h"
24 : : #include "sxe2_ipsec.h"
25 : : #include "sxe2_tm.h"
26 : : #include "sxe2_filter.h"
27 : :
28 : : struct sxe2_link_msg {
29 : : uint32_t speed;
30 : : uint8_t status;
31 : : };
32 : :
33 : : enum sxe2_fnav_tunnel_flag_type {
34 : : SXE2_FNAV_TUN_FLAG_NO_TUNNEL,
35 : : SXE2_FNAV_TUN_FLAG_TUNNEL,
36 : : SXE2_FNAV_TUN_FLAG_ANY,
37 : : };
38 : :
39 : : #define SXE2_VF_MAX_NUM 256
40 : : #define SXE2_VSI_MAX_NUM 768
41 : : #define SXE2_FRAME_SIZE_MAX 9832
42 : : #define SXE2_VLAN_TAG_SIZE 4
43 : : #define SXE2_ETH_OVERHEAD \
44 : : (RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN + 2 * SXE2_VLAN_TAG_SIZE)
45 : : #define SXE2_ETH_MAX_LEN (RTE_ETHER_MTU + SXE2_ETH_OVERHEAD)
46 : :
47 : : #ifdef SXE2_TEST
48 : : #define SXE2_RESET_ACTIVE_WAIT_COUNT (5)
49 : : #else
50 : : #define SXE2_RESET_ACTIVE_WAIT_COUNT (10000)
51 : : #endif
52 : : #define SXE2_NO_ACTIVE_CNT (10)
53 : :
54 : : #define SXE2_WOKER_DELAY_5MS (5)
55 : : #define SXE2_WOKER_DELAY_10MS (10)
56 : : #define SXE2_WOKER_DELAY_20MS (20)
57 : : #define SXE2_WOKER_DELAY_30MS (30)
58 : :
59 : : #define SXE2_RESET_DETEC_WAIT_COUNT (100)
60 : : #define SXE2_RESET_DONE_WAIT_COUNT (250)
61 : : #define SXE2_RESET_WAIT_MS (10)
62 : :
63 : : #define SXE2_RESET_WAIT_MIN (10)
64 : : #define SXE2_RESET_WAIT_MAX (20)
65 : : #define upper_32_bits(n) ((uint32_t)(((n) >> 16) >> 16))
66 : : #define lower_32_bits(n) ((uint32_t)((n) & 0xffffffff))
67 : :
68 : : #define SXE2_I2C_EEPROM_DEV_ADDR 0xA0
69 : : #define SXE2_I2C_EEPROM_DEV_ADDR2 0xA2
70 : : #define SXE2_MODULE_TYPE_SFP 0x03
71 : : #define SXE2_MODULE_TYPE_QSFP_PLUS 0x0D
72 : : #define SXE2_MODULE_TYPE_QSFP28 0x11
73 : : #define SXE2_MODULE_SFF_ADDR_MODE 0x04
74 : : #define SXE2_MODULE_SFF_DIAG_CAPAB 0x40
75 : : #define SXE2_MODULE_REVISION_ADDR 0x01
76 : : #define SXE2_MODULE_SFF_8472_COMP 0x5E
77 : : #define SXE2_MODULE_SFF_8472_SWAP 0x5C
78 : : #define SXE2_MODULE_QSFP_MAX_LEN 640
79 : : #define SXE2_MODULE_SFF_8472_UNSUP 0x0
80 : : #define SXE2_MODULE_SFF_DDM_IMPLEMENTED 0x40
81 : : #define SXE2_MODULE_SFF_SFP_TYPE 0x03
82 : : #define SXE2_MODULE_TYPE_QSFP_PLUS 0x0D
83 : : #define SXE2_MODULE_TYPE_QSFP28 0x11
84 : :
85 : : #define SXE2_MODULE_SFF_8079 0x1
86 : : #define SXE2_MODULE_SFF_8079_LEN 256
87 : : #define SXE2_MODULE_SFF_8472 0x2
88 : : #define SXE2_MODULE_SFF_8472_LEN 512
89 : : #define SXE2_MODULE_SFF_8636 0x3
90 : : #define SXE2_MODULE_SFF_8636_LEN 256
91 : : #define SXE2_MODULE_SFF_8636_MAX_LEN 640
92 : : #define SXE2_MODULE_SFF_8436 0x4
93 : : #define SXE2_MODULE_SFF_8436_LEN 256
94 : : #define SXE2_MODULE_SFF_8436_MAX_LEN 640
95 : :
96 : : enum sxe2_wk_type {
97 : : SXE2_WK_MONITOR,
98 : : SXE2_WK_MONITOR_IM,
99 : : SXE2_WK_POST,
100 : : SXE2_WK_MBX,
101 : : };
102 : :
103 : : enum {
104 : : SXE2_FLAG_LEGACY_RX_ENABLE = 0,
105 : : SXE2_FLAG_LRO_ENABLE = 1,
106 : : SXE2_FLAG_RXQ_DISABLED = 2,
107 : : SXE2_FLAG_TXQ_DISABLED = 3,
108 : : SXE2_FLAG_DRV_REMOVING = 4,
109 : : SXE2_FLAG_RESET_DETECTED = 5,
110 : : SXE2_FLAG_CORE_RESET_DONE = 6,
111 : : SXE2_FLAG_RESET_ACTIVED = 7,
112 : : SXE2_FLAG_RESET_PENDING = 8,
113 : : SXE2_FLAG_RESET_REQUEST = 9,
114 : : SXE2_FLAGS_RESET_PROCESS_DONE = 10,
115 : : SXE2_FLAG_RESET_FAILED = 11,
116 : : SXE2_FLAG_DRV_PROBE_DONE = 12,
117 : : SXE2_FLAG_NETDEV_REGISTED = 13,
118 : : SXE2_FLAG_DRV_UP = 15,
119 : : SXE2_FLAG_DCB_ENABLE = 16,
120 : : SXE2_FLAG_FLTR_SYNC = 17,
121 : :
122 : : SXE2_FLAG_EVENT_IRQ_DISABLED = 18,
123 : : SXE2_FLAG_SUSPEND = 19,
124 : : SXE2_FLAG_FNAV_ENABLE = 20,
125 : :
126 : : SXE2_FLAGS_NBITS
127 : : };
128 : :
129 : : struct sxe2_ptp_context {
130 : : uint64_t mbuf_rx_ts_flag;
131 : : int32_t mbuf_rx_ts_offset;
132 : : };
133 : :
134 : : struct sxe2_devargs {
135 : : uint8_t flow_dup_pattern_mode;
136 : : uint8_t func_flow_direct_en;
137 : : uint8_t fnav_stat_type;
138 : : uint8_t acl_stat_type;
139 : : uint8_t no_sched_mode;
140 : : uint8_t sched_layer_mode;
141 : : uint8_t rx_low_latency;
142 : : };
143 : :
144 : : #define SXE2_PCI_MAP_BAR_INVALID ((uint8_t)0xff)
145 : : #define SXE2_PCI_MAP_INVALID_VAL ((uint32_t)0xffffffff)
146 : :
147 : : enum sxe2_pci_map_resource {
148 : : SXE2_PCI_MAP_RES_INVALID = 0,
149 : : SXE2_PCI_MAP_RES_DOORBELL_TX,
150 : : SXE2_PCI_MAP_RES_DOORBELL_RX_TAIL,
151 : : SXE2_PCI_MAP_RES_IRQ_DYN,
152 : : SXE2_PCI_MAP_RES_IRQ_ITR,
153 : : SXE2_PCI_MAP_RES_IRQ_MSIX,
154 : : SXE2_PCI_MAP_RES_PTP,
155 : : SXE2_PCI_MAP_RES_MAX_COUNT,
156 : : };
157 : :
158 : : enum sxe2_udp_tunnel_protocol {
159 : : SXE2_UDP_TUNNEL_PROTOCOL_VXLAN = 0,
160 : : SXE2_UDP_TUNNEL_PROTOCOL_VXLAN_GPE,
161 : : SXE2_UDP_TUNNEL_PROTOCOL_GENEVE,
162 : : SXE2_UDP_TUNNEL_PROTOCOL_GTP_C = 4,
163 : : SXE2_UDP_TUNNEL_PROTOCOL_GTP_U,
164 : : SXE2_UDP_TUNNEL_PROTOCOL_PFCP,
165 : : SXE2_UDP_TUNNEL_PROTOCOL_ECPRI,
166 : : SXE2_UDP_TUNNEL_PROTOCOL_MPLS,
167 : : SXE2_UDP_TUNNEL_PROTOCOL_NVGRE = 10,
168 : : SXE2_UDP_TUNNEL_PROTOCOL_L2TP,
169 : : SXE2_UDP_TUNNEL_PROTOCOL_TEREDO,
170 : : SXE2_UDP_TUNNEL_MAX,
171 : : };
172 : :
173 : : struct sxe2_pci_map_addr_info {
174 : : uint64_t addr_base;
175 : : uint8_t bar_idx;
176 : : uint8_t reg_width;
177 : : };
178 : :
179 : : struct sxe2_pci_map_segment_info {
180 : : enum sxe2_pci_map_resource type;
181 : : void *addr;
182 : : uint64_t page_inner_offset;
183 : : uint64_t len;
184 : : };
185 : :
186 : : struct sxe2_pci_map_bar_info {
187 : : uint8_t bar_idx;
188 : : uint8_t map_cnt;
189 : : struct sxe2_pci_map_segment_info *seg_info;
190 : : };
191 : :
192 : : struct sxe2_pci_map_context {
193 : : uint8_t bar_cnt;
194 : : struct sxe2_pci_map_bar_info *bar_info;
195 : : struct sxe2_pci_map_addr_info *addr_info;
196 : : };
197 : :
198 : : struct sxe2_dev_mac_info {
199 : : uint8_t perm_addr[SXE2_ETH_ALEN];
200 : : };
201 : :
202 : : struct sxe2_pci_info {
203 : : uint64_t serial_number;
204 : : uint8_t bus_devid;
205 : : uint8_t bus_function;
206 : : uint16_t max_vfs;
207 : : };
208 : :
209 : : struct sxe2_fw_info {
210 : : uint8_t main_version_id;
211 : : uint8_t sub_version_id;
212 : : uint8_t fix_version_id;
213 : : uint8_t build_id;
214 : : };
215 : :
216 : : struct sxe2_dev_info {
217 : : struct rte_eth_dev_data *dev_data;
218 : : struct sxe2_pci_info pci;
219 : : struct sxe2_fw_info fw;
220 : : struct sxe2_dev_mac_info mac;
221 : : };
222 : :
223 : : enum sxe2_udp_tunnel_status {
224 : : SXE2_UDP_TUNNEL_DISABLE = 0x0,
225 : : SXE2_UDP_TUNNEL_ENABLE,
226 : : };
227 : :
228 : : struct sxe2_udp_tunnel_cfg {
229 : : uint8_t protocol;
230 : : uint8_t dev_status;
231 : : uint16_t dev_port;
232 : : uint16_t dev_ref_cnt;
233 : :
234 : : uint16_t fw_port;
235 : : uint8_t fw_status;
236 : : uint8_t fw_dst_en;
237 : : uint8_t fw_src_en;
238 : : uint8_t fw_used;
239 : : };
240 : :
241 : : struct sxe2_udp_tunnel_ctx {
242 : : struct sxe2_udp_tunnel_cfg tunnel_conf[SXE2_UDP_TUNNEL_MAX];
243 : : rte_spinlock_t lock;
244 : : };
245 : :
246 : : struct sxe2_repr_context {
247 : : uint16_t nb_vf;
248 : : uint16_t nb_repr_vf;
249 : : struct rte_eth_dev **vf_rep_eth_dev;
250 : : struct sxe2_drv_vsi_caps repr_vf_id[SXE2_VF_MAX_NUM];
251 : : };
252 : :
253 : : struct sxe2_repr_private_data {
254 : : struct rte_eth_dev *rep_eth_dev;
255 : : struct sxe2_adapter *parent_adapter;
256 : :
257 : : struct sxe2_vsi *cp_vsi;
258 : : uint16_t repr_q_id;
259 : :
260 : : uint16_t repr_id;
261 : : uint16_t repr_pf_id;
262 : : uint16_t repr_vf_id;
263 : : uint16_t repr_vf_vsi_id;
264 : : uint16_t repr_vf_primary_vsi_id;
265 : : uint16_t repr_vf_backup_vsi_id;
266 : : };
267 : :
268 : : struct sxe2_sched_hw_cap {
269 : : uint32_t tm_layers;
270 : : uint8_t root_max_children;
271 : : uint8_t prio_max;
272 : : uint8_t adj_lvl;
273 : : };
274 : :
275 : : struct sxe2_sfp_read_info {
276 : : uint8_t *data;
277 : : uint16_t offset;
278 : : uint16_t len;
279 : : uint16_t bus_addr;
280 : : uint16_t page_cnt;
281 : : bool is_qsfp;
282 : : };
283 : :
284 : : struct sxe2_link_context {
285 : : rte_spinlock_t link_lock;
286 : : bool link_up;
287 : : uint32_t speed;
288 : : };
289 : :
290 : : struct sxe2_filter_context {
291 : : rte_spinlock_t filter_lock;
292 : : struct sxe2_vlan_info vlan_info;
293 : : struct sxe2_uc_filter_list_head uc_list;
294 : : struct sxe2_mc_filter_list_head mc_list;
295 : : struct sxe2_vlan_filter_list_head vlan_list;
296 : : uint8_t uc_num;
297 : : uint8_t mc_num;
298 : : uint8_t vlan_num;
299 : : uint8_t rsv;
300 : : uint32_t hw_promisc_flags;
301 : : uint32_t cur_promisc_flags;
302 : :
303 : : bool hw_uplink_config;
304 : : bool cur_uplink_config;
305 : : bool hw_repr_config;
306 : : bool cur_repr_config;
307 : : bool hw_l2_config;
308 : : bool cur_l2_config;
309 : : };
310 : :
311 : : struct sxe2_fc_state_ctxt {
312 : : uint8_t curr_state;
313 : : uint8_t cfg_state;
314 : : };
315 : :
316 : : struct sxe2_adapter {
317 : : struct sxe2_common_device *cdev;
318 : : struct sxe2_dev_info dev_info;
319 : : struct rte_pci_device *pci_dev;
320 : : struct sxe2_repr_private_data *repr_priv_data;
321 : : struct sxe2_pci_map_context map_ctxt;
322 : : struct sxe2_irq_context irq_ctxt;
323 : : struct sxe2_queue_context q_ctxt;
324 : : struct sxe2_vsi_context vsi_ctxt;
325 : : struct sxe2_filter_context filter_ctxt;
326 : : struct sxe2_rss_context rss_ctxt;
327 : : struct sxe2_flow_context flow_ctxt;
328 : : struct sxe2_link_context link_ctxt;
329 : : struct sxe2_ptp_context ptp_ctxt;
330 : : struct sxe2_sched_hw_cap sched_ctxt;
331 : : struct sxe2_tm_context tm_ctxt;
332 : : struct sxe2_devargs devargs;
333 : : struct sxe2_udp_tunnel_ctx udp_tunnel_ctx;
334 : : struct sxe2_security_ctx security_ctx;
335 : : struct sxe2_repr_context repr_ctxt;
336 : : struct sxe2_switchdev_info switchdev_info;
337 : : struct sxe2_fc_state_ctxt fc_state_ctx;
338 : : bool rule_started;
339 : : bool flow_isolated;
340 : : bool flow_isolate_cfg;
341 : : uint16_t dev_port_id;
342 : : bool is_dev_repr;
343 : : uint64_t cap_flags;
344 : : enum sxe2_dev_type dev_type;
345 : : struct rte_ether_addr mac_addr;
346 : : uint8_t port_idx;
347 : : uint8_t pf_idx;
348 : : uint32_t tx_mode_flags;
349 : : uint32_t rx_mode_flags;
350 : : uint8_t started;
351 : : };
352 : :
353 : : #define SXE2_DEV_PRIVATE_TO_ADAPTER(dev) \
354 : : ((struct sxe2_adapter *)(dev)->data->dev_private)
355 : :
356 : : #define SXE2_PCI_REG_WRITE(reg, value) rte_write32((rte_cpu_to_le_32(value)), (reg))
357 : : #define SXE2_PCI_REG_READ(reg) rte_read32(reg)
358 : :
359 : : void *sxe2_pci_map_addr_get(struct sxe2_adapter *adapter,
360 : : enum sxe2_pci_map_resource res_type,
361 : : uint16_t idx_in_func);
362 : :
363 : : bool sxe2_ethdev_check(struct rte_eth_dev *dev);
364 : :
365 : : uint32_t sxe2_sched_mode_get(struct sxe2_adapter *adapter);
366 : :
367 : : struct sxe2_pci_map_bar_info *sxe2_dev_get_bar_info(struct sxe2_adapter *adapter,
368 : : enum sxe2_pci_map_resource res_type);
369 : :
370 : : int32_t sxe2_dev_pci_seg_map(struct sxe2_adapter *adapter,
371 : : enum sxe2_pci_map_resource res_type,
372 : : uint64_t org_len, uint64_t org_offset);
373 : :
374 : : int32_t sxe2_dev_pci_res_seg_map(struct sxe2_adapter *adapter,
375 : : uint32_t res_type,
376 : : uint32_t item_cnt,
377 : : uint32_t item_base);
378 : :
379 : : void sxe2_pci_map_write_reg(struct sxe2_adapter *adapter,
380 : : enum sxe2_pci_map_resource res_type, uint16_t idx_in_func, uint32_t value);
381 : :
382 : : uint32_t sxe2_pci_map_read_reg(struct sxe2_adapter *adapter,
383 : : enum sxe2_pci_map_resource res_type, uint16_t idx_in_func);
384 : :
385 : : void sxe2_dev_pci_seg_unmap(struct sxe2_adapter *adapter, uint32_t res_type);
386 : :
387 : : int32_t sxe2_dev_pci_map_init(struct rte_eth_dev *dev);
388 : :
389 : : int32_t sxe2_udp_tunnel_port_del_common(struct sxe2_adapter *ad,
390 : : enum sxe2_udp_tunnel_protocol tunnel_proto, uint16_t udp_port);
391 : :
392 : : int32_t sxe2_udp_tunnel_port_add_common(struct sxe2_adapter *ad,
393 : : enum sxe2_udp_tunnel_protocol tunnel_proto, uint16_t udp_port);
394 : :
395 : : void sxe2_dev_pci_map_uinit(struct rte_eth_dev *dev);
396 : :
397 : : void sxe2_eth_uinit(struct rte_eth_dev *dev);
398 : :
399 : : static inline bool
400 : 0 : sxe2_dev_port_vlan_check(struct rte_eth_dev *dev)
401 : : {
402 [ # # ]: 0 : struct sxe2_adapter *ad = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
403 : :
404 [ # # # # ]: 0 : return ad->filter_ctxt.vlan_info.port_vlan_exist;
405 : : }
406 : :
407 : : #endif /* SXE2_ETHDEV_H */
|