xref: /dpdk/drivers/net/octeontx/base/octeontx_bgx.c (revision a84ff1d9cfd318615818a2fa2675a490f525a048)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2017 Cavium, Inc
3  */
4 
5 #include <string.h>
6 
7 #include "octeontx_bgx.h"
8 
9 int
10 octeontx_bgx_port_open(int port, octeontx_mbox_bgx_port_conf_t *conf)
11 {
12 	struct octeontx_mbox_hdr hdr;
13 	octeontx_mbox_bgx_port_conf_t bgx_conf;
14 	int len = sizeof(octeontx_mbox_bgx_port_conf_t);
15 	int res;
16 
17 	memset(&bgx_conf, 0, sizeof(octeontx_mbox_bgx_port_conf_t));
18 	hdr.coproc = OCTEONTX_BGX_COPROC;
19 	hdr.msg = MBOX_BGX_PORT_OPEN;
20 	hdr.vfid = port;
21 
22 	res = octeontx_mbox_send(&hdr, NULL, 0, &bgx_conf, len);
23 	if (res < 0)
24 		return -EACCES;
25 
26 	conf->enable = bgx_conf.enable;
27 	conf->promisc = bgx_conf.promisc;
28 	conf->bpen = bgx_conf.bpen;
29 	conf->node = bgx_conf.node;
30 	conf->base_chan = bgx_conf.base_chan;
31 	conf->num_chans = bgx_conf.num_chans;
32 	conf->mtu = bgx_conf.mtu;
33 	conf->bgx = bgx_conf.bgx;
34 	conf->lmac = bgx_conf.lmac;
35 	conf->mode = bgx_conf.mode;
36 	conf->pkind = bgx_conf.pkind;
37 	memcpy(conf->macaddr, bgx_conf.macaddr, 6);
38 
39 	return res;
40 }
41 
42 int
43 octeontx_bgx_port_close(int port)
44 {
45 	struct octeontx_mbox_hdr hdr;
46 	int res;
47 
48 	hdr.coproc = OCTEONTX_BGX_COPROC;
49 	hdr.msg = MBOX_BGX_PORT_CLOSE;
50 	hdr.vfid = port;
51 
52 	res = octeontx_mbox_send(&hdr, NULL, 0, NULL, 0);
53 	if (res < 0)
54 		return -EACCES;
55 
56 	return res;
57 }
58 
59 int
60 octeontx_bgx_port_start(int port)
61 {
62 	struct octeontx_mbox_hdr hdr;
63 	int res;
64 
65 	hdr.coproc = OCTEONTX_BGX_COPROC;
66 	hdr.msg = MBOX_BGX_PORT_START;
67 	hdr.vfid = port;
68 
69 	res = octeontx_mbox_send(&hdr, NULL, 0, NULL, 0);
70 	if (res < 0)
71 		return -EACCES;
72 
73 	return res;
74 }
75 
76 int
77 octeontx_bgx_port_stop(int port)
78 {
79 	struct octeontx_mbox_hdr hdr;
80 	int res;
81 
82 	hdr.coproc = OCTEONTX_BGX_COPROC;
83 	hdr.msg = MBOX_BGX_PORT_STOP;
84 	hdr.vfid = port;
85 
86 	res = octeontx_mbox_send(&hdr, NULL, 0, NULL, 0);
87 	if (res < 0)
88 		return -EACCES;
89 
90 	return res;
91 }
92 
93 int
94 octeontx_bgx_port_get_config(int port, octeontx_mbox_bgx_port_conf_t *conf)
95 {
96 	struct octeontx_mbox_hdr hdr;
97 	octeontx_mbox_bgx_port_conf_t bgx_conf;
98 	int len = sizeof(octeontx_mbox_bgx_port_conf_t);
99 	int res;
100 
101 	hdr.coproc = OCTEONTX_BGX_COPROC;
102 	hdr.msg = MBOX_BGX_PORT_GET_CONFIG;
103 	hdr.vfid = port;
104 
105 	memset(&bgx_conf, 0, sizeof(octeontx_mbox_bgx_port_conf_t));
106 	res = octeontx_mbox_send(&hdr, NULL, 0, &bgx_conf, len);
107 	if (res < 0)
108 		return -EACCES;
109 
110 	conf->enable = bgx_conf.enable;
111 	conf->promisc = bgx_conf.promisc;
112 	conf->bpen = bgx_conf.bpen;
113 	conf->node = bgx_conf.node;
114 	conf->base_chan = bgx_conf.base_chan;
115 	conf->num_chans = bgx_conf.num_chans;
116 	conf->mtu = bgx_conf.mtu;
117 	conf->bgx = bgx_conf.bgx;
118 	conf->lmac = bgx_conf.lmac;
119 	conf->mode = bgx_conf.mode;
120 	conf->pkind = bgx_conf.pkind;
121 	memcpy(conf->macaddr, bgx_conf.macaddr, 6);
122 
123 	return res;
124 }
125 
126 int
127 octeontx_bgx_port_status(int port, octeontx_mbox_bgx_port_status_t *stat)
128 {
129 	struct octeontx_mbox_hdr hdr;
130 	octeontx_mbox_bgx_port_status_t bgx_stat;
131 	int len = sizeof(octeontx_mbox_bgx_port_status_t);
132 	int res;
133 
134 	hdr.coproc = OCTEONTX_BGX_COPROC;
135 	hdr.msg = MBOX_BGX_PORT_GET_STATUS;
136 	hdr.vfid = port;
137 
138 	res = octeontx_mbox_send(&hdr, NULL, 0, &bgx_stat, len);
139 	if (res < 0)
140 		return -EACCES;
141 
142 	stat->link_up = bgx_stat.link_up;
143 
144 	return res;
145 }
146 
147 int
148 octeontx_bgx_port_stats(int port, octeontx_mbox_bgx_port_stats_t *stats)
149 {
150 	struct octeontx_mbox_hdr hdr;
151 	octeontx_mbox_bgx_port_stats_t bgx_stats;
152 	int len = sizeof(octeontx_mbox_bgx_port_stats_t);
153 	int res;
154 
155 	hdr.coproc = OCTEONTX_BGX_COPROC;
156 	hdr.msg = MBOX_BGX_PORT_GET_STATS;
157 	hdr.vfid = port;
158 
159 	res = octeontx_mbox_send(&hdr, NULL, 0, &bgx_stats, len);
160 	if (res < 0)
161 		return -EACCES;
162 
163 	stats->rx_packets = bgx_stats.rx_packets;
164 	stats->rx_bytes = bgx_stats.rx_bytes;
165 	stats->rx_dropped = bgx_stats.rx_dropped;
166 	stats->rx_errors = bgx_stats.rx_errors;
167 	stats->tx_packets = bgx_stats.tx_packets;
168 	stats->tx_bytes = bgx_stats.tx_bytes;
169 	stats->tx_dropped = bgx_stats.tx_dropped;
170 	stats->tx_errors = bgx_stats.tx_errors;
171 	return res;
172 }
173 
174 int
175 octeontx_bgx_port_stats_clr(int port)
176 {
177 	struct octeontx_mbox_hdr hdr;
178 	int res;
179 
180 	hdr.coproc = OCTEONTX_BGX_COPROC;
181 	hdr.msg = MBOX_BGX_PORT_CLR_STATS;
182 	hdr.vfid = port;
183 
184 	res = octeontx_mbox_send(&hdr, NULL, 0, NULL, 0);
185 	if (res < 0)
186 		return -EACCES;
187 
188 	return res;
189 }
190 
191 int
192 octeontx_bgx_port_link_status(int port)
193 {
194 	struct octeontx_mbox_hdr hdr;
195 	uint8_t link;
196 	int len = sizeof(uint8_t);
197 	int res;
198 
199 	hdr.coproc = OCTEONTX_BGX_COPROC;
200 	hdr.msg = MBOX_BGX_PORT_GET_LINK_STATUS;
201 	hdr.vfid = port;
202 
203 	res = octeontx_mbox_send(&hdr, NULL, 0, &link, len);
204 	if (res < 0)
205 		return -EACCES;
206 
207 	return link;
208 }
209 
210 int
211 octeontx_bgx_port_set_link_state(int port, bool enable)
212 {
213 	struct octeontx_mbox_hdr hdr;
214 
215 	hdr.coproc = OCTEONTX_BGX_COPROC;
216 	hdr.msg = MBOX_BGX_PORT_SET_LINK_STATE;
217 	hdr.vfid = port;
218 
219 	return octeontx_mbox_send(&hdr, &enable, sizeof(bool), NULL, 0);
220 }
221 
222 int
223 octeontx_bgx_port_promisc_set(int port, int en)
224 {
225 	struct octeontx_mbox_hdr hdr;
226 	uint8_t	prom;
227 	int res;
228 
229 	hdr.coproc = OCTEONTX_BGX_COPROC;
230 	hdr.msg = MBOX_BGX_PORT_SET_PROMISC;
231 	hdr.vfid = port;
232 	prom = en ? 1 : 0;
233 
234 	res = octeontx_mbox_send(&hdr, &prom, sizeof(prom), NULL, 0);
235 	if (res < 0)
236 		return -EACCES;
237 
238 	return res;
239 }
240 
241 int
242 octeontx_bgx_port_mtu_set(int port, int mtu)
243 {
244 	struct octeontx_mbox_hdr hdr;
245 	int res;
246 
247 	hdr.coproc = OCTEONTX_BGX_COPROC;
248 	hdr.msg = MBOX_BGX_PORT_SET_MTU;
249 	hdr.vfid = port;
250 
251 	res = octeontx_mbox_send(&hdr, &mtu, sizeof(mtu), NULL, 0);
252 	if (res < 0)
253 		return -EACCES;
254 
255 	return res;
256 }
257 
258 int
259 octeontx_bgx_port_mac_set(int port, uint8_t *mac_addr)
260 {
261 	struct octeontx_mbox_hdr hdr;
262 	int len = 6;
263 	int res = 0;
264 
265 	hdr.coproc = OCTEONTX_BGX_COPROC;
266 	hdr.msg = MBOX_BGX_PORT_SET_MACADDR;
267 	hdr.vfid = port;
268 
269 	res = octeontx_mbox_send(&hdr, mac_addr, len, NULL, 0);
270 	if (res < 0)
271 		return -EACCES;
272 
273 	return res;
274 }
275 
276 int
277 octeontx_bgx_port_mac_add(int port, uint8_t *mac_addr, int index)
278 {
279 	struct octeontx_mbox_bgx_port_mac_filter filter;
280 	struct octeontx_mbox_hdr hdr;
281 	int len = 6;
282 
283 	hdr.coproc = OCTEONTX_BGX_COPROC;
284 	hdr.msg = MBOX_BGX_PORT_ADD_MACADDR;
285 	hdr.vfid = port;
286 
287 	memcpy(filter.mac_addr, mac_addr, len);
288 	filter.index = index;
289 	len = sizeof(struct octeontx_mbox_bgx_port_mac_filter);
290 
291 	return octeontx_mbox_send(&hdr, &filter, len, NULL, 0);
292 }
293 
294 int
295 octeontx_bgx_port_mac_del(int port, uint32_t index)
296 {
297 	struct octeontx_mbox_hdr hdr;
298 	int len = sizeof(uint32_t);
299 	int res = 0;
300 
301 	hdr.coproc = OCTEONTX_BGX_COPROC;
302 	hdr.msg = MBOX_BGX_PORT_DEL_MACADDR;
303 	hdr.vfid = port;
304 
305 	res = octeontx_mbox_send(&hdr, &index, len, NULL, 0);
306 	if (res < 0)
307 		return -EACCES;
308 
309 	return res;
310 }
311 
312 int
313 octeontx_bgx_port_mac_entries_get(int port)
314 {
315 	struct octeontx_mbox_hdr hdr;
316 	int resp = 6;
317 	int res = 0;
318 
319 	hdr.coproc = OCTEONTX_BGX_COPROC;
320 	hdr.msg = MBOX_BGX_PORT_GET_MACADDR_ENTRIES;
321 	hdr.vfid = port;
322 
323 	res = octeontx_mbox_send(&hdr, NULL, 0, &resp, sizeof(int));
324 	if (res < 0)
325 		return -EACCES;
326 
327 	return resp;
328 }
329 
330 int octeontx_bgx_port_get_fifo_cfg(int port,
331 				   octeontx_mbox_bgx_port_fifo_cfg_t *cfg)
332 {
333 	int len = sizeof(octeontx_mbox_bgx_port_fifo_cfg_t);
334 	octeontx_mbox_bgx_port_fifo_cfg_t conf;
335 	struct octeontx_mbox_hdr hdr;
336 
337 	hdr.coproc = OCTEONTX_BGX_COPROC;
338 	hdr.msg = MBOX_BGX_PORT_GET_FIFO_CFG;
339 	hdr.vfid = port;
340 
341 	if (octeontx_mbox_send(&hdr, NULL, 0, &conf, len) < 0)
342 		return -EACCES;
343 
344 	cfg->rx_fifosz = conf.rx_fifosz;
345 
346 	return 0;
347 }
348 
349 int octeontx_bgx_port_flow_ctrl_cfg(int port,
350 				    octeontx_mbox_bgx_port_fc_cfg_t *cfg)
351 {
352 	int len = sizeof(octeontx_mbox_bgx_port_fc_cfg_t);
353 	octeontx_mbox_bgx_port_fc_cfg_t conf;
354 	struct octeontx_mbox_hdr hdr;
355 
356 	hdr.coproc = OCTEONTX_BGX_COPROC;
357 	hdr.msg = MBOX_BGX_PORT_FLOW_CTRL_CFG;
358 	hdr.vfid = port;
359 
360 	if (cfg->fc_cfg == BGX_PORT_FC_CFG_SET)
361 		memcpy(&conf, cfg, len);
362 	else
363 		memset(&conf, 0, len);
364 
365 	if (octeontx_mbox_send(&hdr, &conf, len, &conf, len) < 0)
366 		return -EACCES;
367 
368 	if (cfg->fc_cfg == BGX_PORT_FC_CFG_SET)
369 		goto done;
370 
371 	cfg->rx_pause = conf.rx_pause;
372 	cfg->tx_pause = conf.tx_pause;
373 	cfg->low_water = conf.low_water;
374 	cfg->high_water = conf.high_water;
375 
376 done:
377 	return 0;
378 }
379 
380 int octeontx_bgx_port_change_mode(int port,
381 				  octeontx_mbox_bgx_port_change_mode_t *cfg)
382 {
383 	int len = sizeof(octeontx_mbox_bgx_port_change_mode_t), res;
384 	octeontx_mbox_bgx_port_change_mode_t conf;
385 	struct octeontx_mbox_hdr hdr;
386 
387 	hdr.coproc = OCTEONTX_BGX_COPROC;
388 	hdr.msg = MBOX_BGX_PORT_CHANGE_MODE;
389 	hdr.vfid = port;
390 
391 	memcpy(&conf, cfg, len);
392 	res = octeontx_mbox_send(&hdr, &conf, len, NULL, 0);
393 	if (res < 0)
394 		return -EACCES;
395 
396 	return res;
397 }
398