/** Table scope array */
struct tf_tbl_scope_cb tbl_scopes[TF_NUM_TBL_SCOPE];
+/** Table scope reversal table
+ *
+ * Table scope are allocated from 15 to 0 within HCAPI RM. Because of the
+ * association between PFs and legacy table scopes, reverse table scope ids.
+ * 15 indicates 0, 14 indicates 1, etc... The application will only see the 0
+ * based number. The firmware will only use the 0 based number. Only HCAPI RM
+ * and Truflow RM believe the number is 15. When HCAPI RM support allocation
+ * from low to high is supported, this adjust function can be removed.
+ */
+const uint32_t tbl_scope_reverse[TF_NUM_TBL_SCOPE] = {
+ 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
+
+static uint32_t
+tf_tbl_scope_adjust(uint32_t tbl_scope_id)
+{
+ if (tbl_scope_id < TF_NUM_TBL_SCOPE)
+ return tbl_scope_reverse[tbl_scope_id];
+ else
+ return TF_TBL_SCOPE_INVALID;
+};
+
+
/* API defined in tf_em.h */
struct tf_tbl_scope_cb *
tbl_scope_cb_find(uint32_t tbl_scope_id)
{
int i;
- struct tf_rm_is_allocated_parms parms;
+ struct tf_rm_is_allocated_parms parms = { 0 };
int allocated;
+ uint32_t rm_tbl_scope_id;
+
+ rm_tbl_scope_id = tf_tbl_scope_adjust(tbl_scope_id);
+
+ if (rm_tbl_scope_id == TF_TBL_SCOPE_INVALID)
+ return NULL;
/* Check that id is valid */
parms.rm_db = eem_db[TF_DIR_RX];
parms.db_index = TF_EM_TBL_TYPE_TBL_SCOPE;
- parms.index = tbl_scope_id;
+ parms.index = rm_tbl_scope_id;
parms.allocated = &allocated;
i = tf_rm_is_allocated(&parms);
return NULL;
}
+int tf_tbl_scope_alloc(uint32_t *tbl_scope_id)
+{
+ int rc;
+ struct tf_rm_allocate_parms parms = { 0 };
+ uint32_t rm_tbl_scope_id;
+ uint32_t usr_tbl_scope_id = TF_TBL_SCOPE_INVALID;
+
+ /* Get Table Scope control block from the session pool */
+ parms.rm_db = eem_db[TF_DIR_RX];
+ parms.db_index = TF_EM_TBL_TYPE_TBL_SCOPE;
+ parms.index = &rm_tbl_scope_id;
+
+ rc = tf_rm_allocate(&parms);
+ if (rc) {
+ TFP_DRV_LOG(ERR,
+ "Failed to allocate table scope rc:%s\n",
+ strerror(-rc));
+ return rc;
+ }
+
+ usr_tbl_scope_id = tf_tbl_scope_adjust(rm_tbl_scope_id);
+
+ if (usr_tbl_scope_id == TF_TBL_SCOPE_INVALID) {
+ TFP_DRV_LOG(ERR,
+ "Invalid table scope allocated id:%d\n",
+ (int)rm_tbl_scope_id);
+ return -EINVAL;
+ }
+ *tbl_scope_id = usr_tbl_scope_id;
+ return 0;
+};
+
+int tf_tbl_scope_free(uint32_t tbl_scope_id)
+{
+ struct tf_rm_free_parms parms = { 0 };
+ uint32_t rm_tbl_scope_id;
+ uint32_t rc;
+
+ rm_tbl_scope_id = tf_tbl_scope_adjust(tbl_scope_id);
+
+ if (rm_tbl_scope_id == TF_TBL_SCOPE_INVALID) {
+ TFP_DRV_LOG(ERR,
+ "Invalid table scope allocated id:%d\n",
+ (int)tbl_scope_id);
+ return -EINVAL;
+ }
+
+ parms.rm_db = eem_db[TF_DIR_RX];
+ parms.db_index = TF_EM_TBL_TYPE_TBL_SCOPE;
+ parms.index = rm_tbl_scope_id;
+
+ rc = tf_rm_free(&parms);
+ return rc;
+};
+
int
tf_create_tbl_pool_external(enum tf_dir dir,
struct tf_tbl_scope_cb *tbl_scope_cb,
uint64_t big_hash;
int rc;
-#if (TF_EM_SYSMEM_DELAY_EXPORT == 1)
- if (!tbl_scope_cb->valid) {
- rc = offload_system_mmap(tbl_scope_cb);
-
- if (rc) {
- struct tf_rm_free_parms fparms = { 0 };
-
- TFP_DRV_LOG(ERR,
- "System alloc mmap failed\n");
- /* Free Table control block */
- fparms.rm_db = eem_db[TF_DIR_RX];
- fparms.db_index = TF_EM_TBL_TYPE_TBL_SCOPE;
- fparms.index = parms->tbl_scope_id;
- tf_rm_free(&fparms);
- return -EINVAL;
- }
-
- tbl_scope_cb->valid = true;
- }
-#endif
/* Get mask to use on hash */
mask = tf_em_get_key_mask(tbl_scope_cb->em_ctx_info[parms->dir].em_tables[TF_KEY0_TABLE].num_entries);
return -EINVAL;
}
-#if (TF_EM_SYSMEM_DELAY_EXPORT == 1)
- if (!tbl_scope_cb->valid) {
- rc = offload_system_mmap(tbl_scope_cb);
-
- if (rc) {
- struct tf_rm_free_parms fparms = { 0 };
-
- TFP_DRV_LOG(ERR,
- "System alloc mmap failed\n");
- /* Free Table control block */
- fparms.rm_db = eem_db[TF_DIR_RX];
- fparms.db_index = TF_EM_TBL_TYPE_TBL_SCOPE;
- fparms.index = parms->tbl_scope_id;
- tf_rm_free(&fparms);
- return -EINVAL;
- }
-
- tbl_scope_cb->valid = true;
- }
-#endif
-
op.opcode = HCAPI_CFA_HWOPS_PUT;
key_tbl.base0 =
(uint8_t *)&tbl_scope_cb->em_ctx_info[parms->dir].em_tables[TF_RECORD_TABLE];