1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2019-2020 Broadcom
9 #include "tf_resources.h"
16 /* Internal macro to determine appropriate allocation pools based on
17 * DIRECTION parm, also performs error checking for DIRECTION parm. The
18 * SESSION_POOL and SESSION pointers are set appropriately upon
19 * successful return (the GLOBAL_POOL is used to globally manage
20 * resource allocation and the SESSION_POOL is used to track the
21 * resources that have been allocated to the session)
25 * enum tf_dir direction
26 * struct bitalloc **session_pool
27 * string base_pool_name - used to form pointers to the
28 * appropriate bit allocation
29 * pools, both directions of the
30 * session pools must have same
31 * base name, for example if
32 * POOL_NAME is feat_pool: - the
33 * ptr's to the session pools
34 * are feat_pool_rx feat_pool_tx
36 * int rc - return code
38 * -1 - invalid DIRECTION parm
40 #define TF_RM_GET_POOLS(tfs, direction, session_pool, pool_name, rc) do { \
42 if ((direction) == TF_DIR_RX) { \
43 *(session_pool) = (tfs)->pool_name ## _RX; \
44 } else if ((direction) == TF_DIR_TX) { \
45 *(session_pool) = (tfs)->pool_name ## _TX; \
51 #define TF_RM_GET_POOLS_RX(tfs, session_pool, pool_name) \
52 (*(session_pool) = (tfs)->pool_name ## _RX)
54 #define TF_RM_GET_POOLS_TX(tfs, session_pool, pool_name) \
55 (*(session_pool) = (tfs)->pool_name ## _TX)
58 * Resource query single entry
60 struct tf_rm_query_entry {
61 /** Minimum guaranteed number of elements */
63 /** Maximum non-guaranteed number of elements */
68 * Resource single entry
71 /** Starting index of the allocated resource */
73 /** Number of allocated elements */
78 * Resource query array of HW entities
80 struct tf_rm_hw_query {
81 /** array of HW resource entries */
82 struct tf_rm_query_entry hw_query[TF_RESC_TYPE_HW_MAX];
86 * Resource allocation array of HW entities
88 struct tf_rm_hw_alloc {
89 /** array of HW resource entries */
90 uint16_t hw_num[TF_RESC_TYPE_HW_MAX];
94 * Resource query array of SRAM entities
96 struct tf_rm_sram_query {
97 /** array of SRAM resource entries */
98 struct tf_rm_query_entry sram_query[TF_RESC_TYPE_SRAM_MAX];
102 * Resource allocation array of SRAM entities
104 struct tf_rm_sram_alloc {
105 /** array of SRAM resource entries */
106 uint16_t sram_num[TF_RESC_TYPE_SRAM_MAX];
110 * Resource Manager arrays for a single direction
113 /** array of HW resource entries */
114 struct tf_rm_entry hw_entry[TF_RESC_TYPE_HW_MAX];
115 /** array of SRAM resource entries */
116 struct tf_rm_entry sram_entry[TF_RESC_TYPE_SRAM_MAX];
120 * Resource Manager Database
123 struct tf_rm_resc rx;
124 struct tf_rm_resc tx;
128 * Helper function used to convert HW HCAPI resource type to a string.
131 *tf_hcapi_hw_2_str(enum tf_resource_type_hw hw_type);
134 * Helper function used to convert SRAM HCAPI resource type to a string.
137 *tf_hcapi_sram_2_str(enum tf_resource_type_sram sram_type);
140 * Initializes the Resource Manager and the associated database
141 * entries for HW and SRAM resources. Must be called before any other
142 * Resource Manager functions.
145 * Pointer to TF handle
147 void tf_rm_init(struct tf *tfp);
150 * Allocates and validates both HW and SRAM resources per the NVM
151 * configuration. If any allocation fails all resources for the
152 * session is deallocated.
155 * Pointer to TF handle
158 * - (0) if successful.
159 * - (-EINVAL) on failure.
161 int tf_rm_allocate_validate(struct tf *tfp);
164 * Closes the Resource Manager and frees all allocated resources per
165 * the associated database.
168 * Pointer to TF handle
171 * - (0) if successful.
172 * - (-EINVAL) on failure.
173 * - (-ENOTEMPTY) if resources are not cleaned up before close
175 int tf_rm_close(struct tf *tfp);
179 * Initializes Shadow DB of configuration elements
182 * Pointer to TF Session
187 int tf_rm_shadow_db_init(struct tf_session *tfs);
188 #endif /* TF_SHADOW */
191 * Perform a Session Pool lookup using the Tcam table type.
193 * Function will print error msg if tcam type is unsupported or lookup
197 * Pointer to TF Session
203 * Receive or transmit direction
205 * [in/out] session_pool
209 * 0 - Success will set the **pool
210 * -EOPNOTSUPP - Type is not supported
213 tf_rm_lookup_tcam_type_pool(struct tf_session *tfs,
215 enum tf_tcam_tbl_type type,
216 struct bitalloc **pool);
219 * Perform a Session Pool lookup using the Table type.
221 * Function will print error msg if table type is unsupported or
225 * Pointer to TF Session
231 * Receive or transmit direction
233 * [in/out] session_pool
237 * 0 - Success will set the **pool
238 * -EOPNOTSUPP - Type is not supported
241 tf_rm_lookup_tbl_type_pool(struct tf_session *tfs,
243 enum tf_tbl_type type,
244 struct bitalloc **pool);
247 * Converts the TF Table Type to internal HCAPI_TYPE
250 * Type to be converted
252 * [in/out] hcapi_type
256 * 0 - Success will set the *hcapi_type
257 * -EOPNOTSUPP - Type is not supported
260 tf_rm_convert_tbl_type(enum tf_tbl_type type,
261 uint32_t *hcapi_type);
264 * TF RM Convert of index methods.
266 enum tf_rm_convert_type {
267 /** Adds the base of the Session Pool to the index */
268 TF_RM_CONVERT_ADD_BASE,
269 /** Removes the Session Pool base from the index */
270 TF_RM_CONVERT_RM_BASE
274 * Provides conversion of the Table Type index in relation to the
278 * Pointer to TF Session
281 * Receive or transmit direction
287 * Type of conversion to perform
290 * Index to be converted
292 * [in/out] convert_index
293 * Pointer to the converted index
296 tf_rm_convert_index(struct tf_session *tfs,
298 enum tf_tbl_type type,
299 enum tf_rm_convert_type c_type,
301 uint32_t *convert_index);
303 #endif /* TF_RM_H_ */