}
}
+ if (parms->rx_num_flows_in_k != 0 &&
+ (parms->rx_max_key_sz_in_bits / 8 == 0)) {
+ PMD_DRV_LOG(ERR,
+ "EEM: Rx key size required: %u\n",
+ (parms->rx_max_key_sz_in_bits));
+ return -EINVAL;
+ }
+
+ if (parms->tx_num_flows_in_k != 0 &&
+ (parms->tx_max_key_sz_in_bits / 8 == 0)) {
+ PMD_DRV_LOG(ERR,
+ "EEM: Tx key size required: %u\n",
+ (parms->tx_max_key_sz_in_bits));
+ return -EINVAL;
+ }
/* Rx */
tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[KEY0_TABLE].num_entries =
parms->rx_num_flows_in_k * TF_KILOBYTE;
tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[RECORD_TABLE].num_entries =
parms->rx_num_flows_in_k * TF_KILOBYTE;
tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[RECORD_TABLE].entry_size =
- parms->tx_max_action_entry_sz_in_bits / 8;
+ parms->rx_max_action_entry_sz_in_bits / 8;
tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[EFC_TABLE].num_entries =
0;
/**
* Create External Tbl pool of memory indexes.
*
- * [in] session
- * Pointer to session
* [in] dir
* direction
* [in] tbl_scope_cb
* pointer to the table scope
- * [in] tbl_scope_id
- * id of the table scope
* [in] num_entries
* number of entries to write
* [in] entry_sz_bytes
* - Failure, entry not allocated, out of resources
*/
static int
-tf_create_tbl_pool_external(struct tf_session *session,
- enum tf_dir dir,
+tf_create_tbl_pool_external(enum tf_dir dir,
struct tf_tbl_scope_cb *tbl_scope_cb,
- uint32_t table_scope_id,
uint32_t num_entries,
uint32_t entry_sz_bytes)
-
{
struct tfp_calloc_parms parms;
- uint32_t i, j;
+ uint32_t i;
+ int32_t j;
int rc = 0;
- struct stack *pool = &tbl_scope_cb->ext_pool[dir][TF_EXT_POOL_0];
+ struct stack *pool = &tbl_scope_cb->ext_act_pool[dir];
parms.nitems = num_entries;
parms.size = sizeof(uint32_t);
/* Save the malloced memory address so that it can
* be freed when the table scope is freed.
*/
- tbl_scope_cb->ext_pool_mem[dir][TF_EXT_POOL_0] =
- (uint32_t *)parms.mem_va;
+ tbl_scope_cb->ext_act_pool_mem[dir] = (uint32_t *)parms.mem_va;
- /* Fill pool with indexes
+ /* Fill pool with indexes in reverse
*/
- j = num_entries * entry_sz_bytes - 1;
+ j = (num_entries - 1) * entry_sz_bytes;
for (i = 0; i < num_entries; i++) {
rc = stack_push(pool, j);
if (rc != 0) {
- PMD_DRV_LOG(ERR, "%d TBL: stack failure %s\n",
- dir, strerror(-rc));
+ PMD_DRV_LOG(ERR, "%s TBL: stack failure %s\n",
+ tf_dir_2_str(dir), strerror(-rc));
+ goto cleanup;
+ }
+
+ if (j < 0) {
+ PMD_DRV_LOG(ERR, "%d TBL: invalid offset (%d)\n",
+ dir, j);
goto cleanup;
}
j -= entry_sz_bytes;
dir, strerror(-rc));
goto cleanup;
}
- /* Set the table scope associated with the pool
- */
- session->ext_pool_2_scope[dir][TF_EXT_POOL_0] = table_scope_id;
-
return 0;
cleanup:
tfp_free((void *)parms.mem_va);
/**
* Destroy External Tbl pool of memory indexes.
*
- * [in] session
- * Pointer to session
* [in] dir
* direction
* [in] tbl_scope_cb
*
*/
static void
-tf_destroy_tbl_pool_external(struct tf_session *session,
- enum tf_dir dir,
- struct tf_tbl_scope_cb *tbl_scope_cb)
+tf_destroy_tbl_pool_external(enum tf_dir dir,
+ struct tf_tbl_scope_cb *tbl_scope_cb)
{
- uint32_t *ext_pool_mem =
- tbl_scope_cb->ext_pool_mem[dir][TF_EXT_POOL_0];
+ uint32_t *ext_act_pool_mem =
+ tbl_scope_cb->ext_act_pool_mem[dir];
- tfp_free(ext_pool_mem);
-
- /* Set the table scope associated with the pool
- */
- session->ext_pool_2_scope[dir][TF_EXT_POOL_0] = TF_TBL_SCOPE_INVALID;
+ tfp_free(ext_act_pool_mem);
}
/**
int rc;
uint32_t index;
struct tf_session *tfs;
- uint32_t tbl_scope_id;
struct tf_tbl_scope_cb *tbl_scope_cb;
struct stack *pool;
tfs = (struct tf_session *)(tfp->session->core_data);
- if (parms->type != TF_TBL_TYPE_EXT) {
- PMD_DRV_LOG(ERR,
- "dir:%d, Type not supported, type:%d\n",
- parms->dir,
- parms->type);
- return -EOPNOTSUPP;
- }
-
/* Get the pool info from the table scope
*/
- tbl_scope_id = tfs->ext_pool_2_scope[parms->dir][TF_EXT_POOL_0];
- tbl_scope_cb = tbl_scope_cb_find(tfs, tbl_scope_id);
+ tbl_scope_cb = tbl_scope_cb_find(tfs, parms->tbl_scope_id);
if (tbl_scope_cb == NULL) {
PMD_DRV_LOG(ERR,
- "dir:%d, table scope not allocated\n",
- parms->dir);
+ "%s, table scope not allocated\n",
+ tf_dir_2_str(parms->dir));
return -EINVAL;
}
- pool = &tbl_scope_cb->ext_pool[parms->dir][TF_EXT_POOL_0];
+ pool = &tbl_scope_cb->ext_act_pool[parms->dir];
/* Allocate an element
*/
*/
static int
tf_free_tbl_entry_pool_external(struct tf *tfp,
- struct tf_free_tbl_entry_parms *parms)
+ struct tf_free_tbl_entry_parms *parms)
{
int rc = 0;
struct tf_session *tfs;
uint32_t index;
- uint32_t tbl_scope_id;
struct tf_tbl_scope_cb *tbl_scope_cb;
struct stack *pool;
tfs = (struct tf_session *)(tfp->session->core_data);
- if (parms->type != TF_TBL_TYPE_EXT) {
- PMD_DRV_LOG(ERR,
- "dir:%d, Type not supported, type:%d\n",
- parms->dir,
- parms->type);
- return -EOPNOTSUPP;
- }
-
/* Get the pool info from the table scope
*/
- tbl_scope_id = tfs->ext_pool_2_scope[parms->dir][TF_EXT_POOL_0];
- tbl_scope_cb = tbl_scope_cb_find(tfs, tbl_scope_id);
+ tbl_scope_cb = tbl_scope_cb_find(tfs, parms->tbl_scope_id);
if (tbl_scope_cb == NULL) {
PMD_DRV_LOG(ERR,
- "dir:%d, table scope error\n",
+ "dir:%d, Session info invalid\n",
parms->dir);
return -EINVAL;
}
- pool = &tbl_scope_cb->ext_pool[parms->dir][TF_EXT_POOL_0];
+ pool = &tbl_scope_cb->ext_act_pool[parms->dir];
index = parms->idx;
return rc;
}
-/* API defined in tf_tbl.h */
-void
-tf_init_tbl_pool(struct tf_session *session)
-{
- enum tf_dir dir;
-
- for (dir = 0; dir < TF_DIR_MAX; dir++) {
- session->ext_pool_2_scope[dir][TF_EXT_POOL_0] =
- TF_TBL_SCOPE_INVALID;
- }
-}
-
/* API defined in tf_em.h */
struct tf_tbl_scope_cb *
tbl_scope_cb_find(struct tf_session *session,
for (dir = 0; dir < TF_DIR_MAX; dir++) {
/* Free associated external pools
*/
- tf_destroy_tbl_pool_external(session,
- dir,
+ tf_destroy_tbl_pool_external(dir,
tbl_scope_cb);
tf_msg_em_op(tfp,
dir,
* Initially, this is a single fixed size pool for all external
* actions related to a single table scope.
*/
- rc = tf_create_tbl_pool_external(session,
- dir,
- tbl_scope_cb,
- index,
- TF_EXT_POOL_ENTRY_CNT,
- TF_EXT_POOL_ENTRY_SZ_BYTES);
+ rc = tf_create_tbl_pool_external(dir,
+ tbl_scope_cb,
+ em_tables[RECORD_TABLE].num_entries,
+ em_tables[RECORD_TABLE].entry_size);
if (rc) {
PMD_DRV_LOG(ERR,
"%d TBL: Unable to allocate idx pools %s\n",
if (parms->type == TF_TBL_TYPE_EXT) {
void *base_addr;
- uint32_t offset = TF_ACT_REC_INDEX_2_OFFSET(parms->idx);
+ uint32_t offset = parms->idx;
uint32_t tbl_scope_id;
session = (struct tf_session *)(tfp->session->core_data);
- tbl_scope_id =
- session->ext_pool_2_scope[parms->dir][TF_EXT_POOL_0];
+ tbl_scope_id = parms->tbl_scope_id;
if (tbl_scope_id == TF_TBL_SCOPE_INVALID) {
PMD_DRV_LOG(ERR,
/* Get the table scope control block associated with the
* external pool
*/
-
tbl_scope_cb = tbl_scope_cb_find(session, tbl_scope_id);
if (tbl_scope_cb == NULL)