From patchwork Sun Jun 13 00:06:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajit Khaparde X-Patchwork-Id: 94122 X-Patchwork-Delegate: ajit.khaparde@broadcom.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 65830A0C41; Sun, 13 Jun 2021 02:11:10 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B40AC4114D; Sun, 13 Jun 2021 02:07:43 +0200 (CEST) Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.173]) by mails.dpdk.org (Postfix) with ESMTP id 7ED80411E2 for ; Sun, 13 Jun 2021 02:07:41 +0200 (CEST) Received: by mail-pf1-f173.google.com with SMTP id y15so7615010pfl.4 for ; Sat, 12 Jun 2021 17:07:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version; bh=p02SedorvI0BQjGBISbdN2FeQdGM2alsPhzMF6jAlTE=; b=VMcrmtSxuu3zgTi7wvzMYlx7YMckhRpW8TNV8Qmi+KtNgTpEBoQ75hER+T2EMSuHM/ jqSJC0UlWHC8dPPCZ6Jzqe3FH/sRfk5kO10k1lnpqWAJO2bjLq5+HfJMVRmTHJ7+6rVZ 7FA6qDNdDDpki9inM1HhHyshe9OsYlTJy7vxo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version; bh=p02SedorvI0BQjGBISbdN2FeQdGM2alsPhzMF6jAlTE=; b=BmPAJHLtT/6Xi/ncrw9wgVLDRrLTiYASYq22HyvssuV0qKJbvPPK+F9LtRhueZOTji S5kDDjjFTHyuma3/0oIfVLnMWAJ+YIWT81NiQ6LM5ipInvf1d6X19zN2PTxflJoczXcu zyXiV0X6dAprtBNWsdh+24im+bN+bE0hEHxTRiHfDt5hcPjDzjeZSewJrdxkt6YpgZBe kzeZcBrwC+SVqp1FZuW4Qjhx6W0uWppJdQbQFPPnz500bzMppiiLEnMkkrjMMbfLXZEX dyozEsE3YBiAXYWWoMjw0RyqLPYzhp/kn3Ut5dgGXAhFgcD6ciJslRtwMlVGN1xI/Z2W RKFA== X-Gm-Message-State: AOAM530ajWbNd9oJf5sLt3J+nem9ill/CxHjjb2qEikF6BrVZiMXJaAw XMyz3LE+8KbwCiZWhhdHyfxm8/CEGG+mx3Zkqn7BTPhFvqtNl3UBEN4SmXpQQQ1KoWR1BKzTsKU PSnePKx6pvXEJj0R2zjZZtUKn5LmfMBDZ6eXBHRTO824/0C55cYYr4W8nDAb2X/4= X-Google-Smtp-Source: ABdhPJyk0i4/MXR/Xy0FzaQ1EvIsq9ihXCTnEu5Zkt7+1/ks9xCHxmVyCXVg43EmHVc3HhTBXfWO2g== X-Received: by 2002:a62:e80d:0:b029:2ec:d02f:6114 with SMTP id c13-20020a62e80d0000b02902ecd02f6114mr15312297pfi.1.1623542860210; Sat, 12 Jun 2021 17:07:40 -0700 (PDT) Received: from localhost.localdomain ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id gg22sm12774609pjb.17.2021.06.12.17.07.38 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 12 Jun 2021 17:07:39 -0700 (PDT) From: Ajit Khaparde To: dev@dpdk.org Cc: Kishore Padmanabha , Venkat Duvvuru , Mike Baucom Date: Sat, 12 Jun 2021 17:06:22 -0700 Message-Id: <20210613000652.28191-29-ajit.khaparde@broadcom.com> X-Mailer: git-send-email 2.21.1 (Apple Git-122.3) In-Reply-To: <20210613000652.28191-1-ajit.khaparde@broadcom.com> References: <20210530085929.29695-1-venkatkumar.duvvuru@broadcom.com> <20210613000652.28191-1-ajit.khaparde@broadcom.com> MIME-Version: 1.0 X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: [dpdk-dev] [PATCH v2 28/58] net/bnxt: add support for mapper flow database opcodes 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 Sender: "dev" From: Kishore Padmanabha Added support for mapper flow database opcode to enable shared resources like mirror action. This allows mapper to conditionally populate flow database based on template content. Signed-off-by: Kishore Padmanabha Signed-off-by: Venkat Duvvuru Reviewed-by: Mike Baucom Reviewed-by: Ajit Khaparde --- drivers/net/bnxt/tf_ulp/ulp_mapper.c | 119 ++++++++++++------ .../net/bnxt/tf_ulp/ulp_template_db_enum.h | 8 ++ drivers/net/bnxt/tf_ulp/ulp_template_struct.h | 4 + 3 files changed, 95 insertions(+), 36 deletions(-) diff --git a/drivers/net/bnxt/tf_ulp/ulp_mapper.c b/drivers/net/bnxt/tf_ulp/ulp_mapper.c index 7037297922..c8ae924cf0 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_mapper.c +++ b/drivers/net/bnxt/tf_ulp/ulp_mapper.c @@ -469,6 +469,80 @@ ulp_mapper_child_flow_free(struct bnxt_ulp_context *ulp, return 0; } +/* + * Process the flow database opcode action. + * returns 0 on success. + */ +static int32_t +ulp_mapper_fdb_opc_process(struct bnxt_ulp_mapper_parms *parms, + struct bnxt_ulp_mapper_tbl_info *tbl, + struct ulp_flow_db_res_params *fid_parms) +{ + uint32_t push_fid, fid = 0; + uint64_t val64; + int32_t rc = 0; + + switch (tbl->fdb_opcode) { + case BNXT_ULP_FDB_OPC_PUSH: + push_fid = parms->fid; + break; + case BNXT_ULP_FDB_OPC_ALLOC_PUSH_REGFILE: + /* allocate a new fid */ + rc = ulp_flow_db_fid_alloc(parms->ulp_ctx, + BNXT_ULP_FDB_TYPE_REGULAR, + tbl->resource_func, &fid); + if (rc) { + BNXT_TF_DBG(ERR, + "Unable to allocate flow table entry\n"); + return rc; + } + /* Store the allocated fid in regfile*/ + val64 = fid; + rc = ulp_regfile_write(parms->regfile, tbl->flow_db_operand, + val64); + if (!rc) { + BNXT_TF_DBG(ERR, "Write regfile[%d] failed\n", + tbl->flow_db_operand); + rc = -EINVAL; + goto error; + } + /* Use the allocated fid to update the flow resource */ + push_fid = fid; + break; + case BNXT_ULP_FDB_OPC_PUSH_REGFILE: + /* get the fid from the regfile */ + rc = ulp_regfile_read(parms->regfile, tbl->flow_db_operand, + &val64); + if (!rc) { + BNXT_TF_DBG(ERR, "regfile[%d] read oob\n", + tbl->flow_db_operand); + return -EINVAL; + } + /* Use the extracted fid to update the flow resource */ + push_fid = (uint32_t)val64; + break; + default: + return rc; /* Nothing to be done */ + } + + /* Add the resource to the flow database */ + rc = ulp_flow_db_resource_add(parms->ulp_ctx, parms->flow_type, + push_fid, fid_parms); + if (rc) { + BNXT_TF_DBG(ERR, "Failed to add res to flow %x rc = %d\n", + push_fid, rc); + goto error; + } + return rc; + +error: + /* free the allocated fid */ + if (fid) + ulp_flow_db_fid_free(parms->ulp_ctx, + BNXT_ULP_FDB_TYPE_REGULAR, fid); + return rc; +} + /* * Process the identifier instruction and either store it in the flow database * or return it in the val (if not NULL) on success. If val is NULL, the @@ -524,10 +598,7 @@ ulp_mapper_ident_process(struct bnxt_ulp_mapper_parms *parms, fid_parms.resource_hndl = iparms.id; fid_parms.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO; - rc = ulp_flow_db_resource_add(parms->ulp_ctx, - parms->flow_type, - parms->fid, - &fid_parms); + rc = ulp_mapper_fdb_opc_process(parms, tbl, &fid_parms); if (rc) { BNXT_TF_DBG(ERR, "Failed to link res to flow rc = %d\n", rc); @@ -618,10 +689,7 @@ ulp_mapper_ident_extract(struct bnxt_ulp_mapper_parms *parms, fid_parms.resource_type = ident->ident_type; fid_parms.resource_hndl = sparms.search_id; fid_parms.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO; - rc = ulp_flow_db_resource_add(parms->ulp_ctx, - parms->flow_type, - parms->fid, - &fid_parms); + rc = ulp_mapper_fdb_opc_process(parms, tbl, &fid_parms); if (rc) { BNXT_TF_DBG(ERR, "Failed to link res to flow rc = %d\n", rc); @@ -1103,10 +1171,7 @@ ulp_mapper_mark_gfid_process(struct bnxt_ulp_mapper_parms *parms, fid_parms.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO; fid_parms.resource_type = mark_flag; fid_parms.resource_hndl = gfid; - rc = ulp_flow_db_resource_add(parms->ulp_ctx, - parms->flow_type, - parms->fid, - &fid_parms); + rc = ulp_mapper_fdb_opc_process(parms, tbl, &fid_parms); if (rc) BNXT_TF_DBG(ERR, "Fail to link res to flow rc = %d\n", rc); return rc; @@ -1152,10 +1217,7 @@ ulp_mapper_mark_act_ptr_process(struct bnxt_ulp_mapper_parms *parms, fid_parms.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO; fid_parms.resource_type = mark_flag; fid_parms.resource_hndl = act_idx; - rc = ulp_flow_db_resource_add(parms->ulp_ctx, - parms->flow_type, - parms->fid, - &fid_parms); + rc = ulp_mapper_fdb_opc_process(parms, tbl, &fid_parms); if (rc) BNXT_TF_DBG(ERR, "Fail to link res to flow rc = %d\n", rc); return rc; @@ -1201,10 +1263,7 @@ ulp_mapper_mark_vfr_idx_process(struct bnxt_ulp_mapper_parms *parms, fid_parms.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO; fid_parms.resource_type = mark_flag; fid_parms.resource_hndl = act_idx; - rc = ulp_flow_db_resource_add(parms->ulp_ctx, - parms->flow_type, - parms->fid, - &fid_parms); + rc = ulp_mapper_fdb_opc_process(parms, tbl, &fid_parms); if (rc) BNXT_TF_DBG(ERR, "Fail to link res to flow rc = %d\n", rc); return rc; @@ -1580,10 +1639,7 @@ ulp_mapper_tcam_tbl_process(struct bnxt_ulp_mapper_parms *parms, fid_parms.resource_type = tbl->resource_type; fid_parms.critical_resource = tbl->critical_resource; fid_parms.resource_hndl = idx; - rc = ulp_flow_db_resource_add(parms->ulp_ctx, - parms->flow_type, - parms->fid, - &fid_parms); + rc = ulp_mapper_fdb_opc_process(parms, tbl, &fid_parms); if (rc) { BNXT_TF_DBG(ERR, "Failed to link resource to flow rc = %d\n", @@ -1741,10 +1797,7 @@ ulp_mapper_em_tbl_process(struct bnxt_ulp_mapper_parms *parms, fid_parms.critical_resource = tbl->critical_resource; fid_parms.resource_hndl = iparms.flow_handle; - rc = ulp_flow_db_resource_add(parms->ulp_ctx, - parms->flow_type, - parms->fid, - &fid_parms); + rc = ulp_mapper_fdb_opc_process(parms, tbl, &fid_parms); if (rc) { BNXT_TF_DBG(ERR, "Fail to link res to flow rc = %d\n", rc); @@ -1968,10 +2021,7 @@ ulp_mapper_index_tbl_process(struct bnxt_ulp_mapper_parms *parms, fid_parms.resource_hndl = index; fid_parms.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO; - rc = ulp_flow_db_resource_add(parms->ulp_ctx, - parms->flow_type, - parms->fid, - &fid_parms); + rc = ulp_mapper_fdb_opc_process(parms, tbl, &fid_parms); if (rc) { BNXT_TF_DBG(ERR, "Failed to link resource to flow rc = %d\n", rc); @@ -2280,10 +2330,7 @@ ulp_mapper_gen_tbl_process(struct bnxt_ulp_mapper_parms *parms, fid_parms.resource_sub_type = tbl->resource_sub_type; fid_parms.resource_hndl = ckey; fid_parms.critical_resource = tbl->critical_resource; - rc = ulp_flow_db_resource_add(parms->ulp_ctx, - parms->flow_type, - parms->fid, - &fid_parms); + rc = ulp_mapper_fdb_opc_process(parms, tbl, &fid_parms); if (rc) BNXT_TF_DBG(ERR, "Fail to add gen ent flowdb %d\n", rc); } 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 2a9a290eea..f16651a821 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_template_db_enum.h +++ b/drivers/net/bnxt/tf_ulp/ulp_template_db_enum.h @@ -179,6 +179,14 @@ enum bnxt_ulp_direction { BNXT_ULP_DIRECTION_LAST = 2 }; +enum bnxt_ulp_fdb_opc { + BNXT_ULP_FDB_OPC_PUSH = 0, + BNXT_ULP_FDB_OPC_ALLOC_PUSH_REGFILE = 1, + BNXT_ULP_FDB_OPC_PUSH_REGFILE = 2, + BNXT_ULP_FDB_OPC_NOP = 3, + BNXT_ULP_FDB_OPC_LAST = 4 +}; + enum bnxt_ulp_flow_mem_type { BNXT_ULP_FLOW_MEM_TYPE_INT = 0, BNXT_ULP_FLOW_MEM_TYPE_EXT = 1, diff --git a/drivers/net/bnxt/tf_ulp/ulp_template_struct.h b/drivers/net/bnxt/tf_ulp/ulp_template_struct.h index 67308f1cf1..167116a2f4 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_template_struct.h +++ b/drivers/net/bnxt/tf_ulp/ulp_template_struct.h @@ -220,6 +220,10 @@ struct bnxt_ulp_mapper_tbl_info { /* Table opcode for table operations */ uint32_t tbl_opcode; + + /* FDB table opcode */ + enum bnxt_ulp_fdb_opc fdb_opcode; + uint32_t flow_db_operand; }; struct bnxt_ulp_mapper_key_field_info {