From: Mike Baucom Date: Sun, 30 May 2021 08:59:22 +0000 (+0530) Subject: net/bnxt: process resource lists before session open X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=6b70a9563c6f3fdbdb082375fc324f1fa2831507;p=dpdk.git net/bnxt: process resource lists before session open Shared sessions require both named and unnamed resources to be requested during a tf_open_session. ULP uses named resources for global resources that are pre-allocated and remain through the life of the application. Unnamed resources are generally per flow resources and allocated on demand. The sum of both named and unnamed resources must be requested when initializing the session. The ulp_init now processes both lists prior to calling tf_open_session for both shared and regular sessions. Signed-off-by: Mike Baucom Signed-off-by: Venkat Duvvuru Reviewed-by: Randy Schacher Reviewed-by: Ajit Khaparde --- diff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c index 632334674c..98b86f2c52 100644 --- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c +++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c @@ -77,6 +77,15 @@ bnxt_ulp_app_cap_list_get(uint32_t *num_entries) return ulp_app_cap_info_list; } +static struct bnxt_ulp_resource_resv_info * +bnxt_ulp_app_resource_resv_list_get(uint32_t *num_entries) +{ + if (num_entries == NULL) + return NULL; + *num_entries = BNXT_ULP_APP_RESOURCE_RESV_LIST_MAX_SZ; + return ulp_app_resource_resv_list; +} + struct bnxt_ulp_resource_resv_info * bnxt_ulp_resource_resv_list_get(uint32_t *num_entries) { @@ -96,23 +105,18 @@ bnxt_ulp_app_glb_resource_info_list_get(uint32_t *num_entries) } static int32_t -bnxt_ulp_tf_resources_get(struct bnxt_ulp_context *ulp_ctx, - struct tf_session_resources *res) +bnxt_ulp_named_resources_calc(struct bnxt_ulp_context *ulp_ctx, + struct bnxt_ulp_glb_resource_info *info, + uint32_t num, + struct tf_session_resources *res) { - struct bnxt_ulp_resource_resv_info *info = NULL; - uint32_t dev_id, res_type, i, num; + uint32_t dev_id, res_type, i; enum tf_dir dir; uint8_t app_id; int32_t rc = 0; - if (!ulp_ctx || !res) { - BNXT_TF_DBG(ERR, "Invalid arguments to get resources.\n"); - return -EINVAL; - } - - info = bnxt_ulp_resource_resv_list_get(&num); - if (!info) { - BNXT_TF_DBG(ERR, "Unable to get resource reservation list.\n"); + if (ulp_ctx == NULL || info == NULL || res == NULL || num == 0) { + BNXT_TF_DBG(ERR, "Invalid parms to named resources calc.\n"); return -EINVAL; } @@ -124,31 +128,33 @@ bnxt_ulp_tf_resources_get(struct bnxt_ulp_context *ulp_ctx, rc = bnxt_ulp_cntxt_dev_id_get(ulp_ctx, &dev_id); if (rc) { - BNXT_TF_DBG(ERR, "Unable to get the device id from ulp.\n"); + BNXT_TF_DBG(ERR, "Unable to get the dev id from ulp.\n"); return -EINVAL; } for (i = 0; i < num; i++) { - if (app_id != info[i].app_id || dev_id != info[i].device_id) + if (dev_id != info[i].device_id || app_id != info[i].app_id) continue; dir = info[i].direction; res_type = info[i].resource_type; switch (info[i].resource_func) { case BNXT_ULP_RESOURCE_FUNC_IDENTIFIER: - res->ident_cnt[dir].cnt[res_type] = info[i].count; + res->ident_cnt[dir].cnt[res_type]++; break; case BNXT_ULP_RESOURCE_FUNC_INDEX_TABLE: - res->tbl_cnt[dir].cnt[res_type] = info[i].count; + res->tbl_cnt[dir].cnt[res_type]++; break; case BNXT_ULP_RESOURCE_FUNC_TCAM_TABLE: - res->tcam_cnt[dir].cnt[res_type] = info[i].count; + res->tcam_cnt[dir].cnt[res_type]++; break; case BNXT_ULP_RESOURCE_FUNC_EM_TABLE: - res->em_cnt[dir].cnt[res_type] = info[i].count; + res->em_cnt[dir].cnt[res_type]++; break; default: - break; + BNXT_TF_DBG(ERR, "Unknown resource func (0x%x)\n,", + info[i].resource_func); + continue; } } @@ -156,14 +162,20 @@ bnxt_ulp_tf_resources_get(struct bnxt_ulp_context *ulp_ctx, } static int32_t -bnxt_ulp_tf_shared_session_resources_get(struct bnxt_ulp_context *ulp_ctx, - struct tf_session_resources *res) +bnxt_ulp_unnamed_resources_calc(struct bnxt_ulp_context *ulp_ctx, + struct bnxt_ulp_resource_resv_info *info, + uint32_t num, + struct tf_session_resources *res) { - struct bnxt_ulp_glb_resource_info *info; - uint32_t dev_id, res_type, i, num; + uint32_t dev_id, res_type, i; enum tf_dir dir; uint8_t app_id; - int32_t rc; + int32_t rc = 0; + + if (ulp_ctx == NULL || res == NULL || info == NULL || num == 0) { + BNXT_TF_DBG(ERR, "Invalid arguments to get resources.\n"); + return -EINVAL; + } rc = bnxt_ulp_cntxt_app_id_get(ulp_ctx, &app_id); if (rc) { @@ -173,48 +185,108 @@ bnxt_ulp_tf_shared_session_resources_get(struct bnxt_ulp_context *ulp_ctx, rc = bnxt_ulp_cntxt_dev_id_get(ulp_ctx, &dev_id); if (rc) { - BNXT_TF_DBG(ERR, "Unable to get device id from ulp.\n"); + BNXT_TF_DBG(ERR, "Unable to get the dev id from ulp.\n"); return -EINVAL; } - /* Make sure the resources are zero before accumulating. */ - memset(res, 0, sizeof(struct tf_session_resources)); - - /* Get the list and tally the resources. */ - info = bnxt_ulp_app_glb_resource_info_list_get(&num); - if (!info) { - BNXT_TF_DBG(ERR, "Unable to get app global resource list\n"); - return -EINVAL; - } for (i = 0; i < num; i++) { - if (dev_id != info[i].device_id || app_id != info[i].app_id) + if (app_id != info[i].app_id || dev_id != info[i].device_id) continue; dir = info[i].direction; res_type = info[i].resource_type; switch (info[i].resource_func) { case BNXT_ULP_RESOURCE_FUNC_IDENTIFIER: - res->ident_cnt[dir].cnt[res_type]++; + res->ident_cnt[dir].cnt[res_type] = info[i].count; break; case BNXT_ULP_RESOURCE_FUNC_INDEX_TABLE: - res->tbl_cnt[dir].cnt[res_type]++; + res->tbl_cnt[dir].cnt[res_type] = info[i].count; break; case BNXT_ULP_RESOURCE_FUNC_TCAM_TABLE: - res->tcam_cnt[dir].cnt[res_type]++; + res->tcam_cnt[dir].cnt[res_type] = info[i].count; break; case BNXT_ULP_RESOURCE_FUNC_EM_TABLE: - res->em_cnt[dir].cnt[res_type]++; + res->em_cnt[dir].cnt[res_type] = info[i].count; break; default: - BNXT_TF_DBG(ERR, "Unknown resource func (0x%x)\n,", - info[i].resource_func); - continue; + break; } } - return 0; } +static int32_t +bnxt_ulp_tf_resources_get(struct bnxt_ulp_context *ulp_ctx, + struct tf_session_resources *res) +{ + struct bnxt_ulp_resource_resv_info *unnamed = NULL; + uint32_t unum; + int32_t rc = 0; + + if (ulp_ctx == NULL || res == NULL) { + BNXT_TF_DBG(ERR, "Invalid arguments to get resources.\n"); + return -EINVAL; + } + + unnamed = bnxt_ulp_resource_resv_list_get(&unum); + if (unnamed == NULL) { + BNXT_TF_DBG(ERR, "Unable to get resource resv list.\n"); + return -EINVAL; + } + + rc = bnxt_ulp_unnamed_resources_calc(ulp_ctx, unnamed, unum, res); + if (rc) + BNXT_TF_DBG(ERR, "Unable to calc resources for session.\n"); + + return rc; +} + +static int32_t +bnxt_ulp_tf_shared_session_resources_get(struct bnxt_ulp_context *ulp_ctx, + struct tf_session_resources *res) +{ + struct bnxt_ulp_resource_resv_info *unnamed; + struct bnxt_ulp_glb_resource_info *named; + uint32_t unum, nnum; + int32_t rc; + + if (ulp_ctx == NULL || res == NULL) { + BNXT_TF_DBG(ERR, "Invalid arguments to get resources.\n"); + return -EINVAL; + } + + /* Make sure the resources are zero before accumulating. */ + memset(res, 0, sizeof(struct tf_session_resources)); + + /* + * Shared resources are comprised of both named and unnamed resources. + * First get the unnamed counts, and then add the named to the result. + */ + /* Get the baseline counts */ + unnamed = bnxt_ulp_app_resource_resv_list_get(&unum); + if (unnamed == NULL) { + BNXT_TF_DBG(ERR, "Unable to get shared resource resv list.\n"); + return -EINVAL; + } + rc = bnxt_ulp_unnamed_resources_calc(ulp_ctx, unnamed, unum, res); + if (rc) { + BNXT_TF_DBG(ERR, "Unable to calc resources for shared session.\n"); + return -EINVAL; + } + + /* Get the named list and add the totals */ + named = bnxt_ulp_app_glb_resource_info_list_get(&nnum); + if (named == NULL) { + BNXT_TF_DBG(ERR, "Unable to get app global resource list\n"); + return -EINVAL; + } + rc = bnxt_ulp_named_resources_calc(ulp_ctx, named, nnum, res); + if (rc) + BNXT_TF_DBG(ERR, "Unable to calc named resources\n"); + + return rc; +} + int32_t bnxt_ulp_cntxt_app_caps_init(struct bnxt_ulp_context *ulp_ctx, uint8_t app_id, uint32_t dev_id) @@ -320,10 +392,8 @@ ulp_ctx_shared_session_open(struct bnxt *bp, strncat(parms.ctrl_chan_name, "-tf_shared", copy_num_bytes); rc = bnxt_ulp_tf_shared_session_resources_get(bp->ulp_ctx, resources); - if (rc) { - BNXT_TF_DBG(ERR, "Unable to get shared resource count.\n"); + if (rc) return rc; - } rc = bnxt_ulp_cntxt_dev_id_get(bp->ulp_ctx, &ulp_dev_id); if (rc) { @@ -342,8 +412,7 @@ ulp_ctx_shared_session_open(struct bnxt *bp, parms.device_type = TF_DEVICE_TYPE_THOR; break; default: - BNXT_TF_DBG(ERR, "Unable to determine device for " - "opening session.\n"); + BNXT_TF_DBG(ERR, "Unable to determine dev for opening session.\n"); return rc; } @@ -450,18 +519,14 @@ ulp_ctx_session_open(struct bnxt *bp, params.device_type = TF_DEVICE_TYPE_THOR; break; default: - BNXT_TF_DBG(ERR, "Unable to determine device for " - "opening session.\n"); + BNXT_TF_DBG(ERR, "Unable to determine device for opening session.\n"); return rc; } resources = ¶ms.resources; rc = bnxt_ulp_tf_resources_get(bp->ulp_ctx, resources); - if (rc) { - BNXT_TF_DBG(ERR, "Unable to determine tf resources for " - "session open.\n"); + if (rc) return rc; - } params.bp = bp; rc = tf_open_session(&bp->tfp, ¶ms); @@ -708,8 +773,8 @@ ulp_ctx_init(struct bnxt *bp, rc = bnxt_ulp_cntxt_app_caps_init(bp->ulp_ctx, bp->app_id, devid); if (rc) { - BNXT_TF_DBG(ERR, "Unable to set capabilities for " - " app(%x)/dev(%x)\n", bp->app_id, devid); + BNXT_TF_DBG(ERR, "Unable to set caps for app(%x)/dev(%x)\n", + bp->app_id, devid); goto error_deinit; } diff --git a/drivers/net/bnxt/tf_ulp/ulp_def_rules.c b/drivers/net/bnxt/tf_ulp/ulp_def_rules.c index b688288a62..483030edbf 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_def_rules.c +++ b/drivers/net/bnxt/tf_ulp/ulp_def_rules.c @@ -321,8 +321,8 @@ ulp_default_flow_create(struct rte_eth_dev *eth_dev, ulp_ctx = bnxt_ulp_eth_dev_ptr2_cntxt_get(eth_dev); if (!ulp_ctx) { - BNXT_TF_DBG(ERR, "ULP context is not initialized. " - "Failed to create default flow.\n"); + BNXT_TF_DBG(ERR, + "ULP context is not initialized. Failed to create dflt flow.\n"); return -EINVAL; } diff --git a/drivers/net/bnxt/tf_ulp/ulp_mapper.c b/drivers/net/bnxt/tf_ulp/ulp_mapper.c index 8fd8a329bf..b5cefbeb08 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_mapper.c +++ b/drivers/net/bnxt/tf_ulp/ulp_mapper.c @@ -2296,8 +2296,7 @@ ulp_mapper_index_tbl_process(struct bnxt_ulp_mapper_parms *parms, tbl->tbl_operand, ®val, &shared)) { BNXT_TF_DBG(ERR, - "Failed to get tbl idx from Global " - "regfile[%d].\n", + "Failed to get tbl idx from Glb RF[%d].\n", tbl->tbl_operand); return -EINVAL; } @@ -2347,8 +2346,9 @@ ulp_mapper_index_tbl_process(struct bnxt_ulp_mapper_parms *parms, gparms.data_sz_in_bytes, data.byte_order); if (rc) { - BNXT_TF_DBG(ERR, "Failed to read fields on tbl read " - "rc=%d\n", rc); + BNXT_TF_DBG(ERR, + "Failed to get flds on tbl read rc=%d\n", + rc); return rc; } return 0; @@ -2433,8 +2433,7 @@ ulp_mapper_index_tbl_process(struct bnxt_ulp_mapper_parms *parms, rc = tf_set_tbl_entry(tfp, &sparms); if (rc) { BNXT_TF_DBG(ERR, - "Index table[%s][%s][%x] write failed " - "rc=%d\n", + "Index table[%s][%s][%x] write fail rc=%d\n", tf_tbl_type_2_str(sparms.type), tf_dir_2_str(sparms.dir), sparms.idx, rc); @@ -2833,15 +2832,15 @@ ulp_mapper_glb_resource_info_init(struct bnxt_ulp_context *ulp_ctx, rc = bnxt_ulp_cntxt_dev_id_get(ulp_ctx, &dev_id); if (rc) { - BNXT_TF_DBG(ERR, "Failed to get device id for " - "global init (%d)\n", rc); + BNXT_TF_DBG(ERR, "Failed to get device id for glb init (%d)\n", + rc); return rc; } rc = bnxt_ulp_cntxt_app_id_get(ulp_ctx, &app_id); if (rc) { - BNXT_TF_DBG(ERR, "Failed to get app id for " - "global init (%d)\n", rc); + BNXT_TF_DBG(ERR, "Failed to get app id for glb init (%d)\n", + rc); return rc; } @@ -2916,15 +2915,15 @@ ulp_mapper_app_glb_resource_info_init(struct bnxt_ulp_context *ulp_ctx, rc = bnxt_ulp_cntxt_app_id_get(ulp_ctx, &app_id); if (rc) { - BNXT_TF_DBG(ERR, "Failed to get the app id in global init " - "(%d).\n", rc); + BNXT_TF_DBG(ERR, "Failed to get the app id in glb init (%d).\n", + rc); return rc; } rc = bnxt_ulp_cntxt_dev_id_get(ulp_ctx, &dev_id); if (rc) { - BNXT_TF_DBG(ERR, "Failed to get device id for app " - "global init (%d)\n", rc); + BNXT_TF_DBG(ERR, "Failed to get dev id for app glb init (%d)\n", + rc); return rc; } @@ -3413,8 +3412,8 @@ ulp_mapper_tbls_process(struct bnxt_ulp_mapper_parms *parms, uint32_t tid) cond_tbls, num_cond_tbls, &cond_rc); if (rc) { - BNXT_TF_DBG(ERR, "Failed to process cond opc list " - "(%d)\n", rc); + BNXT_TF_DBG(ERR, "Failed to proc cond opc list (%d)\n", + rc); goto error; } /* Skip the table if False */ @@ -3812,8 +3811,7 @@ ulp_mapper_init(struct bnxt_ulp_context *ulp_ctx) if (bnxt_ulp_cntxt_shared_session_enabled(ulp_ctx)) { rc = ulp_mapper_app_glb_resource_info_init(ulp_ctx, data); if (rc) { - BNXT_TF_DBG(ERR, "Failed to initialize app " - "global resources\n"); + BNXT_TF_DBG(ERR, "Failed to init app glb resources\n"); goto error; } } @@ -3840,8 +3838,7 @@ ulp_mapper_deinit(struct bnxt_ulp_context *ulp_ctx) if (!ulp_ctx) { BNXT_TF_DBG(ERR, - "Failed to acquire ulp context, so data may " - "not be released.\n"); + "Failed to acquire ulp context, so data may not be released.\n"); return; } diff --git a/drivers/net/bnxt/tf_ulp/ulp_template_db_enum.h b/drivers/net/bnxt/tf_ulp/ulp_template_db_enum.h index 4a2f7337be..bc701aa8a5 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_template_db_enum.h +++ b/drivers/net/bnxt/tf_ulp/ulp_template_db_enum.h @@ -29,6 +29,7 @@ #define BNXT_ULP_GLB_RESOURCE_TBL_MAX_SZ 33 #define BNXT_ULP_APP_GLB_RESOURCE_TBL_MAX_SZ 27 #define BNXT_ULP_RESOURCE_RESV_LIST_MAX_SZ 219 +#define BNXT_ULP_APP_RESOURCE_RESV_LIST_MAX_SZ 4 #define BNXT_ULP_APP_CAP_TBL_MAX_SZ 6 #define BNXT_ULP_COND_GOTO_REJECT 1023 #define BNXT_ULP_COND_GOTO_RF 0x10000 diff --git a/drivers/net/bnxt/tf_ulp/ulp_template_db_tbl.c b/drivers/net/bnxt/tf_ulp/ulp_template_db_tbl.c index f3146cc1a3..ffa42ffa8b 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_template_db_tbl.c +++ b/drivers/net/bnxt/tf_ulp/ulp_template_db_tbl.c @@ -270,6 +270,42 @@ struct bnxt_ulp_app_capabilities_info ulp_app_cap_info_list[] = { } }; +/* List of unnamed app tf resources required to be reserved per app/device */ +struct bnxt_ulp_resource_resv_info ulp_app_resource_resv_list[] = { + { + .app_id = 1, + .device_id = BNXT_ULP_DEVICE_ID_WH_PLUS, + .direction = TF_DIR_RX, + .resource_func = BNXT_ULP_RESOURCE_FUNC_TCAM_TABLE, + .resource_type = TF_TCAM_TBL_TYPE_WC_TCAM, + .count = 256 + }, + { + .app_id = 1, + .device_id = BNXT_ULP_DEVICE_ID_THOR, + .direction = TF_DIR_RX, + .resource_func = BNXT_ULP_RESOURCE_FUNC_TCAM_TABLE, + .resource_type = TF_TCAM_TBL_TYPE_WC_TCAM, + .count = 256 + }, + { + .app_id = 2, + .device_id = BNXT_ULP_DEVICE_ID_WH_PLUS, + .direction = TF_DIR_RX, + .resource_func = BNXT_ULP_RESOURCE_FUNC_TCAM_TABLE, + .resource_type = TF_TCAM_TBL_TYPE_WC_TCAM, + .count = 256 + }, + { + .app_id = 2, + .device_id = BNXT_ULP_DEVICE_ID_THOR, + .direction = TF_DIR_RX, + .resource_func = BNXT_ULP_RESOURCE_FUNC_TCAM_TABLE, + .resource_type = TF_TCAM_TBL_TYPE_WC_TCAM, + .count = 256 + } +}; + /* List of device specific parameters */ struct bnxt_ulp_glb_resource_info ulp_app_glb_resource_tbl[] = { { diff --git a/drivers/net/bnxt/tf_ulp/ulp_template_struct.h b/drivers/net/bnxt/tf_ulp/ulp_template_struct.h index cf6a27e771..ed943a7c92 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_template_struct.h +++ b/drivers/net/bnxt/tf_ulp/ulp_template_struct.h @@ -391,6 +391,12 @@ extern struct bnxt_ulp_glb_resource_info ulp_app_glb_resource_tbl[]; */ extern struct bnxt_ulp_resource_resv_info ulp_resource_resv_list[]; +/* + * The ulp_app_resource_resv_list provides the list of tf resources required + * when calling tf_open. + */ +extern struct bnxt_ulp_resource_resv_info ulp_app_resource_resv_list[]; + /* * The_app_cap_info_list provides the list of ULP capabilities per app/device. */