common/cnxk: add ROC API to free MCAM entry
authorSatheesh Paul <psatheesh@marvell.com>
Wed, 15 Jun 2022 13:57:05 +0000 (19:27 +0530)
committerJerin Jacob <jerinj@marvell.com>
Fri, 17 Jun 2022 12:52:42 +0000 (14:52 +0200)
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>
drivers/common/cnxk/roc_npc.c
drivers/common/cnxk/roc_npc.h
drivers/common/cnxk/roc_npc_mcam.c
drivers/common/cnxk/roc_npc_priv.h
drivers/common/cnxk/roc_npc_utils.c
drivers/common/cnxk/version.map

index da5b962..b38389b 100644 (file)
@@ -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;
 
index f92c2a6..1b4e552 100644 (file)
@@ -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_ */
index 0ae58da..245eeb0 100644 (file)
@@ -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;
 }
index 78d6ee8..b08539d 100644 (file)
@@ -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_ */
index e36a312..cbc6200 100644 (file)
@@ -264,9 +264,8 @@ done:
        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;
index 469f024..d1dd0cb 100644 (file)
@@ -332,7 +332,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;