xref: /dpdk/drivers/net/octeontx/base/octeontx_bgx.c (revision 8b42b07eef49915468cfc9b9684cb274efa42fdd)
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
211*8b42b07eSHarman Kalra octeontx_bgx_port_set_link_state(int port, bool enable)
212*8b42b07eSHarman Kalra {
213*8b42b07eSHarman Kalra 	struct octeontx_mbox_hdr hdr;
214*8b42b07eSHarman Kalra 
215*8b42b07eSHarman Kalra 	hdr.coproc = OCTEONTX_BGX_COPROC;
216*8b42b07eSHarman Kalra 	hdr.msg = MBOX_BGX_PORT_SET_LINK_STATE;
217*8b42b07eSHarman Kalra 	hdr.vfid = port;
218*8b42b07eSHarman Kalra 
219*8b42b07eSHarman Kalra 	return octeontx_mbox_send(&hdr, &enable, sizeof(bool), NULL, 0);
220*8b42b07eSHarman Kalra }
221*8b42b07eSHarman Kalra 
222*8b42b07eSHarman Kalra int
223e242dd1cSJerin Jacob octeontx_bgx_port_promisc_set(int port, int en)
224e242dd1cSJerin Jacob {
225e242dd1cSJerin Jacob 	struct octeontx_mbox_hdr hdr;
226e242dd1cSJerin Jacob 	uint8_t	prom;
227e242dd1cSJerin Jacob 	int res;
228e242dd1cSJerin Jacob 
229e242dd1cSJerin Jacob 	hdr.coproc = OCTEONTX_BGX_COPROC;
230e242dd1cSJerin Jacob 	hdr.msg = MBOX_BGX_PORT_SET_PROMISC;
231e242dd1cSJerin Jacob 	hdr.vfid = port;
232e242dd1cSJerin Jacob 	prom = en ? 1 : 0;
233e242dd1cSJerin Jacob 
234d8dd3165SPavan Nikhilesh 	res = octeontx_mbox_send(&hdr, &prom, sizeof(prom), NULL, 0);
235e242dd1cSJerin Jacob 	if (res < 0)
236e242dd1cSJerin Jacob 		return -EACCES;
237e242dd1cSJerin Jacob 
238e242dd1cSJerin Jacob 	return res;
239e242dd1cSJerin Jacob }
240e242dd1cSJerin Jacob 
241e242dd1cSJerin Jacob int
2423151e6a6SHarman Kalra octeontx_bgx_port_mtu_set(int port, int mtu)
2433151e6a6SHarman Kalra {
2443151e6a6SHarman Kalra 	struct octeontx_mbox_hdr hdr;
2453151e6a6SHarman Kalra 	int res;
2463151e6a6SHarman Kalra 
2473151e6a6SHarman Kalra 	hdr.coproc = OCTEONTX_BGX_COPROC;
2483151e6a6SHarman Kalra 	hdr.msg = MBOX_BGX_PORT_SET_MTU;
2493151e6a6SHarman Kalra 	hdr.vfid = port;
2503151e6a6SHarman Kalra 
2513151e6a6SHarman Kalra 	res = octeontx_mbox_send(&hdr, &mtu, sizeof(mtu), NULL, 0);
2523151e6a6SHarman Kalra 	if (res < 0)
2533151e6a6SHarman Kalra 		return -EACCES;
2543151e6a6SHarman Kalra 
2553151e6a6SHarman Kalra 	return res;
2563151e6a6SHarman Kalra }
2573151e6a6SHarman Kalra 
2583151e6a6SHarman Kalra int
259e242dd1cSJerin Jacob octeontx_bgx_port_mac_set(int port, uint8_t *mac_addr)
260e242dd1cSJerin Jacob {
261e242dd1cSJerin Jacob 	struct octeontx_mbox_hdr hdr;
262e242dd1cSJerin Jacob 	int len = 6;
263e242dd1cSJerin Jacob 	int res = 0;
264e242dd1cSJerin Jacob 
265e242dd1cSJerin Jacob 	hdr.coproc = OCTEONTX_BGX_COPROC;
266e242dd1cSJerin Jacob 	hdr.msg = MBOX_BGX_PORT_SET_MACADDR;
267e242dd1cSJerin Jacob 	hdr.vfid = port;
268e242dd1cSJerin Jacob 
269d8dd3165SPavan Nikhilesh 	res = octeontx_mbox_send(&hdr, mac_addr, len, NULL, 0);
270e242dd1cSJerin Jacob 	if (res < 0)
271e242dd1cSJerin Jacob 		return -EACCES;
272e242dd1cSJerin Jacob 
273e242dd1cSJerin Jacob 	return res;
274e242dd1cSJerin Jacob }
275e4373bf1SSunil Kumar Kori 
276e4373bf1SSunil Kumar Kori int
2779614459bSSunil Kumar Kori octeontx_bgx_port_mac_add(int port, uint8_t *mac_addr, int index)
278e4373bf1SSunil Kumar Kori {
2799614459bSSunil Kumar Kori 	struct octeontx_mbox_bgx_port_mac_filter filter;
280e4373bf1SSunil Kumar Kori 	struct octeontx_mbox_hdr hdr;
281e4373bf1SSunil Kumar Kori 	int len = 6;
282e4373bf1SSunil Kumar Kori 
283e4373bf1SSunil Kumar Kori 	hdr.coproc = OCTEONTX_BGX_COPROC;
284e4373bf1SSunil Kumar Kori 	hdr.msg = MBOX_BGX_PORT_ADD_MACADDR;
285e4373bf1SSunil Kumar Kori 	hdr.vfid = port;
286e4373bf1SSunil Kumar Kori 
2879614459bSSunil Kumar Kori 	memcpy(filter.mac_addr, mac_addr, len);
2889614459bSSunil Kumar Kori 	filter.index = index;
2899614459bSSunil Kumar Kori 	len = sizeof(struct octeontx_mbox_bgx_port_mac_filter);
290e4373bf1SSunil Kumar Kori 
2919614459bSSunil Kumar Kori 	return octeontx_mbox_send(&hdr, &filter, len, NULL, 0);
292e4373bf1SSunil Kumar Kori }
293e4373bf1SSunil Kumar Kori 
294e4373bf1SSunil Kumar Kori int
295e4373bf1SSunil Kumar Kori octeontx_bgx_port_mac_del(int port, uint32_t index)
296e4373bf1SSunil Kumar Kori {
297e4373bf1SSunil Kumar Kori 	struct octeontx_mbox_hdr hdr;
298e4373bf1SSunil Kumar Kori 	int len = sizeof(uint32_t);
299e4373bf1SSunil Kumar Kori 	int res = 0;
300e4373bf1SSunil Kumar Kori 
301e4373bf1SSunil Kumar Kori 	hdr.coproc = OCTEONTX_BGX_COPROC;
302e4373bf1SSunil Kumar Kori 	hdr.msg = MBOX_BGX_PORT_DEL_MACADDR;
303e4373bf1SSunil Kumar Kori 	hdr.vfid = port;
304e4373bf1SSunil Kumar Kori 
305e4373bf1SSunil Kumar Kori 	res = octeontx_mbox_send(&hdr, &index, len, NULL, 0);
306e4373bf1SSunil Kumar Kori 	if (res < 0)
307e4373bf1SSunil Kumar Kori 		return -EACCES;
308e4373bf1SSunil Kumar Kori 
309e4373bf1SSunil Kumar Kori 	return res;
310e4373bf1SSunil Kumar Kori }
311e4373bf1SSunil Kumar Kori 
312e4373bf1SSunil Kumar Kori int
313e4373bf1SSunil Kumar Kori octeontx_bgx_port_mac_entries_get(int port)
314e4373bf1SSunil Kumar Kori {
315e4373bf1SSunil Kumar Kori 	struct octeontx_mbox_hdr hdr;
316e4373bf1SSunil Kumar Kori 	int resp = 6;
317e4373bf1SSunil Kumar Kori 	int res = 0;
318e4373bf1SSunil Kumar Kori 
319e4373bf1SSunil Kumar Kori 	hdr.coproc = OCTEONTX_BGX_COPROC;
320e4373bf1SSunil Kumar Kori 	hdr.msg = MBOX_BGX_PORT_GET_MACADDR_ENTRIES;
321e4373bf1SSunil Kumar Kori 	hdr.vfid = port;
322e4373bf1SSunil Kumar Kori 
323e4373bf1SSunil Kumar Kori 	res = octeontx_mbox_send(&hdr, NULL, 0, &resp, sizeof(int));
324e4373bf1SSunil Kumar Kori 	if (res < 0)
325e4373bf1SSunil Kumar Kori 		return -EACCES;
326e4373bf1SSunil Kumar Kori 
327e4373bf1SSunil Kumar Kori 	return resp;
328e4373bf1SSunil Kumar Kori }
329