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 67A00A0093; Fri, 17 Jun 2022 14:54:57 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 434E3410D2; Fri, 17 Jun 2022 14:54:57 +0200 (CEST) Received: from mail-qk1-f169.google.com (mail-qk1-f169.google.com [209.85.222.169]) by mails.dpdk.org (Postfix) with ESMTP id E737240DDD for ; Fri, 17 Jun 2022 14:54:55 +0200 (CEST) Received: by mail-qk1-f169.google.com with SMTP id l192so3047431qke.13 for ; Fri, 17 Jun 2022 05:54:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=nCKwNM17Drvwix9gXn48Rtm+XGi65YKCf5rZSSt9Juo=; b=RbF7HDaJFvtrBTGFDhDGx0lg3IXd+hhMvn+C3PEFGNZzxDDcLxEOpd0CpPkccmga/k indKcBJWQp/fp97+O6QSxwqXC65PhuoozlnV6Hzz6nI1b0uo2wURju9DHtGSypT7XAYR K81m43HyBlXBY0ZXhczuyj6DOK6K0YPvUwEJF1nopq28mUWS3Ca4DTQK58fS/JV5Ahv6 vCgpFaxqs9728hlPowzXsuWcoE8rEyVOHnoT1A+HDP7u0J41Mf4MKLMIQKk4ggZVuiNo 0aqkhlYvea+qjpXpFdF5HXq0dzDLXGZ50qQWO59PaFmo9Mt9tRw5EZ9ceCPiWaFNB7T0 5Z2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=nCKwNM17Drvwix9gXn48Rtm+XGi65YKCf5rZSSt9Juo=; b=cQIuCwjQ/3x1DJcsGNIg+Cbeynq74VqIIrjSL7Q4W61HAIgidkhtvNyxism88pxMoc S5EXINxITBmX2LriYbJxLyXm2K7D+x7/Yju2yIK761QtPsKlVLWwhECvxzzyrzRD8xd4 0D2xD8azqZ0d9ln4HeMleuOEm7oBwtdLfyhX8k70W4OQ2bDeg81BgMdT8B1HHzT+HsV7 UEKnhbPt77M2CsbJDKFH1id5ubl6jL4kU7lE8DzaYDaVo0C/gg5916g/SPvnpOTW05Be oy79qGm+5TYJ0xTmr8VGdwdKenWyMPavqT3M32706iQMM0gRHk6xvx0GWpYVcYpjh8Ps OgMQ== X-Gm-Message-State: AJIora++IT2U+DO6H151AMAF2/GXOLHaGhxXfikUHtnC/cEkOb2n+iMt fBr+OVnwyxsOtajvyMGbTHYk7jkdEQKR+hXz0+l3KOjRi8g= X-Google-Smtp-Source: AGRyM1tApZJY7SpKYWeVxdJsFyXEf84t7tsx0i1bSnONCsEg2f0ADqw1DKkuAQuKg0DX9qUxxykDK9P5l3ta/1Ij/oQ= X-Received: by 2002:a37:c20a:0:b0:6a6:bfa7:ca5a with SMTP id i10-20020a37c20a000000b006a6bfa7ca5amr6613440qkm.283.1655470495212; Fri, 17 Jun 2022 05:54:55 -0700 (PDT) MIME-Version: 1.0 References: <20220603033432.3170553-1-psatheesh@marvell.com> <20220615135705.910841-1-psatheesh@marvell.com> In-Reply-To: <20220615135705.910841-1-psatheesh@marvell.com> From: Jerin Jacob Date: Fri, 17 Jun 2022 18:24:29 +0530 Message-ID: Subject: Re: [dpdk-dev] [PATCH v2] common/cnxk: add ROC API to free MCAM entry To: Satheesh Paul Cc: Nithin Dabilpuram , Kiran Kumar K , Sunil Kumar Kori , Satha Rao , Ray Kinsella , dpdk-dev , Jerin Jacob Content-Type: text/plain; charset="UTF-8" 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 On Wed, Jun 15, 2022 at 7:29 PM wrote: > > 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 Applied to dpdk-next-net-mrvl/for-next-net. Thanks > --- > 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 >