1f634204bSKishore Padmanabha /* SPDX-License-Identifier: BSD-3-Clause 26d160d77SRandy Schacher * Copyright(c) 2014-2023 Broadcom 3f634204bSKishore Padmanabha * All rights reserved. 4f634204bSKishore Padmanabha */ 5f634204bSKishore Padmanabha 6f634204bSKishore Padmanabha #ifndef _ULP_GEN_TBL_H_ 7f634204bSKishore Padmanabha #define _ULP_GEN_TBL_H_ 8f634204bSKishore Padmanabha 90001cc58SKishore Padmanabha #include "ulp_gen_hash.h" 100001cc58SKishore Padmanabha 11f634204bSKishore Padmanabha /* Macros for reference count manipulation */ 12f634204bSKishore Padmanabha #define ULP_GEN_TBL_REF_CNT_INC(entry) {*(entry)->ref_count += 1; } 13f634204bSKishore Padmanabha #define ULP_GEN_TBL_REF_CNT_DEC(entry) {*(entry)->ref_count -= 1; } 14f634204bSKishore Padmanabha #define ULP_GEN_TBL_REF_CNT(entry) (*(entry)->ref_count) 15f634204bSKishore Padmanabha 16f634204bSKishore Padmanabha #define ULP_GEN_TBL_FID_OFFSET 0 17f634204bSKishore Padmanabha #define ULP_GEN_TBL_FID_SIZE_BITS 32 18f634204bSKishore Padmanabha 19*af50070eSKishore Padmanabha enum ulp_gen_list_search_flag { 20*af50070eSKishore Padmanabha ULP_GEN_LIST_SEARCH_MISSED = 1, 21*af50070eSKishore Padmanabha ULP_GEN_LIST_SEARCH_FOUND = 2, 22*af50070eSKishore Padmanabha ULP_GEN_LIST_SEARCH_FOUND_SUBSET = 3, 23*af50070eSKishore Padmanabha ULP_GEN_LIST_SEARCH_FOUND_SUPERSET = 4, 24*af50070eSKishore Padmanabha ULP_GEN_LIST_SEARCH_FULL = 5 25*af50070eSKishore Padmanabha }; 26*af50070eSKishore Padmanabha 27f634204bSKishore Padmanabha /* Structure to pass the generic table values across APIs */ 28f634204bSKishore Padmanabha struct ulp_mapper_gen_tbl_entry { 29f634204bSKishore Padmanabha uint32_t *ref_count; 30f634204bSKishore Padmanabha uint32_t byte_data_size; 31f634204bSKishore Padmanabha uint8_t *byte_data; 32f634204bSKishore Padmanabha enum bnxt_ulp_byte_order byte_order; 33*af50070eSKishore Padmanabha uint32_t byte_key_size; 34*af50070eSKishore Padmanabha uint8_t *byte_key; 35f634204bSKishore Padmanabha }; 36f634204bSKishore Padmanabha 37f634204bSKishore Padmanabha /* 38f634204bSKishore Padmanabha * Structure to store the generic tbl container 39f634204bSKishore Padmanabha * The ref count and byte data contain list of "num_elem" elements. 40f634204bSKishore Padmanabha * The size of each entry in byte_data is of size byte_data_size. 41f634204bSKishore Padmanabha */ 42f634204bSKishore Padmanabha struct ulp_mapper_gen_tbl_cont { 43f634204bSKishore Padmanabha uint32_t num_elem; 44f634204bSKishore Padmanabha uint32_t byte_data_size; 45f634204bSKishore Padmanabha enum bnxt_ulp_byte_order byte_order; 46f634204bSKishore Padmanabha /* Reference count to track number of users*/ 47f634204bSKishore Padmanabha uint32_t *ref_count; 48f634204bSKishore Padmanabha /* First 4 bytes is either tcam_idx or fid and rest are identities */ 49f634204bSKishore Padmanabha uint8_t *byte_data; 50dd0191d5SShuanglin Wang uint8_t *byte_key; 51*af50070eSKishore Padmanabha uint32_t byte_key_ex_size;/* exact match size */ 52*af50070eSKishore Padmanabha uint32_t byte_key_par_size; /*partial match */ 53dd0191d5SShuanglin Wang uint32_t seq_cnt; 54f634204bSKishore Padmanabha }; 55f634204bSKishore Padmanabha 56f634204bSKishore Padmanabha /* Structure to store the generic tbl container */ 57f634204bSKishore Padmanabha struct ulp_mapper_gen_tbl_list { 580001cc58SKishore Padmanabha const char *gen_tbl_name; 59dd0191d5SShuanglin Wang enum bnxt_ulp_gen_tbl_type tbl_type; 60f634204bSKishore Padmanabha struct ulp_mapper_gen_tbl_cont container; 61f634204bSKishore Padmanabha uint32_t mem_data_size; 62f634204bSKishore Padmanabha uint8_t *mem_data; 630001cc58SKishore Padmanabha struct ulp_gen_hash_tbl *hash_tbl; 64f634204bSKishore Padmanabha }; 65f634204bSKishore Padmanabha 66f634204bSKishore Padmanabha /* Forward declaration */ 67f634204bSKishore Padmanabha struct bnxt_ulp_mapper_data; 68f634204bSKishore Padmanabha struct ulp_flow_db_res_params; 69f634204bSKishore Padmanabha 70f634204bSKishore Padmanabha /* 71f634204bSKishore Padmanabha * Initialize the generic table list 72f634204bSKishore Padmanabha * 73dd0191d5SShuanglin Wang * ulp_ctx [in] - Pointer to the ulp context 74f634204bSKishore Padmanabha * mapper_data [in] Pointer to the mapper data and the generic table is 75f634204bSKishore Padmanabha * part of it 76f634204bSKishore Padmanabha * 77f634204bSKishore Padmanabha * returns 0 on success 78f634204bSKishore Padmanabha */ 79f634204bSKishore Padmanabha int32_t 80dd0191d5SShuanglin Wang ulp_mapper_generic_tbl_list_init(struct bnxt_ulp_context *ulp_ctx, 81dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_data *mapper_data); 82f634204bSKishore Padmanabha 83f634204bSKishore Padmanabha /* 84f634204bSKishore Padmanabha * Free the generic table list 85f634204bSKishore Padmanabha * 86f634204bSKishore Padmanabha * mapper_data [in] Pointer to the mapper data and the generic table is 87f634204bSKishore Padmanabha * part of it 88f634204bSKishore Padmanabha * 89f634204bSKishore Padmanabha * returns 0 on success 90f634204bSKishore Padmanabha */ 91f634204bSKishore Padmanabha int32_t 92f634204bSKishore Padmanabha ulp_mapper_generic_tbl_list_deinit(struct bnxt_ulp_mapper_data *mapper_data); 93f634204bSKishore Padmanabha 94f634204bSKishore Padmanabha /* 95f634204bSKishore Padmanabha * Get the generic table list entry 96f634204bSKishore Padmanabha * 970001cc58SKishore Padmanabha * tbl_list [in] - Ptr to generic table 98f634204bSKishore Padmanabha * key [in] - Key index to the table 99f634204bSKishore Padmanabha * entry [out] - output will include the entry if found 100f634204bSKishore Padmanabha * 101f634204bSKishore Padmanabha * returns 0 on success. 102f634204bSKishore Padmanabha */ 103f634204bSKishore Padmanabha int32_t 1040001cc58SKishore Padmanabha ulp_mapper_gen_tbl_entry_get(struct ulp_mapper_gen_tbl_list *tbl_list, 105f634204bSKishore Padmanabha uint32_t key, 106f634204bSKishore Padmanabha struct ulp_mapper_gen_tbl_entry *entry); 107f634204bSKishore Padmanabha 108f634204bSKishore Padmanabha /* 109f634204bSKishore Padmanabha * utility function to calculate the table idx 110f634204bSKishore Padmanabha * 111f634204bSKishore Padmanabha * res_sub_type [in] - Resource sub type 112f634204bSKishore Padmanabha * dir [in] - direction 113f634204bSKishore Padmanabha * 114f634204bSKishore Padmanabha * returns None 115f634204bSKishore Padmanabha */ 116f634204bSKishore Padmanabha int32_t 117f634204bSKishore Padmanabha ulp_mapper_gen_tbl_idx_calculate(uint32_t res_sub_type, uint32_t dir); 118f634204bSKishore Padmanabha 119f634204bSKishore Padmanabha /* 120*af50070eSKishore Padmanabha * Set the data in the generic table entry, Data is in Big endian format 121f634204bSKishore Padmanabha * 122f634204bSKishore Padmanabha * entry [in] - generic table entry 123*af50070eSKishore Padmanabha * key [in] - pointer to the key to be used for setting the value. 124*af50070eSKishore Padmanabha * key_size [in] - The length of the key in bytess to be set 125f634204bSKishore Padmanabha * data [in] - pointer to the data to be used for setting the value. 126aebe3cb7SKishore Padmanabha * data_size [in] - length of the data pointer in bytes. 127f634204bSKishore Padmanabha * 128f634204bSKishore Padmanabha * returns 0 on success 129f634204bSKishore Padmanabha */ 130f634204bSKishore Padmanabha int32_t 131*af50070eSKishore Padmanabha ulp_mapper_gen_tbl_entry_data_set(struct ulp_mapper_gen_tbl_list *tbl_list, 132*af50070eSKishore Padmanabha struct ulp_mapper_gen_tbl_entry *entry, 133*af50070eSKishore Padmanabha uint8_t *key, uint32_t key_size, 134*af50070eSKishore Padmanabha uint8_t *data, uint32_t data_size); 135f634204bSKishore Padmanabha 136f634204bSKishore Padmanabha /* 137f634204bSKishore Padmanabha * Get the data in the generic table entry 138f634204bSKishore Padmanabha * 139f634204bSKishore Padmanabha * entry [in] - generic table entry 140f634204bSKishore Padmanabha * offset [in] - The offset in bits where the data has to get 141f634204bSKishore Padmanabha * len [in] - The length of the data in bits to be get 142f634204bSKishore Padmanabha * data [out] - pointer to the data to be used for setting the value. 143f634204bSKishore Padmanabha * data_size [in] - The size of data in bytes 144f634204bSKishore Padmanabha * 145f634204bSKishore Padmanabha * returns 0 on success 146f634204bSKishore Padmanabha */ 147f634204bSKishore Padmanabha int32_t 148f634204bSKishore Padmanabha ulp_mapper_gen_tbl_entry_data_get(struct ulp_mapper_gen_tbl_entry *entry, 149f634204bSKishore Padmanabha uint32_t offset, uint32_t len, uint8_t *data, 150f634204bSKishore Padmanabha uint32_t data_size); 151f634204bSKishore Padmanabha 152f634204bSKishore Padmanabha /* 1533fe124d2SKishore Padmanabha * Free the generic table list resource 154f634204bSKishore Padmanabha * 155f634204bSKishore Padmanabha * ulp_ctx [in] - Pointer to the ulp context 1566d160d77SRandy Schacher * fid [in] - The fid the generic table is associated with 157f634204bSKishore Padmanabha * res [in] - Pointer to flow db resource entry 158f634204bSKishore Padmanabha * 159f634204bSKishore Padmanabha * returns 0 on success 160f634204bSKishore Padmanabha */ 161f634204bSKishore Padmanabha int32_t 162f634204bSKishore Padmanabha ulp_mapper_gen_tbl_res_free(struct bnxt_ulp_context *ulp_ctx, 1636d160d77SRandy Schacher uint32_t fid, 164f634204bSKishore Padmanabha struct ulp_flow_db_res_params *res); 165f634204bSKishore Padmanabha 1663fe124d2SKishore Padmanabha /* Free the generic table list entry 1673fe124d2SKishore Padmanabha * 1683fe124d2SKishore Padmanabha * ulp_ctx [in] - Pointer to the ulp context 1693fe124d2SKishore Padmanabha * tbl_idx [in] - Index of the generic table 1703fe124d2SKishore Padmanabha * ckey [in] - Key for the entry in the table 1713fe124d2SKishore Padmanabha * 1723fe124d2SKishore Padmanabha * returns 0 on success 1733fe124d2SKishore Padmanabha */ 1743fe124d2SKishore Padmanabha int32_t 1753fe124d2SKishore Padmanabha ulp_mapper_gen_tbl_entry_free(struct bnxt_ulp_context *ulp_ctx, 1763fe124d2SKishore Padmanabha uint32_t tbl_idx, uint32_t ckey); 1773fe124d2SKishore Padmanabha 1780001cc58SKishore Padmanabha /* 1790001cc58SKishore Padmanabha * Write the generic table list hash entry 1800001cc58SKishore Padmanabha * 1810001cc58SKishore Padmanabha * tbl_list [in] - pointer to the generic table list 1820001cc58SKishore Padmanabha * hash_entry [in] - Hash table entry 1830001cc58SKishore Padmanabha * gen_tbl_ent [out] - generic table entry 1840001cc58SKishore Padmanabha * 1850001cc58SKishore Padmanabha * returns 0 on success. 1860001cc58SKishore Padmanabha */ 1870001cc58SKishore Padmanabha int32_t 1880001cc58SKishore Padmanabha ulp_mapper_gen_tbl_hash_entry_add(struct ulp_mapper_gen_tbl_list *tbl_list, 1890001cc58SKishore Padmanabha struct ulp_gen_hash_entry_params *hash_entry, 1900001cc58SKishore Padmanabha struct ulp_mapper_gen_tbl_entry *gen_tbl_ent); 191dd0191d5SShuanglin Wang 192dd0191d5SShuanglin Wang /* 193dd0191d5SShuanglin Wang * Perform add entry in the simple list 194dd0191d5SShuanglin Wang * 195dd0191d5SShuanglin Wang * tbl_list [in] - pointer to the generic table list 196dd0191d5SShuanglin Wang * key [in] - Key added as index 197dd0191d5SShuanglin Wang * data [in] - data added as result 198dd0191d5SShuanglin Wang * key_index [out] - index to the entry 199dd0191d5SShuanglin Wang * gen_tbl_ent [out] - write the output to the entry 200dd0191d5SShuanglin Wang * 201dd0191d5SShuanglin Wang * returns 0 on success. 202dd0191d5SShuanglin Wang */ 203dd0191d5SShuanglin Wang int32_t 204dd0191d5SShuanglin Wang ulp_gen_tbl_simple_list_add_entry(struct ulp_mapper_gen_tbl_list *tbl_list, 205dd0191d5SShuanglin Wang uint8_t *key, 206dd0191d5SShuanglin Wang uint8_t *data, 207dd0191d5SShuanglin Wang uint32_t *key_index, 208dd0191d5SShuanglin Wang struct ulp_mapper_gen_tbl_entry *ent); 209dd0191d5SShuanglin Wang /* 210*af50070eSKishore Padmanabha * Perform simple list search 211dd0191d5SShuanglin Wang * 212dd0191d5SShuanglin Wang * tbl_list [in] - pointer to the generic table list 213dd0191d5SShuanglin Wang * match_key [in] - Key data that needs to be matched 214*af50070eSKishore Padmanabha * key_idx [out] - returns key index . 215dd0191d5SShuanglin Wang * 216dd0191d5SShuanglin Wang * returns 0 on success. 217dd0191d5SShuanglin Wang */ 218*af50070eSKishore Padmanabha uint32_t 219*af50070eSKishore Padmanabha ulp_gen_tbl_simple_list_search(struct ulp_mapper_gen_tbl_list *tbl_list, 220dd0191d5SShuanglin Wang uint8_t *match_key, 221*af50070eSKishore Padmanabha uint32_t *key_idx); 222f634204bSKishore Padmanabha #endif /* _ULP_EN_TBL_H_ */ 223