11c518ee1SSunil Kumar Kori /* SPDX-License-Identifier: BSD-3-Clause
21c518ee1SSunil Kumar Kori * Copyright(C) 2021 Marvell.
31c518ee1SSunil Kumar Kori */
41c518ee1SSunil Kumar Kori
51c518ee1SSunil Kumar Kori #include "roc_api.h"
61c518ee1SSunil Kumar Kori #include "roc_priv.h"
71c518ee1SSunil Kumar Kori
81c518ee1SSunil Kumar Kori int
roc_nix_mcast_mcam_entry_alloc(struct roc_nix * roc_nix,uint16_t nb_entries,uint8_t priority,uint16_t index[])91c518ee1SSunil Kumar Kori roc_nix_mcast_mcam_entry_alloc(struct roc_nix *roc_nix, uint16_t nb_entries,
101c518ee1SSunil Kumar Kori uint8_t priority, uint16_t index[])
111c518ee1SSunil Kumar Kori {
1244a9307cSRakesh Kudurumalla struct nix *nix = roc_nix_to_nix_priv(roc_nix);
1344a9307cSRakesh Kudurumalla struct dev *dev = &nix->dev;
1444a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(dev->mbox);
151c518ee1SSunil Kumar Kori struct npc_mcam_alloc_entry_req *req;
161c518ee1SSunil Kumar Kori struct npc_mcam_alloc_entry_rsp *rsp;
171c518ee1SSunil Kumar Kori int rc = -ENOSPC, i;
181c518ee1SSunil Kumar Kori
191c518ee1SSunil Kumar Kori req = mbox_alloc_msg_npc_mcam_alloc_entry(mbox);
201c518ee1SSunil Kumar Kori if (req == NULL)
2144a9307cSRakesh Kudurumalla goto exit;
221c518ee1SSunil Kumar Kori req->priority = priority;
231c518ee1SSunil Kumar Kori req->count = nb_entries;
241c518ee1SSunil Kumar Kori
251c518ee1SSunil Kumar Kori rc = mbox_process_msg(mbox, (void *)&rsp);
261c518ee1SSunil Kumar Kori if (rc)
2744a9307cSRakesh Kudurumalla goto exit;
281c518ee1SSunil Kumar Kori
291c518ee1SSunil Kumar Kori for (i = 0; i < rsp->count; i++)
301c518ee1SSunil Kumar Kori index[i] = rsp->entry_list[i];
311c518ee1SSunil Kumar Kori
3244a9307cSRakesh Kudurumalla rc = rsp->count;
3344a9307cSRakesh Kudurumalla exit:
3444a9307cSRakesh Kudurumalla mbox_put(mbox);
3544a9307cSRakesh Kudurumalla return rc;
361c518ee1SSunil Kumar Kori }
371c518ee1SSunil Kumar Kori
381c518ee1SSunil Kumar Kori int
roc_nix_mcast_mcam_entry_free(struct roc_nix * roc_nix,uint32_t index)391c518ee1SSunil Kumar Kori roc_nix_mcast_mcam_entry_free(struct roc_nix *roc_nix, uint32_t index)
401c518ee1SSunil Kumar Kori {
4144a9307cSRakesh Kudurumalla struct nix *nix = roc_nix_to_nix_priv(roc_nix);
4244a9307cSRakesh Kudurumalla struct dev *dev = &nix->dev;
4344a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(dev->mbox);
441c518ee1SSunil Kumar Kori struct npc_mcam_free_entry_req *req;
451c518ee1SSunil Kumar Kori int rc = -ENOSPC;
461c518ee1SSunil Kumar Kori
471c518ee1SSunil Kumar Kori req = mbox_alloc_msg_npc_mcam_free_entry(mbox);
481c518ee1SSunil Kumar Kori if (req == NULL)
4944a9307cSRakesh Kudurumalla goto exit;
501c518ee1SSunil Kumar Kori req->entry = index;
511c518ee1SSunil Kumar Kori
5244a9307cSRakesh Kudurumalla rc = mbox_process_msg(mbox, NULL);
5344a9307cSRakesh Kudurumalla exit:
5444a9307cSRakesh Kudurumalla mbox_put(mbox);
5544a9307cSRakesh Kudurumalla return rc;
561c518ee1SSunil Kumar Kori }
571c518ee1SSunil Kumar Kori
581c518ee1SSunil Kumar Kori int
roc_nix_mcast_mcam_entry_write(struct roc_nix * roc_nix,struct mcam_entry * entry,uint32_t index,uint8_t intf,uint64_t action)591c518ee1SSunil Kumar Kori roc_nix_mcast_mcam_entry_write(struct roc_nix *roc_nix,
601c518ee1SSunil Kumar Kori struct mcam_entry *entry, uint32_t index,
611c518ee1SSunil Kumar Kori uint8_t intf, uint64_t action)
621c518ee1SSunil Kumar Kori {
6344a9307cSRakesh Kudurumalla struct nix *nix = roc_nix_to_nix_priv(roc_nix);
6444a9307cSRakesh Kudurumalla struct dev *dev = &nix->dev;
6544a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(dev->mbox);
661c518ee1SSunil Kumar Kori struct npc_mcam_write_entry_req *req;
671c518ee1SSunil Kumar Kori int rc = -ENOSPC;
681c518ee1SSunil Kumar Kori
691c518ee1SSunil Kumar Kori req = mbox_alloc_msg_npc_mcam_write_entry(mbox);
701c518ee1SSunil Kumar Kori if (req == NULL)
7144a9307cSRakesh Kudurumalla goto exit;
721c518ee1SSunil Kumar Kori req->entry = index;
731c518ee1SSunil Kumar Kori req->intf = intf;
741c518ee1SSunil Kumar Kori req->enable_entry = true;
751c518ee1SSunil Kumar Kori mbox_memcpy(&req->entry_data, entry, sizeof(struct mcam_entry));
761c518ee1SSunil Kumar Kori req->entry_data.action = action;
771c518ee1SSunil Kumar Kori
7844a9307cSRakesh Kudurumalla rc = mbox_process(mbox);
7944a9307cSRakesh Kudurumalla exit:
8044a9307cSRakesh Kudurumalla mbox_put(mbox);
8144a9307cSRakesh Kudurumalla return rc;
821c518ee1SSunil Kumar Kori }
831c518ee1SSunil Kumar Kori
841c518ee1SSunil Kumar Kori int
roc_nix_mcast_mcam_entry_ena_dis(struct roc_nix * roc_nix,uint32_t index,bool enable)851c518ee1SSunil Kumar Kori roc_nix_mcast_mcam_entry_ena_dis(struct roc_nix *roc_nix, uint32_t index,
861c518ee1SSunil Kumar Kori bool enable)
871c518ee1SSunil Kumar Kori {
881c518ee1SSunil Kumar Kori struct npc_mcam_ena_dis_entry_req *req;
8944a9307cSRakesh Kudurumalla struct nix *nix = roc_nix_to_nix_priv(roc_nix);
9044a9307cSRakesh Kudurumalla struct dev *dev = &nix->dev;
9144a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(dev->mbox);
921c518ee1SSunil Kumar Kori int rc = -ENOSPC;
931c518ee1SSunil Kumar Kori
941c518ee1SSunil Kumar Kori if (enable) {
951c518ee1SSunil Kumar Kori req = mbox_alloc_msg_npc_mcam_ena_entry(mbox);
961c518ee1SSunil Kumar Kori if (req == NULL)
9744a9307cSRakesh Kudurumalla goto exit;
981c518ee1SSunil Kumar Kori } else {
991c518ee1SSunil Kumar Kori req = mbox_alloc_msg_npc_mcam_dis_entry(mbox);
1001c518ee1SSunil Kumar Kori if (req == NULL)
10144a9307cSRakesh Kudurumalla goto exit;
1021c518ee1SSunil Kumar Kori }
1031c518ee1SSunil Kumar Kori
1041c518ee1SSunil Kumar Kori req->entry = index;
10544a9307cSRakesh Kudurumalla rc = mbox_process(mbox);
10644a9307cSRakesh Kudurumalla exit:
10744a9307cSRakesh Kudurumalla mbox_put(mbox);
10844a9307cSRakesh Kudurumalla return rc;
1091c518ee1SSunil Kumar Kori }
110*209188d1SSatheesh Paul
111*209188d1SSatheesh Paul int
roc_nix_mcast_list_setup(struct mbox * mbox,uint8_t intf,int nb_entries,uint16_t * pf_funcs,uint16_t * channels,uint32_t * rqs,uint32_t * grp_index,uint32_t * start_index)112*209188d1SSatheesh Paul roc_nix_mcast_list_setup(struct mbox *mbox, uint8_t intf, int nb_entries, uint16_t *pf_funcs,
113*209188d1SSatheesh Paul uint16_t *channels, uint32_t *rqs, uint32_t *grp_index,
114*209188d1SSatheesh Paul uint32_t *start_index)
115*209188d1SSatheesh Paul {
116*209188d1SSatheesh Paul struct nix_mcast_grp_create_req *mce_grp_create_req;
117*209188d1SSatheesh Paul struct nix_mcast_grp_create_rsp *mce_grp_create_rsp;
118*209188d1SSatheesh Paul struct nix_mcast_grp_update_req *mce_grp_update_req;
119*209188d1SSatheesh Paul struct nix_mcast_grp_update_rsp *mce_grp_update_rsp;
120*209188d1SSatheesh Paul int rc = 0, i;
121*209188d1SSatheesh Paul
122*209188d1SSatheesh Paul mbox_get(mbox);
123*209188d1SSatheesh Paul
124*209188d1SSatheesh Paul mce_grp_create_req = mbox_alloc_msg_nix_mcast_grp_create(mbox);
125*209188d1SSatheesh Paul if (mce_grp_create_req == NULL) {
126*209188d1SSatheesh Paul rc = -ENOSPC;
127*209188d1SSatheesh Paul goto exit;
128*209188d1SSatheesh Paul }
129*209188d1SSatheesh Paul
130*209188d1SSatheesh Paul mce_grp_create_req->dir = intf;
131*209188d1SSatheesh Paul rc = mbox_process_msg(mbox, (void *)&mce_grp_create_rsp);
132*209188d1SSatheesh Paul if (rc) {
133*209188d1SSatheesh Paul plt_err("Failed to create mirror list");
134*209188d1SSatheesh Paul goto exit;
135*209188d1SSatheesh Paul }
136*209188d1SSatheesh Paul
137*209188d1SSatheesh Paul *grp_index = mce_grp_create_rsp->mcast_grp_idx;
138*209188d1SSatheesh Paul
139*209188d1SSatheesh Paul mce_grp_update_req = mbox_alloc_msg_nix_mcast_grp_update(mbox);
140*209188d1SSatheesh Paul if (mce_grp_update_req == NULL) {
141*209188d1SSatheesh Paul rc = -ENOSPC;
142*209188d1SSatheesh Paul goto exit;
143*209188d1SSatheesh Paul }
144*209188d1SSatheesh Paul
145*209188d1SSatheesh Paul mce_grp_update_req->mcast_grp_idx = *grp_index;
146*209188d1SSatheesh Paul mce_grp_update_req->op = NIX_MCAST_OP_ADD_ENTRY;
147*209188d1SSatheesh Paul mce_grp_update_req->num_mce_entry = nb_entries;
148*209188d1SSatheesh Paul for (i = 0; i < nb_entries; i++) {
149*209188d1SSatheesh Paul mce_grp_update_req->pcifunc[i] = pf_funcs[i];
150*209188d1SSatheesh Paul mce_grp_update_req->channel[i] = channels[i];
151*209188d1SSatheesh Paul mce_grp_update_req->rq_rss_index[i] = rqs[i];
152*209188d1SSatheesh Paul mce_grp_update_req->dest_type[i] = NIX_RX_RQ;
153*209188d1SSatheesh Paul }
154*209188d1SSatheesh Paul
155*209188d1SSatheesh Paul rc = mbox_process_msg(mbox, (void *)&mce_grp_update_rsp);
156*209188d1SSatheesh Paul if (rc) {
157*209188d1SSatheesh Paul plt_err("Failed to create mirror list");
158*209188d1SSatheesh Paul goto exit;
159*209188d1SSatheesh Paul }
160*209188d1SSatheesh Paul
161*209188d1SSatheesh Paul *start_index = (mce_grp_update_rsp->mce_start_index & 0xFFFFF);
162*209188d1SSatheesh Paul
163*209188d1SSatheesh Paul rc = 0;
164*209188d1SSatheesh Paul exit:
165*209188d1SSatheesh Paul mbox_put(mbox);
166*209188d1SSatheesh Paul return rc;
167*209188d1SSatheesh Paul }
168*209188d1SSatheesh Paul
169*209188d1SSatheesh Paul int
roc_nix_mcast_list_free(struct mbox * mbox,uint32_t mcast_grp_index)170*209188d1SSatheesh Paul roc_nix_mcast_list_free(struct mbox *mbox, uint32_t mcast_grp_index)
171*209188d1SSatheesh Paul {
172*209188d1SSatheesh Paul struct nix_mcast_grp_destroy_req *mce_grp_destroy_req;
173*209188d1SSatheesh Paul struct nix_mcast_grp_destroy_rsp *mce_grp_destroy_rsp;
174*209188d1SSatheesh Paul int rc = 0;
175*209188d1SSatheesh Paul
176*209188d1SSatheesh Paul mbox_get(mbox);
177*209188d1SSatheesh Paul
178*209188d1SSatheesh Paul mce_grp_destroy_req = mbox_alloc_msg_nix_mcast_grp_destroy(mbox);
179*209188d1SSatheesh Paul if (mce_grp_destroy_req == NULL) {
180*209188d1SSatheesh Paul rc = -ENOSPC;
181*209188d1SSatheesh Paul goto exit;
182*209188d1SSatheesh Paul }
183*209188d1SSatheesh Paul
184*209188d1SSatheesh Paul mce_grp_destroy_req->mcast_grp_idx = mcast_grp_index;
185*209188d1SSatheesh Paul rc = mbox_process_msg(mbox, (void *)&mce_grp_destroy_rsp);
186*209188d1SSatheesh Paul if (rc) {
187*209188d1SSatheesh Paul plt_err("Failed to destroy mirror group index");
188*209188d1SSatheesh Paul goto exit;
189*209188d1SSatheesh Paul }
190*209188d1SSatheesh Paul
191*209188d1SSatheesh Paul rc = 0;
192*209188d1SSatheesh Paul exit:
193*209188d1SSatheesh Paul mbox_put(mbox);
194*209188d1SSatheesh Paul return rc;
195*209188d1SSatheesh Paul }
196