xref: /dpdk/drivers/net/bnxt/tf_ulp/ulp_matcher.c (revision 0c036a1485b9d9163a8fa8059ed5272d060c05e0)
1c7520059SKishore Padmanabha /* SPDX-License-Identifier: BSD-3-Clause
26d160d77SRandy Schacher  * Copyright(c) 2014-2023 Broadcom
3c7520059SKishore Padmanabha  * All rights reserved.
4c7520059SKishore Padmanabha  */
5c7520059SKishore Padmanabha 
6dd0191d5SShuanglin Wang #include <rte_malloc.h>
7c7520059SKishore Padmanabha #include "ulp_matcher.h"
82921498cSMike Baucom #include "ulp_mapper.h"
9c7520059SKishore Padmanabha #include "ulp_utils.h"
10*0c036a14SPeter Spreadborough #include "bnxt_ulp_utils.h"
11c7520059SKishore Padmanabha 
12dd0191d5SShuanglin Wang #ifndef RTE_HASH_BUCKET_ENTRIES
13dd0191d5SShuanglin Wang /* it is defined in lib/hash/rte_cuckoo_hash.h */
14dd0191d5SShuanglin Wang #define RTE_HASH_BUCKET_ENTRIES     8
15dd0191d5SShuanglin Wang #endif /* RTE_HASH_BUCKET_ENTRIES */
162bbcdee8SKishore Padmanabha 
17dd0191d5SShuanglin Wang static int32_t
18dd0191d5SShuanglin Wang ulp_matcher_class_list_lookup(struct ulp_rte_parser_params *params,
19dd0191d5SShuanglin Wang 			      uint32_t *class_match_idx)
20dd0191d5SShuanglin Wang {
21dd0191d5SShuanglin Wang 	struct bnxt_ulp_class_match_info *class_list = ulp_class_match_list;
22dd0191d5SShuanglin Wang 	uint32_t idx = 0;
23dd0191d5SShuanglin Wang 
24dd0191d5SShuanglin Wang 	while (++idx < BNXT_ULP_CLASS_MATCH_LIST_MAX_SZ) {
25dd0191d5SShuanglin Wang 		/* iterate the list of class matches to find header match */
26dd0191d5SShuanglin Wang 		if (class_list[idx].app_id == params->app_id &&
27dd0191d5SShuanglin Wang 		    !ULP_BITMAP_CMP(&class_list[idx].hdr_bitmap,
28dd0191d5SShuanglin Wang 				    &params->hdr_bitmap)) {
29dd0191d5SShuanglin Wang 			/* Found the match */
30dd0191d5SShuanglin Wang 			*class_match_idx = idx;
31dd0191d5SShuanglin Wang 			return 0;
32dd0191d5SShuanglin Wang 		}
33dd0191d5SShuanglin Wang 	}
34dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(DEBUG, "Did not find any matching protocol hdr\n");
35dd0191d5SShuanglin Wang 	return -1;
36c7520059SKishore Padmanabha }
37c7520059SKishore Padmanabha 
38dd0191d5SShuanglin Wang static int32_t
39dd0191d5SShuanglin Wang ulp_matcher_action_list_lookup(struct ulp_rte_parser_params *params,
40dd0191d5SShuanglin Wang 			       uint32_t *act_tmpl_idx)
41c7520059SKishore Padmanabha {
42dd0191d5SShuanglin Wang 	struct bnxt_ulp_act_match_info *act_list = ulp_act_match_list;
43dd0191d5SShuanglin Wang 	uint64_t act_bits = params->act_bitmap.bits;
44dd0191d5SShuanglin Wang 	uint32_t idx = 0;
45c7520059SKishore Padmanabha 
46dd0191d5SShuanglin Wang 	while (++idx < BNXT_ULP_ACT_MATCH_LIST_MAX_SZ) {
47f6e12015SKishore Padmanabha 		/* iterate the list of action matches to find header match */
48dd0191d5SShuanglin Wang 		if ((act_bits & act_list[idx].act_bitmap.bits) == act_bits) {
49dd0191d5SShuanglin Wang 			/* Found the match */
50dd0191d5SShuanglin Wang 			*act_tmpl_idx = act_list[idx].act_tid;
51dd0191d5SShuanglin Wang 			/* set the comp field to enable action reject cond */
52dd0191d5SShuanglin Wang 			ULP_COMP_FLD_IDX_WR(params,
53dd0191d5SShuanglin Wang 					    BNXT_ULP_CF_IDX_ACT_REJ_COND_EN, 1);
54dd0191d5SShuanglin Wang 			return 0;
55dd0191d5SShuanglin Wang 		}
56dd0191d5SShuanglin Wang 	}
57dd0191d5SShuanglin Wang 	return -1;
58dd0191d5SShuanglin Wang }
59dd0191d5SShuanglin Wang 
60dd0191d5SShuanglin Wang static int32_t
61dd0191d5SShuanglin Wang ulp_matcher_class_hdr_field_validate(struct ulp_rte_parser_params *params,
62dd0191d5SShuanglin Wang 				     uint32_t idx)
63dd0191d5SShuanglin Wang {
64dd0191d5SShuanglin Wang 	struct bnxt_ulp_class_match_info *info = &ulp_class_match_list[idx];
65dd0191d5SShuanglin Wang 	uint64_t bitmap;
66dd0191d5SShuanglin Wang 
67dd0191d5SShuanglin Wang 	/* manadatory fields should be enabled */
68dd0191d5SShuanglin Wang 	if ((params->fld_s_bitmap.bits & info->field_man_bitmap) !=
69dd0191d5SShuanglin Wang 	    info->field_man_bitmap){
70dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(DEBUG, "mismatch in manadatory hdr fields.\n");
71dd0191d5SShuanglin Wang 		return -EINVAL;
72dd0191d5SShuanglin Wang 	}
73dd0191d5SShuanglin Wang 
74dd0191d5SShuanglin Wang 	/* optional fields may be enabled or not so ignore them */
75dd0191d5SShuanglin Wang 	bitmap = params->fld_s_bitmap.bits & (~info->field_man_bitmap);
76dd0191d5SShuanglin Wang 	if ((bitmap && (bitmap & info->field_opt_bitmap) != bitmap)) {
77dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(DEBUG, "mismatch in optional hdr fields.\n");
78dd0191d5SShuanglin Wang 		return -EINVAL;
79dd0191d5SShuanglin Wang 	}
80dd0191d5SShuanglin Wang 
81dd0191d5SShuanglin Wang 	return 0;
82dd0191d5SShuanglin Wang }
83dd0191d5SShuanglin Wang 
84dd0191d5SShuanglin Wang static uint64_t
85dd0191d5SShuanglin Wang ulp_matcher_class_hdr_field_signature(struct ulp_rte_parser_params *params,
86dd0191d5SShuanglin Wang 				      uint32_t idx)
87dd0191d5SShuanglin Wang {
88dd0191d5SShuanglin Wang 	struct bnxt_ulp_class_match_info *info = &ulp_class_match_list[idx];
89dd0191d5SShuanglin Wang 
90dd0191d5SShuanglin Wang 	/* remove the exclude bits */
91dd0191d5SShuanglin Wang 	return params->fld_s_bitmap.bits & ~info->field_exclude_bitmap;
92dd0191d5SShuanglin Wang }
93dd0191d5SShuanglin Wang 
94dd0191d5SShuanglin Wang static uint64_t
95dd0191d5SShuanglin Wang ulp_matcher_class_wc_fld_get(uint32_t idx)
96dd0191d5SShuanglin Wang {
97dd0191d5SShuanglin Wang 	struct bnxt_ulp_class_match_info *info = &ulp_class_match_list[idx];
98dd0191d5SShuanglin Wang 	uint64_t bits;
99dd0191d5SShuanglin Wang 
100dd0191d5SShuanglin Wang 	bits = info->field_opt_bitmap | info->field_man_bitmap;
101dd0191d5SShuanglin Wang 	bits &= ~info->field_exclude_bitmap;
102dd0191d5SShuanglin Wang 	return bits;
103dd0191d5SShuanglin Wang }
104dd0191d5SShuanglin Wang 
105dd0191d5SShuanglin Wang static int32_t
106dd0191d5SShuanglin Wang ulp_matcher_class_hash_lookup(struct bnxt_ulp_matcher_data *matcher_data,
107dd0191d5SShuanglin Wang 			      struct ulp_rte_parser_params *params,
108dd0191d5SShuanglin Wang 			      uint32_t *class_hash_idx)
109dd0191d5SShuanglin Wang {
110af50070eSKishore Padmanabha 	struct ulp_matcher_hash_db_key key = { {0} };
111dd0191d5SShuanglin Wang 	struct ulp_matcher_class_db_node *node;
112dd0191d5SShuanglin Wang 	int32_t idx;
113dd0191d5SShuanglin Wang 	int32_t rc = -ENOENT;
114dd0191d5SShuanglin Wang 
115f6e12015SKishore Padmanabha 	/* populate the key for the search */
116dd0191d5SShuanglin Wang 	key.app_id = params->app_id;
117dd0191d5SShuanglin Wang 	key.hdr_bitmap = params->hdr_bitmap;
118dd0191d5SShuanglin Wang 
119dd0191d5SShuanglin Wang 	/* search the hash table for the hdr bit match */
120dd0191d5SShuanglin Wang 	idx  = rte_hash_lookup(matcher_data->class_matcher_db,
121dd0191d5SShuanglin Wang 			       (const void *)&key);
122dd0191d5SShuanglin Wang 	if (idx < 0 || idx >= matcher_data->class_list_size)
123dd0191d5SShuanglin Wang 		return rc; /* No Entry */
124dd0191d5SShuanglin Wang 
125dd0191d5SShuanglin Wang 	node = &matcher_data->class_list[idx];
126dd0191d5SShuanglin Wang 	if (!node->in_use) {
127dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "PANIC: Matcher database is corrupt %d\n",
128dd0191d5SShuanglin Wang 			     idx);
129dd0191d5SShuanglin Wang 		return rc;
130dd0191d5SShuanglin Wang 	}
131dd0191d5SShuanglin Wang 	*class_hash_idx = idx;
132dd0191d5SShuanglin Wang 	return 0; /* Success */
133dd0191d5SShuanglin Wang }
134dd0191d5SShuanglin Wang 
135dd0191d5SShuanglin Wang static int32_t
136dd0191d5SShuanglin Wang ulp_matcher_class_hash_add(struct bnxt_ulp_matcher_data *matcher_data,
137dd0191d5SShuanglin Wang 			   struct ulp_rte_parser_params *params,
138dd0191d5SShuanglin Wang 			   uint32_t class_match_idx,
139dd0191d5SShuanglin Wang 			   uint32_t *class_hash_idx)
140dd0191d5SShuanglin Wang {
141af50070eSKishore Padmanabha 	struct ulp_matcher_hash_db_key key = { {0} };
142dd0191d5SShuanglin Wang 	struct ulp_matcher_class_db_node *node;
143dd0191d5SShuanglin Wang 	int32_t hash_idx;
144dd0191d5SShuanglin Wang 	int32_t rc = -EINVAL;
145dd0191d5SShuanglin Wang 
146f6e12015SKishore Padmanabha 	/* populate the key for the search */
147dd0191d5SShuanglin Wang 	key.app_id = params->app_id;
148dd0191d5SShuanglin Wang 	key.hdr_bitmap = params->hdr_bitmap;
149dd0191d5SShuanglin Wang 
150dd0191d5SShuanglin Wang 	/* add to the hash table for the hdr bit match */
151dd0191d5SShuanglin Wang 	hash_idx = rte_hash_add_key(matcher_data->class_matcher_db,
152dd0191d5SShuanglin Wang 				    (const void *)&key);
153dd0191d5SShuanglin Wang 	if (hash_idx < 0 || hash_idx >= matcher_data->class_list_size) {
154dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "unable to add entry to matcher hash %d\n",
155dd0191d5SShuanglin Wang 			     hash_idx);
156dd0191d5SShuanglin Wang 		return rc;
157dd0191d5SShuanglin Wang 	}
158dd0191d5SShuanglin Wang 	/* Initialize the class db node with default values */
159dd0191d5SShuanglin Wang 	node = &matcher_data->class_list[hash_idx];
160dd0191d5SShuanglin Wang 	node->in_use = 1;
161dd0191d5SShuanglin Wang 	node->match_info_idx = class_match_idx;
162dd0191d5SShuanglin Wang 	*class_hash_idx = hash_idx;
163dd0191d5SShuanglin Wang 	return 0;
164c7520059SKishore Padmanabha }
165c7520059SKishore Padmanabha 
166c7520059SKishore Padmanabha /*
167c7520059SKishore Padmanabha  * Function to handle the matching of RTE Flows and validating
168c7520059SKishore Padmanabha  * the pattern masks against the flow templates.
169c7520059SKishore Padmanabha  */
170c7520059SKishore Padmanabha int32_t
1713d6ba7cbSKishore Padmanabha ulp_matcher_pattern_match(struct ulp_rte_parser_params *params,
172c7520059SKishore Padmanabha 			  uint32_t *class_id)
173c7520059SKishore Padmanabha {
1742bbcdee8SKishore Padmanabha 	struct bnxt_ulp_class_match_info *class_match;
175dd0191d5SShuanglin Wang 	struct ulp_matcher_class_db_node *class_node;
176dd0191d5SShuanglin Wang 	struct bnxt_ulp_matcher_data *matcher_data;
177dd0191d5SShuanglin Wang 	uint32_t class_match_idx = 0;
178dd0191d5SShuanglin Wang 	uint32_t hash_idx;
1792aa70990SKishore Padmanabha 	uint64_t bits = 0;
1802921498cSMike Baucom 
181dd0191d5SShuanglin Wang 	/* Get the matcher data for hash lookup  */
182dd0191d5SShuanglin Wang 	matcher_data = (struct bnxt_ulp_matcher_data *)
183dd0191d5SShuanglin Wang 		bnxt_ulp_cntxt_ptr2_matcher_data_get(params->ulp_ctx);
184dd0191d5SShuanglin Wang 	if (!matcher_data) {
185dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Failed to get the ulp matcher data\n");
186dd0191d5SShuanglin Wang 		return -EINVAL;
187c7520059SKishore Padmanabha 	}
1885b73c859SKishore Padmanabha 
1892aa70990SKishore Padmanabha 	bits = bnxt_ulp_cntxt_ptr2_default_class_bits_get(params->ulp_ctx);
1902aa70990SKishore Padmanabha 	params->hdr_bitmap.bits |= bits;
1912aa70990SKishore Padmanabha 
192dd0191d5SShuanglin Wang 	/* search the matcher hash db for the entry  */
193dd0191d5SShuanglin Wang 	if (ulp_matcher_class_hash_lookup(matcher_data, params,
194dd0191d5SShuanglin Wang 					  &hash_idx) == -ENOENT) {
195dd0191d5SShuanglin Wang 		/* find  the class list entry */
196dd0191d5SShuanglin Wang 		if (ulp_matcher_class_list_lookup(params, &class_match_idx))
197dd0191d5SShuanglin Wang 			goto error;
198dd0191d5SShuanglin Wang 
199dd0191d5SShuanglin Wang 		/* add it to the hash */
200dd0191d5SShuanglin Wang 		if (ulp_matcher_class_hash_add(matcher_data, params,
201dd0191d5SShuanglin Wang 					       class_match_idx, &hash_idx))
2025b73c859SKishore Padmanabha 			goto error;
2035b73c859SKishore Padmanabha 	}
204dd0191d5SShuanglin Wang 	class_node = &matcher_data->class_list[hash_idx];
205dd0191d5SShuanglin Wang 	class_match = &ulp_class_match_list[class_node->match_info_idx];
206dd0191d5SShuanglin Wang 	class_match_idx = class_node->match_info_idx;
2075b73c859SKishore Padmanabha 
208dd0191d5SShuanglin Wang 	/* perform the field bitmap validation */
209dd0191d5SShuanglin Wang 	if (ulp_matcher_class_hdr_field_validate(params,
210dd0191d5SShuanglin Wang 						 class_node->match_info_idx))
211dd0191d5SShuanglin Wang 		goto error;
212dd0191d5SShuanglin Wang 
213dd0191d5SShuanglin Wang 	/* Update the fields for further processing */
2142bbcdee8SKishore Padmanabha 	*class_id = class_match->class_tid;
215dd0191d5SShuanglin Wang 	params->class_info_idx = class_node->match_info_idx;
216dd0191d5SShuanglin Wang 	params->flow_sig_id =
217dd0191d5SShuanglin Wang 		ulp_matcher_class_hdr_field_signature(params, class_match_idx);
218255add67SKishore Padmanabha 	params->flow_pattern_id = class_match->flow_pattern_id;
219dd0191d5SShuanglin Wang 	params->wc_field_bitmap = ulp_matcher_class_wc_fld_get(class_match_idx);
220dd0191d5SShuanglin Wang 	params->exclude_field_bitmap = class_match->field_exclude_bitmap;
221dd0191d5SShuanglin Wang 
222dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(DEBUG, "Found matching pattern template %u:%d\n",
223dd0191d5SShuanglin Wang 		     class_match_idx, class_match->class_tid);
224c7520059SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
2252bbcdee8SKishore Padmanabha 
2262bbcdee8SKishore Padmanabha error:
227dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(DEBUG, "Did not find any matching template\n");
228dd0191d5SShuanglin Wang #ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG
229dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(DEBUG,
230dd0191d5SShuanglin Wang 		     "hid:%x,Hdr:%" PRIX64 " Fld:%" PRIX64 " SFl:%" PRIX64 "\n",
231dd0191d5SShuanglin Wang 		     class_match_idx, params->hdr_bitmap.bits,
232dd0191d5SShuanglin Wang 		     params->fld_bitmap.bits, params->fld_s_bitmap.bits);
233dd0191d5SShuanglin Wang #endif
234c7520059SKishore Padmanabha 	*class_id = 0;
235c7520059SKishore Padmanabha 	return BNXT_TF_RC_ERROR;
236c7520059SKishore Padmanabha }
23700fa81b7SKishore Padmanabha 
238dd0191d5SShuanglin Wang static int32_t
239dd0191d5SShuanglin Wang ulp_matcher_action_hash_lookup(struct bnxt_ulp_matcher_data *matcher_data,
240dd0191d5SShuanglin Wang 			       struct ulp_rte_parser_params *params,
241dd0191d5SShuanglin Wang 			       uint32_t *act_tmpl_idx)
242dd0191d5SShuanglin Wang {
243af50070eSKishore Padmanabha 	struct ulp_matcher_action_hash_db_key key = { {0} };
244dd0191d5SShuanglin Wang 	struct ulp_matcher_act_db_node *node;
245dd0191d5SShuanglin Wang 	int32_t idx;
246dd0191d5SShuanglin Wang 
247f6e12015SKishore Padmanabha 	/* populate the key for the search */
248dd0191d5SShuanglin Wang 	key.act_bitmap = params->act_bitmap;
249dd0191d5SShuanglin Wang 
250dd0191d5SShuanglin Wang 	/* search the hash table for the hdr bit match */
251dd0191d5SShuanglin Wang 	idx  = rte_hash_lookup(matcher_data->action_matcher_db,
252dd0191d5SShuanglin Wang 			       (const void *)&key);
253dd0191d5SShuanglin Wang 	if (idx < 0 || idx >= BNXT_ULP_ACT_HASH_LIST_SIZE)
254dd0191d5SShuanglin Wang 		return -ENOENT; /* No Entry */
255dd0191d5SShuanglin Wang 
256dd0191d5SShuanglin Wang 	node = &matcher_data->act_list[idx];
257dd0191d5SShuanglin Wang 	*act_tmpl_idx = node->act_tmpl_idx;
258dd0191d5SShuanglin Wang 	return 0; /* Success */
259dd0191d5SShuanglin Wang }
260dd0191d5SShuanglin Wang 
261dd0191d5SShuanglin Wang static int32_t
262dd0191d5SShuanglin Wang ulp_matcher_action_hash_add(struct bnxt_ulp_matcher_data *matcher_data,
263dd0191d5SShuanglin Wang 			    struct ulp_rte_parser_params *params,
264dd0191d5SShuanglin Wang 			    uint32_t match_idx)
265dd0191d5SShuanglin Wang {
266af50070eSKishore Padmanabha 	struct ulp_matcher_action_hash_db_key key = { {0} };
267dd0191d5SShuanglin Wang 	struct ulp_matcher_act_db_node *node;
268dd0191d5SShuanglin Wang 	int32_t hash_idx;
269dd0191d5SShuanglin Wang 	int32_t rc = -EINVAL;
270dd0191d5SShuanglin Wang 
271f6e12015SKishore Padmanabha 	/* populate the key for the search */
272dd0191d5SShuanglin Wang 	key.act_bitmap = params->act_bitmap;
273dd0191d5SShuanglin Wang 
274dd0191d5SShuanglin Wang 	/* add to the hash table for the hdr bit match */
275dd0191d5SShuanglin Wang 	hash_idx = rte_hash_add_key(matcher_data->action_matcher_db,
276dd0191d5SShuanglin Wang 				    (const void *)&key);
277dd0191d5SShuanglin Wang 	if (hash_idx < 0 || hash_idx >= BNXT_ULP_ACT_HASH_LIST_SIZE) {
278dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "unable to add entry to action hash %d\n",
279dd0191d5SShuanglin Wang 			     hash_idx);
280dd0191d5SShuanglin Wang 		return rc;
281dd0191d5SShuanglin Wang 	}
282dd0191d5SShuanglin Wang 	/* Initialize the class db node with default values */
283dd0191d5SShuanglin Wang 	node = &matcher_data->act_list[hash_idx];
284dd0191d5SShuanglin Wang 	node->act_tmpl_idx = match_idx;
285dd0191d5SShuanglin Wang 	return 0;
286dd0191d5SShuanglin Wang }
287dd0191d5SShuanglin Wang 
28800fa81b7SKishore Padmanabha /*
28900fa81b7SKishore Padmanabha  * Function to handle the matching of RTE Flows and validating
29000fa81b7SKishore Padmanabha  * the action against the flow templates.
29100fa81b7SKishore Padmanabha  */
29200fa81b7SKishore Padmanabha int32_t
2933d6ba7cbSKishore Padmanabha ulp_matcher_action_match(struct ulp_rte_parser_params *params,
29400fa81b7SKishore Padmanabha 			 uint32_t *act_id)
29500fa81b7SKishore Padmanabha {
296dd0191d5SShuanglin Wang 	struct bnxt_ulp_matcher_data *matcher_data;
297dd0191d5SShuanglin Wang 	uint32_t act_tmpl_idx = 0;
2982aa70990SKishore Padmanabha 	uint64_t bits = 0;
2992921498cSMike Baucom 
300dd0191d5SShuanglin Wang 	/* Get the matcher data for hash lookup  */
301dd0191d5SShuanglin Wang 	matcher_data = (struct bnxt_ulp_matcher_data *)
302dd0191d5SShuanglin Wang 		bnxt_ulp_cntxt_ptr2_matcher_data_get(params->ulp_ctx);
303dd0191d5SShuanglin Wang 	if (!matcher_data) {
304dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Failed to get the ulp matcher data\n");
305dd0191d5SShuanglin Wang 		return -EINVAL;
306dd0191d5SShuanglin Wang 	}
30700fa81b7SKishore Padmanabha 
3082aa70990SKishore Padmanabha 	bits = bnxt_ulp_cntxt_ptr2_default_act_bits_get(params->ulp_ctx);
3092aa70990SKishore Padmanabha 	params->act_bitmap.bits |= bits;
3102aa70990SKishore Padmanabha 
311dd0191d5SShuanglin Wang 	/* search the matcher hash db for the entry  */
312dd0191d5SShuanglin Wang 	if (ulp_matcher_action_hash_lookup(matcher_data, params,
313dd0191d5SShuanglin Wang 					   &act_tmpl_idx) == -ENOENT) {
314dd0191d5SShuanglin Wang 		/* find the action entry */
315dd0191d5SShuanglin Wang 		if (ulp_matcher_action_list_lookup(params, &act_tmpl_idx))
3162bbcdee8SKishore Padmanabha 			goto error;
3172bbcdee8SKishore Padmanabha 
318dd0191d5SShuanglin Wang 		/* add it to the hash */
319dd0191d5SShuanglin Wang 		if (ulp_matcher_action_hash_add(matcher_data, params,
320dd0191d5SShuanglin Wang 						act_tmpl_idx))
3212bbcdee8SKishore Padmanabha 			goto error;
32200fa81b7SKishore Padmanabha 	}
3235b73c859SKishore Padmanabha 
324dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(DEBUG, "Found matching action template %u\n", act_tmpl_idx);
325dd0191d5SShuanglin Wang 	*act_id = act_tmpl_idx;
32600fa81b7SKishore Padmanabha 	return BNXT_TF_RC_SUCCESS;
3272bbcdee8SKishore Padmanabha error:
328dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(DEBUG, "Did not find any matching action template\n");
329dd0191d5SShuanglin Wang #ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG
330dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(DEBUG, "Hdr:%" PRIX64 "\n", params->act_bitmap.bits);
331dd0191d5SShuanglin Wang #endif
33200fa81b7SKishore Padmanabha 	*act_id = 0;
33300fa81b7SKishore Padmanabha 	return BNXT_TF_RC_ERROR;
33400fa81b7SKishore Padmanabha }
335dd0191d5SShuanglin Wang 
336dd0191d5SShuanglin Wang int32_t ulp_matcher_init(struct bnxt_ulp_context *ulp_ctx)
337dd0191d5SShuanglin Wang {
338dd0191d5SShuanglin Wang 	struct rte_hash_parameters hash_tbl_params = {0};
3398782e4deSKishore Padmanabha 	char hash_class_tbl_name[64] = {0};
3408782e4deSKishore Padmanabha 	char hash_act_tbl_name[64] = {0};
341dd0191d5SShuanglin Wang 	struct bnxt_ulp_matcher_data *data;
3428782e4deSKishore Padmanabha 	uint16_t port_id;
3438782e4deSKishore Padmanabha 
3448782e4deSKishore Padmanabha 	/* append port_id to the buffer name */
3458782e4deSKishore Padmanabha 	port_id = ulp_ctx->bp->eth_dev->data->port_id;
3468782e4deSKishore Padmanabha 	snprintf(hash_class_tbl_name, sizeof(hash_class_tbl_name),
3478782e4deSKishore Padmanabha 		 "bnxt_ulp_class_matcher_%d", port_id);
3488782e4deSKishore Padmanabha 	snprintf(hash_act_tbl_name, sizeof(hash_act_tbl_name),
3498782e4deSKishore Padmanabha 		 "bnxt_ulp_act_matcher_%d", port_id);
350dd0191d5SShuanglin Wang 
351dd0191d5SShuanglin Wang 	data = rte_zmalloc("bnxt_ulp_matcher_data",
352dd0191d5SShuanglin Wang 			   sizeof(struct bnxt_ulp_matcher_data), 0);
353dd0191d5SShuanglin Wang 	if (!data) {
354dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Failed to allocate the matcher data\n");
355dd0191d5SShuanglin Wang 		return -ENOMEM;
356dd0191d5SShuanglin Wang 	}
357dd0191d5SShuanglin Wang 
358dd0191d5SShuanglin Wang 	if (bnxt_ulp_cntxt_ptr2_matcher_data_set(ulp_ctx, data)) {
359dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Failed to set matcher data in context\n");
360dd0191d5SShuanglin Wang 		rte_free(data);
361dd0191d5SShuanglin Wang 		return -ENOMEM;
362dd0191d5SShuanglin Wang 	}
363dd0191d5SShuanglin Wang 
364dd0191d5SShuanglin Wang 	/* create the hash table for the matcher entries */
365dd0191d5SShuanglin Wang 	hash_tbl_params.name = hash_class_tbl_name;
366dd0191d5SShuanglin Wang 	hash_tbl_params.entries = BNXT_ULP_CLASS_MATCH_LIST_MAX_SZ +
367dd0191d5SShuanglin Wang 				  RTE_HASH_BUCKET_ENTRIES;
368dd0191d5SShuanglin Wang 
369dd0191d5SShuanglin Wang 	hash_tbl_params.key_len = sizeof(struct ulp_matcher_hash_db_key);
370dd0191d5SShuanglin Wang 	hash_tbl_params.socket_id = rte_socket_id();
371dd0191d5SShuanglin Wang 	data->class_matcher_db = rte_hash_create(&hash_tbl_params);
372dd0191d5SShuanglin Wang 	if (data->class_matcher_db == NULL) {
373dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Failed to create class matcher hash tbl\n");
374dd0191d5SShuanglin Wang 		goto error;
375dd0191d5SShuanglin Wang 	}
376dd0191d5SShuanglin Wang 
377dd0191d5SShuanglin Wang 	/* allocate memorry for the class list */
378dd0191d5SShuanglin Wang 	data->class_list_size = hash_tbl_params.entries;
379dd0191d5SShuanglin Wang 	data->class_list = rte_zmalloc("bnxt_ulp_matcher_class_list",
380dd0191d5SShuanglin Wang 				       sizeof(struct ulp_matcher_class_db_node)
381dd0191d5SShuanglin Wang 				       * data->class_list_size, 0);
382dd0191d5SShuanglin Wang 	if (data->class_list == NULL) {
383dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Failed to create matcher class list\n");
384dd0191d5SShuanglin Wang 		goto error;
385dd0191d5SShuanglin Wang 	}
386dd0191d5SShuanglin Wang 
387dd0191d5SShuanglin Wang 	/* create the hash table for the action entries */
388dd0191d5SShuanglin Wang 	hash_tbl_params.name = hash_act_tbl_name;
389dd0191d5SShuanglin Wang 	/* The hash list size set to max support and not dependent on template*/
390dd0191d5SShuanglin Wang 	hash_tbl_params.entries = BNXT_ULP_ACT_HASH_LIST_SIZE;
391dd0191d5SShuanglin Wang 	hash_tbl_params.key_len = sizeof(struct ulp_matcher_action_hash_db_key);
392dd0191d5SShuanglin Wang 	hash_tbl_params.socket_id = rte_socket_id();
393dd0191d5SShuanglin Wang 	data->action_matcher_db = rte_hash_create(&hash_tbl_params);
394dd0191d5SShuanglin Wang 	if (data->action_matcher_db == NULL) {
395dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Failed to create action matcher hash tbl\n");
396dd0191d5SShuanglin Wang 		goto error;
397dd0191d5SShuanglin Wang 	}
398dd0191d5SShuanglin Wang 
399dd0191d5SShuanglin Wang 	/* allocate memorry for the action list */
400dd0191d5SShuanglin Wang 	data->act_list = rte_zmalloc("bnxt_ulp_matcher_act_list",
401dd0191d5SShuanglin Wang 				     sizeof(struct ulp_matcher_act_db_node)
402dd0191d5SShuanglin Wang 				       * BNXT_ULP_ACT_HASH_LIST_SIZE, 0);
403dd0191d5SShuanglin Wang 	if (data->act_list == NULL) {
404dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Failed to create matcher act list\n");
405dd0191d5SShuanglin Wang 		goto error;
406dd0191d5SShuanglin Wang 	}
407dd0191d5SShuanglin Wang 	return 0;
408dd0191d5SShuanglin Wang error:
409dd0191d5SShuanglin Wang 	ulp_matcher_deinit(ulp_ctx);
410dd0191d5SShuanglin Wang 	return -ENOMEM;
411dd0191d5SShuanglin Wang }
412dd0191d5SShuanglin Wang 
413dd0191d5SShuanglin Wang void ulp_matcher_deinit(struct bnxt_ulp_context *ulp_ctx)
414dd0191d5SShuanglin Wang {
415dd0191d5SShuanglin Wang 	struct bnxt_ulp_matcher_data *data;
416dd0191d5SShuanglin Wang 
417dd0191d5SShuanglin Wang 	if (!ulp_ctx) {
418dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Failed to acquire ulp context\n");
419dd0191d5SShuanglin Wang 		return;
420dd0191d5SShuanglin Wang 	}
421dd0191d5SShuanglin Wang 
422dd0191d5SShuanglin Wang 	data = (struct bnxt_ulp_matcher_data *)
423dd0191d5SShuanglin Wang 		bnxt_ulp_cntxt_ptr2_matcher_data_get(ulp_ctx);
424dd0191d5SShuanglin Wang 	if (!data) {
425dd0191d5SShuanglin Wang 		/* Go ahead and return since there is no allocated data. */
426dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "No data appears to have been allocated.\n");
427dd0191d5SShuanglin Wang 		return;
428dd0191d5SShuanglin Wang 	}
429dd0191d5SShuanglin Wang 
430dd0191d5SShuanglin Wang 	/* Delete all the hash nodes and the hash list */
431dd0191d5SShuanglin Wang 	rte_hash_free(data->class_matcher_db);
432dd0191d5SShuanglin Wang 	data->class_matcher_db = NULL;
433dd0191d5SShuanglin Wang 
434dd0191d5SShuanglin Wang 	/* free matcher class list */
435dd0191d5SShuanglin Wang 	rte_free(data->class_list);
436dd0191d5SShuanglin Wang 	data->class_list = NULL;
437dd0191d5SShuanglin Wang 
438dd0191d5SShuanglin Wang 	/* Delete all the hash nodes and the hash list */
439dd0191d5SShuanglin Wang 	rte_hash_free(data->action_matcher_db);
440dd0191d5SShuanglin Wang 	data->action_matcher_db = NULL;
441dd0191d5SShuanglin Wang 
442dd0191d5SShuanglin Wang 	/* free matcher act list */
443dd0191d5SShuanglin Wang 	rte_free(data->act_list);
444dd0191d5SShuanglin Wang 	data->act_list = NULL;
445dd0191d5SShuanglin Wang 
446dd0191d5SShuanglin Wang 	/* free the matcher data */
447dd0191d5SShuanglin Wang 	rte_free(data);
448dd0191d5SShuanglin Wang 
449dd0191d5SShuanglin Wang 	/* Reset the data pointer within the ulp_ctx. */
450dd0191d5SShuanglin Wang 	bnxt_ulp_cntxt_ptr2_matcher_data_set(ulp_ctx, NULL);
451dd0191d5SShuanglin Wang }
452