xref: /dpdk/drivers/net/ntnic/include/hw_mod_backend.h (revision fbe2726faa592b7ffee79b04083d9c2cc69c77f7)
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 VER_MAJOR(ver) (((ver) >> 16) & 0xffff)
26 #define VER_MINOR(ver) ((ver) & 0xffff)
27 
28 struct flow_api_backend_s;
29 struct common_func_s;
30 
31 void *callocate_mod(struct common_func_s *mod, int sets, ...);
32 void zero_module_cache(struct common_func_s *mod);
33 
34 #define ALL_ENTRIES -1000
35 #define ALL_BANK_ENTRIES -1001
36 
37 #define INDEX_TOO_LARGE (-2)
38 #define INDEX_TOO_LARGE_LOG NT_LOG(INF, FILTER, "ERROR:%s: Index too large", __func__)
39 
40 #define WORD_OFF_TOO_LARGE (-3)
41 #define WORD_OFF_TOO_LARGE_LOG NT_LOG(INF, FILTER, "ERROR:%s: Word offset too large", __func__)
42 
43 #define UNSUP_FIELD (-5)
44 #define UNSUP_FIELD_LOG                                                         \
45 	NT_LOG(INF, FILTER, "ERROR:%s: Unsupported field in NIC module", __func__)
46 
47 #define UNSUP_VER (-4)
48 #define UNSUP_VER_LOG                                                                       \
49 	NT_LOG(INF, FILTER, "ERROR:%s: Unsupported NIC module: %s ver %i.%i", __func__, _MOD_, \
50 		VER_MAJOR(_VER_), VER_MINOR(_VER_))
51 
52 #define COUNT_ERROR (-4)
53 #define COUNT_ERROR_LOG(_RESOURCE_)                                                         \
54 	NT_LOG(INF, FILTER,                                                                      \
55 		"ERROR:%s: Insufficient resource [ %s ] : NIC module: %s ver %i.%i", __func__,  \
56 		#_RESOURCE_, _MOD_, VER_MAJOR(_VER_), VER_MINOR(_VER_))                          \
57 
58 #define NOT_FOUND 0xffffffff
59 
60 enum {
61 	EXTRA_INDEXES
62 };
63 
64 #define GET(cached_val, val) ({ *(val) = *(cached_val); })
65 
66 #define SET(cached_val, val) ({ *(cached_val) = *(val); })
67 
68 #define GET_SET(cached_val, val)                                                                  \
69 	do {                                                                                      \
70 		uint32_t *temp_val = (val);                                                       \
71 		typeof(cached_val) *temp_cached_val = &(cached_val);                          \
72 		if (get)                                                                          \
73 			GET(temp_cached_val, temp_val);                                           \
74 		else                                                                              \
75 			SET(temp_cached_val, temp_val);                                           \
76 	} while (0)
77 
78 #define GET_SIGNED(cached_val, val) ({ *(val) = (uint32_t)(*(cached_val)); })
79 
80 #define SET_SIGNED(cached_val, val) ({ *(cached_val) = (int32_t)(*(val)); })
81 
82 #define GET_SET_SIGNED(cached_val, val)                                                           \
83 	do {                                                                                      \
84 		uint32_t *temp_val = (val);                                                       \
85 		typeof(cached_val) *temp_cached_val = &(cached_val);                          \
86 		if (get)                                                                          \
87 			GET_SIGNED(temp_cached_val, temp_val);                                    \
88 		else                                                                              \
89 			SET_SIGNED(temp_cached_val, temp_val);                                    \
90 	} while (0)
91 
92 #define FIND_EQUAL_INDEX(be_module_reg, type, idx, start, nb_elements)                            \
93 	do {                                                                                      \
94 		typeof(be_module_reg) *temp_be_module =                                       \
95 			(typeof(be_module_reg) *)be_module_reg;                               \
96 		typeof(idx) tmp_idx = (idx);                                                  \
97 		typeof(nb_elements) tmp_nb_elements = (nb_elements);                          \
98 		unsigned int start_idx = (unsigned int)(start);                                   \
99 		*value = NOT_FOUND;                                                               \
100 		for (unsigned int i = start_idx; i < tmp_nb_elements; i++) {                      \
101 			if ((unsigned int)(tmp_idx) == i)                                         \
102 				continue;                                                         \
103 			if (memcmp(&temp_be_module[tmp_idx], &temp_be_module[i], sizeof(type)) == \
104 			    0) {                                                                  \
105 				*value = i;                                                       \
106 				break;                                                            \
107 			}                                                                         \
108 		}                                                                                 \
109 	} while (0)
110 
111 #define DO_COMPARE_INDEXS(be_module_reg, type, idx, cmp_idx)                                      \
112 	do {                                                                                      \
113 		typeof(be_module_reg) *temp_be_module = &(be_module_reg);                     \
114 		typeof(idx) tmp_idx = (idx);                                                  \
115 		typeof(cmp_idx) tmp_cmp_idx = (cmp_idx);                                      \
116 		if ((unsigned int)(tmp_idx) != (unsigned int)(tmp_cmp_idx)) {                     \
117 			(void)memcmp(temp_be_module + tmp_idx, &temp_be_module[tmp_cmp_idx],      \
118 				     sizeof(type));                                               \
119 		}                                                                                 \
120 	} while (0)
121 
122 enum km_flm_if_select_e {
123 	KM_FLM_IF_FIRST = 0,
124 	KM_FLM_IF_SECOND = 1
125 };
126 
127 #define FIELD_START_INDEX 100
128 
129 #define COMMON_FUNC_INFO_S                                                                        \
130 	int ver;                                                                                  \
131 	void *base;                                                                               \
132 	unsigned int alloced_size;                                                                \
133 	int debug
134 
135 struct common_func_s {
136 	COMMON_FUNC_INFO_S;
137 };
138 
139 struct cat_func_s {
140 	COMMON_FUNC_INFO_S;
141 	uint32_t nb_cat_funcs;
142 	uint32_t nb_flow_types;
143 	uint32_t nb_pm_ext;
144 	uint32_t nb_len;
145 	uint32_t kcc_size;
146 	uint32_t cts_num;
147 	uint32_t kcc_banks;
148 	uint32_t kcc_id_bit_size;
149 	uint32_t kcc_records;
150 	uint32_t km_if_count;
151 	int32_t km_if_m0;
152 	int32_t km_if_m1;
153 
154 	union {
155 		struct hw_mod_cat_v18_s v18;
156 		struct hw_mod_cat_v21_s v21;
157 	};
158 };
159 enum hw_cat_e {
160 	/*
161 	 * functions initial CAT v18
162 	 */
163 	/* 00 */ HW_CAT_CFN_SET_ALL_DEFAULTS = 0,
164 	/* 01 */ HW_CAT_CFN_PRESET_ALL,
165 	/* 02 */ HW_CAT_CFN_COMPARE,
166 	/* 03 */ HW_CAT_CFN_FIND,
167 	/* 04 */ HW_CAT_CFN_COPY_FROM,
168 	/* 05 */ HW_CAT_COT_PRESET_ALL,
169 	/* 06 */ HW_CAT_COT_COMPARE,
170 	/* 07 */ HW_CAT_COT_FIND,
171 	/* 08 */ HW_CAT_COT_COPY_FROM,
172 	/* fields */
173 	/* 00 */ HW_CAT_CFN_ENABLE = FIELD_START_INDEX,
174 	/* 01 */ HW_CAT_CFN_INV,
175 	/* 02 */ HW_CAT_CFN_PTC_INV,
176 	/* 03 */ HW_CAT_CFN_PTC_ISL,
177 	/* 04 */ HW_CAT_CFN_PTC_CFP,
178 	/* 05 */ HW_CAT_CFN_PTC_MAC,
179 	/* 06 */ HW_CAT_CFN_PTC_L2,
180 	/* 07 */ HW_CAT_CFN_PTC_VNTAG,
181 	/* 08 */ HW_CAT_CFN_PTC_VLAN,
182 	/* 09 */ HW_CAT_CFN_PTC_MPLS,
183 	/* 10 */ HW_CAT_CFN_PTC_L3,
184 	/* 11 */ HW_CAT_CFN_PTC_FRAG,
185 	/* 12 */ HW_CAT_CFN_PTC_IP_PROT,
186 	/* 13 */ HW_CAT_CFN_PTC_L4,
187 	/* 14 */ HW_CAT_CFN_PTC_TUNNEL,
188 	/* 15 */ HW_CAT_CFN_PTC_TNL_L2,
189 	/* 16 */ HW_CAT_CFN_PTC_TNL_VLAN,
190 	/* 17 */ HW_CAT_CFN_PTC_TNL_MPLS,
191 	/* 18 */ HW_CAT_CFN_PTC_TNL_L3,
192 	/* 19 */ HW_CAT_CFN_PTC_TNL_FRAG,
193 	/* 20 */ HW_CAT_CFN_PTC_TNL_IP_PROT,
194 	/* 21 */ HW_CAT_CFN_PTC_TNL_L4,
195 	/* 22 */ HW_CAT_CFN_ERR_INV,
196 	/* 23 */ HW_CAT_CFN_ERR_CV,
197 	/* 24 */ HW_CAT_CFN_ERR_FCS,
198 	/* 25 */ HW_CAT_CFN_ERR_TRUNC,
199 	/* 26 */ HW_CAT_CFN_ERR_L3_CS,
200 	/* 27 */ HW_CAT_CFN_ERR_L4_CS,
201 	/* 28 */ HW_CAT_CFN_MAC_PORT,
202 	/* 29 */ HW_CAT_CFN_PM_CMP,
203 	/* 30 */ HW_CAT_CFN_PM_DCT,
204 	/* 31 */ HW_CAT_CFN_PM_EXT_INV,
205 	/* 32 */ HW_CAT_CFN_PM_CMB,
206 	/* 33 */ HW_CAT_CFN_PM_AND_INV,
207 	/* 34 */ HW_CAT_CFN_PM_OR_INV,
208 	/* 35 */ HW_CAT_CFN_PM_INV,
209 	/* 36 */ HW_CAT_CFN_LC,
210 	/* 37 */ HW_CAT_CFN_LC_INV,
211 	/* 38 */ HW_CAT_CFN_KM0_OR,
212 	/* 39 */ HW_CAT_CFN_KM1_OR,
213 	/* 40 */ HW_CAT_KCE_ENABLE_BM,
214 	/* 41 */ HW_CAT_KCS_CATEGORY,
215 	/* 42 */ HW_CAT_FTE_ENABLE_BM,
216 	/* 43 */ HW_CAT_CTE_ENABLE_BM,
217 	/* 44 */ HW_CAT_CTS_CAT_A,
218 	/* 45 */ HW_CAT_CTS_CAT_B,
219 	/* 46 */ HW_CAT_COT_COLOR,
220 	/* 47 */ HW_CAT_COT_KM,
221 	/* 48 */ HW_CAT_CCT_COLOR,
222 	/* 49 */ HW_CAT_CCT_KM,
223 	/* 50 */ HW_CAT_KCC_KEY,
224 	/* 51 */ HW_CAT_KCC_CATEGORY,
225 	/* 52 */ HW_CAT_KCC_ID,
226 	/* 53 */ HW_CAT_EXO_DYN,
227 	/* 54 */ HW_CAT_EXO_OFS,
228 	/* 55 */ HW_CAT_RCK_DATA,
229 	/* 56 */ HW_CAT_LEN_LOWER,
230 	/* 57 */ HW_CAT_LEN_UPPER,
231 	/* 58 */ HW_CAT_LEN_DYN1,
232 	/* 59 */ HW_CAT_LEN_DYN2,
233 	/* 60 */ HW_CAT_LEN_INV,
234 	/* 61 */ HW_CAT_CFN_ERR_TNL_L3_CS,
235 	/* 62 */ HW_CAT_CFN_ERR_TNL_L4_CS,
236 	/* 63 */ HW_CAT_CFN_ERR_TTL_EXP,
237 	/* 64 */ HW_CAT_CFN_ERR_TNL_TTL_EXP,
238 };
239 
240 bool hw_mod_cat_present(struct flow_api_backend_s *be);
241 int hw_mod_cat_alloc(struct flow_api_backend_s *be);
242 void hw_mod_cat_free(struct flow_api_backend_s *be);
243 int hw_mod_cat_reset(struct flow_api_backend_s *be);
244 int hw_mod_cat_cfn_flush(struct flow_api_backend_s *be, int start_idx, int count);
245 int hw_mod_cat_cfn_set(struct flow_api_backend_s *be, enum hw_cat_e field, int index, int word_off,
246 	uint32_t value);
247 
248 int hw_mod_cat_cte_flush(struct flow_api_backend_s *be, int start_idx, int count);
249 int hw_mod_cat_cts_flush(struct flow_api_backend_s *be, int start_idx, int count);
250 int hw_mod_cat_cot_flush(struct flow_api_backend_s *be, int start_idx, int count);
251 int hw_mod_cat_cct_flush(struct flow_api_backend_s *be, int start_idx, int count);
252 int hw_mod_cat_kcc_flush(struct flow_api_backend_s *be, int start_idx, int count);
253 
254 int hw_mod_cat_exo_flush(struct flow_api_backend_s *be, int start_idx, int count);
255 int hw_mod_cat_rck_flush(struct flow_api_backend_s *be, int start_idx, int count);
256 int hw_mod_cat_len_flush(struct flow_api_backend_s *be, int start_idx, int count);
257 
258 struct km_func_s {
259 	COMMON_FUNC_INFO_S;
260 	uint32_t nb_categories;
261 	uint32_t nb_cam_banks;
262 	uint32_t nb_cam_record_words;
263 	uint32_t nb_cam_records;
264 	uint32_t nb_tcam_banks;
265 	uint32_t nb_tcam_bank_width;
266 	/* not read from backend, but rather set using version */
267 	uint32_t nb_km_rcp_mask_a_word_size;
268 	/* --- || --- */
269 	uint32_t nb_km_rcp_mask_b_word_size;
270 	union {
271 		struct hw_mod_km_v7_s v7;
272 	};
273 };
274 enum hw_km_e {
275 	/* functions */
276 	HW_KM_RCP_PRESET_ALL = 0,
277 	HW_KM_CAM_PRESET_ALL,
278 	/* to sync and reset hw with cache - force write all entries in a bank */
279 	HW_KM_TCAM_BANK_RESET,
280 	/* fields */
281 	HW_KM_RCP_QW0_DYN = FIELD_START_INDEX,
282 	HW_KM_RCP_QW0_OFS,
283 	HW_KM_RCP_QW0_SEL_A,
284 	HW_KM_RCP_QW0_SEL_B,
285 	HW_KM_RCP_QW4_DYN,
286 	HW_KM_RCP_QW4_OFS,
287 	HW_KM_RCP_QW4_SEL_A,
288 	HW_KM_RCP_QW4_SEL_B,
289 	HW_KM_RCP_DW8_DYN,
290 	HW_KM_RCP_DW8_OFS,
291 	HW_KM_RCP_DW8_SEL_A,
292 	HW_KM_RCP_DW8_SEL_B,
293 	HW_KM_RCP_DW10_DYN,
294 	HW_KM_RCP_DW10_OFS,
295 	HW_KM_RCP_DW10_SEL_A,
296 	HW_KM_RCP_DW10_SEL_B,
297 	HW_KM_RCP_SWX_CCH,
298 	HW_KM_RCP_SWX_SEL_A,
299 	HW_KM_RCP_SWX_SEL_B,
300 	HW_KM_RCP_MASK_A,
301 	HW_KM_RCP_MASK_B,
302 	HW_KM_RCP_DUAL,
303 	HW_KM_RCP_PAIRED,
304 	HW_KM_RCP_EL_A,
305 	HW_KM_RCP_EL_B,
306 	HW_KM_RCP_INFO_A,
307 	HW_KM_RCP_INFO_B,
308 	HW_KM_RCP_FTM_A,
309 	HW_KM_RCP_FTM_B,
310 	HW_KM_RCP_BANK_A,
311 	HW_KM_RCP_BANK_B,
312 	HW_KM_RCP_KL_A,
313 	HW_KM_RCP_KL_B,
314 	HW_KM_RCP_KEYWAY_A,
315 	HW_KM_RCP_KEYWAY_B,
316 	HW_KM_RCP_SYNERGY_MODE,
317 	HW_KM_RCP_DW0_B_DYN,
318 	HW_KM_RCP_DW0_B_OFS,
319 	HW_KM_RCP_DW2_B_DYN,
320 	HW_KM_RCP_DW2_B_OFS,
321 	HW_KM_RCP_SW4_B_DYN,
322 	HW_KM_RCP_SW4_B_OFS,
323 	HW_KM_RCP_SW5_B_DYN,
324 	HW_KM_RCP_SW5_B_OFS,
325 	HW_KM_CAM_W0,
326 	HW_KM_CAM_W1,
327 	HW_KM_CAM_W2,
328 	HW_KM_CAM_W3,
329 	HW_KM_CAM_W4,
330 	HW_KM_CAM_W5,
331 	HW_KM_CAM_FT0,
332 	HW_KM_CAM_FT1,
333 	HW_KM_CAM_FT2,
334 	HW_KM_CAM_FT3,
335 	HW_KM_CAM_FT4,
336 	HW_KM_CAM_FT5,
337 	HW_KM_TCAM_T,
338 	HW_KM_TCI_COLOR,
339 	HW_KM_TCI_FT,
340 	HW_KM_TCQ_BANK_MASK,
341 	HW_KM_TCQ_QUAL
342 };
343 bool hw_mod_km_present(struct flow_api_backend_s *be);
344 int hw_mod_km_alloc(struct flow_api_backend_s *be);
345 void hw_mod_km_free(struct flow_api_backend_s *be);
346 int hw_mod_km_reset(struct flow_api_backend_s *be);
347 int hw_mod_km_rcp_flush(struct flow_api_backend_s *be, int start_idx, int count);
348 int hw_mod_km_cam_flush(struct flow_api_backend_s *be, int start_bank, int start_record,
349 	int count);
350 int hw_mod_km_tcam_flush(struct flow_api_backend_s *be, int start_bank, int count);
351 int hw_mod_km_tcam_set(struct flow_api_backend_s *be, enum hw_km_e field, int bank, int byte,
352 	int byte_val, uint32_t *value_set);
353 int hw_mod_km_tci_flush(struct flow_api_backend_s *be, int start_bank, int start_record,
354 	int count);
355 int hw_mod_km_tcq_flush(struct flow_api_backend_s *be, int start_bank, int start_record,
356 	int count);
357 
358 struct flm_func_s {
359 	COMMON_FUNC_INFO_S;
360 	uint32_t nb_categories;
361 	uint32_t nb_size_mb;
362 	uint32_t nb_entry_size;
363 	uint32_t nb_variant;
364 	uint32_t nb_prios;
365 	uint32_t nb_pst_profiles;
366 	uint32_t nb_scrub_profiles;
367 	uint32_t nb_rpp_clock_in_ps;
368 	uint32_t nb_load_aps_max;
369 	union {
370 		struct hw_mod_flm_v25_s v25;
371 	};
372 };
373 
374 struct hsh_func_s {
375 	COMMON_FUNC_INFO_S;
376 	uint32_t nb_rcp;/* number of HSH recipes supported by FPGA */
377 	/* indication if Toeplitz is supported by FPGA, i.e. 0 - unsupported, 1 - supported */
378 	uint32_t toeplitz;
379 	union {
380 		struct hw_mod_hsh_v5_s v5;
381 	};
382 };
383 
384 struct qsl_func_s {
385 	COMMON_FUNC_INFO_S;
386 	uint32_t nb_rcp_categories;
387 	uint32_t nb_qst_entries;
388 	union {
389 		struct hw_mod_qsl_v7_s v7;
390 	};
391 };
392 
393 struct slc_lr_func_s {
394 	COMMON_FUNC_INFO_S;
395 	union {
396 		struct hw_mod_slc_lr_v2_s v2;
397 	};
398 };
399 
400 struct pdb_func_s {
401 	COMMON_FUNC_INFO_S;
402 	uint32_t nb_pdb_rcp_categories;
403 
404 	union {
405 		struct hw_mod_pdb_v9_s v9;
406 	};
407 };
408 
409 struct tpe_func_s {
410 	COMMON_FUNC_INFO_S;
411 	uint32_t nb_rcp_categories;
412 	uint32_t nb_ifr_categories;
413 	uint32_t nb_cpy_writers;
414 	uint32_t nb_rpl_depth;
415 	uint32_t nb_rpl_ext_categories;
416 	union {
417 		struct hw_mod_tpe_v3_s v3;
418 	};
419 };
420 
421 enum debug_mode_e {
422 	FLOW_BACKEND_DEBUG_MODE_NONE = 0x0000,
423 	FLOW_BACKEND_DEBUG_MODE_WRITE = 0x0001
424 };
425 
426 struct flow_api_backend_ops {
427 	int version;
428 	int (*set_debug_mode)(void *dev, enum debug_mode_e mode);
429 	int (*get_nb_phy_port)(void *dev);
430 	int (*get_nb_rx_port)(void *dev);
431 	int (*get_ltx_avail)(void *dev);
432 	int (*get_nb_cat_funcs)(void *dev);
433 	int (*get_nb_categories)(void *dev);
434 	int (*get_nb_cat_km_if_cnt)(void *dev);
435 	int (*get_nb_cat_km_if_m0)(void *dev);
436 	int (*get_nb_cat_km_if_m1)(void *dev);
437 
438 	int (*get_nb_queues)(void *dev);
439 	int (*get_nb_km_flow_types)(void *dev);
440 	int (*get_nb_pm_ext)(void *dev);
441 	int (*get_nb_len)(void *dev);
442 	int (*get_kcc_size)(void *dev);
443 	int (*get_kcc_banks)(void *dev);
444 	int (*get_nb_km_categories)(void *dev);
445 	int (*get_nb_km_cam_banks)(void *dev);
446 	int (*get_nb_km_cam_record_words)(void *dev);
447 	int (*get_nb_km_cam_records)(void *dev);
448 	int (*get_nb_km_tcam_banks)(void *dev);
449 	int (*get_nb_km_tcam_bank_width)(void *dev);
450 	int (*get_nb_flm_categories)(void *dev);
451 	int (*get_nb_flm_size_mb)(void *dev);
452 	int (*get_nb_flm_entry_size)(void *dev);
453 	int (*get_nb_flm_variant)(void *dev);
454 	int (*get_nb_flm_prios)(void *dev);
455 	int (*get_nb_flm_pst_profiles)(void *dev);
456 	int (*get_nb_flm_scrub_profiles)(void *dev);
457 	int (*get_nb_flm_load_aps_max)(void *dev);
458 	int (*get_nb_qsl_categories)(void *dev);
459 	int (*get_nb_qsl_qst_entries)(void *dev);
460 	int (*get_nb_pdb_categories)(void *dev);
461 	int (*get_nb_roa_categories)(void *dev);
462 	int (*get_nb_tpe_categories)(void *dev);
463 	int (*get_nb_tx_cpy_writers)(void *dev);
464 	int (*get_nb_tx_cpy_mask_mem)(void *dev);
465 	int (*get_nb_tx_rpl_depth)(void *dev);
466 	int (*get_nb_tx_rpl_ext_categories)(void *dev);
467 	int (*get_nb_tpe_ifr_categories)(void *dev);
468 	int (*get_nb_rpp_per_ps)(void *dev);
469 	int (*get_nb_hsh_categories)(void *dev);
470 	int (*get_nb_hsh_toeplitz)(void *dev);
471 
472 	int (*alloc_rx_queue)(void *dev, int queue_id);
473 	int (*free_rx_queue)(void *dev, int hw_queue);
474 
475 	/* CAT */
476 	bool (*get_cat_present)(void *dev);
477 	uint32_t (*get_cat_version)(void *dev);
478 	int (*cat_cfn_flush)(void *dev, const struct cat_func_s *cat, int cat_func, int cnt);
479 	int (*cat_kce_flush)(void *dev, const struct cat_func_s *cat, int km_if_idx, int index,
480 		int cnt);
481 	int (*cat_kcs_flush)(void *dev, const struct cat_func_s *cat, int km_if_idx, int cat_func,
482 		int cnt);
483 	int (*cat_fte_flush)(void *dev, const struct cat_func_s *cat, int km_if_idx, int index,
484 		int cnt);
485 	int (*cat_cte_flush)(void *dev, const struct cat_func_s *cat, int cat_func, int cnt);
486 	int (*cat_cts_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt);
487 	int (*cat_cot_flush)(void *dev, const struct cat_func_s *cat, int cat_func, int cnt);
488 	int (*cat_cct_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt);
489 	int (*cat_exo_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt);
490 	int (*cat_rck_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt);
491 	int (*cat_len_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt);
492 	int (*cat_kcc_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt);
493 
494 	/* KM */
495 	bool (*get_km_present)(void *dev);
496 	uint32_t (*get_km_version)(void *dev);
497 	int (*km_rcp_flush)(void *dev, const struct km_func_s *km, int category, int cnt);
498 	int (*km_cam_flush)(void *dev, const struct km_func_s *km, int bank, int record, int cnt);
499 	int (*km_tcam_flush)(void *dev, const struct km_func_s *km, int bank, int byte, int value,
500 		int cnt);
501 	int (*km_tci_flush)(void *dev, const struct km_func_s *km, int bank, int record, int cnt);
502 	int (*km_tcq_flush)(void *dev, const struct km_func_s *km, int bank, int record, int cnt);
503 
504 	/* FLM */
505 	bool (*get_flm_present)(void *dev);
506 	uint32_t (*get_flm_version)(void *dev);
507 	int (*flm_control_flush)(void *dev, const struct flm_func_s *flm);
508 	int (*flm_status_flush)(void *dev, const struct flm_func_s *flm);
509 	int (*flm_status_update)(void *dev, const struct flm_func_s *flm);
510 	int (*flm_scan_flush)(void *dev, const struct flm_func_s *flm);
511 	int (*flm_load_bin_flush)(void *dev, const struct flm_func_s *flm);
512 	int (*flm_prio_flush)(void *dev, const struct flm_func_s *flm);
513 	int (*flm_pst_flush)(void *dev, const struct flm_func_s *flm, int index, int cnt);
514 	int (*flm_rcp_flush)(void *dev, const struct flm_func_s *flm, int index, int cnt);
515 	int (*flm_scrub_flush)(void *dev, const struct flm_func_s *flm, int index, int cnt);
516 	int (*flm_buf_ctrl_update)(void *dev, const struct flm_func_s *flm);
517 	int (*flm_stat_update)(void *dev, const struct flm_func_s *flm);
518 	int (*flm_lrn_data_flush)(void *be_dev, const struct flm_func_s *flm,
519 		const uint32_t *lrn_data, uint32_t records,
520 		uint32_t *handled_records, uint32_t words_per_record,
521 		uint32_t *inf_word_cnt, uint32_t *sta_word_cnt);
522 	int (*flm_inf_sta_data_update)(void *be_dev, const struct flm_func_s *flm,
523 		uint32_t *inf_data, uint32_t inf_size,
524 		uint32_t *inf_word_cnt, uint32_t *sta_data,
525 		uint32_t sta_size, uint32_t *sta_word_cnt);
526 
527 	/* HSH */
528 	bool (*get_hsh_present)(void *dev);
529 	uint32_t (*get_hsh_version)(void *dev);
530 	int (*hsh_rcp_flush)(void *dev, const struct hsh_func_s *hsh, int category, int cnt);
531 
532 	/* QSL */
533 	bool (*get_qsl_present)(void *dev);
534 	uint32_t (*get_qsl_version)(void *dev);
535 	int (*qsl_rcp_flush)(void *dev, const struct qsl_func_s *qsl, int category, int cnt);
536 	int (*qsl_qst_flush)(void *dev, const struct qsl_func_s *qsl, int entry, int cnt);
537 	int (*qsl_qen_flush)(void *dev, const struct qsl_func_s *qsl, int entry, int cnt);
538 	int (*qsl_unmq_flush)(void *dev, const struct qsl_func_s *qsl, int entry, int cnt);
539 
540 	/* SLC LR */
541 	bool (*get_slc_lr_present)(void *dev);
542 	uint32_t (*get_slc_lr_version)(void *dev);
543 	int (*slc_lr_rcp_flush)(void *dev, const struct slc_lr_func_s *slc_lr, int category,
544 		int cnt);
545 
546 	/* PDB */
547 	bool (*get_pdb_present)(void *dev);
548 	uint32_t (*get_pdb_version)(void *dev);
549 	int (*pdb_rcp_flush)(void *dev, const struct pdb_func_s *pdb, int category, int cnt);
550 	int (*pdb_config_flush)(void *dev, const struct pdb_func_s *pdb);
551 
552 	/* TPE */
553 	bool (*get_tpe_present)(void *dev);
554 	uint32_t (*get_tpe_version)(void *dev);
555 	int (*tpe_rpp_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
556 	int (*tpe_rpp_ifr_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
557 	int (*tpe_ifr_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
558 	int (*tpe_ins_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
559 	int (*tpe_rpl_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
560 	int (*tpe_rpl_ext_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
561 	int (*tpe_rpl_rpl_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
562 	int (*tpe_cpy_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
563 	int (*tpe_hfu_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
564 	int (*tpe_csu_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
565 };
566 
567 struct flow_api_backend_s {
568 	void *be_dev;
569 	const struct flow_api_backend_ops *iface;
570 
571 	/* flow filter FPGA modules */
572 	struct cat_func_s cat;
573 	struct km_func_s km;
574 
575 	/* NIC attributes */
576 	unsigned int num_phy_ports;
577 	unsigned int num_rx_ports;
578 
579 	/* flow filter resource capacities */
580 	unsigned int max_categories;
581 	unsigned int max_queues;
582 };
583 
584 int flow_api_backend_init(struct flow_api_backend_s *dev, const struct flow_api_backend_ops *iface,
585 	void *be_dev);
586 int flow_api_backend_done(struct flow_api_backend_s *dev);
587 
588 #endif  /* _HW_MOD_BACKEND_H_ */
589