10001cc58SKishore Padmanabha /* SPDX-License-Identifier: BSD-3-Clause 2*e6e8f03eSRandy Schacher * Copyright(c) 2014-2023 Broadcom 30001cc58SKishore Padmanabha * All rights reserved. 40001cc58SKishore Padmanabha */ 50001cc58SKishore Padmanabha 60001cc58SKishore Padmanabha #ifndef _ULP_GEN_HASH_H_ 70001cc58SKishore Padmanabha #define _ULP_GEN_HASH_H_ 80001cc58SKishore Padmanabha 90001cc58SKishore Padmanabha #include "bnxt.h" 100001cc58SKishore Padmanabha 110001cc58SKishore Padmanabha #define ULP_GEN_HASH_MAX_TBL_SIZE BIT(15) 120001cc58SKishore Padmanabha 130001cc58SKishore Padmanabha /* Structure to store the hash key details */ 140001cc58SKishore Padmanabha struct ulp_gen_hash_key_entry { 150001cc58SKishore Padmanabha uint32_t mem_size; 160001cc58SKishore Padmanabha uint32_t data_size; 170001cc58SKishore Padmanabha uint8_t *key_data; 180001cc58SKishore Padmanabha }; 190001cc58SKishore Padmanabha 200001cc58SKishore Padmanabha /* Macros for bucket entries */ 210001cc58SKishore Padmanabha #define ULP_HASH_BUCKET_VALID 0x8000 220001cc58SKishore Padmanabha #define ULP_HASH_BUCKET_IDX_MSK 0x7FFF 230001cc58SKishore Padmanabha #define ULP_HASH_BUCKET_ROW_SZ 4 240001cc58SKishore Padmanabha #define ULP_HASH_BUCKET_INUSE(x) ((*(x)) & (ULP_HASH_BUCKET_VALID)) 250001cc58SKishore Padmanabha #define ULP_HASH_BUCKET_MARK_INUSE(x, y) \ 260001cc58SKishore Padmanabha ((*(x)) = ((y) & ULP_HASH_BUCKET_IDX_MSK) | (ULP_HASH_BUCKET_VALID)) 270001cc58SKishore Padmanabha #define ULP_HASH_BUCKET_CLEAR(x) ((*(x)) = 0) 280001cc58SKishore Padmanabha #define ULP_HASH_BUCKET_INDEX(x) ((*(x)) & (ULP_HASH_BUCKET_IDX_MSK)) 290001cc58SKishore Padmanabha #define ULP_HASH_INDEX_CALC(id1, id2) (((id1) << 16) | ((id2) & 0xFFFF)) 300001cc58SKishore Padmanabha #define ULP_HASH_GET_H_INDEX(x) (((x) >> 16) & 0xFFFF) 310001cc58SKishore Padmanabha #define ULP_HASH_GET_B_INDEX(x) ((x) & 0xFFFF) 320001cc58SKishore Padmanabha #define ULP_HASH_BUCKET_INVAL -1 330001cc58SKishore Padmanabha 340001cc58SKishore Padmanabha /* Structure for the hash bucket details */ 350001cc58SKishore Padmanabha struct ulp_hash_bucket_entry { 360001cc58SKishore Padmanabha uint64_t *bucket; 370001cc58SKishore Padmanabha }; 380001cc58SKishore Padmanabha 390001cc58SKishore Padmanabha /* Structure for the hash bucket details */ 400001cc58SKishore Padmanabha struct bit_alloc_list { 410001cc58SKishore Padmanabha uint32_t bsize; 420001cc58SKishore Padmanabha uint64_t *bdata; 430001cc58SKishore Padmanabha }; 440001cc58SKishore Padmanabha 450001cc58SKishore Padmanabha /* 460001cc58SKishore Padmanabha * Structure to store the generic tbl container 470001cc58SKishore Padmanabha * The ref count and byte data contain list of "num_elem" elements. 480001cc58SKishore Padmanabha * The size of each entry in byte_data is of size byte_data_size. 490001cc58SKishore Padmanabha */ 500001cc58SKishore Padmanabha struct ulp_gen_hash_tbl { 510001cc58SKishore Padmanabha /* memory to store hash key */ 520001cc58SKishore Padmanabha uint32_t num_key_entries; 530001cc58SKishore Padmanabha struct ulp_gen_hash_key_entry key_tbl; 540001cc58SKishore Padmanabha 550001cc58SKishore Padmanabha /* Hash table memory */ 560001cc58SKishore Padmanabha uint32_t hash_tbl_size; 570001cc58SKishore Padmanabha uint32_t hash_bkt_num; 580001cc58SKishore Padmanabha struct ulp_hash_bucket_entry *hash_list; 590001cc58SKishore Padmanabha uint32_t hash_mask; 600001cc58SKishore Padmanabha 610001cc58SKishore Padmanabha /* Bit allocator - to allocate key_res index */ 620001cc58SKishore Padmanabha struct bit_alloc_list bit_list; 630001cc58SKishore Padmanabha }; 640001cc58SKishore Padmanabha 650001cc58SKishore Padmanabha /* structure to pass hash creation params */ 660001cc58SKishore Padmanabha struct ulp_hash_create_params { 670001cc58SKishore Padmanabha /* this is size of the hash tbl - try to keep it to power of 2.*/ 680001cc58SKishore Padmanabha uint32_t num_hash_tbl_entries; 690001cc58SKishore Padmanabha /* Bucket size must be multiple of 4 */ 700001cc58SKishore Padmanabha uint32_t num_buckets; 710001cc58SKishore Padmanabha /* This is size of hash key and data - try to keep it to power of 2 */ 720001cc58SKishore Padmanabha /* This value has to be less than 2^15 */ 730001cc58SKishore Padmanabha uint32_t num_key_entries; 740001cc58SKishore Padmanabha /* the size of the hash key in bytes */ 750001cc58SKishore Padmanabha uint32_t key_size; 760001cc58SKishore Padmanabha }; 770001cc58SKishore Padmanabha 780001cc58SKishore Padmanabha enum ulp_gen_hash_search_flag { 790001cc58SKishore Padmanabha ULP_GEN_HASH_SEARCH_MISSED = 1, 800001cc58SKishore Padmanabha ULP_GEN_HASH_SEARCH_FOUND = 2, 810001cc58SKishore Padmanabha ULP_GEN_HASH_SEARCH_FULL = 3 820001cc58SKishore Padmanabha }; 830001cc58SKishore Padmanabha 840001cc58SKishore Padmanabha /* structure to pass hash entry */ 850001cc58SKishore Padmanabha struct ulp_gen_hash_entry_params { 860001cc58SKishore Padmanabha uint8_t *key_data; 870001cc58SKishore Padmanabha uint32_t key_length; 880001cc58SKishore Padmanabha enum ulp_gen_hash_search_flag search_flag; 890001cc58SKishore Padmanabha uint32_t hash_index; 900001cc58SKishore Padmanabha uint32_t key_idx; 910001cc58SKishore Padmanabha }; 920001cc58SKishore Padmanabha 930001cc58SKishore Padmanabha /* 940001cc58SKishore Padmanabha * Initialize the Generic Hash table 950001cc58SKishore Padmanabha * 960001cc58SKishore Padmanabha * cparams [in] Pointer to hash create params list 970001cc58SKishore Padmanabha * hash_tbl [out] the pointer to created hash table 980001cc58SKishore Padmanabha * 990001cc58SKishore Padmanabha * returns 0 on success 1000001cc58SKishore Padmanabha */ 1010001cc58SKishore Padmanabha int32_t 1020001cc58SKishore Padmanabha ulp_gen_hash_tbl_list_init(struct ulp_hash_create_params *cparams, 1030001cc58SKishore Padmanabha struct ulp_gen_hash_tbl **hash_tbl); 1040001cc58SKishore Padmanabha 1050001cc58SKishore Padmanabha /* 1060001cc58SKishore Padmanabha * Free the generic hash table 1070001cc58SKishore Padmanabha * 1080001cc58SKishore Padmanabha * hash_tbl [in] the pointer to hash table 1090001cc58SKishore Padmanabha * 1100001cc58SKishore Padmanabha * returns 0 on success 1110001cc58SKishore Padmanabha */ 1120001cc58SKishore Padmanabha int32_t 1130001cc58SKishore Padmanabha ulp_gen_hash_tbl_list_deinit(struct ulp_gen_hash_tbl *hash_tbl); 1140001cc58SKishore Padmanabha 1150001cc58SKishore Padmanabha /* 1160001cc58SKishore Padmanabha * Search the generic hash table using key data 1170001cc58SKishore Padmanabha * 1180001cc58SKishore Padmanabha * hash_tbl [in] the pointer to hash table 1190001cc58SKishore Padmanabha * entry [in/out] pointer to hash entry details. 1200001cc58SKishore Padmanabha * 1210001cc58SKishore Padmanabha * returns 0 on success and marks search flag as found. 1220001cc58SKishore Padmanabha */ 1230001cc58SKishore Padmanabha int32_t 1240001cc58SKishore Padmanabha ulp_gen_hash_tbl_list_key_search(struct ulp_gen_hash_tbl *hash_tbl, 1250001cc58SKishore Padmanabha struct ulp_gen_hash_entry_params *entry); 1260001cc58SKishore Padmanabha 1270001cc58SKishore Padmanabha /* 1280001cc58SKishore Padmanabha * Search the generic hash table using hash index 1290001cc58SKishore Padmanabha * 1300001cc58SKishore Padmanabha * hash_tbl [in] the pointer to hash table 1310001cc58SKishore Padmanabha * entry [in/out] pointer to hash entry details. 1320001cc58SKishore Padmanabha * 1330001cc58SKishore Padmanabha * returns 0 on success and marks search flag as found. 1340001cc58SKishore Padmanabha */ 1350001cc58SKishore Padmanabha int32_t 1360001cc58SKishore Padmanabha ulp_gen_hash_tbl_list_index_search(struct ulp_gen_hash_tbl *hash_tbl, 1370001cc58SKishore Padmanabha struct ulp_gen_hash_entry_params *entry); 1380001cc58SKishore Padmanabha 1390001cc58SKishore Padmanabha /* 1400001cc58SKishore Padmanabha * Add the entry to the generic hash table 1410001cc58SKishore Padmanabha * 1420001cc58SKishore Padmanabha * hash_tbl [in] the pointer to hash table 1430001cc58SKishore Padmanabha * entry [in/out] pointer to hash entry details. Fill the hash index and 1440001cc58SKishore Padmanabha * key data details to be added. 1450001cc58SKishore Padmanabha * 1460001cc58SKishore Padmanabha * returns 0 on success 1470001cc58SKishore Padmanabha * 1480001cc58SKishore Padmanabha */ 1490001cc58SKishore Padmanabha int32_t 1500001cc58SKishore Padmanabha ulp_gen_hash_tbl_list_add(struct ulp_gen_hash_tbl *hash_tbl, 1510001cc58SKishore Padmanabha struct ulp_gen_hash_entry_params *entry); 1520001cc58SKishore Padmanabha 1530001cc58SKishore Padmanabha /* 1540001cc58SKishore Padmanabha * Delete the entry in the generic hash table 1550001cc58SKishore Padmanabha * 1560001cc58SKishore Padmanabha * hash_tbl [in] the pointer to hash table 1570001cc58SKishore Padmanabha * entry [in] pointer to hash entry details. Fill the hash index details to be 1580001cc58SKishore Padmanabha * deleted. 1590001cc58SKishore Padmanabha * 1600001cc58SKishore Padmanabha * returns 0 on success 1610001cc58SKishore Padmanabha */ 1620001cc58SKishore Padmanabha int32_t 1630001cc58SKishore Padmanabha ulp_gen_hash_tbl_list_del(struct ulp_gen_hash_tbl *hash_tbl, 1640001cc58SKishore Padmanabha struct ulp_gen_hash_entry_params *entry); 1650001cc58SKishore Padmanabha #endif /* _ULP_GEN_HASH_H_ */ 166