All of lore.kernel.org
 help / color / mirror / Atom feed
From: <psatheesh@marvell.com>
To: Nithin Dabilpuram <ndabilpuram@marvell.com>,
	Kiran Kumar K <kirankumark@marvell.com>,
	Sunil Kumar Kori <skori@marvell.com>,
	Satha Rao <skoteshwar@marvell.com>, Ray Kinsella <mdr@ashroe.eu>
Cc: <dev@dpdk.org>, Satheesh Paul <psatheesh@marvell.com>,
	Jerin Jacob <jerinj@marvell.com>
Subject: [dpdk-dev] [PATCH v2] common/cnxk: add ROC API to free MCAM entry
Date: Wed, 15 Jun 2022 19:27:05 +0530	[thread overview]
Message-ID: <20220615135705.910841-1-psatheesh@marvell.com> (raw)
In-Reply-To: <20220603033432.3170553-1-psatheesh@marvell.com>

From: Satheesh Paul <psatheesh@marvell.com>

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 <psatheesh@marvell.com>
Reviewed-by: Jerin Jacob <jerinj@marvell.com>
---
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


  parent reply	other threads:[~2022-06-15 13:59 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-03  3:34 [dpdk-dev] [PATCH] common/cnxk: add ROC API to free MCAM entry psatheesh
2022-06-03 11:10 ` Ray Kinsella
2022-06-15 13:00 ` Jerin Jacob
2022-06-15 13:57 ` psatheesh [this message]
2022-06-17 12:54   ` [dpdk-dev] [PATCH v2] " Jerin Jacob

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220615135705.910841-1-psatheesh@marvell.com \
    --to=psatheesh@marvell.com \
    --cc=dev@dpdk.org \
    --cc=jerinj@marvell.com \
    --cc=kirankumark@marvell.com \
    --cc=mdr@ashroe.eu \
    --cc=ndabilpuram@marvell.com \
    --cc=skori@marvell.com \
    --cc=skoteshwar@marvell.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.