xref: /dpdk/drivers/common/cnxk/roc_nix_mcast.c (revision 209188d10cdab6564967882f5b1521c11c29eedd)
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