xref: /dpdk/drivers/common/cnxk/roc_eswitch.c (revision 29a8df5cb664feb6f182c07868c49c0f5c9a4c46)
1df29c91cSHarman Kalra /* SPDX-License-Identifier: BSD-3-Clause
2df29c91cSHarman Kalra  * Copyright(C) 2024 Marvell.
3df29c91cSHarman Kalra  */
4df29c91cSHarman Kalra 
5df29c91cSHarman Kalra #include <arpa/inet.h>
6df29c91cSHarman Kalra 
7df29c91cSHarman Kalra #include "roc_api.h"
8df29c91cSHarman Kalra #include "roc_priv.h"
9df29c91cSHarman Kalra 
10df29c91cSHarman Kalra static int
11df29c91cSHarman Kalra eswitch_vlan_rx_cfg(uint16_t pcifunc, struct mbox *mbox)
12df29c91cSHarman Kalra {
13df29c91cSHarman Kalra 	struct nix_vtag_config *vtag_cfg;
14df29c91cSHarman Kalra 	int rc;
15df29c91cSHarman Kalra 
16df29c91cSHarman Kalra 	vtag_cfg = mbox_alloc_msg_nix_vtag_cfg(mbox_get(mbox));
17df29c91cSHarman Kalra 	if (!vtag_cfg) {
18df29c91cSHarman Kalra 		rc = -EINVAL;
19df29c91cSHarman Kalra 		goto exit;
20df29c91cSHarman Kalra 	}
21df29c91cSHarman Kalra 
22df29c91cSHarman Kalra 	/* config strip, capture and size */
23df29c91cSHarman Kalra 	vtag_cfg->hdr.pcifunc = pcifunc;
24df29c91cSHarman Kalra 	vtag_cfg->vtag_size = NIX_VTAGSIZE_T4;
25df29c91cSHarman Kalra 	vtag_cfg->cfg_type = VTAG_RX; /* rx vlan cfg */
26df29c91cSHarman Kalra 	vtag_cfg->rx.vtag_type = NIX_RX_VTAG_TYPE0;
27df29c91cSHarman Kalra 	vtag_cfg->rx.strip_vtag = true;
28df29c91cSHarman Kalra 	vtag_cfg->rx.capture_vtag = true;
29df29c91cSHarman Kalra 
30df29c91cSHarman Kalra 	rc = mbox_process(mbox);
31df29c91cSHarman Kalra 	if (rc)
32df29c91cSHarman Kalra 		goto exit;
33df29c91cSHarman Kalra 
34df29c91cSHarman Kalra 	rc = 0;
35df29c91cSHarman Kalra exit:
36df29c91cSHarman Kalra 	mbox_put(mbox);
37df29c91cSHarman Kalra 	return rc;
38df29c91cSHarman Kalra }
39df29c91cSHarman Kalra 
40df29c91cSHarman Kalra static int
41df29c91cSHarman Kalra eswitch_vlan_tx_cfg(struct roc_npc_flow *flow, uint16_t pcifunc, struct mbox *mbox,
42df29c91cSHarman Kalra 		    uint16_t vlan_tci, uint16_t *vidx)
43df29c91cSHarman Kalra {
44df29c91cSHarman Kalra 	struct nix_vtag_config *vtag_cfg;
45df29c91cSHarman Kalra 	struct nix_vtag_config_rsp *rsp;
46df29c91cSHarman Kalra 	int rc;
47df29c91cSHarman Kalra 
48df29c91cSHarman Kalra 	union {
49df29c91cSHarman Kalra 		uint64_t reg;
50df29c91cSHarman Kalra 		struct nix_tx_vtag_action_s act;
51df29c91cSHarman Kalra 	} tx_vtag_action;
52df29c91cSHarman Kalra 
53df29c91cSHarman Kalra 	vtag_cfg = mbox_alloc_msg_nix_vtag_cfg(mbox_get(mbox));
54df29c91cSHarman Kalra 	if (!vtag_cfg) {
55df29c91cSHarman Kalra 		rc = -EINVAL;
56df29c91cSHarman Kalra 		goto exit;
57df29c91cSHarman Kalra 	}
58df29c91cSHarman Kalra 
59df29c91cSHarman Kalra 	/* Insert vlan tag */
60df29c91cSHarman Kalra 	vtag_cfg->hdr.pcifunc = pcifunc;
61df29c91cSHarman Kalra 	vtag_cfg->vtag_size = NIX_VTAGSIZE_T4;
62df29c91cSHarman Kalra 	vtag_cfg->cfg_type = VTAG_TX; /* tx vlan cfg */
63df29c91cSHarman Kalra 	vtag_cfg->tx.cfg_vtag0 = true;
64df29c91cSHarman Kalra 	vtag_cfg->tx.vtag0 = (((uint32_t)ROC_ESWITCH_VLAN_TPID << 16) | vlan_tci);
65df29c91cSHarman Kalra 
66df29c91cSHarman Kalra 	rc = mbox_process_msg(mbox, (void *)&rsp);
67df29c91cSHarman Kalra 	if (rc)
68df29c91cSHarman Kalra 		goto exit;
69df29c91cSHarman Kalra 
70df29c91cSHarman Kalra 	if (rsp->vtag0_idx < 0) {
71df29c91cSHarman Kalra 		plt_err("Failed to config TX VTAG action");
72df29c91cSHarman Kalra 		rc = -EINVAL;
73df29c91cSHarman Kalra 		goto exit;
74df29c91cSHarman Kalra 	}
75df29c91cSHarman Kalra 
76df29c91cSHarman Kalra 	*vidx = rsp->vtag0_idx;
77df29c91cSHarman Kalra 	tx_vtag_action.reg = 0;
78df29c91cSHarman Kalra 	tx_vtag_action.act.vtag0_def = rsp->vtag0_idx;
79df29c91cSHarman Kalra 	tx_vtag_action.act.vtag0_lid = NPC_LID_LA;
80df29c91cSHarman Kalra 	tx_vtag_action.act.vtag0_op = NIX_TX_VTAGOP_INSERT;
81df29c91cSHarman Kalra 	tx_vtag_action.act.vtag0_relptr = NIX_TX_VTAGACTION_VTAG0_RELPTR;
82df29c91cSHarman Kalra 
83df29c91cSHarman Kalra 	flow->vtag_action = tx_vtag_action.reg;
84df29c91cSHarman Kalra 
85df29c91cSHarman Kalra 	rc = 0;
86df29c91cSHarman Kalra exit:
87df29c91cSHarman Kalra 	mbox_put(mbox);
88df29c91cSHarman Kalra 	return rc;
89df29c91cSHarman Kalra }
90df29c91cSHarman Kalra 
91df29c91cSHarman Kalra int
92df29c91cSHarman Kalra roc_eswitch_npc_mcam_tx_rule(struct roc_npc *roc_npc, struct roc_npc_flow *flow, uint16_t pcifunc,
93df29c91cSHarman Kalra 			     uint32_t vlan_tci)
94df29c91cSHarman Kalra {
95df29c91cSHarman Kalra 	struct npc *npc = roc_npc_to_npc_priv(roc_npc);
96df29c91cSHarman Kalra 	struct npc_install_flow_req *req;
97df29c91cSHarman Kalra 	struct npc_install_flow_rsp *rsp;
98df29c91cSHarman Kalra 	struct mbox *mbox = npc->mbox;
99df29c91cSHarman Kalra 	uint16_t vidx = 0, lbkid;
100df29c91cSHarman Kalra 	int rc;
101df29c91cSHarman Kalra 
102df29c91cSHarman Kalra 	rc = eswitch_vlan_tx_cfg(flow, roc_npc->pf_func, mbox, vlan_tci, &vidx);
103df29c91cSHarman Kalra 	if (rc) {
104df29c91cSHarman Kalra 		plt_err("Failed to configure VLAN TX, err %d", rc);
105df29c91cSHarman Kalra 		goto fail;
106df29c91cSHarman Kalra 	}
107df29c91cSHarman Kalra 
108df29c91cSHarman Kalra 	req = mbox_alloc_msg_npc_install_flow(mbox_get(mbox));
109df29c91cSHarman Kalra 	if (!req) {
110df29c91cSHarman Kalra 		rc = -EINVAL;
111df29c91cSHarman Kalra 		goto exit;
112df29c91cSHarman Kalra 	}
113df29c91cSHarman Kalra 
114df29c91cSHarman Kalra 	lbkid = 0;
115df29c91cSHarman Kalra 	req->hdr.pcifunc = roc_npc->pf_func; /* Eswitch PF is requester */
116df29c91cSHarman Kalra 	req->vf = pcifunc;
117df29c91cSHarman Kalra 	req->entry = flow->mcam_id;
118df29c91cSHarman Kalra 	req->intf = NPC_MCAM_TX;
119df29c91cSHarman Kalra 	req->op = NIX_TX_ACTIONOP_UCAST_CHAN;
120df29c91cSHarman Kalra 	req->index = (lbkid << 8) | ROC_ESWITCH_LBK_CHAN;
121df29c91cSHarman Kalra 	req->set_cntr = 1;
122df29c91cSHarman Kalra 	req->vtag0_def = vidx;
123df29c91cSHarman Kalra 	req->vtag0_op = 1;
124df29c91cSHarman Kalra 	rc = mbox_process_msg(mbox, (void *)&rsp);
125df29c91cSHarman Kalra 	if (rc)
126df29c91cSHarman Kalra 		goto exit;
127df29c91cSHarman Kalra 
128df29c91cSHarman Kalra 	flow->nix_intf = NIX_INTF_TX;
129df29c91cSHarman Kalra exit:
130df29c91cSHarman Kalra 	mbox_put(mbox);
131df29c91cSHarman Kalra fail:
132df29c91cSHarman Kalra 	return rc;
133df29c91cSHarman Kalra }
134df29c91cSHarman Kalra 
135df29c91cSHarman Kalra static int
136df29c91cSHarman Kalra eswitch_vtag_cfg_delete(struct roc_npc *roc_npc, struct roc_npc_flow *flow)
137df29c91cSHarman Kalra {
138df29c91cSHarman Kalra 	struct npc *npc = roc_npc_to_npc_priv(roc_npc);
139df29c91cSHarman Kalra 	struct nix_vtag_config *vtag_cfg;
140df29c91cSHarman Kalra 	struct nix_vtag_config_rsp *rsp;
141df29c91cSHarman Kalra 	struct mbox *mbox = npc->mbox;
142df29c91cSHarman Kalra 	int rc = 0;
143df29c91cSHarman Kalra 
144df29c91cSHarman Kalra 	union {
145df29c91cSHarman Kalra 		uint64_t reg;
146df29c91cSHarman Kalra 		struct nix_tx_vtag_action_s act;
147df29c91cSHarman Kalra 	} tx_vtag_action;
148df29c91cSHarman Kalra 
149df29c91cSHarman Kalra 	tx_vtag_action.reg = flow->vtag_action;
150df29c91cSHarman Kalra 	vtag_cfg = mbox_alloc_msg_nix_vtag_cfg(mbox_get(mbox));
151df29c91cSHarman Kalra 
152df29c91cSHarman Kalra 	if (vtag_cfg == NULL) {
153df29c91cSHarman Kalra 		rc = -ENOSPC;
154df29c91cSHarman Kalra 		goto exit;
155df29c91cSHarman Kalra 	}
156df29c91cSHarman Kalra 
157df29c91cSHarman Kalra 	vtag_cfg->cfg_type = VTAG_TX;
158df29c91cSHarman Kalra 	vtag_cfg->vtag_size = NIX_VTAGSIZE_T4;
159df29c91cSHarman Kalra 	vtag_cfg->tx.vtag0_idx = tx_vtag_action.act.vtag0_def;
160df29c91cSHarman Kalra 	vtag_cfg->tx.free_vtag0 = true;
161df29c91cSHarman Kalra 
162df29c91cSHarman Kalra 	rc = mbox_process_msg(mbox, (void *)&rsp);
163df29c91cSHarman Kalra 	if (rc)
164df29c91cSHarman Kalra 		goto exit;
165df29c91cSHarman Kalra 
166df29c91cSHarman Kalra 	rc = rsp->hdr.rc;
167df29c91cSHarman Kalra exit:
168df29c91cSHarman Kalra 	mbox_put(mbox);
169df29c91cSHarman Kalra 	return rc;
170df29c91cSHarman Kalra }
171df29c91cSHarman Kalra 
172df29c91cSHarman Kalra int
173df29c91cSHarman Kalra roc_eswitch_npc_mcam_delete_rule(struct roc_npc *roc_npc, struct roc_npc_flow *flow,
174df29c91cSHarman Kalra 				 uint16_t pcifunc)
175df29c91cSHarman Kalra {
176df29c91cSHarman Kalra 	struct npc *npc = roc_npc_to_npc_priv(roc_npc);
177df29c91cSHarman Kalra 	struct npc_delete_flow_req *req;
178df29c91cSHarman Kalra 	struct msg_rsp *rsp;
179df29c91cSHarman Kalra 	struct mbox *mbox = npc->mbox;
180df29c91cSHarman Kalra 	int rc = 0;
181df29c91cSHarman Kalra 
182df29c91cSHarman Kalra 	/* Removing the VLAN TX config */
183df29c91cSHarman Kalra 	if (flow->nix_intf == NIX_INTF_TX) {
184df29c91cSHarman Kalra 		rc = eswitch_vtag_cfg_delete(roc_npc, flow);
185df29c91cSHarman Kalra 		if (rc)
186df29c91cSHarman Kalra 			plt_err("Failed to delete TX vtag config");
187df29c91cSHarman Kalra 	}
188df29c91cSHarman Kalra 
189df29c91cSHarman Kalra 	req = mbox_alloc_msg_npc_delete_flow(mbox_get(mbox));
190df29c91cSHarman Kalra 	if (!req) {
191df29c91cSHarman Kalra 		rc = -EINVAL;
192df29c91cSHarman Kalra 		goto exit;
193df29c91cSHarman Kalra 	}
194df29c91cSHarman Kalra 
195df29c91cSHarman Kalra 	req->entry = flow->mcam_id;
196df29c91cSHarman Kalra 	req->vf = pcifunc;
197df29c91cSHarman Kalra 	rc = mbox_process_msg(mbox, (void *)&rsp);
198df29c91cSHarman Kalra 	if (rc)
199df29c91cSHarman Kalra 		goto exit;
200df29c91cSHarman Kalra 
201df29c91cSHarman Kalra 	rc = rsp->hdr.rc;
202df29c91cSHarman Kalra exit:
203df29c91cSHarman Kalra 	mbox_put(mbox);
204df29c91cSHarman Kalra 	return rc;
205df29c91cSHarman Kalra }
206df29c91cSHarman Kalra 
207df29c91cSHarman Kalra int
208df29c91cSHarman Kalra roc_eswitch_npc_mcam_rx_rule(struct roc_npc *roc_npc, struct roc_npc_flow *flow, uint16_t pcifunc,
209df29c91cSHarman Kalra 			     uint16_t vlan_tci, uint16_t vlan_tci_mask)
210df29c91cSHarman Kalra {
211df29c91cSHarman Kalra 	struct npc *npc = roc_npc_to_npc_priv(roc_npc);
212df29c91cSHarman Kalra 	struct npc_install_flow_req *req;
213df29c91cSHarman Kalra 	struct npc_install_flow_rsp *rsp;
214df29c91cSHarman Kalra 	struct mbox *mbox = npc->mbox;
215df29c91cSHarman Kalra 	bool is_esw_dev;
216df29c91cSHarman Kalra 	int rc;
217df29c91cSHarman Kalra 
218df29c91cSHarman Kalra 	/* For ESW PF/VF */
219df29c91cSHarman Kalra 	is_esw_dev = (dev_get_pf(roc_npc->pf_func) == dev_get_pf(pcifunc));
220df29c91cSHarman Kalra 	/* VLAN Rx config */
221df29c91cSHarman Kalra 	if (is_esw_dev) {
222df29c91cSHarman Kalra 		rc = eswitch_vlan_rx_cfg(roc_npc->pf_func, mbox);
223df29c91cSHarman Kalra 		if (rc) {
224df29c91cSHarman Kalra 			plt_err("Failed to configure VLAN RX rule, err %d", rc);
225df29c91cSHarman Kalra 			goto fail;
226df29c91cSHarman Kalra 		}
227df29c91cSHarman Kalra 	}
228df29c91cSHarman Kalra 
229df29c91cSHarman Kalra 	req = mbox_alloc_msg_npc_install_flow(mbox_get(mbox));
230df29c91cSHarman Kalra 	if (!req) {
231df29c91cSHarman Kalra 		rc = -EINVAL;
232df29c91cSHarman Kalra 		goto exit;
233df29c91cSHarman Kalra 	}
234df29c91cSHarman Kalra 
235df29c91cSHarman Kalra 	req->vf = pcifunc;
236df29c91cSHarman Kalra 	/* Action */
237df29c91cSHarman Kalra 	req->op = NIX_RX_ACTIONOP_DEFAULT;
238df29c91cSHarman Kalra 	req->index = 0;
239df29c91cSHarman Kalra 	req->entry = flow->mcam_id;
240df29c91cSHarman Kalra 	req->hdr.pcifunc = roc_npc->pf_func; /* Eswitch PF is requester */
241df29c91cSHarman Kalra 	req->features = BIT_ULL(NPC_OUTER_VID) | BIT_ULL(NPC_VLAN_ETYPE_CTAG);
242df29c91cSHarman Kalra 	req->vtag0_valid = true;
243df29c91cSHarman Kalra 	/* For ESW PF/VF using configured vlan rx cfg while for other
244df29c91cSHarman Kalra 	 * representees using standard vlan_type = 7 which is strip.
245df29c91cSHarman Kalra 	 */
246df29c91cSHarman Kalra 	req->vtag0_type = is_esw_dev ? NIX_RX_VTAG_TYPE0 : NIX_RX_VTAG_TYPE7;
247df29c91cSHarman Kalra 	req->packet.vlan_etype = ROC_ESWITCH_VLAN_TPID;
248df29c91cSHarman Kalra 	req->mask.vlan_etype = 0xFFFF;
249df29c91cSHarman Kalra 	req->packet.vlan_tci = ntohs(vlan_tci & 0xFFFF);
250df29c91cSHarman Kalra 	req->mask.vlan_tci = ntohs(vlan_tci_mask);
251df29c91cSHarman Kalra 
252df29c91cSHarman Kalra 	req->channel = ROC_ESWITCH_LBK_CHAN;
253df29c91cSHarman Kalra 	req->chan_mask = 0xffff;
254df29c91cSHarman Kalra 	req->intf = NPC_MCAM_RX;
255df29c91cSHarman Kalra 	req->set_cntr = 1;
256df29c91cSHarman Kalra 	req->cntr_val = flow->ctr_id;
257df29c91cSHarman Kalra 
258df29c91cSHarman Kalra 	rc = mbox_process_msg(mbox, (void *)&rsp);
259df29c91cSHarman Kalra 	if (rc)
260df29c91cSHarman Kalra 		goto exit;
261df29c91cSHarman Kalra 
262df29c91cSHarman Kalra 	flow->nix_intf = NIX_INTF_RX;
263df29c91cSHarman Kalra exit:
264df29c91cSHarman Kalra 	mbox_put(mbox);
265df29c91cSHarman Kalra fail:
266df29c91cSHarman Kalra 	return rc;
267df29c91cSHarman Kalra }
268df29c91cSHarman Kalra 
269df29c91cSHarman Kalra int
270df29c91cSHarman Kalra roc_eswitch_npc_rss_action_configure(struct roc_npc *roc_npc, struct roc_npc_flow *flow,
271df29c91cSHarman Kalra 				     uint32_t flowkey_cfg, uint16_t *reta_tbl)
272df29c91cSHarman Kalra {
273df29c91cSHarman Kalra 	struct npc *npc = roc_npc_to_npc_priv(roc_npc);
274df29c91cSHarman Kalra 	struct roc_nix *roc_nix = roc_npc->roc_nix;
275df29c91cSHarman Kalra 	uint32_t rss_grp_idx;
276df29c91cSHarman Kalra 	uint8_t flowkey_algx;
277df29c91cSHarman Kalra 	int rc;
278df29c91cSHarman Kalra 
279df29c91cSHarman Kalra 	rc = npc_rss_free_grp_get(npc, &rss_grp_idx);
280df29c91cSHarman Kalra 	/* RSS group :0 is not usable for flow rss action */
281df29c91cSHarman Kalra 	if (rc < 0 || rss_grp_idx == 0)
282df29c91cSHarman Kalra 		return -ENOSPC;
283df29c91cSHarman Kalra 
284df29c91cSHarman Kalra 	/* Populating reta table for the specific RSS group */
285df29c91cSHarman Kalra 	rc = roc_nix_rss_reta_set(roc_nix, rss_grp_idx, reta_tbl);
286df29c91cSHarman Kalra 	if (rc) {
287df29c91cSHarman Kalra 		plt_err("Failed to init rss table rc = %d", rc);
288df29c91cSHarman Kalra 		return rc;
289df29c91cSHarman Kalra 	}
290df29c91cSHarman Kalra 
291df29c91cSHarman Kalra 	rc = roc_nix_rss_flowkey_set(roc_nix, &flowkey_algx, flowkey_cfg, rss_grp_idx,
292df29c91cSHarman Kalra 				     flow->mcam_id);
293df29c91cSHarman Kalra 	if (rc) {
294df29c91cSHarman Kalra 		plt_err("Failed to set rss hash function rc = %d", rc);
295df29c91cSHarman Kalra 		return rc;
296df29c91cSHarman Kalra 	}
297df29c91cSHarman Kalra 
298df29c91cSHarman Kalra 	plt_bitmap_set(npc->rss_grp_entries, rss_grp_idx);
299df29c91cSHarman Kalra 
300df29c91cSHarman Kalra 	flow->npc_action &= (~(0xfULL));
301df29c91cSHarman Kalra 	flow->npc_action |= NIX_RX_ACTIONOP_RSS;
302df29c91cSHarman Kalra 	flow->npc_action |=
303df29c91cSHarman Kalra 		((uint64_t)(flowkey_algx & NPC_RSS_ACT_ALG_MASK) << NPC_RSS_ACT_ALG_OFFSET) |
304df29c91cSHarman Kalra 		((uint64_t)(rss_grp_idx & NPC_RSS_ACT_GRP_MASK) << NPC_RSS_ACT_GRP_OFFSET);
305df29c91cSHarman Kalra 	return 0;
306df29c91cSHarman Kalra }
3078ae147acSHarman Kalra 
3088ae147acSHarman Kalra int
3098ae147acSHarman Kalra roc_eswitch_nix_vlan_tpid_set(struct roc_nix *roc_nix, uint32_t type, uint16_t tpid, bool is_vf)
3108ae147acSHarman Kalra {
3118ae147acSHarman Kalra 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
3128ae147acSHarman Kalra 	struct dev *dev = &nix->dev;
3138ae147acSHarman Kalra 	int rc;
3148ae147acSHarman Kalra 
3158ae147acSHarman Kalra 	/* Configuring for PF/VF */
3168ae147acSHarman Kalra 	rc = nix_vlan_tpid_set(dev->mbox, dev->pf_func | is_vf, type, tpid);
3178ae147acSHarman Kalra 	if (rc)
3188ae147acSHarman Kalra 		plt_err("Failed to set tpid for PF, rc %d", rc);
3198ae147acSHarman Kalra 
3208ae147acSHarman Kalra 	return rc;
3218ae147acSHarman Kalra }
322d85c80b4SHarman Kalra 
323d85c80b4SHarman Kalra int
324d85c80b4SHarman Kalra roc_eswitch_nix_process_repte_notify_cb_register(struct roc_nix *roc_nix,
325d85c80b4SHarman Kalra 						 process_repte_notify_t proc_repte_nt)
326d85c80b4SHarman Kalra {
327d85c80b4SHarman Kalra 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
328d85c80b4SHarman Kalra 	struct dev *dev = &nix->dev;
329d85c80b4SHarman Kalra 
330d85c80b4SHarman Kalra 	if (proc_repte_nt == NULL)
331d85c80b4SHarman Kalra 		return NIX_ERR_PARAM;
332d85c80b4SHarman Kalra 
333d85c80b4SHarman Kalra 	dev->ops->repte_notify = (repte_notify_t)proc_repte_nt;
334d85c80b4SHarman Kalra 	return 0;
335d85c80b4SHarman Kalra }
336d85c80b4SHarman Kalra 
337d85c80b4SHarman Kalra void
338d85c80b4SHarman Kalra roc_eswitch_nix_process_repte_notify_cb_unregister(struct roc_nix *roc_nix)
339d85c80b4SHarman Kalra {
340d85c80b4SHarman Kalra 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
341d85c80b4SHarman Kalra 	struct dev *dev = &nix->dev;
342d85c80b4SHarman Kalra 
343d85c80b4SHarman Kalra 	dev->ops->repte_notify = NULL;
344d85c80b4SHarman Kalra }
345d921b1bbSHarman Kalra 
346d921b1bbSHarman Kalra int
347d921b1bbSHarman Kalra roc_eswitch_nix_repte_stats(struct roc_nix *roc_nix, uint16_t pf_func, struct roc_nix_stats *stats)
348d921b1bbSHarman Kalra {
349d921b1bbSHarman Kalra 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
350d921b1bbSHarman Kalra 	struct dev *dev = &nix->dev;
351d921b1bbSHarman Kalra 	struct nix_get_lf_stats_req *req;
352d921b1bbSHarman Kalra 	struct nix_lf_stats_rsp *rsp;
353d921b1bbSHarman Kalra 	struct mbox *mbox;
354d921b1bbSHarman Kalra 	int rc;
355d921b1bbSHarman Kalra 
356d921b1bbSHarman Kalra 	mbox = mbox_get(dev->mbox);
357d921b1bbSHarman Kalra 	req = mbox_alloc_msg_nix_get_lf_stats(mbox);
358d921b1bbSHarman Kalra 	if (!req) {
359d921b1bbSHarman Kalra 		rc = -ENOSPC;
360d921b1bbSHarman Kalra 		goto exit;
361d921b1bbSHarman Kalra 	}
362d921b1bbSHarman Kalra 
363d921b1bbSHarman Kalra 	req->hdr.pcifunc = roc_nix_get_pf_func(roc_nix);
364d921b1bbSHarman Kalra 	req->pcifunc = pf_func;
365d921b1bbSHarman Kalra 
366d921b1bbSHarman Kalra 	rc = mbox_process_msg(mbox, (void *)&rsp);
367d921b1bbSHarman Kalra 	if (rc)
368d921b1bbSHarman Kalra 		goto exit;
369d921b1bbSHarman Kalra 
370d921b1bbSHarman Kalra 	stats->rx_octs = rsp->rx.octs;
371d921b1bbSHarman Kalra 	stats->rx_ucast = rsp->rx.ucast;
372d921b1bbSHarman Kalra 	stats->rx_bcast = rsp->rx.bcast;
373d921b1bbSHarman Kalra 	stats->rx_mcast = rsp->rx.mcast;
374d921b1bbSHarman Kalra 	stats->rx_drop = rsp->rx.drop;
375d921b1bbSHarman Kalra 	stats->rx_drop_octs = rsp->rx.drop_octs;
376d921b1bbSHarman Kalra 	stats->rx_drop_bcast = rsp->rx.drop_bcast;
377d921b1bbSHarman Kalra 	stats->rx_drop_mcast = rsp->rx.drop_mcast;
378d921b1bbSHarman Kalra 	stats->rx_err = rsp->rx.err;
379d921b1bbSHarman Kalra 
380d921b1bbSHarman Kalra 	stats->tx_ucast = rsp->tx.ucast;
381d921b1bbSHarman Kalra 	stats->tx_bcast = rsp->tx.bcast;
382d921b1bbSHarman Kalra 	stats->tx_mcast = rsp->tx.mcast;
383d921b1bbSHarman Kalra 	stats->tx_drop = rsp->tx.drop;
384d921b1bbSHarman Kalra 	stats->tx_octs = rsp->tx.octs;
385d921b1bbSHarman Kalra 
386d921b1bbSHarman Kalra exit:
387d921b1bbSHarman Kalra 	mbox_put(mbox);
388d921b1bbSHarman Kalra 	return rc;
389d921b1bbSHarman Kalra }
390*29a8df5cSHarman Kalra 
391*29a8df5cSHarman Kalra int
392*29a8df5cSHarman Kalra roc_eswitch_is_repte_pfs_vf(uint16_t rep_pffunc, uint16_t pf_pffunc)
393*29a8df5cSHarman Kalra {
394*29a8df5cSHarman Kalra 	uint16_t rep_pf = dev_get_pf(rep_pffunc);
395*29a8df5cSHarman Kalra 
396*29a8df5cSHarman Kalra 	if (roc_model_is_cn20k())
397*29a8df5cSHarman Kalra 		return ((rep_pf << RVU_PFVF_PF_SHIFT_CN20K) == pf_pffunc);
398*29a8df5cSHarman Kalra 	else
399*29a8df5cSHarman Kalra 		return ((rep_pf << RVU_PFVF_PF_SHIFT) == pf_pffunc);
400*29a8df5cSHarman Kalra }
401