From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id CCF66458A8; Fri, 30 Aug 2024 15:53:19 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 22F5442EAB; Fri, 30 Aug 2024 15:53:14 +0200 (CEST) Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) by mails.dpdk.org (Postfix) with ESMTP id 424F742EB8 for ; Fri, 30 Aug 2024 15:53:12 +0200 (CEST) Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-204eebfaebdso15980855ad.1 for ; Fri, 30 Aug 2024 06:53:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1725025991; x=1725630791; darn=dpdk.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=UnWLWwFEVECs0tjbct5TxuNgkIi2PfqAMNayRd/slEY=; b=HlTfhcw+6tF2alYHDVpL53NDCkUZjPae3FaQnVj1n2dTauglAtn7Y8C8rY1HzGzT3U KE/t4NZFSOTgFXyZ6G/rH0QOasIc8tkYQk5vxxgJqnYmWYKT6uZqYenIdLye1GeLThaY 7nVI9EXKreSeKelFa6P9ewsiMgKlCIXwSXWC8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725025991; x=1725630791; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=UnWLWwFEVECs0tjbct5TxuNgkIi2PfqAMNayRd/slEY=; b=sx9quZHha6mteVHIgfzBfjj72Ecn4xokYZZnb5FqdZKZbf+oGYuOPcoYdrAM2pUefY Nb4KmI/3rM6cEzd3gVdDmStH2OOKqGwLB/ZicNLL+2/RmJMJ7iFYPsC7kIWaiJELX7J1 TKd9GG4MYpaheCbrfGzmXFPA3cfe606HFAHcL6PzPqGSl1JnJZq9eoblPBaf0FRzn5Nw vQT9gCCIpmpF2lUXZUhg79yh3bJd2237noH9hyyUIgbd6Z0Os4OJZP5VMEw7OhG88d95 n+xsqh+NBqvkktIjycHL1x39LCYJwN73TeMUi/SYF9imxiSat1cC+pApiI1oB4LDjs5f u/Hw== X-Gm-Message-State: AOJu0YyuW2plu9Q+CwSROtn0JOsMVwt6fUwJjxhwaToEt9qQtYlyBrwi AJ+Pxc8giwJE8zCQ2Q29Czm9qV7L+u+Ds/ShQXNWxa2j1K3jMvwfvsVYuGS82ZzArms8RHXaxQT q6LUn5M8+ef/PGn/Er8FWIXwGV9wguekB/eNfL6apk46SGvVJXX66MUcXDW7abU9uJZOJrYKtqq r8GkSIRYCI1Rt0ViAhxbGOW0mGsqGRyKyGZ5W+oT33+xO0 X-Google-Smtp-Source: AGHT+IH+nI75NG3J+lFvPtWFQtwixwui7RXcZckXkUC3UMdspRa0ebm7a9i5pSui2r2biwj7ID54mQ== X-Received: by 2002:a17:902:db07:b0:1fd:63d7:5d21 with SMTP id d9443c01a7336-2050c42dd2amr70787645ad.47.1725025990831; Fri, 30 Aug 2024 06:53:10 -0700 (PDT) Received: from dhcp-10-123-154-23.dhcp.broadcom.net ([192.19.234.250]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-205155658dfsm27067145ad.297.2024.08.30.06.53.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 30 Aug 2024 06:53:10 -0700 (PDT) From: Sriharsha Basavapatna To: dev@dpdk.org Cc: Kishore Padmanabha , Michael Baucom , Sriharsha Basavapatna Subject: [PATCH 19/47] net/bnxt: tf_ulp: convert recipe table to dynamic memory Date: Fri, 30 Aug 2024 19:30:21 +0530 Message-Id: <20240830140049.1715230-20-sriharsha.basavapatna@broadcom.com> X-Mailer: git-send-email 2.39.0.189.g4dbebc36b0 In-Reply-To: <20240830140049.1715230-1-sriharsha.basavapatna@broadcom.com> References: <20240830140049.1715230-1-sriharsha.basavapatna@broadcom.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Kishore Padmanabha Converted the recipe table allocation from static model to dynamic memory allocation model. Signed-off-by: Kishore Padmanabha Reviewed-by: Michael Baucom Signed-off-by: Sriharsha Basavapatna --- drivers/net/bnxt/tf_ulp/ulp_mapper.c | 175 +++++++++++++++------------ drivers/net/bnxt/tf_ulp/ulp_mapper.h | 5 +- 2 files changed, 97 insertions(+), 83 deletions(-) diff --git a/drivers/net/bnxt/tf_ulp/ulp_mapper.c b/drivers/net/bnxt/tf_ulp/ulp_mapper.c index 7045efffad..a7b35bf292 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_mapper.c +++ b/drivers/net/bnxt/tf_ulp/ulp_mapper.c @@ -1280,65 +1280,71 @@ ulp_mapper_field_opc_next(struct bnxt_ulp_mapper_parms *parms, static void ulp_mapper_key_recipe_tbl_deinit(struct bnxt_ulp_mapper_data *mdata) { + struct bnxt_ulp_key_recipe_entry **recipes; enum bnxt_ulp_direction dir; + uint32_t idx, ftype; + + /* If recipe table is not initialized then exit */ + if (!mdata->key_recipe_info.num_recipes) + return; for (dir = 0; dir < BNXT_ULP_DIRECTION_LAST; dir++) { - rte_free(mdata->key_recipe_info.em_recipes[dir]); - rte_free(mdata->key_recipe_info.wc_recipes[dir]); + for (ftype = 0; ftype < ULP_RECIPE_TYPE_MAX; ftype++) { + recipes = mdata->key_recipe_info.recipes[dir][ftype]; + for (idx = 0; idx < mdata->key_recipe_info.num_recipes; + idx++) { + if (recipes[idx]) + rte_free(recipes[idx]); + } + rte_free(mdata->key_recipe_info.recipes[dir][ftype]); + mdata->key_recipe_info.recipes[dir][ftype] = NULL; + } } + mdata->key_recipe_info.num_recipes = 0; } static int32_t ulp_mapper_key_recipe_tbl_init(struct bnxt_ulp_context *ulp_ctx, struct bnxt_ulp_mapper_data *mdata) { - struct bnxt_ulp_key_recipe_entry *recipes; + struct bnxt_ulp_key_recipe_entry **recipes; enum bnxt_ulp_direction dir; - uint32_t dev_id = 0; - uint32_t num_recipes; + uint32_t dev_id = 0, size_val; + uint32_t num_recipes, ftype; int32_t rc = 0; rc = bnxt_ulp_cntxt_dev_id_get(ulp_ctx, &dev_id); if (rc) { BNXT_DRV_DBG(ERR, "Unable to get device id from ulp.\n"); - return rc; + return -EINVAL; } num_recipes = bnxt_ulp_num_key_recipes_get(ulp_ctx); if (!num_recipes) - return 0; + return rc; + size_val = sizeof(struct bnxt_ulp_key_recipe_entry *); for (dir = 0; dir < BNXT_ULP_DIRECTION_LAST; dir++) { - recipes = rte_zmalloc("key_recipe_em", - sizeof(struct bnxt_ulp_key_recipe_entry) * - num_recipes, 0); - if (!recipes) - goto error; - mdata->key_recipe_info.em_recipes[dir] = recipes; - - recipes = rte_zmalloc("key_recipe_wc", - sizeof(struct bnxt_ulp_key_recipe_entry) * - num_recipes, 0); - if (!recipes) - goto error; - mdata->key_recipe_info.wc_recipes[dir] = recipes; + for (ftype = 0; ftype < ULP_RECIPE_TYPE_MAX; ftype++) { + recipes = rte_zmalloc("key_recipe_list", + size_val * num_recipes, 0); + if (!recipes) { + BNXT_DRV_DBG(ERR, "Uanable to alloc memory\n"); + return -ENOMEM; + } + mdata->key_recipe_info.recipes[dir][ftype] = recipes; + } } - mdata->key_recipe_info.num_recipes = num_recipes; mdata->key_recipe_info.max_fields = BNXT_ULP_KEY_RECIPE_MAX_FLDS; - - return 0; -error: - (void)ulp_mapper_key_recipe_tbl_deinit(mdata); - return -ENOMEM; + return rc; } -static struct bnxt_ulp_key_recipe_entry * -ulp_mapper_key_recipe_entry_get(struct bnxt_ulp_context *ulp_ctx, - enum bnxt_ulp_direction dir, - enum bnxt_ulp_resource_sub_type stype, - uint8_t recipe_id, uint8_t *max_fields) +static struct bnxt_ulp_mapper_data * +ulp_mapper_key_recipe_args_validate(struct bnxt_ulp_context *ulp_ctx, + enum bnxt_ulp_direction dir, + enum bnxt_ulp_resource_sub_type stype, + uint8_t recipe_id) { - struct bnxt_ulp_key_recipe_entry *recipes; struct bnxt_ulp_mapper_data *mdata; mdata = (struct bnxt_ulp_mapper_data *) @@ -1355,52 +1361,54 @@ ulp_mapper_key_recipe_entry_get(struct bnxt_ulp_context *ulp_ctx, BNXT_DRV_DBG(ERR, "Recipes are not supported\n"); return NULL; } - switch (stype) { - case BNXT_ULP_RESOURCE_SUB_TYPE_KEY_RECIPE_TABLE_WM: - recipes = mdata->key_recipe_info.wc_recipes[dir]; - break; - case BNXT_ULP_RESOURCE_SUB_TYPE_KEY_RECIPE_TABLE_EM: - recipes = mdata->key_recipe_info.em_recipes[dir]; - break; - default: - BNXT_DRV_DBG(ERR, "Invalid type (%d) for key recipe.\n", stype); + if (stype != BNXT_ULP_RESOURCE_SUB_TYPE_KEY_RECIPE_TABLE_WM && + stype != BNXT_ULP_RESOURCE_SUB_TYPE_KEY_RECIPE_TABLE_EM) { + BNXT_DRV_DBG(ERR, "Invalid type (%d) in key recipe\n", stype); return NULL; - }; - - if (recipe_id >= mdata->key_recipe_info.num_recipes) { - BNXT_DRV_DBG(ERR, "key recipe id out of range(%d >= %d)\n", + } + if (recipe_id >= mdata->key_recipe_info.num_recipes || + !mdata->key_recipe_info.num_recipes) { + BNXT_DRV_DBG(ERR, "Key recipe id out of range(%d >= %d)\n", recipe_id, mdata->key_recipe_info.num_recipes); return NULL; } - - if (max_fields) - *max_fields = mdata->key_recipe_info.max_fields; - return &recipes[recipe_id]; + return mdata; } -/* Not a strict alloc, it is allocating with the key id */ static struct bnxt_ulp_key_recipe_entry * ulp_mapper_key_recipe_alloc(struct bnxt_ulp_context *ulp_ctx, enum bnxt_ulp_direction dir, enum bnxt_ulp_resource_sub_type stype, uint8_t recipe_id, uint8_t *max_fields) { - struct bnxt_ulp_key_recipe_entry *recipe; + struct bnxt_ulp_key_recipe_entry **recipes; + struct bnxt_ulp_mapper_data *mdata = NULL; + uint32_t size_s = sizeof(struct bnxt_ulp_key_recipe_entry); - recipe = ulp_mapper_key_recipe_entry_get(ulp_ctx, dir, stype, - recipe_id, max_fields); - if (recipe) { - if (recipe->in_use) { - BNXT_DRV_INF("Recipe ID (%d) already allocated\n", - recipe_id); + mdata = ulp_mapper_key_recipe_args_validate(ulp_ctx, dir, + stype, recipe_id); + if (mdata == NULL) + return NULL; + + recipes = mdata->key_recipe_info.recipes[dir][stype]; + if (recipes[recipe_id] == NULL) { + recipes[recipe_id] = rte_zmalloc("key_recipe_entry", size_s, 0); + if (recipes[recipe_id] == NULL) { + BNXT_DRV_DBG(ERR, "Unable to alloc key recipe\n"); return NULL; } - recipe->in_use = true; - recipe->cnt = 0; +#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG +#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG_MAPPER + BNXT_DRV_INF("Alloc key recipe [%s]:[%s] = 0x%X\n", + (dir == BNXT_ULP_DIRECTION_INGRESS) ? "rx" : "tx", + ulp_mapper_key_recipe_type_to_str(stype), recipe_id); +#endif +#endif + *max_fields = mdata->key_recipe_info.max_fields; + return recipes[recipe_id]; } - - /* key will be null if it failed */ - return recipe; + BNXT_DRV_DBG(ERR, "Recipe ID (%d) already allocated\n", recipe_id); + return NULL; } /* The free just marks the entry as not in use and resets the number of entries @@ -1412,15 +1420,19 @@ ulp_mapper_key_recipe_free(struct bnxt_ulp_context *ulp_ctx, enum bnxt_ulp_resource_sub_type stype, uint32_t index) { - struct bnxt_ulp_key_recipe_entry *recipe; + struct bnxt_ulp_key_recipe_entry **recipes; + struct bnxt_ulp_mapper_data *mdata = NULL; - recipe = ulp_mapper_key_recipe_entry_get(ulp_ctx, dir, stype, - index, NULL); - if (recipe == NULL) + mdata = ulp_mapper_key_recipe_args_validate(ulp_ctx, dir, + stype, index); + if (mdata == NULL) return -EINVAL; - recipe->in_use = false; - recipe->cnt = 0; + recipes = mdata->key_recipe_info.recipes[dir][stype]; + if (recipes[index] == NULL) + return -EINVAL; + rte_free(recipes[index]); + recipes[index] = NULL; #ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG #ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG_MAPPER BNXT_DRV_INF("Free key recipe [%s]:[%s] = 0x%X\n", @@ -1428,7 +1440,6 @@ ulp_mapper_key_recipe_free(struct bnxt_ulp_context *ulp_ctx, ulp_mapper_key_recipe_type_to_str(stype), index); #endif #endif - return 0; } @@ -1454,8 +1465,9 @@ ulp_mapper_key_recipe_fields_get(struct bnxt_ulp_mapper_parms *parms, struct bnxt_ulp_mapper_tbl_info *tbl, uint32_t *num_flds) { - struct bnxt_ulp_key_recipe_entry *recipe; + struct bnxt_ulp_key_recipe_entry **recipes; enum bnxt_ulp_resource_sub_type stype; + struct bnxt_ulp_mapper_data *mdata = NULL; uint64_t recipe_id = 0; /* Don't like this, but need to convert from a tbl resource func to the @@ -1475,22 +1487,25 @@ ulp_mapper_key_recipe_fields_get(struct bnxt_ulp_mapper_parms *parms, }; /* Get the recipe index from the registry file */ - if (!ulp_regfile_read(parms->regfile, - tbl->key_recipe_operand, + if (!ulp_regfile_read(parms->regfile, tbl->key_recipe_operand, &recipe_id)) { - BNXT_DRV_DBG(ERR, - "Failed to get tbl idx from regfile[%d].\n", + BNXT_DRV_DBG(ERR, "Failed to get tbl idx from regfile[%d].\n", tbl->tbl_operand); return NULL; } recipe_id = tfp_be_to_cpu_64(recipe_id); - recipe = ulp_mapper_key_recipe_entry_get(parms->ulp_ctx, tbl->direction, - stype, recipe_id, NULL); - if (recipe == NULL || !recipe->in_use) + mdata = ulp_mapper_key_recipe_args_validate(parms->ulp_ctx, + tbl->direction, + stype, recipe_id); + if (mdata == NULL) + return NULL; + + recipes = mdata->key_recipe_info.recipes[tbl->direction][stype]; + if (recipes[recipe_id] == NULL) return NULL; - *num_flds = recipe->cnt; - return &recipe->flds[0]; + *num_flds = recipes[recipe_id]->cnt; + return &recipes[recipe_id]->flds[0]; } static int32_t @@ -3552,7 +3567,7 @@ ulp_mapper_func_info_process(struct bnxt_ulp_mapper_parms *parms, } #ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG #ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG_MAPPER - BNXT_DRV_DBG(DEBUG, "write the %" PRIu64 " into func_opc %u\n", res, + BNXT_DRV_DBG(DEBUG, "write the %" PRIX64 " into func_opc %u\n", res, func_info->func_dst_opr); #endif #endif diff --git a/drivers/net/bnxt/tf_ulp/ulp_mapper.h b/drivers/net/bnxt/tf_ulp/ulp_mapper.h index 9c7fb67891..53305670bf 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_mapper.h +++ b/drivers/net/bnxt/tf_ulp/ulp_mapper.h @@ -31,16 +31,15 @@ struct bnxt_ulp_mapper_glb_resource_entry { #define BNXT_ULP_KEY_RECIPE_MAX_FLDS 128 struct bnxt_ulp_key_recipe_entry { - bool in_use; uint32_t cnt; struct bnxt_ulp_mapper_key_info flds[BNXT_ULP_KEY_RECIPE_MAX_FLDS]; }; +#define ULP_RECIPE_TYPE_MAX (BNXT_ULP_RESOURCE_SUB_TYPE_KEY_RECIPE_TABLE_WM + 1) struct bnxt_ulp_key_recipe_info { uint32_t num_recipes; uint8_t max_fields; - struct bnxt_ulp_key_recipe_entry *em_recipes[BNXT_ULP_DIRECTION_LAST]; - struct bnxt_ulp_key_recipe_entry *wc_recipes[BNXT_ULP_DIRECTION_LAST]; + struct bnxt_ulp_key_recipe_entry **recipes[BNXT_ULP_DIRECTION_LAST][ULP_RECIPE_TYPE_MAX]; }; struct ulp_mapper_core_ops; -- 2.39.3