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