xref: /dpdk/drivers/net/bnxt/tf_ulp/ulp_gen_hash.h (revision e6e8f03e5459f25153f1e4cd3e9ac30d3e473a61)
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