xref: /dpdk/drivers/common/cnxk/roc_nix_npc.c (revision 44a9307c0908ae28989f5ab9b90ddcbc5484592f)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2021 Marvell.
3  */
4 
5 #include "roc_api.h"
6 #include "roc_priv.h"
7 
8 int
roc_nix_npc_promisc_ena_dis(struct roc_nix * roc_nix,int enable)9 roc_nix_npc_promisc_ena_dis(struct roc_nix *roc_nix, int enable)
10 {
11 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
12 	struct dev *dev = &nix->dev;
13 	struct mbox *mbox = mbox_get(dev->mbox);
14 	struct nix_rx_mode *req;
15 	int rc = -ENOSPC;
16 
17 	if (roc_nix_is_vf_or_sdp(roc_nix)) {
18 		rc = NIX_ERR_PARAM;
19 		goto exit;
20 	}
21 
22 	req = mbox_alloc_msg_nix_set_rx_mode(mbox);
23 	if (req == NULL)
24 		goto exit;
25 
26 	if (enable)
27 		req->mode = NIX_RX_MODE_UCAST | NIX_RX_MODE_PROMISC;
28 
29 	rc = mbox_process(mbox);
30 exit:
31 	mbox_put(mbox);
32 	return rc;
33 }
34 
35 int
roc_nix_npc_mac_addr_set(struct roc_nix * roc_nix,uint8_t addr[])36 roc_nix_npc_mac_addr_set(struct roc_nix *roc_nix, uint8_t addr[])
37 {
38 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
39 	struct dev *dev = &nix->dev;
40 	struct mbox *mbox = mbox_get(dev->mbox);
41 	struct nix_set_mac_addr *req;
42 	int rc;
43 
44 	req = mbox_alloc_msg_nix_set_mac_addr(mbox);
45 	mbox_memcpy(req->mac_addr, addr, PLT_ETHER_ADDR_LEN);
46 	rc = mbox_process(mbox);
47 	mbox_put(mbox);
48 	return rc;
49 }
50 
51 int
roc_nix_npc_mac_addr_get(struct roc_nix * roc_nix,uint8_t * addr)52 roc_nix_npc_mac_addr_get(struct roc_nix *roc_nix, uint8_t *addr)
53 {
54 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
55 	struct dev *dev = &nix->dev;
56 	struct mbox *mbox = mbox_get(dev->mbox);
57 	struct nix_get_mac_addr_rsp *rsp;
58 	int rc;
59 
60 	mbox_alloc_msg_nix_get_mac_addr(mbox);
61 	rc = mbox_process_msg(mbox, (void *)&rsp);
62 	if (rc)
63 		goto exit;
64 
65 	mbox_memcpy(addr, rsp->mac_addr, PLT_ETHER_ADDR_LEN);
66 	rc = 0;
67 exit:
68 	mbox_put(mbox);
69 	return rc;
70 }
71 
72 int
roc_nix_npc_rx_ena_dis(struct roc_nix * roc_nix,bool enable)73 roc_nix_npc_rx_ena_dis(struct roc_nix *roc_nix, bool enable)
74 {
75 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
76 	struct dev *dev = &nix->dev;
77 	struct mbox *mbox = mbox_get(dev->mbox);
78 	int rc;
79 
80 	if (enable)
81 		mbox_alloc_msg_nix_lf_start_rx(mbox);
82 	else
83 		mbox_alloc_msg_nix_lf_stop_rx(mbox);
84 
85 	rc = mbox_process(mbox);
86 	if (!rc)
87 		roc_nix->io_enabled = enable;
88 
89 	mbox_put(mbox);
90 	return rc;
91 }
92 
93 int
roc_nix_npc_mcast_config(struct roc_nix * roc_nix,bool mcast_enable,bool prom_enable)94 roc_nix_npc_mcast_config(struct roc_nix *roc_nix, bool mcast_enable,
95 			 bool prom_enable)
96 
97 {
98 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
99 	struct dev *dev = &nix->dev;
100 	struct mbox *mbox = mbox_get(dev->mbox);
101 	struct nix_rx_mode *req;
102 	int rc = -ENOSPC;
103 
104 	if (roc_nix_is_vf_or_sdp(roc_nix)) {
105 		rc = 0;
106 		goto exit;
107 	}
108 
109 	req = mbox_alloc_msg_nix_set_rx_mode(mbox);
110 	if (req == NULL)
111 		goto exit;
112 
113 	if (mcast_enable)
114 		req->mode = NIX_RX_MODE_ALLMULTI;
115 	if (prom_enable)
116 		req->mode = NIX_RX_MODE_PROMISC;
117 
118 	rc = mbox_process(mbox);
119 exit:
120 	mbox_put(mbox);
121 	return rc;
122 }
123