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 ¶ms->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