xref: /dpdk/drivers/net/bnxt/tf_core/tf_tbl.h (revision 68a03efeed657e6e05f281479b33b51102797e15)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2019-2021 Broadcom
3  * All rights reserved.
4  */
5 
6 #ifndef TF_TBL_TYPE_H_
7 #define TF_TBL_TYPE_H_
8 
9 #include "tf_core.h"
10 #include "stack.h"
11 
12 struct tf;
13 
14 /**
15  * The Table module provides processing of Internal TF table types.
16  */
17 
18 /**
19  * Table scope control block content
20  */
21 struct tf_em_caps {
22 	uint32_t flags;
23 	uint32_t supported;
24 	uint32_t max_entries_supported;
25 	uint16_t key_entry_size;
26 	uint16_t record_entry_size;
27 	uint16_t efc_entry_size;
28 };
29 
30 /** Invalid table scope id */
31 #define TF_TBL_SCOPE_INVALID 0xffffffff
32 
33 /**
34  * Table Scope Control Block
35  *
36  * Holds private data for a table scope. Only one instance of a table
37  * scope with Internal EM is supported.
38  */
39 struct tf_tbl_scope_cb {
40 	uint32_t tbl_scope_id;
41        /** The pf or parent pf of the vf used for table scope creation
42 	*/
43 	uint16_t pf;
44 	int index;
45 	struct hcapi_cfa_em_ctx_mem_info em_ctx_info[TF_DIR_MAX];
46 	struct tf_em_caps em_caps[TF_DIR_MAX];
47 	struct stack ext_act_pool[TF_DIR_MAX];
48 	uint32_t *ext_act_pool_mem[TF_DIR_MAX];
49 };
50 
51 /**
52  * Table configuration parameters
53  */
54 struct tf_tbl_cfg_parms {
55 	/**
56 	 * Number of table types in each of the configuration arrays
57 	 */
58 	uint16_t num_elements;
59 	/**
60 	 * Table Type element configuration array
61 	 */
62 	struct tf_rm_element_cfg *cfg;
63 	/**
64 	 * Shadow table type configuration array
65 	 */
66 	struct tf_shadow_tbl_cfg *shadow_cfg;
67 	/**
68 	 * Boolean controlling the request shadow copy.
69 	 */
70 	bool shadow_copy;
71 	/**
72 	 * Session resource allocations
73 	 */
74 	struct tf_session_resources *resources;
75 };
76 
77 /**
78  * Table allocation parameters
79  */
80 struct tf_tbl_alloc_parms {
81 	/**
82 	 * [in] Receive or transmit direction
83 	 */
84 	enum tf_dir dir;
85 	/**
86 	 * [in] Type of the allocation
87 	 */
88 	enum tf_tbl_type type;
89 	/**
90 	 * [in] Table scope identifier (ignored unless TF_TBL_TYPE_EXT)
91 	 */
92 	uint32_t tbl_scope_id;
93 	/**
94 	 * [out] Idx of allocated entry or found entry (if search_enable)
95 	 */
96 	uint32_t *idx;
97 };
98 
99 /**
100  * Table free parameters
101  */
102 struct tf_tbl_free_parms {
103 	/**
104 	 * [in] Receive or transmit direction
105 	 */
106 	enum tf_dir dir;
107 	/**
108 	 * [in] Type of the allocation type
109 	 */
110 	enum tf_tbl_type type;
111 	/**
112 	 * [in] Table scope identifier (ignored unless TF_TBL_TYPE_EXT)
113 	 */
114 	uint32_t tbl_scope_id;
115 	/**
116 	 * [in] Index to free
117 	 */
118 	uint32_t idx;
119 	/**
120 	 * [out] Reference count after free, only valid if session has been
121 	 * created with shadow_copy.
122 	 */
123 	uint16_t ref_cnt;
124 };
125 
126 /**
127  * Table allocate search parameters
128  */
129 struct tf_tbl_alloc_search_parms {
130 	/**
131 	 * [in] Receive or transmit direction
132 	 */
133 	enum tf_dir dir;
134 	/**
135 	 * [in] Type of the allocation
136 	 */
137 	enum tf_tbl_type type;
138 	/**
139 	 * [in] Table scope identifier (ignored unless TF_TBL_TYPE_EXT)
140 	 */
141 	uint32_t tbl_scope_id;
142 	/**
143 	 * [in] Result data to search for
144 	 */
145 	uint8_t *result;
146 	/**
147 	 * [in] Result data size in bytes
148 	 */
149 	uint16_t result_sz_in_bytes;
150 	/**
151 	 * [in] Whether or not to allocate on MISS, 1 is allocate.
152 	 */
153 	uint8_t alloc;
154 	/**
155 	 * [out] If search_enable, set if matching entry found
156 	 */
157 	uint8_t hit;
158 	/**
159 	 * [out] The status of the search (REJECT, MISS, HIT)
160 	 */
161 	enum tf_search_status search_status;
162 	/**
163 	 * [out] Current ref count after allocation
164 	 */
165 	uint16_t ref_cnt;
166 	/**
167 	 * [out] Idx of allocated entry or found entry
168 	 */
169 	uint32_t idx;
170 };
171 
172 /**
173  * Table set parameters
174  */
175 struct tf_tbl_set_parms {
176 	/**
177 	 * [in] Receive or transmit direction
178 	 */
179 	enum tf_dir dir;
180 	/**
181 	 * [in] Type of object to set
182 	 */
183 	enum tf_tbl_type type;
184 	/**
185 	 * [in] Table scope identifier (ignored unless TF_TBL_TYPE_EXT)
186 	 */
187 	uint32_t tbl_scope_id;
188 	/**
189 	 * [in] Entry data
190 	 */
191 	uint8_t *data;
192 	/**
193 	 * [in] Entry size
194 	 */
195 	uint16_t data_sz_in_bytes;
196 	/**
197 	 * [in] Entry index to write to
198 	 */
199 	uint32_t idx;
200 };
201 
202 /**
203  * Table get parameters
204  */
205 struct tf_tbl_get_parms {
206 	/**
207 	 * [in] Receive or transmit direction
208 	 */
209 	enum tf_dir dir;
210 	/**
211 	 * [in] Type of object to get
212 	 */
213 	enum tf_tbl_type type;
214 	/**
215 	 * [out] Entry data
216 	 */
217 	uint8_t *data;
218 	/**
219 	 * [out] Entry size
220 	 */
221 	uint16_t data_sz_in_bytes;
222 	/**
223 	 * [in] Entry index to read
224 	 */
225 	uint32_t idx;
226 };
227 
228 /**
229  * Table get bulk parameters
230  */
231 struct tf_tbl_get_bulk_parms {
232 	/**
233 	 * [in] Receive or transmit direction
234 	 */
235 	enum tf_dir dir;
236 	/**
237 	 * [in] Type of object to get
238 	 */
239 	enum tf_tbl_type type;
240 	/**
241 	 * [in] Starting index to read from
242 	 */
243 	uint32_t starting_idx;
244 	/**
245 	 * [in] Number of sequential entries
246 	 */
247 	uint16_t num_entries;
248 	/**
249 	 * [in] Size of the single entry
250 	 */
251 	uint16_t entry_sz_in_bytes;
252 	/**
253 	 * [out] Host physical address, where the data
254 	 * will be copied to by the firmware.
255 	 * Use tfp_calloc() API and mem_pa
256 	 * variable of the tfp_calloc_parms
257 	 * structure for the physical address.
258 	 */
259 	uint64_t physical_mem_addr;
260 };
261 
262 /**
263  * @page tbl Table
264  *
265  * @ref tf_tbl_bind
266  *
267  * @ref tf_tbl_unbind
268  *
269  * @ref tf_tbl_alloc
270  *
271  * @ref tf_tbl_free
272  *
273  * @ref tf_tbl_alloc_search
274  *
275  * @ref tf_tbl_set
276  *
277  * @ref tf_tbl_get
278  *
279  * @ref tf_tbl_bulk_get
280  */
281 
282 /**
283  * Initializes the Table module with the requested DBs. Must be
284  * invoked as the first thing before any of the access functions.
285  *
286  * [in] tfp
287  *   Pointer to TF handle, used for HCAPI communication
288  *
289  * [in] parms
290  *   Pointer to Table configuration parameters
291  *
292  * Returns
293  *   - (0) if successful.
294  *   - (-EINVAL) on failure.
295  */
296 int tf_tbl_bind(struct tf *tfp,
297 		struct tf_tbl_cfg_parms *parms);
298 
299 /**
300  * Cleans up the private DBs and releases all the data.
301  *
302  * [in] tfp
303  *   Pointer to TF handle, used for HCAPI communication
304  *
305  * [in] parms
306  *   Pointer to parameters
307  *
308  * Returns
309  *   - (0) if successful.
310  *   - (-EINVAL) on failure.
311  */
312 int tf_tbl_unbind(struct tf *tfp);
313 
314 /**
315  * Allocates the requested table type from the internal RM DB.
316  *
317  * [in] tfp
318  *   Pointer to TF handle, used for HCAPI communication
319  *
320  * [in] parms
321  *   Pointer to Table allocation parameters
322  *
323  * Returns
324  *   - (0) if successful.
325  *   - (-EINVAL) on failure.
326  */
327 int tf_tbl_alloc(struct tf *tfp,
328 		 struct tf_tbl_alloc_parms *parms);
329 
330 /**
331  * Free's the requested table type and returns it to the DB. If shadow
332  * DB is enabled its searched first and if found the element refcount
333  * is decremented. If refcount goes to 0 then its returned to the
334  * table type DB.
335  *
336  * [in] tfp
337  *   Pointer to TF handle, used for HCAPI communication
338  *
339  * [in] parms
340  *   Pointer to Table free parameters
341  *
342  * Returns
343  *   - (0) if successful.
344  *   - (-EINVAL) on failure.
345  */
346 int tf_tbl_free(struct tf *tfp,
347 		struct tf_tbl_free_parms *parms);
348 
349 /**
350  * Supported if Shadow DB is configured. Searches the Shadow DB for
351  * any matching element. If found the refcount in the shadow DB is
352  * updated accordingly. If not found a new element is allocated and
353  * installed into the shadow DB.
354  *
355  * [in] tfp
356  *   Pointer to TF handle, used for HCAPI communication
357  *
358  * [in] parms
359  *   Pointer to parameters
360  *
361  * Returns
362  *   - (0) if successful.
363  *   - (-EINVAL) on failure.
364  */
365 int tf_tbl_alloc_search(struct tf *tfp,
366 			struct tf_tbl_alloc_search_parms *parms);
367 
368 /**
369  * Configures the requested element by sending a firmware request which
370  * then installs it into the device internal structures.
371  *
372  * [in] tfp
373  *   Pointer to TF handle, used for HCAPI communication
374  *
375  * [in] parms
376  *   Pointer to Table set parameters
377  *
378  * Returns
379  *   - (0) if successful.
380  *   - (-EINVAL) on failure.
381  */
382 int tf_tbl_set(struct tf *tfp,
383 	       struct tf_tbl_set_parms *parms);
384 
385 /**
386  * Retrieves the requested element by sending a firmware request to get
387  * the element.
388  *
389  * [in] tfp
390  *   Pointer to TF handle, used for HCAPI communication
391  *
392  * [in] parms
393  *   Pointer to Table get parameters
394  *
395  * Returns
396  *   - (0) if successful.
397  *   - (-EINVAL) on failure.
398  */
399 int tf_tbl_get(struct tf *tfp,
400 	       struct tf_tbl_get_parms *parms);
401 
402 /**
403  * Retrieves bulk block of elements by sending a firmware request to
404  * get the elements.
405  *
406  * [in] tfp
407  *   Pointer to TF handle, used for HCAPI communication
408  *
409  * [in] parms
410  *   Pointer to Table get bulk parameters
411  *
412  * Returns
413  *   - (0) if successful.
414  *   - (-EINVAL) on failure.
415  */
416 int tf_tbl_bulk_get(struct tf *tfp,
417 		    struct tf_tbl_get_bulk_parms *parms);
418 
419 #endif /* TF_TBL_TYPE_H */
420