xref: /dpdk/drivers/net/octeontx/base/octeontx_bgx.c (revision e4373bf1b3f51715bf66e87c0134e2c217e4612c)
1aaf4363eSJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause
2aaf4363eSJerin Jacob  * Copyright(c) 2017 Cavium, Inc
34d027880SJerin Jacob  */
44d027880SJerin Jacob 
54d027880SJerin Jacob #include <string.h>
64d027880SJerin Jacob 
74d027880SJerin Jacob #include "octeontx_bgx.h"
84d027880SJerin Jacob 
94d027880SJerin Jacob int
104d027880SJerin Jacob octeontx_bgx_port_open(int port, octeontx_mbox_bgx_port_conf_t *conf)
114d027880SJerin Jacob {
124d027880SJerin Jacob 	struct octeontx_mbox_hdr hdr;
134d027880SJerin Jacob 	octeontx_mbox_bgx_port_conf_t bgx_conf;
144d027880SJerin Jacob 	int len = sizeof(octeontx_mbox_bgx_port_conf_t);
154d027880SJerin Jacob 	int res;
164d027880SJerin Jacob 
174d027880SJerin Jacob 	memset(&bgx_conf, 0, sizeof(octeontx_mbox_bgx_port_conf_t));
184d027880SJerin Jacob 	hdr.coproc = OCTEONTX_BGX_COPROC;
194d027880SJerin Jacob 	hdr.msg = MBOX_BGX_PORT_OPEN;
204d027880SJerin Jacob 	hdr.vfid = port;
214d027880SJerin Jacob 
22d8dd3165SPavan Nikhilesh 	res = octeontx_mbox_send(&hdr, NULL, 0, &bgx_conf, len);
234d027880SJerin Jacob 	if (res < 0)
244d027880SJerin Jacob 		return -EACCES;
254d027880SJerin Jacob 
264d027880SJerin Jacob 	conf->enable = bgx_conf.enable;
274d027880SJerin Jacob 	conf->promisc = bgx_conf.promisc;
284d027880SJerin Jacob 	conf->bpen = bgx_conf.bpen;
294d027880SJerin Jacob 	conf->node = bgx_conf.node;
304d027880SJerin Jacob 	conf->base_chan = bgx_conf.base_chan;
314d027880SJerin Jacob 	conf->num_chans = bgx_conf.num_chans;
324d027880SJerin Jacob 	conf->mtu = bgx_conf.mtu;
334d027880SJerin Jacob 	conf->bgx = bgx_conf.bgx;
344d027880SJerin Jacob 	conf->lmac = bgx_conf.lmac;
354d027880SJerin Jacob 	conf->mode = bgx_conf.mode;
364d027880SJerin Jacob 	conf->pkind = bgx_conf.pkind;
374d027880SJerin Jacob 	memcpy(conf->macaddr, bgx_conf.macaddr, 6);
384d027880SJerin Jacob 
394d027880SJerin Jacob 	return res;
404d027880SJerin Jacob }
414d027880SJerin Jacob 
424d027880SJerin Jacob int
434d027880SJerin Jacob octeontx_bgx_port_close(int port)
444d027880SJerin Jacob {
454d027880SJerin Jacob 	struct octeontx_mbox_hdr hdr;
464d027880SJerin Jacob 	int res;
474d027880SJerin Jacob 
484d027880SJerin Jacob 	hdr.coproc = OCTEONTX_BGX_COPROC;
494d027880SJerin Jacob 	hdr.msg = MBOX_BGX_PORT_CLOSE;
504d027880SJerin Jacob 	hdr.vfid = port;
514d027880SJerin Jacob 
52d8dd3165SPavan Nikhilesh 	res = octeontx_mbox_send(&hdr, NULL, 0, NULL, 0);
534d027880SJerin Jacob 	if (res < 0)
544d027880SJerin Jacob 		return -EACCES;
554d027880SJerin Jacob 
564d027880SJerin Jacob 	return res;
574d027880SJerin Jacob }
584d027880SJerin Jacob 
594d027880SJerin Jacob int
604d027880SJerin Jacob octeontx_bgx_port_start(int port)
614d027880SJerin Jacob {
624d027880SJerin Jacob 	struct octeontx_mbox_hdr hdr;
634d027880SJerin Jacob 	int res;
644d027880SJerin Jacob 
654d027880SJerin Jacob 	hdr.coproc = OCTEONTX_BGX_COPROC;
664d027880SJerin Jacob 	hdr.msg = MBOX_BGX_PORT_START;
674d027880SJerin Jacob 	hdr.vfid = port;
684d027880SJerin Jacob 
69d8dd3165SPavan Nikhilesh 	res = octeontx_mbox_send(&hdr, NULL, 0, NULL, 0);
704d027880SJerin Jacob 	if (res < 0)
714d027880SJerin Jacob 		return -EACCES;
724d027880SJerin Jacob 
734d027880SJerin Jacob 	return res;
744d027880SJerin Jacob }
754d027880SJerin Jacob 
764d027880SJerin Jacob int
774d027880SJerin Jacob octeontx_bgx_port_stop(int port)
784d027880SJerin Jacob {
794d027880SJerin Jacob 	struct octeontx_mbox_hdr hdr;
804d027880SJerin Jacob 	int res;
814d027880SJerin Jacob 
824d027880SJerin Jacob 	hdr.coproc = OCTEONTX_BGX_COPROC;
834d027880SJerin Jacob 	hdr.msg = MBOX_BGX_PORT_STOP;
844d027880SJerin Jacob 	hdr.vfid = port;
854d027880SJerin Jacob 
86d8dd3165SPavan Nikhilesh 	res = octeontx_mbox_send(&hdr, NULL, 0, NULL, 0);
874d027880SJerin Jacob 	if (res < 0)
884d027880SJerin Jacob 		return -EACCES;
894d027880SJerin Jacob 
904d027880SJerin Jacob 	return res;
914d027880SJerin Jacob }
92e242dd1cSJerin Jacob 
93e242dd1cSJerin Jacob int
94e242dd1cSJerin Jacob octeontx_bgx_port_get_config(int port, octeontx_mbox_bgx_port_conf_t *conf)
95e242dd1cSJerin Jacob {
96e242dd1cSJerin Jacob 	struct octeontx_mbox_hdr hdr;
97e242dd1cSJerin Jacob 	octeontx_mbox_bgx_port_conf_t bgx_conf;
98e242dd1cSJerin Jacob 	int len = sizeof(octeontx_mbox_bgx_port_conf_t);
99e242dd1cSJerin Jacob 	int res;
100e242dd1cSJerin Jacob 
101e242dd1cSJerin Jacob 	hdr.coproc = OCTEONTX_BGX_COPROC;
102e242dd1cSJerin Jacob 	hdr.msg = MBOX_BGX_PORT_GET_CONFIG;
103e242dd1cSJerin Jacob 	hdr.vfid = port;
104e242dd1cSJerin Jacob 
105e242dd1cSJerin Jacob 	memset(&bgx_conf, 0, sizeof(octeontx_mbox_bgx_port_conf_t));
106d8dd3165SPavan Nikhilesh 	res = octeontx_mbox_send(&hdr, NULL, 0, &bgx_conf, len);
107e242dd1cSJerin Jacob 	if (res < 0)
108e242dd1cSJerin Jacob 		return -EACCES;
109e242dd1cSJerin Jacob 
110e242dd1cSJerin Jacob 	conf->enable = bgx_conf.enable;
111e242dd1cSJerin Jacob 	conf->promisc = bgx_conf.promisc;
112e242dd1cSJerin Jacob 	conf->bpen = bgx_conf.bpen;
113e242dd1cSJerin Jacob 	conf->node = bgx_conf.node;
114e242dd1cSJerin Jacob 	conf->base_chan = bgx_conf.base_chan;
115e242dd1cSJerin Jacob 	conf->num_chans = bgx_conf.num_chans;
116e242dd1cSJerin Jacob 	conf->mtu = bgx_conf.mtu;
117e242dd1cSJerin Jacob 	conf->bgx = bgx_conf.bgx;
118e242dd1cSJerin Jacob 	conf->lmac = bgx_conf.lmac;
119e242dd1cSJerin Jacob 	conf->mode = bgx_conf.mode;
120e242dd1cSJerin Jacob 	conf->pkind = bgx_conf.pkind;
121e242dd1cSJerin Jacob 	memcpy(conf->macaddr, bgx_conf.macaddr, 6);
122e242dd1cSJerin Jacob 
123e242dd1cSJerin Jacob 	return res;
124e242dd1cSJerin Jacob }
125e242dd1cSJerin Jacob 
126e242dd1cSJerin Jacob int
127e242dd1cSJerin Jacob octeontx_bgx_port_status(int port, octeontx_mbox_bgx_port_status_t *stat)
128e242dd1cSJerin Jacob {
129e242dd1cSJerin Jacob 	struct octeontx_mbox_hdr hdr;
130e242dd1cSJerin Jacob 	octeontx_mbox_bgx_port_status_t bgx_stat;
131e242dd1cSJerin Jacob 	int len = sizeof(octeontx_mbox_bgx_port_status_t);
132e242dd1cSJerin Jacob 	int res;
133e242dd1cSJerin Jacob 
134e242dd1cSJerin Jacob 	hdr.coproc = OCTEONTX_BGX_COPROC;
135e242dd1cSJerin Jacob 	hdr.msg = MBOX_BGX_PORT_GET_STATUS;
136e242dd1cSJerin Jacob 	hdr.vfid = port;
137e242dd1cSJerin Jacob 
138d8dd3165SPavan Nikhilesh 	res = octeontx_mbox_send(&hdr, NULL, 0, &bgx_stat, len);
139e242dd1cSJerin Jacob 	if (res < 0)
140e242dd1cSJerin Jacob 		return -EACCES;
141e242dd1cSJerin Jacob 
142e242dd1cSJerin Jacob 	stat->link_up = bgx_stat.link_up;
143e242dd1cSJerin Jacob 
144e242dd1cSJerin Jacob 	return res;
145e242dd1cSJerin Jacob }
146e242dd1cSJerin Jacob 
147e242dd1cSJerin Jacob int
148e242dd1cSJerin Jacob octeontx_bgx_port_stats(int port, octeontx_mbox_bgx_port_stats_t *stats)
149e242dd1cSJerin Jacob {
150e242dd1cSJerin Jacob 	struct octeontx_mbox_hdr hdr;
151e242dd1cSJerin Jacob 	octeontx_mbox_bgx_port_stats_t bgx_stats;
152e242dd1cSJerin Jacob 	int len = sizeof(octeontx_mbox_bgx_port_stats_t);
153e242dd1cSJerin Jacob 	int res;
154e242dd1cSJerin Jacob 
155e242dd1cSJerin Jacob 	hdr.coproc = OCTEONTX_BGX_COPROC;
156e242dd1cSJerin Jacob 	hdr.msg = MBOX_BGX_PORT_GET_STATS;
157e242dd1cSJerin Jacob 	hdr.vfid = port;
158e242dd1cSJerin Jacob 
159d8dd3165SPavan Nikhilesh 	res = octeontx_mbox_send(&hdr, NULL, 0, &bgx_stats, len);
160e242dd1cSJerin Jacob 	if (res < 0)
161e242dd1cSJerin Jacob 		return -EACCES;
162e242dd1cSJerin Jacob 
163e242dd1cSJerin Jacob 	stats->rx_packets = bgx_stats.rx_packets;
164e242dd1cSJerin Jacob 	stats->rx_bytes = bgx_stats.rx_bytes;
165e242dd1cSJerin Jacob 	stats->rx_dropped = bgx_stats.rx_dropped;
166e242dd1cSJerin Jacob 	stats->rx_errors = bgx_stats.rx_errors;
167e242dd1cSJerin Jacob 	stats->tx_packets = bgx_stats.tx_packets;
168e242dd1cSJerin Jacob 	stats->tx_bytes = bgx_stats.tx_bytes;
169e242dd1cSJerin Jacob 	stats->tx_dropped = bgx_stats.tx_dropped;
170e242dd1cSJerin Jacob 	stats->tx_errors = bgx_stats.tx_errors;
171e242dd1cSJerin Jacob 	return res;
172e242dd1cSJerin Jacob }
173e242dd1cSJerin Jacob 
174e242dd1cSJerin Jacob int
175e242dd1cSJerin Jacob octeontx_bgx_port_stats_clr(int port)
176e242dd1cSJerin Jacob {
177e242dd1cSJerin Jacob 	struct octeontx_mbox_hdr hdr;
178e242dd1cSJerin Jacob 	int res;
179e242dd1cSJerin Jacob 
180e242dd1cSJerin Jacob 	hdr.coproc = OCTEONTX_BGX_COPROC;
181e242dd1cSJerin Jacob 	hdr.msg = MBOX_BGX_PORT_CLR_STATS;
182e242dd1cSJerin Jacob 	hdr.vfid = port;
183e242dd1cSJerin Jacob 
184d8dd3165SPavan Nikhilesh 	res = octeontx_mbox_send(&hdr, NULL, 0, NULL, 0);
185e242dd1cSJerin Jacob 	if (res < 0)
186e242dd1cSJerin Jacob 		return -EACCES;
187e242dd1cSJerin Jacob 
188e242dd1cSJerin Jacob 	return res;
189e242dd1cSJerin Jacob }
190e242dd1cSJerin Jacob 
191e242dd1cSJerin Jacob int
192e242dd1cSJerin Jacob octeontx_bgx_port_link_status(int port)
193e242dd1cSJerin Jacob {
194e242dd1cSJerin Jacob 	struct octeontx_mbox_hdr hdr;
195e242dd1cSJerin Jacob 	uint8_t link;
196e242dd1cSJerin Jacob 	int len = sizeof(uint8_t);
197e242dd1cSJerin Jacob 	int res;
198e242dd1cSJerin Jacob 
199e242dd1cSJerin Jacob 	hdr.coproc = OCTEONTX_BGX_COPROC;
200e242dd1cSJerin Jacob 	hdr.msg = MBOX_BGX_PORT_GET_LINK_STATUS;
201e242dd1cSJerin Jacob 	hdr.vfid = port;
202e242dd1cSJerin Jacob 
203d8dd3165SPavan Nikhilesh 	res = octeontx_mbox_send(&hdr, NULL, 0, &link, len);
204e242dd1cSJerin Jacob 	if (res < 0)
205e242dd1cSJerin Jacob 		return -EACCES;
206e242dd1cSJerin Jacob 
207e242dd1cSJerin Jacob 	return link;
208e242dd1cSJerin Jacob }
209e242dd1cSJerin Jacob 
210e242dd1cSJerin Jacob int
211e242dd1cSJerin Jacob octeontx_bgx_port_promisc_set(int port, int en)
212e242dd1cSJerin Jacob {
213e242dd1cSJerin Jacob 	struct octeontx_mbox_hdr hdr;
214e242dd1cSJerin Jacob 	uint8_t	prom;
215e242dd1cSJerin Jacob 	int res;
216e242dd1cSJerin Jacob 
217e242dd1cSJerin Jacob 	hdr.coproc = OCTEONTX_BGX_COPROC;
218e242dd1cSJerin Jacob 	hdr.msg = MBOX_BGX_PORT_SET_PROMISC;
219e242dd1cSJerin Jacob 	hdr.vfid = port;
220e242dd1cSJerin Jacob 	prom = en ? 1 : 0;
221e242dd1cSJerin Jacob 
222d8dd3165SPavan Nikhilesh 	res = octeontx_mbox_send(&hdr, &prom, sizeof(prom), NULL, 0);
223e242dd1cSJerin Jacob 	if (res < 0)
224e242dd1cSJerin Jacob 		return -EACCES;
225e242dd1cSJerin Jacob 
226e242dd1cSJerin Jacob 	return res;
227e242dd1cSJerin Jacob }
228e242dd1cSJerin Jacob 
229e242dd1cSJerin Jacob int
230e242dd1cSJerin Jacob octeontx_bgx_port_mac_set(int port, uint8_t *mac_addr)
231e242dd1cSJerin Jacob {
232e242dd1cSJerin Jacob 	struct octeontx_mbox_hdr hdr;
233e242dd1cSJerin Jacob 	int len = 6;
234e242dd1cSJerin Jacob 	int res = 0;
235e242dd1cSJerin Jacob 
236e242dd1cSJerin Jacob 	hdr.coproc = OCTEONTX_BGX_COPROC;
237e242dd1cSJerin Jacob 	hdr.msg = MBOX_BGX_PORT_SET_MACADDR;
238e242dd1cSJerin Jacob 	hdr.vfid = port;
239e242dd1cSJerin Jacob 
240d8dd3165SPavan Nikhilesh 	res = octeontx_mbox_send(&hdr, mac_addr, len, NULL, 0);
241e242dd1cSJerin Jacob 	if (res < 0)
242e242dd1cSJerin Jacob 		return -EACCES;
243e242dd1cSJerin Jacob 
244e242dd1cSJerin Jacob 	return res;
245e242dd1cSJerin Jacob }
246*e4373bf1SSunil Kumar Kori 
247*e4373bf1SSunil Kumar Kori int
248*e4373bf1SSunil Kumar Kori octeontx_bgx_port_mac_add(int port, uint8_t *mac_addr)
249*e4373bf1SSunil Kumar Kori {
250*e4373bf1SSunil Kumar Kori 	struct octeontx_mbox_hdr hdr;
251*e4373bf1SSunil Kumar Kori 	int resp = 0;
252*e4373bf1SSunil Kumar Kori 	int len = 6;
253*e4373bf1SSunil Kumar Kori 	int res = 0;
254*e4373bf1SSunil Kumar Kori 
255*e4373bf1SSunil Kumar Kori 	hdr.coproc = OCTEONTX_BGX_COPROC;
256*e4373bf1SSunil Kumar Kori 	hdr.msg = MBOX_BGX_PORT_ADD_MACADDR;
257*e4373bf1SSunil Kumar Kori 	hdr.vfid = port;
258*e4373bf1SSunil Kumar Kori 
259*e4373bf1SSunil Kumar Kori 	res = octeontx_mbox_send(&hdr, mac_addr, len, &resp, sizeof(int));
260*e4373bf1SSunil Kumar Kori 	if (res < 0)
261*e4373bf1SSunil Kumar Kori 		return -EACCES;
262*e4373bf1SSunil Kumar Kori 
263*e4373bf1SSunil Kumar Kori 	return res;
264*e4373bf1SSunil Kumar Kori }
265*e4373bf1SSunil Kumar Kori 
266*e4373bf1SSunil Kumar Kori int
267*e4373bf1SSunil Kumar Kori octeontx_bgx_port_mac_del(int port, uint32_t index)
268*e4373bf1SSunil Kumar Kori {
269*e4373bf1SSunil Kumar Kori 	struct octeontx_mbox_hdr hdr;
270*e4373bf1SSunil Kumar Kori 	int len = sizeof(uint32_t);
271*e4373bf1SSunil Kumar Kori 	int res = 0;
272*e4373bf1SSunil Kumar Kori 
273*e4373bf1SSunil Kumar Kori 	hdr.coproc = OCTEONTX_BGX_COPROC;
274*e4373bf1SSunil Kumar Kori 	hdr.msg = MBOX_BGX_PORT_DEL_MACADDR;
275*e4373bf1SSunil Kumar Kori 	hdr.vfid = port;
276*e4373bf1SSunil Kumar Kori 
277*e4373bf1SSunil Kumar Kori 	res = octeontx_mbox_send(&hdr, &index, len, NULL, 0);
278*e4373bf1SSunil Kumar Kori 	if (res < 0)
279*e4373bf1SSunil Kumar Kori 		return -EACCES;
280*e4373bf1SSunil Kumar Kori 
281*e4373bf1SSunil Kumar Kori 	return res;
282*e4373bf1SSunil Kumar Kori }
283*e4373bf1SSunil Kumar Kori 
284*e4373bf1SSunil Kumar Kori int
285*e4373bf1SSunil Kumar Kori octeontx_bgx_port_mac_entries_get(int port)
286*e4373bf1SSunil Kumar Kori {
287*e4373bf1SSunil Kumar Kori 	struct octeontx_mbox_hdr hdr;
288*e4373bf1SSunil Kumar Kori 	int resp = 6;
289*e4373bf1SSunil Kumar Kori 	int res = 0;
290*e4373bf1SSunil Kumar Kori 
291*e4373bf1SSunil Kumar Kori 	hdr.coproc = OCTEONTX_BGX_COPROC;
292*e4373bf1SSunil Kumar Kori 	hdr.msg = MBOX_BGX_PORT_GET_MACADDR_ENTRIES;
293*e4373bf1SSunil Kumar Kori 	hdr.vfid = port;
294*e4373bf1SSunil Kumar Kori 
295*e4373bf1SSunil Kumar Kori 	res = octeontx_mbox_send(&hdr, NULL, 0, &resp, sizeof(int));
296*e4373bf1SSunil Kumar Kori 	if (res < 0)
297*e4373bf1SSunil Kumar Kori 		return -EACCES;
298*e4373bf1SSunil Kumar Kori 
299*e4373bf1SSunil Kumar Kori 	return resp;
300*e4373bf1SSunil Kumar Kori }
301