xref: /dpdk/drivers/net/ntnic/nthw/flow_api/flow_backend/flow_backend.c (revision e3723ca6f492f3b1df4799ae9248860ddf214be3)
1 /*
2  * SPDX-License-Identifier: BSD-3-Clause
3  * Copyright(c) 2023 Napatech A/S
4  */
5 
6 #include <stdint.h>
7 
8 #include "flow_nthw_info.h"
9 #include "ntnic_mod_reg.h"
10 #include "nthw_fpga_model.h"
11 #include "hw_mod_backend.h"
12 
13 /*
14  * Binary Flow API backend implementation into ntservice driver
15  *
16  * General note on this backend implementation:
17  * Maybe use shadow class to combine multiple writes. However, this backend is only for dev/testing
18  */
19 
20 static struct backend_dev_s {
21 	uint8_t adapter_no;
22 	enum debug_mode_e dmode;
23 	struct info_nthw *p_info_nthw;
24 } be_devs[MAX_PHYS_ADAPTERS];
25 
26 const struct flow_api_backend_ops *bin_flow_backend_init(nthw_fpga_t *p_fpga, void **be_dev);
27 static void bin_flow_backend_done(void *be_dev);
28 
29 static int set_debug_mode(void *be_dev, enum debug_mode_e mode)
30 {
31 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
32 	be->dmode = mode;
33 	return 0;
34 }
35 
36 /*
37  * INFO
38  */
39 
40 static int get_nb_phy_ports(void *be_dev)
41 {
42 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
43 	return info_nthw_get_nb_phy_ports(be->p_info_nthw);
44 }
45 
46 static int get_nb_rx_ports(void *be_dev)
47 {
48 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
49 	return info_nthw_get_nb_rx_ports(be->p_info_nthw);
50 }
51 
52 static int get_ltx_avail(void *be_dev)
53 {
54 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
55 	return info_nthw_get_ltx_avail(be->p_info_nthw);
56 }
57 
58 static int get_nb_cat_funcs(void *be_dev)
59 {
60 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
61 	return info_nthw_get_nb_cat_funcs(be->p_info_nthw);
62 }
63 
64 static int get_nb_categories(void *be_dev)
65 {
66 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
67 	return info_nthw_get_nb_categories(be->p_info_nthw);
68 }
69 
70 static int get_nb_cat_km_if_cnt(void *be_dev)
71 {
72 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
73 	return info_nthw_get_nb_cat_km_if_cnt(be->p_info_nthw);
74 }
75 
76 static int get_nb_cat_km_if_m0(void *be_dev)
77 {
78 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
79 	return info_nthw_get_nb_cat_km_if_m0(be->p_info_nthw);
80 }
81 
82 static int get_nb_cat_km_if_m1(void *be_dev)
83 {
84 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
85 	return info_nthw_get_nb_cat_km_if_m1(be->p_info_nthw);
86 }
87 
88 static int get_nb_queues(void *be_dev)
89 {
90 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
91 	return info_nthw_get_nb_queues(be->p_info_nthw);
92 }
93 
94 static int get_nb_km_flow_types(void *be_dev)
95 {
96 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
97 	return info_nthw_get_nb_km_flow_types(be->p_info_nthw);
98 }
99 
100 static int get_nb_pm_ext(void *be_dev)
101 {
102 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
103 	return info_nthw_get_nb_pm_ext(be->p_info_nthw);
104 }
105 
106 static int get_nb_len(void *be_dev)
107 {
108 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
109 	return info_nthw_get_nb_len(be->p_info_nthw);
110 }
111 
112 static int get_kcc_size(void *be_dev)
113 {
114 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
115 	return info_nthw_get_kcc_size(be->p_info_nthw);
116 }
117 
118 static int get_kcc_banks(void *be_dev)
119 {
120 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
121 	return info_nthw_get_kcc_banks(be->p_info_nthw);
122 }
123 
124 static int get_nb_km_categories(void *be_dev)
125 {
126 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
127 	return info_nthw_get_nb_km_categories(be->p_info_nthw);
128 }
129 
130 static int get_nb_km_cam_banks(void *be_dev)
131 {
132 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
133 	return info_nthw_get_nb_km_cam_banks(be->p_info_nthw);
134 }
135 
136 static int get_nb_km_cam_record_words(void *be_dev)
137 {
138 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
139 	return info_nthw_get_nb_km_cam_record_words(be->p_info_nthw);
140 }
141 
142 static int get_nb_km_cam_records(void *be_dev)
143 {
144 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
145 	return info_nthw_get_nb_km_cam_records(be->p_info_nthw);
146 }
147 
148 static int get_nb_km_tcam_banks(void *be_dev)
149 {
150 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
151 	return info_nthw_get_nb_km_tcam_banks(be->p_info_nthw);
152 }
153 
154 static int get_nb_km_tcam_bank_width(void *be_dev)
155 {
156 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
157 	return info_nthw_get_nb_km_tcam_bank_width(be->p_info_nthw);
158 }
159 
160 static int get_nb_flm_categories(void *be_dev)
161 {
162 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
163 	return info_nthw_get_nb_flm_categories(be->p_info_nthw);
164 }
165 
166 static int get_nb_flm_size_mb(void *be_dev)
167 {
168 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
169 	return info_nthw_get_nb_flm_size_mb(be->p_info_nthw);
170 }
171 
172 static int get_nb_flm_entry_size(void *be_dev)
173 {
174 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
175 	return info_nthw_get_nb_flm_entry_size(be->p_info_nthw);
176 }
177 
178 static int get_nb_flm_variant(void *be_dev)
179 {
180 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
181 	return info_nthw_get_nb_flm_variant(be->p_info_nthw);
182 }
183 
184 static int get_nb_flm_prios(void *be_dev)
185 {
186 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
187 	return info_nthw_get_nb_flm_prios(be->p_info_nthw);
188 }
189 
190 static int get_nb_flm_pst_profiles(void *be_dev)
191 {
192 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
193 	return info_nthw_get_nb_flm_pst_profiles(be->p_info_nthw);
194 }
195 
196 static int get_nb_flm_scrub_profiles(void *be_dev)
197 {
198 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
199 	return info_nthw_get_nb_flm_scrub_profiles(be->p_info_nthw);
200 }
201 
202 static int get_nb_flm_load_aps_max(void *be_dev)
203 {
204 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
205 	return info_nthw_get_nb_flm_load_aps_max(be->p_info_nthw);
206 }
207 
208 static int get_nb_qsl_categories(void *be_dev)
209 {
210 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
211 	return info_nthw_get_nb_qsl_categories(be->p_info_nthw);
212 }
213 
214 static int get_nb_qsl_qst_entries(void *be_dev)
215 {
216 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
217 	return info_nthw_get_nb_qsl_qst_entries(be->p_info_nthw);
218 }
219 
220 static int get_nb_pdb_categories(void *be_dev)
221 {
222 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
223 	return info_nthw_get_nb_pdb_categories(be->p_info_nthw);
224 }
225 
226 static int get_nb_roa_categories(void *be_dev)
227 {
228 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
229 	return info_nthw_get_nb_roa_categories(be->p_info_nthw);
230 }
231 
232 static int get_nb_tpe_categories(void *be_dev)
233 {
234 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
235 	return info_nthw_get_nb_tpe_categories(be->p_info_nthw);
236 }
237 
238 static int get_nb_tx_cpy_writers(void *be_dev)
239 {
240 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
241 	return info_nthw_get_nb_tx_cpy_writers(be->p_info_nthw);
242 }
243 
244 static int get_nb_tx_cpy_mask_mem(void *be_dev)
245 {
246 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
247 	return info_nthw_get_nb_tx_cpy_mask_mem(be->p_info_nthw);
248 }
249 
250 static int get_nb_tx_rpl_depth(void *be_dev)
251 {
252 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
253 	return info_nthw_get_nb_tx_rpl_depth(be->p_info_nthw);
254 }
255 
256 static int get_nb_tx_rpl_ext_categories(void *be_dev)
257 {
258 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
259 	return info_nthw_get_nb_tx_rpl_ext_categories(be->p_info_nthw);
260 }
261 
262 static int get_nb_tpe_ifr_categories(void *be_dev)
263 {
264 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
265 	return info_nthw_get_nb_tpe_ifr_categories(be->p_info_nthw);
266 }
267 
268 static int get_nb_rpp_per_ps(void *be_dev)
269 {
270 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
271 	return info_nthw_get_nb_rpp_per_ps(be->p_info_nthw);
272 }
273 
274 static int get_nb_hsh_categories(void *be_dev)
275 {
276 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
277 	return info_nthw_get_nb_hsh_categories(be->p_info_nthw);
278 }
279 
280 static int get_nb_hsh_toeplitz(void *be_dev)
281 {
282 	struct backend_dev_s *be = (struct backend_dev_s *)be_dev;
283 	return info_nthw_get_nb_hsh_toeplitz(be->p_info_nthw);
284 }
285 
286 /*
287  * DBS
288  */
289 
290 static int alloc_rx_queue(void *be_dev, int queue_id)
291 {
292 	(void)be_dev;
293 	(void)queue_id;
294 	NT_LOG(ERR, FILTER, "ERROR alloc Rx queue");
295 	return -1;
296 }
297 
298 static int free_rx_queue(void *be_dev, int hw_queue)
299 {
300 	(void)be_dev;
301 	(void)hw_queue;
302 	NT_LOG(ERR, FILTER, "ERROR free Rx queue");
303 	return 0;
304 }
305 
306 const struct flow_api_backend_ops flow_be_iface = {
307 	1,
308 
309 	set_debug_mode,
310 	get_nb_phy_ports,
311 	get_nb_rx_ports,
312 	get_ltx_avail,
313 	get_nb_cat_funcs,
314 	get_nb_categories,
315 	get_nb_cat_km_if_cnt,
316 	get_nb_cat_km_if_m0,
317 	get_nb_cat_km_if_m1,
318 	get_nb_queues,
319 	get_nb_km_flow_types,
320 	get_nb_pm_ext,
321 	get_nb_len,
322 	get_kcc_size,
323 	get_kcc_banks,
324 	get_nb_km_categories,
325 	get_nb_km_cam_banks,
326 	get_nb_km_cam_record_words,
327 	get_nb_km_cam_records,
328 	get_nb_km_tcam_banks,
329 	get_nb_km_tcam_bank_width,
330 	get_nb_flm_categories,
331 	get_nb_flm_size_mb,
332 	get_nb_flm_entry_size,
333 	get_nb_flm_variant,
334 	get_nb_flm_prios,
335 	get_nb_flm_pst_profiles,
336 	get_nb_flm_scrub_profiles,
337 	get_nb_flm_load_aps_max,
338 	get_nb_qsl_categories,
339 	get_nb_qsl_qst_entries,
340 	get_nb_pdb_categories,
341 	get_nb_roa_categories,
342 	get_nb_tpe_categories,
343 	get_nb_tx_cpy_writers,
344 	get_nb_tx_cpy_mask_mem,
345 	get_nb_tx_rpl_depth,
346 	get_nb_tx_rpl_ext_categories,
347 	get_nb_tpe_ifr_categories,
348 	get_nb_rpp_per_ps,
349 	get_nb_hsh_categories,
350 	get_nb_hsh_toeplitz,
351 
352 	alloc_rx_queue,
353 	free_rx_queue,
354 };
355 
356 const struct flow_api_backend_ops *bin_flow_backend_init(nthw_fpga_t *p_fpga, void **dev)
357 {
358 	uint8_t physical_adapter_no = (uint8_t)p_fpga->p_fpga_info->adapter_no;
359 
360 	struct info_nthw *pinfonthw = info_nthw_new();
361 	info_nthw_init(pinfonthw, p_fpga, physical_adapter_no);
362 	be_devs[physical_adapter_no].p_info_nthw = pinfonthw;
363 
364 	be_devs[physical_adapter_no].adapter_no = physical_adapter_no;
365 	*dev = (void *)&be_devs[physical_adapter_no];
366 
367 	return &flow_be_iface;
368 }
369 
370 static void bin_flow_backend_done(void *dev)
371 {
372 	struct backend_dev_s *be_dev = (struct backend_dev_s *)dev;
373 	info_nthw_delete(be_dev->p_info_nthw);
374 }
375 
376 static const struct flow_backend_ops ops = {
377 	.bin_flow_backend_init = bin_flow_backend_init,
378 	.bin_flow_backend_done = bin_flow_backend_done,
379 };
380 
381 void flow_backend_init(void)
382 {
383 	register_flow_backend_ops(&ops);
384 }
385