From 229f98639605e7a856932baa7cf4fa473f6eb3b7 Mon Sep 17 00:00:00 2001 From: Farah Smith Date: Sat, 25 Apr 2020 09:17:23 +0530 Subject: [PATCH] net/bnxt: update external action record pool - Added support variable sized action records - Additional error checking on table scope params - Single external pool supported per direction - Changed to return action record pointer - Allows action pool to fully utilize the number of flows Signed-off-by: Farah Smith Signed-off-by: Mike Baucom Reviewed-by: Peter Spreadborough Reviewed-by: Kishore Padmanabha --- drivers/net/bnxt/tf_core/tf_core.c | 3 - drivers/net/bnxt/tf_core/tf_core.h | 15 +-- drivers/net/bnxt/tf_core/tf_rm.c | 3 - drivers/net/bnxt/tf_core/tf_session.h | 6 -- drivers/net/bnxt/tf_core/tf_tbl.c | 136 ++++++++++---------------- drivers/net/bnxt/tf_core/tf_tbl.h | 4 +- 6 files changed, 62 insertions(+), 105 deletions(-) diff --git a/drivers/net/bnxt/tf_core/tf_core.c b/drivers/net/bnxt/tf_core/tf_core.c index fc7d6381f2..cf9f36adb2 100644 --- a/drivers/net/bnxt/tf_core/tf_core.c +++ b/drivers/net/bnxt/tf_core/tf_core.c @@ -175,9 +175,6 @@ tf_open_session(struct tf *tfp, /* Setup hash seeds */ tf_seeds_init(session); - /* Initialize external pool data structures */ - tf_init_tbl_pool(session); - session->ref_count++; /* Return session ID */ diff --git a/drivers/net/bnxt/tf_core/tf_core.h b/drivers/net/bnxt/tf_core/tf_core.h index 6a1f3a1069..4b60973ee8 100644 --- a/drivers/net/bnxt/tf_core/tf_core.h +++ b/drivers/net/bnxt/tf_core/tf_core.h @@ -83,7 +83,7 @@ enum tf_mem { /** EEM record AR helper * - * Helpers to handle the Action Record Pointer in the EEM Record Entry. + * Helper to handle the Action Record Pointer in the EEM Record Entry. * * Convert absolute offset to action record pointer in EEM record entry * Convert action record pointer in EEM record entry to absolute offset @@ -91,8 +91,6 @@ enum tf_mem { #define TF_ACT_REC_OFFSET_2_PTR(offset) ((offset) >> 4) #define TF_ACT_REC_PTR_2_OFFSET(offset) ((offset) << 4) -#define TF_ACT_REC_INDEX_2_OFFSET(idx) ((idx) << 9) - /* * Helper Macros */ @@ -943,8 +941,6 @@ enum tf_tbl_type { * scope. Internal types are not. */ TF_TBL_TYPE_EXT, - /** Future - external pool of size0 entries */ - TF_TBL_TYPE_EXT_0, TF_TBL_TYPE_MAX }; @@ -959,6 +955,10 @@ struct tf_alloc_tbl_entry_parms { * [in] Type of the allocation */ enum tf_tbl_type type; + /** + * [in] Table scope identifier (ignored unless TF_TBL_TYPE_EXT) + */ + uint32_t tbl_scope_id; /** * [in] Enable search for matching entry. If the table type is * internal the shadow copy will be searched before @@ -1028,6 +1028,10 @@ struct tf_free_tbl_entry_parms { * [in] Type of the allocation type */ enum tf_tbl_type type; + /** + * [in] Table scope identifier (ignored unless TF_TBL_TYPE_EXT) + */ + uint32_t tbl_scope_id; /** * [in] Index to free */ @@ -1070,7 +1074,6 @@ int tf_free_tbl_entry(struct tf *tfp, struct tf_set_tbl_entry_parms { /** * [in] Table scope identifier - * */ uint32_t tbl_scope_id; /** diff --git a/drivers/net/bnxt/tf_core/tf_rm.c b/drivers/net/bnxt/tf_core/tf_rm.c index a5e96f29bb..38b1e71cd3 100644 --- a/drivers/net/bnxt/tf_core/tf_rm.c +++ b/drivers/net/bnxt/tf_core/tf_rm.c @@ -3104,7 +3104,6 @@ tf_rm_lookup_tbl_type_pool(struct tf_session *tfs, break; /* No bitalloc pools for these types */ case TF_TBL_TYPE_EXT: - case TF_TBL_TYPE_EXT_0: default: break; } @@ -3211,7 +3210,6 @@ tf_rm_convert_tbl_type(enum tf_tbl_type type, case TF_TBL_TYPE_ACT_MODIFY_IPV6_SRC: case TF_TBL_TYPE_VNIC_SVIF: case TF_TBL_TYPE_EXT: /* No pools for this type */ - case TF_TBL_TYPE_EXT_0: /* No pools for this type */ default: *hcapi_type = -1; rc = -EOPNOTSUPP; @@ -3277,7 +3275,6 @@ tf_rm_convert_index(struct tf_session *tfs, /* Not yet supported */ case TF_TBL_TYPE_VNIC_SVIF: case TF_TBL_TYPE_EXT: /* No pools for this type */ - case TF_TBL_TYPE_EXT_0: /* No pools for this type */ default: return -EOPNOTSUPP; } diff --git a/drivers/net/bnxt/tf_core/tf_session.h b/drivers/net/bnxt/tf_core/tf_session.h index fed34f1467..50ef2d530c 100644 --- a/drivers/net/bnxt/tf_core/tf_session.h +++ b/drivers/net/bnxt/tf_core/tf_session.h @@ -289,12 +289,6 @@ struct tf_session { /** Table scope array */ struct tf_tbl_scope_cb tbl_scopes[TF_NUM_TBL_SCOPE]; - - /** Each external pool is associated with a single table scope - * For each external pool store the associated table scope in - * this data structure - */ - uint32_t ext_pool_2_scope[TF_DIR_MAX][TF_EXT_POOL_CNT_MAX]; }; #endif /* _TF_SESSION_H_ */ diff --git a/drivers/net/bnxt/tf_core/tf_tbl.c b/drivers/net/bnxt/tf_core/tf_tbl.c index 17df274355..236affe25c 100644 --- a/drivers/net/bnxt/tf_core/tf_tbl.c +++ b/drivers/net/bnxt/tf_core/tf_tbl.c @@ -701,6 +701,21 @@ tf_em_validate_num_entries(struct tf_tbl_scope_cb *tbl_scope_cb, } } + 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; @@ -715,7 +730,7 @@ tf_em_validate_num_entries(struct tf_tbl_scope_cb *tbl_scope_cb, 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; @@ -954,14 +969,10 @@ tf_free_tbl_entry_shadow(struct tf_session *tfs, /** * 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 @@ -973,18 +984,16 @@ tf_free_tbl_entry_shadow(struct tf_session *tfs, * - 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); @@ -1009,18 +1018,23 @@ tf_create_tbl_pool_external(struct tf_session *session, /* 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; @@ -1032,10 +1046,6 @@ tf_create_tbl_pool_external(struct tf_session *session, 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); @@ -1045,8 +1055,6 @@ cleanup: /** * Destroy External Tbl pool of memory indexes. * - * [in] session - * Pointer to session * [in] dir * direction * [in] tbl_scope_cb @@ -1054,18 +1062,13 @@ cleanup: * */ 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); } /** @@ -1088,7 +1091,6 @@ tf_alloc_tbl_entry_pool_external(struct tf *tfp, 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; @@ -1107,26 +1109,17 @@ tf_alloc_tbl_entry_pool_external(struct tf *tfp, 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 */ @@ -1246,12 +1239,11 @@ tf_alloc_tbl_entry_pool_internal(struct tf *tfp, */ 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; @@ -1270,26 +1262,17 @@ tf_free_tbl_entry_pool_external(struct tf *tfp, 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; @@ -1390,18 +1373,6 @@ tf_free_tbl_entry_pool_internal(struct tf *tfp, 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, @@ -1447,8 +1418,7 @@ tf_free_eem_tbl_scope_cb(struct tf *tfp, 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, @@ -1551,12 +1521,10 @@ tf_alloc_eem_tbl_scope(struct tf *tfp, * 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", @@ -1600,13 +1568,12 @@ tf_set_tbl_entry(struct tf *tfp, 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, @@ -1618,7 +1585,6 @@ tf_set_tbl_entry(struct tf *tfp, /* 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) diff --git a/drivers/net/bnxt/tf_core/tf_tbl.h b/drivers/net/bnxt/tf_core/tf_tbl.h index 5d3ea71f4a..bdc6288ee1 100644 --- a/drivers/net/bnxt/tf_core/tf_tbl.h +++ b/drivers/net/bnxt/tf_core/tf_tbl.h @@ -72,8 +72,8 @@ struct tf_tbl_scope_cb { int index; struct tf_em_ctx_mem_info em_ctx_info[TF_DIR_MAX]; struct tf_em_caps em_caps[TF_DIR_MAX]; - struct stack ext_pool[TF_DIR_MAX][TF_EXT_POOL_CNT_MAX]; - uint32_t *ext_pool_mem[TF_DIR_MAX][TF_EXT_POOL_CNT_MAX]; + struct stack ext_act_pool[TF_DIR_MAX]; + uint32_t *ext_act_pool_mem[TF_DIR_MAX]; }; /** Hardware Page sizes supported for EEM: 4K, 8K, 64K, 256K, 1M, 2M, 4M, 1G. -- 2.20.1