xref: /dpdk/drivers/net/ntnic/include/hw_mod_backend.h (revision 7917b0d38e92e8b9ec5a870415b791420e10f11a)
1 /*
2  * SPDX-License-Identifier: BSD-3-Clause
3  * Copyright(c) 2023 Napatech A/S
4  */
5 
6 #ifndef _HW_MOD_BACKEND_H_
7 #define _HW_MOD_BACKEND_H_
8 
9 #include <stdbool.h>
10 
11 #include "ntlog.h"
12 
13 #include "hw_mod_cat_v18.h"
14 #include "hw_mod_cat_v21.h"
15 #include "hw_mod_flm_v25.h"
16 #include "hw_mod_km_v7.h"
17 #include "hw_mod_qsl_v7.h"
18 #include "hw_mod_pdb_v9.h"
19 #include "hw_mod_slc_lr_v2.h"
20 #include "hw_mod_hsh_v5.h"
21 #include "hw_mod_tpe_v3.h"
22 
23 #define MAX_PHYS_ADAPTERS 8
24 
25 #define COMMON_FUNC_INFO_S                                                                        \
26 	int ver;                                                                                  \
27 	void *base;                                                                               \
28 	unsigned int alloced_size;                                                                \
29 	int debug
30 
31 struct cat_func_s {
32 	COMMON_FUNC_INFO_S;
33 	uint32_t nb_cat_funcs;
34 	uint32_t nb_flow_types;
35 	uint32_t nb_pm_ext;
36 	uint32_t nb_len;
37 	uint32_t kcc_size;
38 	uint32_t cts_num;
39 	uint32_t kcc_banks;
40 	uint32_t kcc_id_bit_size;
41 	uint32_t kcc_records;
42 	uint32_t km_if_count;
43 	int32_t km_if_m0;
44 	int32_t km_if_m1;
45 
46 	union {
47 		struct hw_mod_cat_v18_s v18;
48 		struct hw_mod_cat_v21_s v21;
49 	};
50 };
51 
52 struct km_func_s {
53 	COMMON_FUNC_INFO_S;
54 	uint32_t nb_categories;
55 	uint32_t nb_cam_banks;
56 	uint32_t nb_cam_record_words;
57 	uint32_t nb_cam_records;
58 	uint32_t nb_tcam_banks;
59 	uint32_t nb_tcam_bank_width;
60 	/* not read from backend, but rather set using version */
61 	uint32_t nb_km_rcp_mask_a_word_size;
62 	/* --- || --- */
63 	uint32_t nb_km_rcp_mask_b_word_size;
64 	union {
65 		struct hw_mod_km_v7_s v7;
66 	};
67 };
68 
69 struct flm_func_s {
70 	COMMON_FUNC_INFO_S;
71 	uint32_t nb_categories;
72 	uint32_t nb_size_mb;
73 	uint32_t nb_entry_size;
74 	uint32_t nb_variant;
75 	uint32_t nb_prios;
76 	uint32_t nb_pst_profiles;
77 	uint32_t nb_scrub_profiles;
78 	uint32_t nb_rpp_clock_in_ps;
79 	uint32_t nb_load_aps_max;
80 	union {
81 		struct hw_mod_flm_v25_s v25;
82 	};
83 };
84 
85 struct hsh_func_s {
86 	COMMON_FUNC_INFO_S;
87 	uint32_t nb_rcp;/* number of HSH recipes supported by FPGA */
88 	/* indication if Toeplitz is supported by FPGA, i.e. 0 - unsupported, 1 - supported */
89 	uint32_t toeplitz;
90 	union {
91 		struct hw_mod_hsh_v5_s v5;
92 	};
93 };
94 
95 struct qsl_func_s {
96 	COMMON_FUNC_INFO_S;
97 	uint32_t nb_rcp_categories;
98 	uint32_t nb_qst_entries;
99 	union {
100 		struct hw_mod_qsl_v7_s v7;
101 	};
102 };
103 
104 struct slc_lr_func_s {
105 	COMMON_FUNC_INFO_S;
106 	union {
107 		struct hw_mod_slc_lr_v2_s v2;
108 	};
109 };
110 
111 struct pdb_func_s {
112 	COMMON_FUNC_INFO_S;
113 	uint32_t nb_pdb_rcp_categories;
114 
115 	union {
116 		struct hw_mod_pdb_v9_s v9;
117 	};
118 };
119 
120 struct tpe_func_s {
121 	COMMON_FUNC_INFO_S;
122 	uint32_t nb_rcp_categories;
123 	uint32_t nb_ifr_categories;
124 	uint32_t nb_cpy_writers;
125 	uint32_t nb_rpl_depth;
126 	uint32_t nb_rpl_ext_categories;
127 	union {
128 		struct hw_mod_tpe_v3_s v3;
129 	};
130 };
131 
132 enum debug_mode_e {
133 	FLOW_BACKEND_DEBUG_MODE_NONE = 0x0000,
134 	FLOW_BACKEND_DEBUG_MODE_WRITE = 0x0001
135 };
136 
137 struct flow_api_backend_ops {
138 	int version;
139 	int (*set_debug_mode)(void *dev, enum debug_mode_e mode);
140 	int (*get_nb_phy_port)(void *dev);
141 	int (*get_nb_rx_port)(void *dev);
142 	int (*get_ltx_avail)(void *dev);
143 	int (*get_nb_cat_funcs)(void *dev);
144 	int (*get_nb_categories)(void *dev);
145 	int (*get_nb_cat_km_if_cnt)(void *dev);
146 	int (*get_nb_cat_km_if_m0)(void *dev);
147 	int (*get_nb_cat_km_if_m1)(void *dev);
148 
149 	int (*get_nb_queues)(void *dev);
150 	int (*get_nb_km_flow_types)(void *dev);
151 	int (*get_nb_pm_ext)(void *dev);
152 	int (*get_nb_len)(void *dev);
153 	int (*get_kcc_size)(void *dev);
154 	int (*get_kcc_banks)(void *dev);
155 	int (*get_nb_km_categories)(void *dev);
156 	int (*get_nb_km_cam_banks)(void *dev);
157 	int (*get_nb_km_cam_record_words)(void *dev);
158 	int (*get_nb_km_cam_records)(void *dev);
159 	int (*get_nb_km_tcam_banks)(void *dev);
160 	int (*get_nb_km_tcam_bank_width)(void *dev);
161 	int (*get_nb_flm_categories)(void *dev);
162 	int (*get_nb_flm_size_mb)(void *dev);
163 	int (*get_nb_flm_entry_size)(void *dev);
164 	int (*get_nb_flm_variant)(void *dev);
165 	int (*get_nb_flm_prios)(void *dev);
166 	int (*get_nb_flm_pst_profiles)(void *dev);
167 	int (*get_nb_flm_scrub_profiles)(void *dev);
168 	int (*get_nb_flm_load_aps_max)(void *dev);
169 	int (*get_nb_qsl_categories)(void *dev);
170 	int (*get_nb_qsl_qst_entries)(void *dev);
171 	int (*get_nb_pdb_categories)(void *dev);
172 	int (*get_nb_roa_categories)(void *dev);
173 	int (*get_nb_tpe_categories)(void *dev);
174 	int (*get_nb_tx_cpy_writers)(void *dev);
175 	int (*get_nb_tx_cpy_mask_mem)(void *dev);
176 	int (*get_nb_tx_rpl_depth)(void *dev);
177 	int (*get_nb_tx_rpl_ext_categories)(void *dev);
178 	int (*get_nb_tpe_ifr_categories)(void *dev);
179 	int (*get_nb_rpp_per_ps)(void *dev);
180 	int (*get_nb_hsh_categories)(void *dev);
181 	int (*get_nb_hsh_toeplitz)(void *dev);
182 
183 	int (*alloc_rx_queue)(void *dev, int queue_id);
184 	int (*free_rx_queue)(void *dev, int hw_queue);
185 
186 	/* CAT */
187 	bool (*get_cat_present)(void *dev);
188 	uint32_t (*get_cat_version)(void *dev);
189 	int (*cat_cfn_flush)(void *dev, const struct cat_func_s *cat, int cat_func, int cnt);
190 	int (*cat_kce_flush)(void *dev, const struct cat_func_s *cat, int km_if_idx, int index,
191 		int cnt);
192 	int (*cat_kcs_flush)(void *dev, const struct cat_func_s *cat, int km_if_idx, int cat_func,
193 		int cnt);
194 	int (*cat_fte_flush)(void *dev, const struct cat_func_s *cat, int km_if_idx, int index,
195 		int cnt);
196 	int (*cat_cte_flush)(void *dev, const struct cat_func_s *cat, int cat_func, int cnt);
197 	int (*cat_cts_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt);
198 	int (*cat_cot_flush)(void *dev, const struct cat_func_s *cat, int cat_func, int cnt);
199 	int (*cat_cct_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt);
200 	int (*cat_exo_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt);
201 	int (*cat_rck_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt);
202 	int (*cat_len_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt);
203 	int (*cat_kcc_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt);
204 
205 	/* KM */
206 	bool (*get_km_present)(void *dev);
207 	uint32_t (*get_km_version)(void *dev);
208 	int (*km_rcp_flush)(void *dev, const struct km_func_s *km, int category, int cnt);
209 	int (*km_cam_flush)(void *dev, const struct km_func_s *km, int bank, int record, int cnt);
210 	int (*km_tcam_flush)(void *dev, const struct km_func_s *km, int bank, int byte, int value,
211 		int cnt);
212 	int (*km_tci_flush)(void *dev, const struct km_func_s *km, int bank, int record, int cnt);
213 	int (*km_tcq_flush)(void *dev, const struct km_func_s *km, int bank, int record, int cnt);
214 
215 	/* FLM */
216 	bool (*get_flm_present)(void *dev);
217 	uint32_t (*get_flm_version)(void *dev);
218 	int (*flm_control_flush)(void *dev, const struct flm_func_s *flm);
219 	int (*flm_status_flush)(void *dev, const struct flm_func_s *flm);
220 	int (*flm_status_update)(void *dev, const struct flm_func_s *flm);
221 	int (*flm_scan_flush)(void *dev, const struct flm_func_s *flm);
222 	int (*flm_load_bin_flush)(void *dev, const struct flm_func_s *flm);
223 	int (*flm_prio_flush)(void *dev, const struct flm_func_s *flm);
224 	int (*flm_pst_flush)(void *dev, const struct flm_func_s *flm, int index, int cnt);
225 	int (*flm_rcp_flush)(void *dev, const struct flm_func_s *flm, int index, int cnt);
226 	int (*flm_scrub_flush)(void *dev, const struct flm_func_s *flm, int index, int cnt);
227 	int (*flm_buf_ctrl_update)(void *dev, const struct flm_func_s *flm);
228 	int (*flm_stat_update)(void *dev, const struct flm_func_s *flm);
229 	int (*flm_lrn_data_flush)(void *be_dev, const struct flm_func_s *flm,
230 		const uint32_t *lrn_data, uint32_t records,
231 		uint32_t *handled_records, uint32_t words_per_record,
232 		uint32_t *inf_word_cnt, uint32_t *sta_word_cnt);
233 	int (*flm_inf_sta_data_update)(void *be_dev, const struct flm_func_s *flm,
234 		uint32_t *inf_data, uint32_t inf_size,
235 		uint32_t *inf_word_cnt, uint32_t *sta_data,
236 		uint32_t sta_size, uint32_t *sta_word_cnt);
237 
238 	/* HSH */
239 	bool (*get_hsh_present)(void *dev);
240 	uint32_t (*get_hsh_version)(void *dev);
241 	int (*hsh_rcp_flush)(void *dev, const struct hsh_func_s *hsh, int category, int cnt);
242 
243 	/* QSL */
244 	bool (*get_qsl_present)(void *dev);
245 	uint32_t (*get_qsl_version)(void *dev);
246 	int (*qsl_rcp_flush)(void *dev, const struct qsl_func_s *qsl, int category, int cnt);
247 	int (*qsl_qst_flush)(void *dev, const struct qsl_func_s *qsl, int entry, int cnt);
248 	int (*qsl_qen_flush)(void *dev, const struct qsl_func_s *qsl, int entry, int cnt);
249 	int (*qsl_unmq_flush)(void *dev, const struct qsl_func_s *qsl, int entry, int cnt);
250 
251 	/* SLC LR */
252 	bool (*get_slc_lr_present)(void *dev);
253 	uint32_t (*get_slc_lr_version)(void *dev);
254 	int (*slc_lr_rcp_flush)(void *dev, const struct slc_lr_func_s *slc_lr, int category,
255 		int cnt);
256 
257 	/* PDB */
258 	bool (*get_pdb_present)(void *dev);
259 	uint32_t (*get_pdb_version)(void *dev);
260 	int (*pdb_rcp_flush)(void *dev, const struct pdb_func_s *pdb, int category, int cnt);
261 	int (*pdb_config_flush)(void *dev, const struct pdb_func_s *pdb);
262 
263 	/* TPE */
264 	bool (*get_tpe_present)(void *dev);
265 	uint32_t (*get_tpe_version)(void *dev);
266 	int (*tpe_rpp_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
267 	int (*tpe_rpp_ifr_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
268 	int (*tpe_ifr_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
269 	int (*tpe_ins_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
270 	int (*tpe_rpl_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
271 	int (*tpe_rpl_ext_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
272 	int (*tpe_rpl_rpl_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
273 	int (*tpe_cpy_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
274 	int (*tpe_hfu_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
275 	int (*tpe_csu_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
276 };
277 
278 struct flow_api_backend_s {
279 	void *be_dev;
280 	const struct flow_api_backend_ops *iface;
281 
282 	/* NIC attributes */
283 	unsigned int num_phy_ports;
284 	unsigned int num_rx_ports;
285 
286 	/* flow filter resource capacities */
287 	unsigned int max_categories;
288 	unsigned int max_queues;
289 };
290 
291 int flow_api_backend_init(struct flow_api_backend_s *dev, const struct flow_api_backend_ops *iface,
292 	void *be_dev);
293 int flow_api_backend_done(struct flow_api_backend_s *dev);
294 
295 #endif  /* _HW_MOD_BACKEND_H_ */
296