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 6369DA0548; Wed, 15 Jun 2022 15:59:19 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 42AF940F1A; Wed, 15 Jun 2022 15:59:19 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by mails.dpdk.org (Postfix) with ESMTP id 0399E40F19 for ; Wed, 15 Jun 2022 15:59:17 +0200 (CEST) Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FCG1iJ029042; Wed, 15 Jun 2022 06:57:14 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=pfpt0220; bh=51xP184ow3UdR6s/1wOkMoQtB96Bw2l3240WXLorsLM=; b=Ps2xS7gupB/MHAh5isIbgwSL9LF14XX2ZqKCZ6TJogRpu9M+2bE/sfW31WfcQwxaV32L af6WklGY7T9kH4Jd3QagKdbdUAwXfRXieocSi0MfJVLJ6Qb28SfPc2RZW3K8NHf/03qA dOIviw+7nhHrTooluBM9bh9vEBGw93w0v/0bxW/CIAA0VhLGrfB6OTf9PbVYneEg+/o6 OhmKEV/N77OpH3rWvVjs1YYvOHXyu8hWmYko6xVIUAZY29wtyin7Xel/Fd8jY9bHnjPn lE1OzKlua/Ut1H2d9C3/WBEaxpOMBN6ZUWGYkKoUrbYxwEzZtGgo5ZBiFfD/LplVCTGg Jw== Received: from dc5-exch01.marvell.com ([199.233.59.181]) by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3gq83yt8y2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Wed, 15 Jun 2022 06:57:14 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 15 Jun 2022 06:57:12 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 15 Jun 2022 06:57:12 -0700 Received: from satheeshpaullabpc.. (unknown [10.28.34.33]) by maili.marvell.com (Postfix) with ESMTP id 6CE0C3F7082; Wed, 15 Jun 2022 06:57:09 -0700 (PDT) From: To: Nithin Dabilpuram , Kiran Kumar K , Sunil Kumar Kori , Satha Rao , Ray Kinsella CC: , Satheesh Paul , Jerin Jacob Subject: [dpdk-dev] [PATCH v2] common/cnxk: add ROC API to free MCAM entry Date: Wed, 15 Jun 2022 19:27:05 +0530 Message-ID: <20220615135705.910841-1-psatheesh@marvell.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20220603033432.3170553-1-psatheesh@marvell.com> References: <20220603033432.3170553-1-psatheesh@marvell.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Proofpoint-ORIG-GUID: -k-wZDhbe2GBjtr_JOz4i4OaqVmttQei X-Proofpoint-GUID: -k-wZDhbe2GBjtr_JOz4i4OaqVmttQei X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.874,Hydra:6.0.517,FMLib:17.11.64.514 definitions=2022-06-15_13,2022-06-15_01,2022-02-23_01 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: Satheesh Paul Add ROC API to free the given MCAM entry. If the MCAM entry has flow counter associated, this API will clear and free the flow counter. Signed-off-by: Satheesh Paul Reviewed-by: Jerin Jacob --- v2: * Removed unnecessary variable initialization drivers/common/cnxk/roc_npc.c | 63 +++++++++++++++++++++++------ drivers/common/cnxk/roc_npc.h | 7 ++++ drivers/common/cnxk/roc_npc_mcam.c | 39 ++++++++++++++---- drivers/common/cnxk/roc_npc_priv.h | 2 + drivers/common/cnxk/roc_npc_utils.c | 15 +++---- drivers/common/cnxk/version.map | 3 ++ 6 files changed, 100 insertions(+), 29 deletions(-) diff --git a/drivers/common/cnxk/roc_npc.c b/drivers/common/cnxk/roc_npc.c index da5b96242e..b38389b18a 100644 --- a/drivers/common/cnxk/roc_npc.c +++ b/drivers/common/cnxk/roc_npc.c @@ -55,6 +55,53 @@ roc_npc_mcam_free_entry(struct roc_npc *roc_npc, uint32_t entry) return npc_mcam_free_entry(npc, entry); } +int +roc_npc_mcam_free(struct roc_npc *roc_npc, struct roc_npc_flow *mcam) +{ + int rc = 0; + + if (mcam->use_ctr) { + rc = roc_npc_mcam_clear_counter(roc_npc, mcam->ctr_id); + if (rc) + return rc; + + rc = roc_npc_mcam_free_counter(roc_npc, mcam->ctr_id); + if (rc) + return rc; + } + + return roc_npc_mcam_free_entry(roc_npc, mcam->mcam_id); +} + +int +roc_npc_mcam_init(struct roc_npc *roc_npc, struct roc_npc_flow *flow, + int mcam_id) +{ + struct npc *npc = roc_npc_to_npc_priv(roc_npc); + int rc; + + rc = npc_mcam_init(npc, flow, mcam_id); + if (rc != 0) { + plt_err("npc: mcam initialisation write failed"); + return rc; + } + return 0; +} + +int +roc_npc_mcam_move(struct roc_npc *roc_npc, uint16_t old_ent, uint16_t new_ent) +{ + struct npc *npc = roc_npc_to_npc_priv(roc_npc); + struct mbox *mbox = npc->mbox; + int rc; + + rc = npc_mcam_move(mbox, old_ent, new_ent); + if (rc) + return rc; + + return 0; +} + int roc_npc_mcam_free_all_resources(struct roc_npc *roc_npc) { @@ -383,7 +430,7 @@ npc_parse_actions(struct roc_npc *roc_npc, const struct roc_npc_attr *attr, case ROC_NPC_ACTION_TYPE_COUNT: /* Indicates, need a counter */ - flow->ctr_id = 1; + flow->use_ctr = 1; req_act |= ROC_NPC_ACTION_TYPE_COUNT; break; @@ -1268,7 +1315,7 @@ roc_npc_flow_create(struct roc_npc *roc_npc, const struct roc_npc_attr *attr, return flow; set_rss_failed: - rc = npc_mcam_free_entry(npc, flow->mcam_id); + rc = roc_npc_mcam_free_entry(roc_npc, flow->mcam_id); if (rc != 0) { *errcode = rc; plt_free(flow); @@ -1314,17 +1361,7 @@ roc_npc_flow_destroy(struct roc_npc *roc_npc, struct roc_npc_flow *flow) return rc; } - if (flow->ctr_id != NPC_COUNTER_NONE) { - rc = roc_npc_mcam_clear_counter(roc_npc, flow->ctr_id); - if (rc != 0) - return rc; - - rc = npc_mcam_free_counter(npc, flow->ctr_id); - if (rc != 0) - return rc; - } - - rc = npc_mcam_free_entry(npc, flow->mcam_id); + rc = roc_npc_mcam_free(roc_npc, flow); if (rc != 0) return rc; diff --git a/drivers/common/cnxk/roc_npc.h b/drivers/common/cnxk/roc_npc.h index f92c2a633c..1b4e5521cb 100644 --- a/drivers/common/cnxk/roc_npc.h +++ b/drivers/common/cnxk/roc_npc.h @@ -246,6 +246,7 @@ struct roc_npc_flow { uint8_t nix_intf; uint8_t enable; uint32_t mcam_id; + uint8_t use_ctr; int32_t ctr_id; uint32_t priority; uint32_t mtr_id; @@ -329,6 +330,8 @@ roc_npc_flow_create(struct roc_npc *roc_npc, const struct roc_npc_attr *attr, const struct roc_npc_action actions[], int *errcode); int __roc_api roc_npc_flow_destroy(struct roc_npc *roc_npc, struct roc_npc_flow *flow); +int __roc_api roc_npc_mcam_free(struct roc_npc *roc_npc, + struct roc_npc_flow *mcam); int __roc_api roc_npc_mcam_free_entry(struct roc_npc *roc_npc, uint32_t entry); int __roc_api roc_npc_mcam_enable_all_entries(struct roc_npc *roc_npc, bool enable); @@ -367,4 +370,8 @@ int __roc_api roc_npc_mcam_merge_base_steering_rule(struct roc_npc *roc_npc, struct roc_npc_flow *flow); int __roc_api roc_npc_validate_portid_action(struct roc_npc *roc_npc_src, struct roc_npc *roc_npc_dst); +int __roc_api roc_npc_mcam_init(struct roc_npc *roc_npc, + struct roc_npc_flow *flow, int mcam_id); +int __roc_api roc_npc_mcam_move(struct roc_npc *roc_npc, uint16_t old_ent, + uint16_t new_ent); #endif /* _ROC_NPC_H_ */ diff --git a/drivers/common/cnxk/roc_npc_mcam.c b/drivers/common/cnxk/roc_npc_mcam.c index 0ae58da0ba..245eeb0107 100644 --- a/drivers/common/cnxk/roc_npc_mcam.c +++ b/drivers/common/cnxk/roc_npc_mcam.c @@ -401,16 +401,37 @@ npc_mcam_write_entry(struct npc *npc, struct roc_npc_flow *mcam) struct mbox *mbox = npc->mbox; struct mbox_msghdr *rsp; int rc = -ENOSPC; + uint16_t ctr = 0; int i; + if (mcam->use_ctr && mcam->ctr_id == NPC_COUNTER_NONE) { + rc = npc_mcam_alloc_counter(npc, &ctr); + if (rc) + return rc; + mcam->ctr_id = ctr; + + rc = npc_mcam_clear_counter(npc, mcam->ctr_id); + if (rc) + return rc; + } + req = mbox_alloc_msg_npc_mcam_write_entry(mbox); - if (req == NULL) + if (req == NULL) { + if (mcam->use_ctr) + npc_mcam_free_counter(npc, ctr); + return rc; + } req->entry = mcam->mcam_id; req->intf = mcam->nix_intf; req->enable_entry = mcam->enable; req->entry_data.action = mcam->npc_action; req->entry_data.vtag_action = mcam->vtag_action; + if (mcam->use_ctr) { + req->set_cntr = 1; + req->cntr = mcam->ctr_id; + } + for (i = 0; i < NPC_MCAM_KEY_X4_WORDS; i++) { req->entry_data.kw[i] = mcam->mcam_data[i]; req->entry_data.kw_mask[i] = mcam->mcam_mask[i]; @@ -539,7 +560,6 @@ int npc_mcam_alloc_and_write(struct npc *npc, struct roc_npc_flow *flow, struct npc_parse_state *pst) { - int use_ctr = (flow->ctr_id == NPC_COUNTER_NONE ? 0 : 1); struct npc_mcam_write_entry_req *req; struct nix_inl_dev *inl_dev = NULL; struct mbox *mbox = npc->mbox; @@ -552,15 +572,20 @@ npc_mcam_alloc_and_write(struct npc *npc, struct roc_npc_flow *flow, PLT_SET_USED(pst); - if (use_ctr) { + if (flow->use_ctr) { rc = npc_mcam_alloc_counter(npc, &ctr); if (rc) return rc; + + flow->ctr_id = ctr; + rc = npc_mcam_clear_counter(npc, flow->ctr_id); + if (rc) + return rc; } entry = npc_get_free_mcam_entry(mbox, flow, npc); if (entry < 0) { - if (use_ctr) + if (flow->use_ctr) npc_mcam_free_counter(npc, ctr); return NPC_ERR_MCAM_ALLOC; } @@ -568,8 +593,8 @@ npc_mcam_alloc_and_write(struct npc *npc, struct roc_npc_flow *flow, req = mbox_alloc_msg_npc_mcam_write_entry(mbox); if (req == NULL) return -ENOSPC; - req->set_cntr = use_ctr; - req->cntr = ctr; + req->set_cntr = flow->use_ctr; + req->cntr = flow->ctr_id; req->entry = entry; req->intf = (flow->nix_intf == NIX_INTF_RX) ? NPC_MCAM_RX : NPC_MCAM_TX; @@ -636,7 +661,7 @@ npc_mcam_alloc_and_write(struct npc *npc, struct roc_npc_flow *flow, flow->mcam_id = entry; - if (use_ctr) + if (flow->use_ctr) flow->ctr_id = ctr; return 0; } diff --git a/drivers/common/cnxk/roc_npc_priv.h b/drivers/common/cnxk/roc_npc_priv.h index 78d6ee844d..b08539d8f8 100644 --- a/drivers/common/cnxk/roc_npc_priv.h +++ b/drivers/common/cnxk/roc_npc_priv.h @@ -453,4 +453,6 @@ int npc_rss_action_program(struct roc_npc *roc_npc, const struct roc_npc_action actions[], struct roc_npc_flow *flow); int npc_rss_group_free(struct npc *npc, struct roc_npc_flow *flow); +int npc_mcam_init(struct npc *npc, struct roc_npc_flow *flow, int mcam_id); +int npc_mcam_move(struct mbox *mbox, uint16_t old_ent, uint16_t new_ent); #endif /* _ROC_NPC_PRIV_H_ */ diff --git a/drivers/common/cnxk/roc_npc_utils.c b/drivers/common/cnxk/roc_npc_utils.c index e36a312576..cbc6200fec 100644 --- a/drivers/common/cnxk/roc_npc_utils.c +++ b/drivers/common/cnxk/roc_npc_utils.c @@ -264,9 +264,8 @@ npc_update_parse_state(struct npc_parse_state *pst, return 0; } -static int -npc_initialise_mcam_entry(struct npc *npc, struct roc_npc_flow *flow, - int mcam_id) +int +npc_mcam_init(struct npc *npc, struct roc_npc_flow *flow, int mcam_id) { struct npc_mcam_write_entry_req *req; struct npc_mcam_write_entry_rsq *rsp; @@ -308,8 +307,8 @@ npc_initialise_mcam_entry(struct npc *npc, struct roc_npc_flow *flow, return 0; } -static int -npc_shift_mcam_entry(struct mbox *mbox, uint16_t old_ent, uint16_t new_ent) +int +npc_mcam_move(struct mbox *mbox, uint16_t old_ent, uint16_t new_ent) { struct npc_mcam_shift_entry_req *req; struct npc_mcam_shift_entry_rsp *rsp; @@ -365,12 +364,10 @@ npc_slide_mcam_entries(struct mbox *mbox, struct npc *npc, int prio, * Initialise and enable before moving an entry into * this mcam. */ - rc = npc_initialise_mcam_entry(npc, curr->flow, - to_mcam_id); + rc = npc_mcam_init(npc, curr->flow, to_mcam_id); if (rc) return rc; - rc = npc_shift_mcam_entry(mbox, from_mcam_id, - to_mcam_id); + rc = npc_mcam_move(mbox, from_mcam_id, to_mcam_id); if (rc) return rc; curr->flow->mcam_id = to_mcam_id; diff --git a/drivers/common/cnxk/version.map b/drivers/common/cnxk/version.map index a77f3f6e3c..bbde990440 100644 --- a/drivers/common/cnxk/version.map +++ b/drivers/common/cnxk/version.map @@ -325,7 +325,10 @@ INTERNAL { roc_npc_mcam_ena_dis_entry; roc_npc_mcam_free_all_resources; roc_npc_mcam_free_counter; + roc_npc_mcam_free; roc_npc_mcam_free_entry; + roc_npc_mcam_init; + roc_npc_mcam_move; roc_npc_mcam_merge_base_steering_rule; roc_npc_mcam_write_entry; roc_npc_mcam_read_counter; -- 2.35.3