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)
{
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;
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);
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;
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;
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);
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_ */
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];
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;
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;
}
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;
flow->mcam_id = entry;
- if (use_ctr)
+ if (flow->use_ctr)
flow->ctr_id = ctr;
return 0;
}
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_ */
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;
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;
* 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;
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;