xref: /dpdk/drivers/net/ntnic/include/hw_mod_backend.h (revision 059dfc39e94dd5482f3b07faee60ead36401a43b)
18df4a5f8SOleksandr Kolomeiets /*
28df4a5f8SOleksandr Kolomeiets  * SPDX-License-Identifier: BSD-3-Clause
38df4a5f8SOleksandr Kolomeiets  * Copyright(c) 2023 Napatech A/S
48df4a5f8SOleksandr Kolomeiets  */
58df4a5f8SOleksandr Kolomeiets 
68df4a5f8SOleksandr Kolomeiets #ifndef _HW_MOD_BACKEND_H_
78df4a5f8SOleksandr Kolomeiets #define _HW_MOD_BACKEND_H_
88df4a5f8SOleksandr Kolomeiets 
9636b2cfeSOleksandr Kolomeiets #include <stdbool.h>
10636b2cfeSOleksandr Kolomeiets 
111d3f62a0SOleksandr Kolomeiets #include "ntlog.h"
121d3f62a0SOleksandr Kolomeiets 
13636b2cfeSOleksandr Kolomeiets #include "hw_mod_cat_v18.h"
14636b2cfeSOleksandr Kolomeiets #include "hw_mod_cat_v21.h"
15cec43fabSOleksandr Kolomeiets #include "hw_mod_flm_v25.h"
163005c75dSOleksandr Kolomeiets #include "hw_mod_km_v7.h"
17b95f1cd0SOleksandr Kolomeiets #include "hw_mod_qsl_v7.h"
187d65ee1aSOleksandr Kolomeiets #include "hw_mod_pdb_v9.h"
198c545325SOleksandr Kolomeiets #include "hw_mod_slc_lr_v2.h"
20a5a5d5bbSOleksandr Kolomeiets #include "hw_mod_hsh_v5.h"
217f058028SSerhii Iliushyk #include "hw_mod_tpe_v3.h"
22636b2cfeSOleksandr Kolomeiets 
23e3723ca6SOleksandr Kolomeiets #define MAX_PHYS_ADAPTERS 8
24e3723ca6SOleksandr Kolomeiets 
256e8b7f11SOleksandr Kolomeiets #define VER_MAJOR(ver) (((ver) >> 16) & 0xffff)
266e8b7f11SOleksandr Kolomeiets #define VER_MINOR(ver) ((ver) & 0xffff)
276e8b7f11SOleksandr Kolomeiets 
286e8b7f11SOleksandr Kolomeiets struct flow_api_backend_s;
296e8b7f11SOleksandr Kolomeiets struct common_func_s;
306e8b7f11SOleksandr Kolomeiets 
316e8b7f11SOleksandr Kolomeiets void *callocate_mod(struct common_func_s *mod, int sets, ...);
326e8b7f11SOleksandr Kolomeiets void zero_module_cache(struct common_func_s *mod);
336e8b7f11SOleksandr Kolomeiets 
346e8b7f11SOleksandr Kolomeiets #define ALL_ENTRIES -1000
35fbe2726fSOleksandr Kolomeiets #define ALL_BANK_ENTRIES -1001
366e8b7f11SOleksandr Kolomeiets 
376e8b7f11SOleksandr Kolomeiets #define INDEX_TOO_LARGE (-2)
386e8b7f11SOleksandr Kolomeiets #define INDEX_TOO_LARGE_LOG NT_LOG(INF, FILTER, "ERROR:%s: Index too large", __func__)
396e8b7f11SOleksandr Kolomeiets 
406e8b7f11SOleksandr Kolomeiets #define WORD_OFF_TOO_LARGE (-3)
416e8b7f11SOleksandr Kolomeiets #define WORD_OFF_TOO_LARGE_LOG NT_LOG(INF, FILTER, "ERROR:%s: Word offset too large", __func__)
426e8b7f11SOleksandr Kolomeiets 
436e8b7f11SOleksandr Kolomeiets #define UNSUP_FIELD (-5)
446e8b7f11SOleksandr Kolomeiets #define UNSUP_FIELD_LOG                                                         \
456e8b7f11SOleksandr Kolomeiets 	NT_LOG(INF, FILTER, "ERROR:%s: Unsupported field in NIC module", __func__)
466e8b7f11SOleksandr Kolomeiets 
476e8b7f11SOleksandr Kolomeiets #define UNSUP_VER (-4)
486e8b7f11SOleksandr Kolomeiets #define UNSUP_VER_LOG                                                                       \
496e8b7f11SOleksandr Kolomeiets 	NT_LOG(INF, FILTER, "ERROR:%s: Unsupported NIC module: %s ver %i.%i", __func__, _MOD_, \
506e8b7f11SOleksandr Kolomeiets 		VER_MAJOR(_VER_), VER_MINOR(_VER_))
516e8b7f11SOleksandr Kolomeiets 
526e8b7f11SOleksandr Kolomeiets #define COUNT_ERROR (-4)
536e8b7f11SOleksandr Kolomeiets #define COUNT_ERROR_LOG(_RESOURCE_)                                                         \
546e8b7f11SOleksandr Kolomeiets 	NT_LOG(INF, FILTER,                                                                      \
556e8b7f11SOleksandr Kolomeiets 		"ERROR:%s: Insufficient resource [ %s ] : NIC module: %s ver %i.%i", __func__,  \
566e8b7f11SOleksandr Kolomeiets 		#_RESOURCE_, _MOD_, VER_MAJOR(_VER_), VER_MINOR(_VER_))                          \
576e8b7f11SOleksandr Kolomeiets 
586e8b7f11SOleksandr Kolomeiets #define NOT_FOUND 0xffffffff
596e8b7f11SOleksandr Kolomeiets 
606e8b7f11SOleksandr Kolomeiets enum {
616e8b7f11SOleksandr Kolomeiets 	EXTRA_INDEXES
626e8b7f11SOleksandr Kolomeiets };
636e8b7f11SOleksandr Kolomeiets 
646e8b7f11SOleksandr Kolomeiets #define GET(cached_val, val) ({ *(val) = *(cached_val); })
656e8b7f11SOleksandr Kolomeiets 
666e8b7f11SOleksandr Kolomeiets #define SET(cached_val, val) ({ *(cached_val) = *(val); })
676e8b7f11SOleksandr Kolomeiets 
686e8b7f11SOleksandr Kolomeiets #define GET_SET(cached_val, val)                                                                  \
696e8b7f11SOleksandr Kolomeiets 	do {                                                                                      \
706e8b7f11SOleksandr Kolomeiets 		uint32_t *temp_val = (val);                                                       \
716e8b7f11SOleksandr Kolomeiets 		typeof(cached_val) *temp_cached_val = &(cached_val);                          \
726e8b7f11SOleksandr Kolomeiets 		if (get)                                                                          \
736e8b7f11SOleksandr Kolomeiets 			GET(temp_cached_val, temp_val);                                           \
746e8b7f11SOleksandr Kolomeiets 		else                                                                              \
756e8b7f11SOleksandr Kolomeiets 			SET(temp_cached_val, temp_val);                                           \
766e8b7f11SOleksandr Kolomeiets 	} while (0)
776e8b7f11SOleksandr Kolomeiets 
786e8b7f11SOleksandr Kolomeiets #define GET_SIGNED(cached_val, val) ({ *(val) = (uint32_t)(*(cached_val)); })
796e8b7f11SOleksandr Kolomeiets 
806e8b7f11SOleksandr Kolomeiets #define SET_SIGNED(cached_val, val) ({ *(cached_val) = (int32_t)(*(val)); })
816e8b7f11SOleksandr Kolomeiets 
826e8b7f11SOleksandr Kolomeiets #define GET_SET_SIGNED(cached_val, val)                                                           \
836e8b7f11SOleksandr Kolomeiets 	do {                                                                                      \
846e8b7f11SOleksandr Kolomeiets 		uint32_t *temp_val = (val);                                                       \
856e8b7f11SOleksandr Kolomeiets 		typeof(cached_val) *temp_cached_val = &(cached_val);                          \
866e8b7f11SOleksandr Kolomeiets 		if (get)                                                                          \
876e8b7f11SOleksandr Kolomeiets 			GET_SIGNED(temp_cached_val, temp_val);                                    \
886e8b7f11SOleksandr Kolomeiets 		else                                                                              \
896e8b7f11SOleksandr Kolomeiets 			SET_SIGNED(temp_cached_val, temp_val);                                    \
906e8b7f11SOleksandr Kolomeiets 	} while (0)
916e8b7f11SOleksandr Kolomeiets 
926e8b7f11SOleksandr Kolomeiets #define FIND_EQUAL_INDEX(be_module_reg, type, idx, start, nb_elements)                            \
936e8b7f11SOleksandr Kolomeiets 	do {                                                                                      \
946e8b7f11SOleksandr Kolomeiets 		typeof(be_module_reg) *temp_be_module =                                       \
956e8b7f11SOleksandr Kolomeiets 			(typeof(be_module_reg) *)be_module_reg;                               \
966e8b7f11SOleksandr Kolomeiets 		typeof(idx) tmp_idx = (idx);                                                  \
976e8b7f11SOleksandr Kolomeiets 		typeof(nb_elements) tmp_nb_elements = (nb_elements);                          \
986e8b7f11SOleksandr Kolomeiets 		unsigned int start_idx = (unsigned int)(start);                                   \
996e8b7f11SOleksandr Kolomeiets 		*value = NOT_FOUND;                                                               \
1006e8b7f11SOleksandr Kolomeiets 		for (unsigned int i = start_idx; i < tmp_nb_elements; i++) {                      \
1016e8b7f11SOleksandr Kolomeiets 			if ((unsigned int)(tmp_idx) == i)                                         \
1026e8b7f11SOleksandr Kolomeiets 				continue;                                                         \
1036e8b7f11SOleksandr Kolomeiets 			if (memcmp(&temp_be_module[tmp_idx], &temp_be_module[i], sizeof(type)) == \
1046e8b7f11SOleksandr Kolomeiets 			    0) {                                                                  \
1056e8b7f11SOleksandr Kolomeiets 				*value = i;                                                       \
1066e8b7f11SOleksandr Kolomeiets 				break;                                                            \
1076e8b7f11SOleksandr Kolomeiets 			}                                                                         \
1086e8b7f11SOleksandr Kolomeiets 		}                                                                                 \
1096e8b7f11SOleksandr Kolomeiets 	} while (0)
1106e8b7f11SOleksandr Kolomeiets 
1116e8b7f11SOleksandr Kolomeiets #define DO_COMPARE_INDEXS(be_module_reg, type, idx, cmp_idx)                                      \
1126e8b7f11SOleksandr Kolomeiets 	do {                                                                                      \
1136e8b7f11SOleksandr Kolomeiets 		typeof(be_module_reg) *temp_be_module = &(be_module_reg);                     \
1146e8b7f11SOleksandr Kolomeiets 		typeof(idx) tmp_idx = (idx);                                                  \
1156e8b7f11SOleksandr Kolomeiets 		typeof(cmp_idx) tmp_cmp_idx = (cmp_idx);                                      \
1166e8b7f11SOleksandr Kolomeiets 		if ((unsigned int)(tmp_idx) != (unsigned int)(tmp_cmp_idx)) {                     \
1176e8b7f11SOleksandr Kolomeiets 			(void)memcmp(temp_be_module + tmp_idx, &temp_be_module[tmp_cmp_idx],      \
1186e8b7f11SOleksandr Kolomeiets 				     sizeof(type));                                               \
1196e8b7f11SOleksandr Kolomeiets 		}                                                                                 \
1206e8b7f11SOleksandr Kolomeiets 	} while (0)
1216e8b7f11SOleksandr Kolomeiets 
1226e8b7f11SOleksandr Kolomeiets enum km_flm_if_select_e {
1236e8b7f11SOleksandr Kolomeiets 	KM_FLM_IF_FIRST = 0,
1246e8b7f11SOleksandr Kolomeiets 	KM_FLM_IF_SECOND = 1
1256e8b7f11SOleksandr Kolomeiets };
1266e8b7f11SOleksandr Kolomeiets 
1276e8b7f11SOleksandr Kolomeiets #define FIELD_START_INDEX 100
1286e8b7f11SOleksandr Kolomeiets 
129636b2cfeSOleksandr Kolomeiets #define COMMON_FUNC_INFO_S                                                                        \
130636b2cfeSOleksandr Kolomeiets 	int ver;                                                                                  \
131636b2cfeSOleksandr Kolomeiets 	void *base;                                                                               \
132636b2cfeSOleksandr Kolomeiets 	unsigned int alloced_size;                                                                \
133636b2cfeSOleksandr Kolomeiets 	int debug
134636b2cfeSOleksandr Kolomeiets 
1356e8b7f11SOleksandr Kolomeiets struct common_func_s {
1366e8b7f11SOleksandr Kolomeiets 	COMMON_FUNC_INFO_S;
1376e8b7f11SOleksandr Kolomeiets };
1386e8b7f11SOleksandr Kolomeiets 
139636b2cfeSOleksandr Kolomeiets struct cat_func_s {
140636b2cfeSOleksandr Kolomeiets 	COMMON_FUNC_INFO_S;
141636b2cfeSOleksandr Kolomeiets 	uint32_t nb_cat_funcs;
142636b2cfeSOleksandr Kolomeiets 	uint32_t nb_flow_types;
143636b2cfeSOleksandr Kolomeiets 	uint32_t nb_pm_ext;
144636b2cfeSOleksandr Kolomeiets 	uint32_t nb_len;
145636b2cfeSOleksandr Kolomeiets 	uint32_t kcc_size;
146636b2cfeSOleksandr Kolomeiets 	uint32_t cts_num;
147636b2cfeSOleksandr Kolomeiets 	uint32_t kcc_banks;
148636b2cfeSOleksandr Kolomeiets 	uint32_t kcc_id_bit_size;
149636b2cfeSOleksandr Kolomeiets 	uint32_t kcc_records;
150636b2cfeSOleksandr Kolomeiets 	uint32_t km_if_count;
151636b2cfeSOleksandr Kolomeiets 	int32_t km_if_m0;
152636b2cfeSOleksandr Kolomeiets 	int32_t km_if_m1;
153636b2cfeSOleksandr Kolomeiets 
154636b2cfeSOleksandr Kolomeiets 	union {
155636b2cfeSOleksandr Kolomeiets 		struct hw_mod_cat_v18_s v18;
156636b2cfeSOleksandr Kolomeiets 		struct hw_mod_cat_v21_s v21;
157636b2cfeSOleksandr Kolomeiets 	};
158636b2cfeSOleksandr Kolomeiets };
1596e8b7f11SOleksandr Kolomeiets enum hw_cat_e {
1606e8b7f11SOleksandr Kolomeiets 	/*
1616e8b7f11SOleksandr Kolomeiets 	 * functions initial CAT v18
1626e8b7f11SOleksandr Kolomeiets 	 */
1636e8b7f11SOleksandr Kolomeiets 	/* 00 */ HW_CAT_CFN_SET_ALL_DEFAULTS = 0,
1646e8b7f11SOleksandr Kolomeiets 	/* 01 */ HW_CAT_CFN_PRESET_ALL,
1656e8b7f11SOleksandr Kolomeiets 	/* 02 */ HW_CAT_CFN_COMPARE,
1666e8b7f11SOleksandr Kolomeiets 	/* 03 */ HW_CAT_CFN_FIND,
1676e8b7f11SOleksandr Kolomeiets 	/* 04 */ HW_CAT_CFN_COPY_FROM,
1686e8b7f11SOleksandr Kolomeiets 	/* 05 */ HW_CAT_COT_PRESET_ALL,
1696e8b7f11SOleksandr Kolomeiets 	/* 06 */ HW_CAT_COT_COMPARE,
1706e8b7f11SOleksandr Kolomeiets 	/* 07 */ HW_CAT_COT_FIND,
1716e8b7f11SOleksandr Kolomeiets 	/* 08 */ HW_CAT_COT_COPY_FROM,
1726e8b7f11SOleksandr Kolomeiets 	/* fields */
1736e8b7f11SOleksandr Kolomeiets 	/* 00 */ HW_CAT_CFN_ENABLE = FIELD_START_INDEX,
1746e8b7f11SOleksandr Kolomeiets 	/* 01 */ HW_CAT_CFN_INV,
1756e8b7f11SOleksandr Kolomeiets 	/* 02 */ HW_CAT_CFN_PTC_INV,
1766e8b7f11SOleksandr Kolomeiets 	/* 03 */ HW_CAT_CFN_PTC_ISL,
1776e8b7f11SOleksandr Kolomeiets 	/* 04 */ HW_CAT_CFN_PTC_CFP,
1786e8b7f11SOleksandr Kolomeiets 	/* 05 */ HW_CAT_CFN_PTC_MAC,
1796e8b7f11SOleksandr Kolomeiets 	/* 06 */ HW_CAT_CFN_PTC_L2,
1806e8b7f11SOleksandr Kolomeiets 	/* 07 */ HW_CAT_CFN_PTC_VNTAG,
1816e8b7f11SOleksandr Kolomeiets 	/* 08 */ HW_CAT_CFN_PTC_VLAN,
1826e8b7f11SOleksandr Kolomeiets 	/* 09 */ HW_CAT_CFN_PTC_MPLS,
1836e8b7f11SOleksandr Kolomeiets 	/* 10 */ HW_CAT_CFN_PTC_L3,
1846e8b7f11SOleksandr Kolomeiets 	/* 11 */ HW_CAT_CFN_PTC_FRAG,
1856e8b7f11SOleksandr Kolomeiets 	/* 12 */ HW_CAT_CFN_PTC_IP_PROT,
1866e8b7f11SOleksandr Kolomeiets 	/* 13 */ HW_CAT_CFN_PTC_L4,
1876e8b7f11SOleksandr Kolomeiets 	/* 14 */ HW_CAT_CFN_PTC_TUNNEL,
1886e8b7f11SOleksandr Kolomeiets 	/* 15 */ HW_CAT_CFN_PTC_TNL_L2,
1896e8b7f11SOleksandr Kolomeiets 	/* 16 */ HW_CAT_CFN_PTC_TNL_VLAN,
1906e8b7f11SOleksandr Kolomeiets 	/* 17 */ HW_CAT_CFN_PTC_TNL_MPLS,
1916e8b7f11SOleksandr Kolomeiets 	/* 18 */ HW_CAT_CFN_PTC_TNL_L3,
1926e8b7f11SOleksandr Kolomeiets 	/* 19 */ HW_CAT_CFN_PTC_TNL_FRAG,
1936e8b7f11SOleksandr Kolomeiets 	/* 20 */ HW_CAT_CFN_PTC_TNL_IP_PROT,
1946e8b7f11SOleksandr Kolomeiets 	/* 21 */ HW_CAT_CFN_PTC_TNL_L4,
1956e8b7f11SOleksandr Kolomeiets 	/* 22 */ HW_CAT_CFN_ERR_INV,
1966e8b7f11SOleksandr Kolomeiets 	/* 23 */ HW_CAT_CFN_ERR_CV,
1976e8b7f11SOleksandr Kolomeiets 	/* 24 */ HW_CAT_CFN_ERR_FCS,
1986e8b7f11SOleksandr Kolomeiets 	/* 25 */ HW_CAT_CFN_ERR_TRUNC,
1996e8b7f11SOleksandr Kolomeiets 	/* 26 */ HW_CAT_CFN_ERR_L3_CS,
2006e8b7f11SOleksandr Kolomeiets 	/* 27 */ HW_CAT_CFN_ERR_L4_CS,
2016e8b7f11SOleksandr Kolomeiets 	/* 28 */ HW_CAT_CFN_MAC_PORT,
2026e8b7f11SOleksandr Kolomeiets 	/* 29 */ HW_CAT_CFN_PM_CMP,
2036e8b7f11SOleksandr Kolomeiets 	/* 30 */ HW_CAT_CFN_PM_DCT,
2046e8b7f11SOleksandr Kolomeiets 	/* 31 */ HW_CAT_CFN_PM_EXT_INV,
2056e8b7f11SOleksandr Kolomeiets 	/* 32 */ HW_CAT_CFN_PM_CMB,
2066e8b7f11SOleksandr Kolomeiets 	/* 33 */ HW_CAT_CFN_PM_AND_INV,
2076e8b7f11SOleksandr Kolomeiets 	/* 34 */ HW_CAT_CFN_PM_OR_INV,
2086e8b7f11SOleksandr Kolomeiets 	/* 35 */ HW_CAT_CFN_PM_INV,
2096e8b7f11SOleksandr Kolomeiets 	/* 36 */ HW_CAT_CFN_LC,
2106e8b7f11SOleksandr Kolomeiets 	/* 37 */ HW_CAT_CFN_LC_INV,
2116e8b7f11SOleksandr Kolomeiets 	/* 38 */ HW_CAT_CFN_KM0_OR,
2126e8b7f11SOleksandr Kolomeiets 	/* 39 */ HW_CAT_CFN_KM1_OR,
2136e8b7f11SOleksandr Kolomeiets 	/* 40 */ HW_CAT_KCE_ENABLE_BM,
2146e8b7f11SOleksandr Kolomeiets 	/* 41 */ HW_CAT_KCS_CATEGORY,
2156e8b7f11SOleksandr Kolomeiets 	/* 42 */ HW_CAT_FTE_ENABLE_BM,
2166e8b7f11SOleksandr Kolomeiets 	/* 43 */ HW_CAT_CTE_ENABLE_BM,
2176e8b7f11SOleksandr Kolomeiets 	/* 44 */ HW_CAT_CTS_CAT_A,
2186e8b7f11SOleksandr Kolomeiets 	/* 45 */ HW_CAT_CTS_CAT_B,
2196e8b7f11SOleksandr Kolomeiets 	/* 46 */ HW_CAT_COT_COLOR,
2206e8b7f11SOleksandr Kolomeiets 	/* 47 */ HW_CAT_COT_KM,
2216e8b7f11SOleksandr Kolomeiets 	/* 48 */ HW_CAT_CCT_COLOR,
2226e8b7f11SOleksandr Kolomeiets 	/* 49 */ HW_CAT_CCT_KM,
2236e8b7f11SOleksandr Kolomeiets 	/* 50 */ HW_CAT_KCC_KEY,
2246e8b7f11SOleksandr Kolomeiets 	/* 51 */ HW_CAT_KCC_CATEGORY,
2256e8b7f11SOleksandr Kolomeiets 	/* 52 */ HW_CAT_KCC_ID,
2266e8b7f11SOleksandr Kolomeiets 	/* 53 */ HW_CAT_EXO_DYN,
2276e8b7f11SOleksandr Kolomeiets 	/* 54 */ HW_CAT_EXO_OFS,
2286e8b7f11SOleksandr Kolomeiets 	/* 55 */ HW_CAT_RCK_DATA,
2296e8b7f11SOleksandr Kolomeiets 	/* 56 */ HW_CAT_LEN_LOWER,
2306e8b7f11SOleksandr Kolomeiets 	/* 57 */ HW_CAT_LEN_UPPER,
2316e8b7f11SOleksandr Kolomeiets 	/* 58 */ HW_CAT_LEN_DYN1,
2326e8b7f11SOleksandr Kolomeiets 	/* 59 */ HW_CAT_LEN_DYN2,
2336e8b7f11SOleksandr Kolomeiets 	/* 60 */ HW_CAT_LEN_INV,
2346e8b7f11SOleksandr Kolomeiets 	/* 61 */ HW_CAT_CFN_ERR_TNL_L3_CS,
2356e8b7f11SOleksandr Kolomeiets 	/* 62 */ HW_CAT_CFN_ERR_TNL_L4_CS,
2366e8b7f11SOleksandr Kolomeiets 	/* 63 */ HW_CAT_CFN_ERR_TTL_EXP,
2376e8b7f11SOleksandr Kolomeiets 	/* 64 */ HW_CAT_CFN_ERR_TNL_TTL_EXP,
2386e8b7f11SOleksandr Kolomeiets };
2396e8b7f11SOleksandr Kolomeiets 
2406e8b7f11SOleksandr Kolomeiets bool hw_mod_cat_present(struct flow_api_backend_s *be);
2416e8b7f11SOleksandr Kolomeiets int hw_mod_cat_alloc(struct flow_api_backend_s *be);
2426e8b7f11SOleksandr Kolomeiets void hw_mod_cat_free(struct flow_api_backend_s *be);
2436e8b7f11SOleksandr Kolomeiets int hw_mod_cat_reset(struct flow_api_backend_s *be);
2446e8b7f11SOleksandr Kolomeiets int hw_mod_cat_cfn_flush(struct flow_api_backend_s *be, int start_idx, int count);
2456e8b7f11SOleksandr Kolomeiets int hw_mod_cat_cfn_set(struct flow_api_backend_s *be, enum hw_cat_e field, int index, int word_off,
2466e8b7f11SOleksandr Kolomeiets 	uint32_t value);
2476e8b7f11SOleksandr Kolomeiets 
2486e8b7f11SOleksandr Kolomeiets int hw_mod_cat_cte_flush(struct flow_api_backend_s *be, int start_idx, int count);
2496e8b7f11SOleksandr Kolomeiets int hw_mod_cat_cts_flush(struct flow_api_backend_s *be, int start_idx, int count);
2506e8b7f11SOleksandr Kolomeiets int hw_mod_cat_cot_flush(struct flow_api_backend_s *be, int start_idx, int count);
2516e8b7f11SOleksandr Kolomeiets int hw_mod_cat_cct_flush(struct flow_api_backend_s *be, int start_idx, int count);
2526e8b7f11SOleksandr Kolomeiets int hw_mod_cat_kcc_flush(struct flow_api_backend_s *be, int start_idx, int count);
2536e8b7f11SOleksandr Kolomeiets 
2546e8b7f11SOleksandr Kolomeiets int hw_mod_cat_exo_flush(struct flow_api_backend_s *be, int start_idx, int count);
2556e8b7f11SOleksandr Kolomeiets int hw_mod_cat_rck_flush(struct flow_api_backend_s *be, int start_idx, int count);
2566e8b7f11SOleksandr Kolomeiets int hw_mod_cat_len_flush(struct flow_api_backend_s *be, int start_idx, int count);
257636b2cfeSOleksandr Kolomeiets 
2583005c75dSOleksandr Kolomeiets struct km_func_s {
2593005c75dSOleksandr Kolomeiets 	COMMON_FUNC_INFO_S;
2603005c75dSOleksandr Kolomeiets 	uint32_t nb_categories;
2613005c75dSOleksandr Kolomeiets 	uint32_t nb_cam_banks;
2623005c75dSOleksandr Kolomeiets 	uint32_t nb_cam_record_words;
2633005c75dSOleksandr Kolomeiets 	uint32_t nb_cam_records;
2643005c75dSOleksandr Kolomeiets 	uint32_t nb_tcam_banks;
2653005c75dSOleksandr Kolomeiets 	uint32_t nb_tcam_bank_width;
2663005c75dSOleksandr Kolomeiets 	/* not read from backend, but rather set using version */
2673005c75dSOleksandr Kolomeiets 	uint32_t nb_km_rcp_mask_a_word_size;
2683005c75dSOleksandr Kolomeiets 	/* --- || --- */
2693005c75dSOleksandr Kolomeiets 	uint32_t nb_km_rcp_mask_b_word_size;
2703005c75dSOleksandr Kolomeiets 	union {
2713005c75dSOleksandr Kolomeiets 		struct hw_mod_km_v7_s v7;
2723005c75dSOleksandr Kolomeiets 	};
2733005c75dSOleksandr Kolomeiets };
274fbe2726fSOleksandr Kolomeiets enum hw_km_e {
275fbe2726fSOleksandr Kolomeiets 	/* functions */
276fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_PRESET_ALL = 0,
277fbe2726fSOleksandr Kolomeiets 	HW_KM_CAM_PRESET_ALL,
278fbe2726fSOleksandr Kolomeiets 	/* to sync and reset hw with cache - force write all entries in a bank */
279fbe2726fSOleksandr Kolomeiets 	HW_KM_TCAM_BANK_RESET,
280fbe2726fSOleksandr Kolomeiets 	/* fields */
281fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_QW0_DYN = FIELD_START_INDEX,
282fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_QW0_OFS,
283fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_QW0_SEL_A,
284fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_QW0_SEL_B,
285fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_QW4_DYN,
286fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_QW4_OFS,
287fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_QW4_SEL_A,
288fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_QW4_SEL_B,
289fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_DW8_DYN,
290fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_DW8_OFS,
291fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_DW8_SEL_A,
292fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_DW8_SEL_B,
293fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_DW10_DYN,
294fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_DW10_OFS,
295fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_DW10_SEL_A,
296fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_DW10_SEL_B,
297fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_SWX_CCH,
298fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_SWX_SEL_A,
299fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_SWX_SEL_B,
300fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_MASK_A,
301fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_MASK_B,
302fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_DUAL,
303fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_PAIRED,
304fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_EL_A,
305fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_EL_B,
306fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_INFO_A,
307fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_INFO_B,
308fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_FTM_A,
309fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_FTM_B,
310fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_BANK_A,
311fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_BANK_B,
312fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_KL_A,
313fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_KL_B,
314fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_KEYWAY_A,
315fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_KEYWAY_B,
316fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_SYNERGY_MODE,
317fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_DW0_B_DYN,
318fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_DW0_B_OFS,
319fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_DW2_B_DYN,
320fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_DW2_B_OFS,
321fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_SW4_B_DYN,
322fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_SW4_B_OFS,
323fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_SW5_B_DYN,
324fbe2726fSOleksandr Kolomeiets 	HW_KM_RCP_SW5_B_OFS,
325fbe2726fSOleksandr Kolomeiets 	HW_KM_CAM_W0,
326fbe2726fSOleksandr Kolomeiets 	HW_KM_CAM_W1,
327fbe2726fSOleksandr Kolomeiets 	HW_KM_CAM_W2,
328fbe2726fSOleksandr Kolomeiets 	HW_KM_CAM_W3,
329fbe2726fSOleksandr Kolomeiets 	HW_KM_CAM_W4,
330fbe2726fSOleksandr Kolomeiets 	HW_KM_CAM_W5,
331fbe2726fSOleksandr Kolomeiets 	HW_KM_CAM_FT0,
332fbe2726fSOleksandr Kolomeiets 	HW_KM_CAM_FT1,
333fbe2726fSOleksandr Kolomeiets 	HW_KM_CAM_FT2,
334fbe2726fSOleksandr Kolomeiets 	HW_KM_CAM_FT3,
335fbe2726fSOleksandr Kolomeiets 	HW_KM_CAM_FT4,
336fbe2726fSOleksandr Kolomeiets 	HW_KM_CAM_FT5,
337fbe2726fSOleksandr Kolomeiets 	HW_KM_TCAM_T,
338fbe2726fSOleksandr Kolomeiets 	HW_KM_TCI_COLOR,
339fbe2726fSOleksandr Kolomeiets 	HW_KM_TCI_FT,
340fbe2726fSOleksandr Kolomeiets 	HW_KM_TCQ_BANK_MASK,
341fbe2726fSOleksandr Kolomeiets 	HW_KM_TCQ_QUAL
342fbe2726fSOleksandr Kolomeiets };
343fbe2726fSOleksandr Kolomeiets bool hw_mod_km_present(struct flow_api_backend_s *be);
344fbe2726fSOleksandr Kolomeiets int hw_mod_km_alloc(struct flow_api_backend_s *be);
345fbe2726fSOleksandr Kolomeiets void hw_mod_km_free(struct flow_api_backend_s *be);
346fbe2726fSOleksandr Kolomeiets int hw_mod_km_reset(struct flow_api_backend_s *be);
347fbe2726fSOleksandr Kolomeiets int hw_mod_km_rcp_flush(struct flow_api_backend_s *be, int start_idx, int count);
348fbe2726fSOleksandr Kolomeiets int hw_mod_km_cam_flush(struct flow_api_backend_s *be, int start_bank, int start_record,
349fbe2726fSOleksandr Kolomeiets 	int count);
350fbe2726fSOleksandr Kolomeiets int hw_mod_km_tcam_flush(struct flow_api_backend_s *be, int start_bank, int count);
351fbe2726fSOleksandr Kolomeiets int hw_mod_km_tcam_set(struct flow_api_backend_s *be, enum hw_km_e field, int bank, int byte,
352fbe2726fSOleksandr Kolomeiets 	int byte_val, uint32_t *value_set);
353fbe2726fSOleksandr Kolomeiets int hw_mod_km_tci_flush(struct flow_api_backend_s *be, int start_bank, int start_record,
354fbe2726fSOleksandr Kolomeiets 	int count);
355fbe2726fSOleksandr Kolomeiets int hw_mod_km_tcq_flush(struct flow_api_backend_s *be, int start_bank, int start_record,
356fbe2726fSOleksandr Kolomeiets 	int count);
3573005c75dSOleksandr Kolomeiets 
358cec43fabSOleksandr Kolomeiets struct flm_func_s {
359cec43fabSOleksandr Kolomeiets 	COMMON_FUNC_INFO_S;
360cec43fabSOleksandr Kolomeiets 	uint32_t nb_categories;
361cec43fabSOleksandr Kolomeiets 	uint32_t nb_size_mb;
362cec43fabSOleksandr Kolomeiets 	uint32_t nb_entry_size;
363cec43fabSOleksandr Kolomeiets 	uint32_t nb_variant;
364cec43fabSOleksandr Kolomeiets 	uint32_t nb_prios;
365cec43fabSOleksandr Kolomeiets 	uint32_t nb_pst_profiles;
366cec43fabSOleksandr Kolomeiets 	uint32_t nb_scrub_profiles;
367cec43fabSOleksandr Kolomeiets 	uint32_t nb_rpp_clock_in_ps;
368cec43fabSOleksandr Kolomeiets 	uint32_t nb_load_aps_max;
369cec43fabSOleksandr Kolomeiets 	union {
370cec43fabSOleksandr Kolomeiets 		struct hw_mod_flm_v25_s v25;
371cec43fabSOleksandr Kolomeiets 	};
372cec43fabSOleksandr Kolomeiets };
373*059dfc39SOleksandr Kolomeiets enum hw_flm_e {
374*059dfc39SOleksandr Kolomeiets 	/* functions */
375*059dfc39SOleksandr Kolomeiets 	HW_FLM_CONTROL_PRESET_ALL = 0,
376*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_PRESET_ALL,
377*059dfc39SOleksandr Kolomeiets 	HW_FLM_FLOW_LRN_DATA,
378*059dfc39SOleksandr Kolomeiets 	HW_FLM_FLOW_INF_STA_DATA,
379*059dfc39SOleksandr Kolomeiets 	/* Control fields */
380*059dfc39SOleksandr Kolomeiets 	HW_FLM_CONTROL_ENABLE = FIELD_START_INDEX,
381*059dfc39SOleksandr Kolomeiets 	HW_FLM_CONTROL_INIT,
382*059dfc39SOleksandr Kolomeiets 	HW_FLM_CONTROL_LDS,
383*059dfc39SOleksandr Kolomeiets 	HW_FLM_CONTROL_LFS,
384*059dfc39SOleksandr Kolomeiets 	HW_FLM_CONTROL_LIS,
385*059dfc39SOleksandr Kolomeiets 	HW_FLM_CONTROL_UDS,
386*059dfc39SOleksandr Kolomeiets 	HW_FLM_CONTROL_UIS,
387*059dfc39SOleksandr Kolomeiets 	HW_FLM_CONTROL_RDS,
388*059dfc39SOleksandr Kolomeiets 	HW_FLM_CONTROL_RIS,
389*059dfc39SOleksandr Kolomeiets 	HW_FLM_CONTROL_PDS,
390*059dfc39SOleksandr Kolomeiets 	HW_FLM_CONTROL_PIS,
391*059dfc39SOleksandr Kolomeiets 	HW_FLM_CONTROL_CRCWR,
392*059dfc39SOleksandr Kolomeiets 	HW_FLM_CONTROL_CRCRD,
393*059dfc39SOleksandr Kolomeiets 	HW_FLM_CONTROL_RBL,
394*059dfc39SOleksandr Kolomeiets 	HW_FLM_CONTROL_EAB,
395*059dfc39SOleksandr Kolomeiets 	HW_FLM_CONTROL_SPLIT_SDRAM_USAGE,
396*059dfc39SOleksandr Kolomeiets 	HW_FLM_STATUS_CALIB_SUCCESS,
397*059dfc39SOleksandr Kolomeiets 	HW_FLM_STATUS_CALIB_FAIL,
398*059dfc39SOleksandr Kolomeiets 	HW_FLM_STATUS_INITDONE,
399*059dfc39SOleksandr Kolomeiets 	HW_FLM_STATUS_IDLE,
400*059dfc39SOleksandr Kolomeiets 	HW_FLM_STATUS_CRITICAL,
401*059dfc39SOleksandr Kolomeiets 	HW_FLM_STATUS_PANIC,
402*059dfc39SOleksandr Kolomeiets 	HW_FLM_STATUS_CRCERR,
403*059dfc39SOleksandr Kolomeiets 	HW_FLM_STATUS_EFT_BP,
404*059dfc39SOleksandr Kolomeiets 	HW_FLM_STATUS_CACHE_BUFFER_CRITICAL,
405*059dfc39SOleksandr Kolomeiets 	HW_FLM_LOAD_BIN,
406*059dfc39SOleksandr Kolomeiets 	HW_FLM_LOAD_LPS,
407*059dfc39SOleksandr Kolomeiets 	HW_FLM_LOAD_APS,
408*059dfc39SOleksandr Kolomeiets 	HW_FLM_PRIO_LIMIT0,
409*059dfc39SOleksandr Kolomeiets 	HW_FLM_PRIO_FT0,
410*059dfc39SOleksandr Kolomeiets 	HW_FLM_PRIO_LIMIT1,
411*059dfc39SOleksandr Kolomeiets 	HW_FLM_PRIO_FT1,
412*059dfc39SOleksandr Kolomeiets 	HW_FLM_PRIO_LIMIT2,
413*059dfc39SOleksandr Kolomeiets 	HW_FLM_PRIO_FT2,
414*059dfc39SOleksandr Kolomeiets 	HW_FLM_PRIO_LIMIT3,
415*059dfc39SOleksandr Kolomeiets 	HW_FLM_PRIO_FT3,
416*059dfc39SOleksandr Kolomeiets 	HW_FLM_PST_PRESET_ALL,
417*059dfc39SOleksandr Kolomeiets 	HW_FLM_PST_BP,
418*059dfc39SOleksandr Kolomeiets 	HW_FLM_PST_PP,
419*059dfc39SOleksandr Kolomeiets 	HW_FLM_PST_TP,
420*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_LOOKUP,
421*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_QW0_DYN,
422*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_QW0_OFS,
423*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_QW0_SEL,
424*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_QW4_DYN,
425*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_QW4_OFS,
426*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_SW8_DYN,
427*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_SW8_OFS,
428*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_SW8_SEL,
429*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_SW9_DYN,
430*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_SW9_OFS,
431*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_MASK,
432*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_KID,
433*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_OPN,
434*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_IPN,
435*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_BYT_DYN,
436*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_BYT_OFS,
437*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_TXPLM,
438*059dfc39SOleksandr Kolomeiets 	HW_FLM_RCP_AUTO_IPV4_MASK,
439*059dfc39SOleksandr Kolomeiets 	HW_FLM_BUF_CTRL_LRN_FREE,
440*059dfc39SOleksandr Kolomeiets 	HW_FLM_BUF_CTRL_INF_AVAIL,
441*059dfc39SOleksandr Kolomeiets 	HW_FLM_BUF_CTRL_STA_AVAIL,
442*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_LRN_DONE,
443*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_LRN_IGNORE,
444*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_LRN_FAIL,
445*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_UNL_DONE,
446*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_UNL_IGNORE,
447*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_REL_DONE,
448*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_REL_IGNORE,
449*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_PRB_DONE,
450*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_PRB_IGNORE,
451*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_AUL_DONE,
452*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_AUL_IGNORE,
453*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_AUL_FAIL,
454*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_TUL_DONE,
455*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_FLOWS,
456*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_STA_DONE,	/* module ver 0.20 */
457*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_INF_DONE,	/* module ver 0.20 */
458*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_INF_SKIP,	/* module ver 0.20 */
459*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_PCK_HIT,	/* module ver 0.20 */
460*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_PCK_MISS,	/* module ver 0.20 */
461*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_PCK_UNH,	/* module ver 0.20 */
462*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_PCK_DIS,	/* module ver 0.20 */
463*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_CSH_HIT,	/* module ver 0.20 */
464*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_CSH_MISS,	/* module ver 0.20 */
465*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_CSH_UNH,	/* module ver 0.20 */
466*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_CUC_START,	/* module ver 0.20 */
467*059dfc39SOleksandr Kolomeiets 	HW_FLM_STAT_CUC_MOVE,	/* module ver 0.20 */
468*059dfc39SOleksandr Kolomeiets 	HW_FLM_SCAN_I,	/* module ver 0.22 */
469*059dfc39SOleksandr Kolomeiets 	HW_FLM_SCRUB_PRESET_ALL,
470*059dfc39SOleksandr Kolomeiets 	HW_FLM_SCRUB_T,	/* module ver 0.22 */
471*059dfc39SOleksandr Kolomeiets 	HW_FLM_SCRUB_R,	/* module ver 0.24 */
472*059dfc39SOleksandr Kolomeiets 	HW_FLM_SCRUB_DEL,	/* module ver 0.24 */
473*059dfc39SOleksandr Kolomeiets 	HW_FLM_SCRUB_INF,	/* module ver 0.24 */
474*059dfc39SOleksandr Kolomeiets };
475*059dfc39SOleksandr Kolomeiets 
476*059dfc39SOleksandr Kolomeiets bool hw_mod_flm_present(struct flow_api_backend_s *be);
477*059dfc39SOleksandr Kolomeiets int hw_mod_flm_alloc(struct flow_api_backend_s *be);
478*059dfc39SOleksandr Kolomeiets void hw_mod_flm_free(struct flow_api_backend_s *be);
479*059dfc39SOleksandr Kolomeiets int hw_mod_flm_reset(struct flow_api_backend_s *be);
480*059dfc39SOleksandr Kolomeiets 
481*059dfc39SOleksandr Kolomeiets int hw_mod_flm_control_flush(struct flow_api_backend_s *be);
482*059dfc39SOleksandr Kolomeiets int hw_mod_flm_control_set(struct flow_api_backend_s *be, enum hw_flm_e field, uint32_t value);
483*059dfc39SOleksandr Kolomeiets 
484*059dfc39SOleksandr Kolomeiets int hw_mod_flm_scan_flush(struct flow_api_backend_s *be);
485*059dfc39SOleksandr Kolomeiets 
486*059dfc39SOleksandr Kolomeiets int hw_mod_flm_rcp_flush(struct flow_api_backend_s *be, int start_idx, int count);
487*059dfc39SOleksandr Kolomeiets 
488*059dfc39SOleksandr Kolomeiets int hw_mod_flm_scrub_flush(struct flow_api_backend_s *be, int start_idx, int count);
489cec43fabSOleksandr Kolomeiets 
490a5a5d5bbSOleksandr Kolomeiets struct hsh_func_s {
491a5a5d5bbSOleksandr Kolomeiets 	COMMON_FUNC_INFO_S;
492a5a5d5bbSOleksandr Kolomeiets 	uint32_t nb_rcp;/* number of HSH recipes supported by FPGA */
493a5a5d5bbSOleksandr Kolomeiets 	/* indication if Toeplitz is supported by FPGA, i.e. 0 - unsupported, 1 - supported */
494a5a5d5bbSOleksandr Kolomeiets 	uint32_t toeplitz;
495a5a5d5bbSOleksandr Kolomeiets 	union {
496a5a5d5bbSOleksandr Kolomeiets 		struct hw_mod_hsh_v5_s v5;
497a5a5d5bbSOleksandr Kolomeiets 	};
498a5a5d5bbSOleksandr Kolomeiets };
499a5a5d5bbSOleksandr Kolomeiets 
500b95f1cd0SOleksandr Kolomeiets struct qsl_func_s {
501b95f1cd0SOleksandr Kolomeiets 	COMMON_FUNC_INFO_S;
502b95f1cd0SOleksandr Kolomeiets 	uint32_t nb_rcp_categories;
503b95f1cd0SOleksandr Kolomeiets 	uint32_t nb_qst_entries;
504b95f1cd0SOleksandr Kolomeiets 	union {
505b95f1cd0SOleksandr Kolomeiets 		struct hw_mod_qsl_v7_s v7;
506b95f1cd0SOleksandr Kolomeiets 	};
507b95f1cd0SOleksandr Kolomeiets };
508b95f1cd0SOleksandr Kolomeiets 
5098c545325SOleksandr Kolomeiets struct slc_lr_func_s {
5108c545325SOleksandr Kolomeiets 	COMMON_FUNC_INFO_S;
5118c545325SOleksandr Kolomeiets 	union {
5128c545325SOleksandr Kolomeiets 		struct hw_mod_slc_lr_v2_s v2;
5138c545325SOleksandr Kolomeiets 	};
5148c545325SOleksandr Kolomeiets };
5158c545325SOleksandr Kolomeiets 
5167d65ee1aSOleksandr Kolomeiets struct pdb_func_s {
5177d65ee1aSOleksandr Kolomeiets 	COMMON_FUNC_INFO_S;
5187d65ee1aSOleksandr Kolomeiets 	uint32_t nb_pdb_rcp_categories;
5197d65ee1aSOleksandr Kolomeiets 
5207d65ee1aSOleksandr Kolomeiets 	union {
5217d65ee1aSOleksandr Kolomeiets 		struct hw_mod_pdb_v9_s v9;
5227d65ee1aSOleksandr Kolomeiets 	};
5237d65ee1aSOleksandr Kolomeiets };
5247d65ee1aSOleksandr Kolomeiets 
5257f058028SSerhii Iliushyk struct tpe_func_s {
5267f058028SSerhii Iliushyk 	COMMON_FUNC_INFO_S;
5277f058028SSerhii Iliushyk 	uint32_t nb_rcp_categories;
5287f058028SSerhii Iliushyk 	uint32_t nb_ifr_categories;
5297f058028SSerhii Iliushyk 	uint32_t nb_cpy_writers;
5307f058028SSerhii Iliushyk 	uint32_t nb_rpl_depth;
5317f058028SSerhii Iliushyk 	uint32_t nb_rpl_ext_categories;
5327f058028SSerhii Iliushyk 	union {
5337f058028SSerhii Iliushyk 		struct hw_mod_tpe_v3_s v3;
5347f058028SSerhii Iliushyk 	};
5357f058028SSerhii Iliushyk };
5367f058028SSerhii Iliushyk 
537e3723ca6SOleksandr Kolomeiets enum debug_mode_e {
538e3723ca6SOleksandr Kolomeiets 	FLOW_BACKEND_DEBUG_MODE_NONE = 0x0000,
539e3723ca6SOleksandr Kolomeiets 	FLOW_BACKEND_DEBUG_MODE_WRITE = 0x0001
540e3723ca6SOleksandr Kolomeiets };
541e3723ca6SOleksandr Kolomeiets 
542e3723ca6SOleksandr Kolomeiets struct flow_api_backend_ops {
543e3723ca6SOleksandr Kolomeiets 	int version;
544e3723ca6SOleksandr Kolomeiets 	int (*set_debug_mode)(void *dev, enum debug_mode_e mode);
545e3723ca6SOleksandr Kolomeiets 	int (*get_nb_phy_port)(void *dev);
546e3723ca6SOleksandr Kolomeiets 	int (*get_nb_rx_port)(void *dev);
547e3723ca6SOleksandr Kolomeiets 	int (*get_ltx_avail)(void *dev);
548e3723ca6SOleksandr Kolomeiets 	int (*get_nb_cat_funcs)(void *dev);
549e3723ca6SOleksandr Kolomeiets 	int (*get_nb_categories)(void *dev);
550e3723ca6SOleksandr Kolomeiets 	int (*get_nb_cat_km_if_cnt)(void *dev);
551e3723ca6SOleksandr Kolomeiets 	int (*get_nb_cat_km_if_m0)(void *dev);
552e3723ca6SOleksandr Kolomeiets 	int (*get_nb_cat_km_if_m1)(void *dev);
553e3723ca6SOleksandr Kolomeiets 
554e3723ca6SOleksandr Kolomeiets 	int (*get_nb_queues)(void *dev);
555e3723ca6SOleksandr Kolomeiets 	int (*get_nb_km_flow_types)(void *dev);
556e3723ca6SOleksandr Kolomeiets 	int (*get_nb_pm_ext)(void *dev);
557e3723ca6SOleksandr Kolomeiets 	int (*get_nb_len)(void *dev);
558e3723ca6SOleksandr Kolomeiets 	int (*get_kcc_size)(void *dev);
559e3723ca6SOleksandr Kolomeiets 	int (*get_kcc_banks)(void *dev);
560e3723ca6SOleksandr Kolomeiets 	int (*get_nb_km_categories)(void *dev);
561e3723ca6SOleksandr Kolomeiets 	int (*get_nb_km_cam_banks)(void *dev);
562e3723ca6SOleksandr Kolomeiets 	int (*get_nb_km_cam_record_words)(void *dev);
563e3723ca6SOleksandr Kolomeiets 	int (*get_nb_km_cam_records)(void *dev);
564e3723ca6SOleksandr Kolomeiets 	int (*get_nb_km_tcam_banks)(void *dev);
565e3723ca6SOleksandr Kolomeiets 	int (*get_nb_km_tcam_bank_width)(void *dev);
566e3723ca6SOleksandr Kolomeiets 	int (*get_nb_flm_categories)(void *dev);
567e3723ca6SOleksandr Kolomeiets 	int (*get_nb_flm_size_mb)(void *dev);
568e3723ca6SOleksandr Kolomeiets 	int (*get_nb_flm_entry_size)(void *dev);
569e3723ca6SOleksandr Kolomeiets 	int (*get_nb_flm_variant)(void *dev);
570e3723ca6SOleksandr Kolomeiets 	int (*get_nb_flm_prios)(void *dev);
571e3723ca6SOleksandr Kolomeiets 	int (*get_nb_flm_pst_profiles)(void *dev);
572e3723ca6SOleksandr Kolomeiets 	int (*get_nb_flm_scrub_profiles)(void *dev);
573e3723ca6SOleksandr Kolomeiets 	int (*get_nb_flm_load_aps_max)(void *dev);
574e3723ca6SOleksandr Kolomeiets 	int (*get_nb_qsl_categories)(void *dev);
575e3723ca6SOleksandr Kolomeiets 	int (*get_nb_qsl_qst_entries)(void *dev);
576e3723ca6SOleksandr Kolomeiets 	int (*get_nb_pdb_categories)(void *dev);
577e3723ca6SOleksandr Kolomeiets 	int (*get_nb_roa_categories)(void *dev);
578e3723ca6SOleksandr Kolomeiets 	int (*get_nb_tpe_categories)(void *dev);
579e3723ca6SOleksandr Kolomeiets 	int (*get_nb_tx_cpy_writers)(void *dev);
580e3723ca6SOleksandr Kolomeiets 	int (*get_nb_tx_cpy_mask_mem)(void *dev);
581e3723ca6SOleksandr Kolomeiets 	int (*get_nb_tx_rpl_depth)(void *dev);
582e3723ca6SOleksandr Kolomeiets 	int (*get_nb_tx_rpl_ext_categories)(void *dev);
583e3723ca6SOleksandr Kolomeiets 	int (*get_nb_tpe_ifr_categories)(void *dev);
584e3723ca6SOleksandr Kolomeiets 	int (*get_nb_rpp_per_ps)(void *dev);
585e3723ca6SOleksandr Kolomeiets 	int (*get_nb_hsh_categories)(void *dev);
586e3723ca6SOleksandr Kolomeiets 	int (*get_nb_hsh_toeplitz)(void *dev);
587e3723ca6SOleksandr Kolomeiets 
588e3723ca6SOleksandr Kolomeiets 	int (*alloc_rx_queue)(void *dev, int queue_id);
589e3723ca6SOleksandr Kolomeiets 	int (*free_rx_queue)(void *dev, int hw_queue);
590636b2cfeSOleksandr Kolomeiets 
591636b2cfeSOleksandr Kolomeiets 	/* CAT */
592636b2cfeSOleksandr Kolomeiets 	bool (*get_cat_present)(void *dev);
593636b2cfeSOleksandr Kolomeiets 	uint32_t (*get_cat_version)(void *dev);
594636b2cfeSOleksandr Kolomeiets 	int (*cat_cfn_flush)(void *dev, const struct cat_func_s *cat, int cat_func, int cnt);
595636b2cfeSOleksandr Kolomeiets 	int (*cat_kce_flush)(void *dev, const struct cat_func_s *cat, int km_if_idx, int index,
596636b2cfeSOleksandr Kolomeiets 		int cnt);
597636b2cfeSOleksandr Kolomeiets 	int (*cat_kcs_flush)(void *dev, const struct cat_func_s *cat, int km_if_idx, int cat_func,
598636b2cfeSOleksandr Kolomeiets 		int cnt);
599636b2cfeSOleksandr Kolomeiets 	int (*cat_fte_flush)(void *dev, const struct cat_func_s *cat, int km_if_idx, int index,
600636b2cfeSOleksandr Kolomeiets 		int cnt);
601636b2cfeSOleksandr Kolomeiets 	int (*cat_cte_flush)(void *dev, const struct cat_func_s *cat, int cat_func, int cnt);
602636b2cfeSOleksandr Kolomeiets 	int (*cat_cts_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt);
603636b2cfeSOleksandr Kolomeiets 	int (*cat_cot_flush)(void *dev, const struct cat_func_s *cat, int cat_func, int cnt);
604636b2cfeSOleksandr Kolomeiets 	int (*cat_cct_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt);
605636b2cfeSOleksandr Kolomeiets 	int (*cat_exo_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt);
606636b2cfeSOleksandr Kolomeiets 	int (*cat_rck_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt);
607636b2cfeSOleksandr Kolomeiets 	int (*cat_len_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt);
608636b2cfeSOleksandr Kolomeiets 	int (*cat_kcc_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt);
6093005c75dSOleksandr Kolomeiets 
6103005c75dSOleksandr Kolomeiets 	/* KM */
6113005c75dSOleksandr Kolomeiets 	bool (*get_km_present)(void *dev);
6123005c75dSOleksandr Kolomeiets 	uint32_t (*get_km_version)(void *dev);
6133005c75dSOleksandr Kolomeiets 	int (*km_rcp_flush)(void *dev, const struct km_func_s *km, int category, int cnt);
6143005c75dSOleksandr Kolomeiets 	int (*km_cam_flush)(void *dev, const struct km_func_s *km, int bank, int record, int cnt);
6153005c75dSOleksandr Kolomeiets 	int (*km_tcam_flush)(void *dev, const struct km_func_s *km, int bank, int byte, int value,
6163005c75dSOleksandr Kolomeiets 		int cnt);
6173005c75dSOleksandr Kolomeiets 	int (*km_tci_flush)(void *dev, const struct km_func_s *km, int bank, int record, int cnt);
6183005c75dSOleksandr Kolomeiets 	int (*km_tcq_flush)(void *dev, const struct km_func_s *km, int bank, int record, int cnt);
619cec43fabSOleksandr Kolomeiets 
620cec43fabSOleksandr Kolomeiets 	/* FLM */
621cec43fabSOleksandr Kolomeiets 	bool (*get_flm_present)(void *dev);
622cec43fabSOleksandr Kolomeiets 	uint32_t (*get_flm_version)(void *dev);
623cec43fabSOleksandr Kolomeiets 	int (*flm_control_flush)(void *dev, const struct flm_func_s *flm);
624cec43fabSOleksandr Kolomeiets 	int (*flm_status_flush)(void *dev, const struct flm_func_s *flm);
625cec43fabSOleksandr Kolomeiets 	int (*flm_status_update)(void *dev, const struct flm_func_s *flm);
626cec43fabSOleksandr Kolomeiets 	int (*flm_scan_flush)(void *dev, const struct flm_func_s *flm);
627cec43fabSOleksandr Kolomeiets 	int (*flm_load_bin_flush)(void *dev, const struct flm_func_s *flm);
628cec43fabSOleksandr Kolomeiets 	int (*flm_prio_flush)(void *dev, const struct flm_func_s *flm);
629cec43fabSOleksandr Kolomeiets 	int (*flm_pst_flush)(void *dev, const struct flm_func_s *flm, int index, int cnt);
630cec43fabSOleksandr Kolomeiets 	int (*flm_rcp_flush)(void *dev, const struct flm_func_s *flm, int index, int cnt);
631cec43fabSOleksandr Kolomeiets 	int (*flm_scrub_flush)(void *dev, const struct flm_func_s *flm, int index, int cnt);
632cec43fabSOleksandr Kolomeiets 	int (*flm_buf_ctrl_update)(void *dev, const struct flm_func_s *flm);
633cec43fabSOleksandr Kolomeiets 	int (*flm_stat_update)(void *dev, const struct flm_func_s *flm);
634cec43fabSOleksandr Kolomeiets 	int (*flm_lrn_data_flush)(void *be_dev, const struct flm_func_s *flm,
635cec43fabSOleksandr Kolomeiets 		const uint32_t *lrn_data, uint32_t records,
636cec43fabSOleksandr Kolomeiets 		uint32_t *handled_records, uint32_t words_per_record,
637cec43fabSOleksandr Kolomeiets 		uint32_t *inf_word_cnt, uint32_t *sta_word_cnt);
638cec43fabSOleksandr Kolomeiets 	int (*flm_inf_sta_data_update)(void *be_dev, const struct flm_func_s *flm,
639cec43fabSOleksandr Kolomeiets 		uint32_t *inf_data, uint32_t inf_size,
640cec43fabSOleksandr Kolomeiets 		uint32_t *inf_word_cnt, uint32_t *sta_data,
641cec43fabSOleksandr Kolomeiets 		uint32_t sta_size, uint32_t *sta_word_cnt);
642a5a5d5bbSOleksandr Kolomeiets 
643a5a5d5bbSOleksandr Kolomeiets 	/* HSH */
644a5a5d5bbSOleksandr Kolomeiets 	bool (*get_hsh_present)(void *dev);
645a5a5d5bbSOleksandr Kolomeiets 	uint32_t (*get_hsh_version)(void *dev);
646a5a5d5bbSOleksandr Kolomeiets 	int (*hsh_rcp_flush)(void *dev, const struct hsh_func_s *hsh, int category, int cnt);
647b95f1cd0SOleksandr Kolomeiets 
648b95f1cd0SOleksandr Kolomeiets 	/* QSL */
649b95f1cd0SOleksandr Kolomeiets 	bool (*get_qsl_present)(void *dev);
650b95f1cd0SOleksandr Kolomeiets 	uint32_t (*get_qsl_version)(void *dev);
651b95f1cd0SOleksandr Kolomeiets 	int (*qsl_rcp_flush)(void *dev, const struct qsl_func_s *qsl, int category, int cnt);
652b95f1cd0SOleksandr Kolomeiets 	int (*qsl_qst_flush)(void *dev, const struct qsl_func_s *qsl, int entry, int cnt);
653b95f1cd0SOleksandr Kolomeiets 	int (*qsl_qen_flush)(void *dev, const struct qsl_func_s *qsl, int entry, int cnt);
654b95f1cd0SOleksandr Kolomeiets 	int (*qsl_unmq_flush)(void *dev, const struct qsl_func_s *qsl, int entry, int cnt);
6558c545325SOleksandr Kolomeiets 
6568c545325SOleksandr Kolomeiets 	/* SLC LR */
6578c545325SOleksandr Kolomeiets 	bool (*get_slc_lr_present)(void *dev);
6588c545325SOleksandr Kolomeiets 	uint32_t (*get_slc_lr_version)(void *dev);
6598c545325SOleksandr Kolomeiets 	int (*slc_lr_rcp_flush)(void *dev, const struct slc_lr_func_s *slc_lr, int category,
6608c545325SOleksandr Kolomeiets 		int cnt);
6617d65ee1aSOleksandr Kolomeiets 
6627d65ee1aSOleksandr Kolomeiets 	/* PDB */
6637d65ee1aSOleksandr Kolomeiets 	bool (*get_pdb_present)(void *dev);
6647d65ee1aSOleksandr Kolomeiets 	uint32_t (*get_pdb_version)(void *dev);
6657d65ee1aSOleksandr Kolomeiets 	int (*pdb_rcp_flush)(void *dev, const struct pdb_func_s *pdb, int category, int cnt);
6667d65ee1aSOleksandr Kolomeiets 	int (*pdb_config_flush)(void *dev, const struct pdb_func_s *pdb);
6677f058028SSerhii Iliushyk 
6687f058028SSerhii Iliushyk 	/* TPE */
6697f058028SSerhii Iliushyk 	bool (*get_tpe_present)(void *dev);
6707f058028SSerhii Iliushyk 	uint32_t (*get_tpe_version)(void *dev);
6717f058028SSerhii Iliushyk 	int (*tpe_rpp_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
6727f058028SSerhii Iliushyk 	int (*tpe_rpp_ifr_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
6737f058028SSerhii Iliushyk 	int (*tpe_ifr_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
6747f058028SSerhii Iliushyk 	int (*tpe_ins_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
6757f058028SSerhii Iliushyk 	int (*tpe_rpl_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
6767f058028SSerhii Iliushyk 	int (*tpe_rpl_ext_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
6777f058028SSerhii Iliushyk 	int (*tpe_rpl_rpl_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
6787f058028SSerhii Iliushyk 	int (*tpe_cpy_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
6797f058028SSerhii Iliushyk 	int (*tpe_hfu_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
6807f058028SSerhii Iliushyk 	int (*tpe_csu_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt);
681e3723ca6SOleksandr Kolomeiets };
682e3723ca6SOleksandr Kolomeiets 
6838df4a5f8SOleksandr Kolomeiets struct flow_api_backend_s {
6848df4a5f8SOleksandr Kolomeiets 	void *be_dev;
6851d3f62a0SOleksandr Kolomeiets 	const struct flow_api_backend_ops *iface;
6867917b0d3SOleksandr Kolomeiets 
6876e8b7f11SOleksandr Kolomeiets 	/* flow filter FPGA modules */
6886e8b7f11SOleksandr Kolomeiets 	struct cat_func_s cat;
689fbe2726fSOleksandr Kolomeiets 	struct km_func_s km;
690*059dfc39SOleksandr Kolomeiets 	struct flm_func_s flm;
6916e8b7f11SOleksandr Kolomeiets 
6927917b0d3SOleksandr Kolomeiets 	/* NIC attributes */
6937917b0d3SOleksandr Kolomeiets 	unsigned int num_phy_ports;
6947917b0d3SOleksandr Kolomeiets 	unsigned int num_rx_ports;
6957917b0d3SOleksandr Kolomeiets 
6967917b0d3SOleksandr Kolomeiets 	/* flow filter resource capacities */
6977917b0d3SOleksandr Kolomeiets 	unsigned int max_categories;
6987917b0d3SOleksandr Kolomeiets 	unsigned int max_queues;
6998df4a5f8SOleksandr Kolomeiets };
7008df4a5f8SOleksandr Kolomeiets 
7017917b0d3SOleksandr Kolomeiets int flow_api_backend_init(struct flow_api_backend_s *dev, const struct flow_api_backend_ops *iface,
7027917b0d3SOleksandr Kolomeiets 	void *be_dev);
7037917b0d3SOleksandr Kolomeiets int flow_api_backend_done(struct flow_api_backend_s *dev);
7047917b0d3SOleksandr Kolomeiets 
7058df4a5f8SOleksandr Kolomeiets #endif  /* _HW_MOD_BACKEND_H_ */
706