xref: /openbmc/u-boot/drivers/net/fsl-mc/dpni.c (revision 382bee57)
1 /*
2  * Copyright (C) 2013-2015 Freescale Semiconductor
3  *
4  * SPDX-License-Identifier:	GPL-2.0+
5  */
6 
7 #include <fsl-mc/fsl_mc_sys.h>
8 #include <fsl-mc/fsl_mc_cmd.h>
9 #include <fsl-mc/fsl_dpni.h>
10 
11 int dpni_prepare_extended_cfg(const struct dpni_extended_cfg	*cfg,
12 			      uint8_t			*ext_cfg_buf)
13 {
14 	uint64_t *ext_params = (uint64_t *)ext_cfg_buf;
15 
16 	DPNI_PREP_EXTENDED_CFG(ext_params, cfg);
17 
18 	return 0;
19 }
20 
21 int dpni_extract_extended_cfg(struct dpni_extended_cfg	*cfg,
22 			      const uint8_t		*ext_cfg_buf)
23 {
24 	uint64_t *ext_params = (uint64_t *)ext_cfg_buf;
25 
26 	DPNI_EXT_EXTENDED_CFG(ext_params, cfg);
27 
28 	return 0;
29 }
30 
31 int dpni_open(struct fsl_mc_io *mc_io,
32 	      uint32_t cmd_flags,
33 	      int dpni_id,
34 	      uint16_t *token)
35 {
36 	struct mc_command cmd = { 0 };
37 	int err;
38 
39 	/* prepare command */
40 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_OPEN,
41 					  cmd_flags,
42 					  0);
43 	DPNI_CMD_OPEN(cmd, dpni_id);
44 
45 	/* send command to mc*/
46 	err = mc_send_command(mc_io, &cmd);
47 	if (err)
48 		return err;
49 
50 	/* retrieve response parameters */
51 	*token = MC_CMD_HDR_READ_TOKEN(cmd.header);
52 
53 	return 0;
54 }
55 
56 int dpni_close(struct fsl_mc_io *mc_io,
57 	       uint32_t cmd_flags,
58 	       uint16_t token)
59 {
60 	struct mc_command cmd = { 0 };
61 
62 	/* prepare command */
63 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLOSE,
64 					  cmd_flags,
65 					  token);
66 
67 	/* send command to mc*/
68 	return mc_send_command(mc_io, &cmd);
69 }
70 
71 int dpni_create(struct fsl_mc_io *mc_io,
72 		uint32_t cmd_flags,
73 		const struct dpni_cfg *cfg,
74 		uint16_t *token)
75 {
76 	struct mc_command cmd = { 0 };
77 	int err;
78 
79 	/* prepare command */
80 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CREATE,
81 					  cmd_flags,
82 					  0);
83 	DPNI_CMD_CREATE(cmd, cfg);
84 
85 	/* send command to mc*/
86 	err = mc_send_command(mc_io, &cmd);
87 	if (err)
88 		return err;
89 
90 	/* retrieve response parameters */
91 	*token = MC_CMD_HDR_READ_TOKEN(cmd.header);
92 
93 	return 0;
94 }
95 
96 int dpni_destroy(struct fsl_mc_io *mc_io,
97 		 uint32_t cmd_flags,
98 		 uint16_t token)
99 {
100 	struct mc_command cmd = { 0 };
101 
102 	/* prepare command */
103 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_DESTROY,
104 					  cmd_flags,
105 					  token);
106 
107 	/* send command to mc*/
108 	return mc_send_command(mc_io, &cmd);
109 }
110 
111 int dpni_set_pools(struct fsl_mc_io *mc_io,
112 		   uint32_t cmd_flags,
113 		   uint16_t token,
114 		   const struct dpni_pools_cfg *cfg)
115 {
116 	struct mc_command cmd = { 0 };
117 
118 	/* prepare command */
119 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_POOLS,
120 					  cmd_flags,
121 					  token);
122 	DPNI_CMD_SET_POOLS(cmd, cfg);
123 
124 	/* send command to mc*/
125 	return mc_send_command(mc_io, &cmd);
126 }
127 
128 int dpni_enable(struct fsl_mc_io *mc_io,
129 		uint32_t cmd_flags,
130 		uint16_t token)
131 {
132 	struct mc_command cmd = { 0 };
133 
134 	/* prepare command */
135 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE,
136 					  cmd_flags,
137 					  token);
138 
139 	/* send command to mc*/
140 	return mc_send_command(mc_io, &cmd);
141 }
142 
143 int dpni_disable(struct fsl_mc_io *mc_io,
144 		 uint32_t cmd_flags,
145 		 uint16_t token)
146 {
147 	struct mc_command cmd = { 0 };
148 
149 	/* prepare command */
150 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_DISABLE,
151 					  cmd_flags,
152 					  token);
153 
154 	/* send command to mc*/
155 	return mc_send_command(mc_io, &cmd);
156 }
157 
158 int dpni_reset(struct fsl_mc_io *mc_io,
159 	       uint32_t cmd_flags,
160 	       uint16_t token)
161 {
162 	struct mc_command cmd = { 0 };
163 
164 	/* prepare command */
165 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET,
166 					  cmd_flags,
167 					  token);
168 
169 	/* send command to mc*/
170 	return mc_send_command(mc_io, &cmd);
171 }
172 
173 int dpni_get_attributes(struct fsl_mc_io *mc_io,
174 			uint32_t cmd_flags,
175 			uint16_t token,
176 			struct dpni_attr *attr)
177 {
178 	struct mc_command cmd = { 0 };
179 	int err;
180 
181 	/* prepare command */
182 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_ATTR,
183 					  cmd_flags,
184 					  token);
185 	DPNI_CMD_GET_ATTR(cmd, attr);
186 
187 	/* send command to mc*/
188 	err = mc_send_command(mc_io, &cmd);
189 	if (err)
190 		return err;
191 
192 	/* retrieve response parameters */
193 	DPNI_RSP_GET_ATTR(cmd, attr);
194 
195 	return 0;
196 }
197 
198 int dpni_set_errors_behavior(struct fsl_mc_io *mc_io,
199 			     uint32_t cmd_flags,
200 			     uint16_t token,
201 			      struct dpni_error_cfg *cfg)
202 {
203 	struct mc_command cmd = { 0 };
204 
205 	/* prepare command */
206 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_ERRORS_BEHAVIOR,
207 					  cmd_flags,
208 					  token);
209 	DPNI_CMD_SET_ERRORS_BEHAVIOR(cmd, cfg);
210 
211 	/* send command to mc*/
212 	return mc_send_command(mc_io, &cmd);
213 }
214 
215 int dpni_get_rx_buffer_layout(struct fsl_mc_io *mc_io,
216 			      uint32_t cmd_flags,
217 			      uint16_t token,
218 			      struct dpni_buffer_layout *layout)
219 {
220 	struct mc_command cmd = { 0 };
221 	int err;
222 
223 	/* prepare command */
224 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_RX_BUFFER_LAYOUT,
225 					  cmd_flags,
226 					  token);
227 
228 	/* send command to mc*/
229 	err = mc_send_command(mc_io, &cmd);
230 	if (err)
231 		return err;
232 
233 	/* retrieve response parameters */
234 	DPNI_RSP_GET_RX_BUFFER_LAYOUT(cmd, layout);
235 
236 	return 0;
237 }
238 
239 int dpni_set_rx_buffer_layout(struct fsl_mc_io *mc_io,
240 			      uint32_t cmd_flags,
241 			      uint16_t token,
242 			      const struct dpni_buffer_layout *layout)
243 {
244 	struct mc_command cmd = { 0 };
245 
246 	/* prepare command */
247 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_BUFFER_LAYOUT,
248 					  cmd_flags,
249 					  token);
250 	DPNI_CMD_SET_RX_BUFFER_LAYOUT(cmd, layout);
251 
252 	/* send command to mc*/
253 	return mc_send_command(mc_io, &cmd);
254 }
255 
256 int dpni_get_tx_buffer_layout(struct fsl_mc_io *mc_io,
257 			      uint32_t cmd_flags,
258 			      uint16_t token,
259 			      struct dpni_buffer_layout *layout)
260 {
261 	struct mc_command cmd = { 0 };
262 	int err;
263 
264 	/* prepare command */
265 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_BUFFER_LAYOUT,
266 					  cmd_flags,
267 					  token);
268 
269 	/* send command to mc*/
270 	err = mc_send_command(mc_io, &cmd);
271 	if (err)
272 		return err;
273 
274 	/* retrieve response parameters */
275 	DPNI_RSP_GET_TX_BUFFER_LAYOUT(cmd, layout);
276 
277 	return 0;
278 }
279 
280 int dpni_set_tx_buffer_layout(struct fsl_mc_io *mc_io,
281 			      uint32_t cmd_flags,
282 			      uint16_t token,
283 			      const struct dpni_buffer_layout *layout)
284 {
285 	struct mc_command cmd = { 0 };
286 
287 	/* prepare command */
288 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_BUFFER_LAYOUT,
289 					  cmd_flags,
290 					  token);
291 	DPNI_CMD_SET_TX_BUFFER_LAYOUT(cmd, layout);
292 
293 	/* send command to mc*/
294 	return mc_send_command(mc_io, &cmd);
295 }
296 
297 int dpni_get_tx_conf_buffer_layout(struct fsl_mc_io *mc_io,
298 				   uint32_t cmd_flags,
299 				   uint16_t token,
300 				   struct dpni_buffer_layout *layout)
301 {
302 	struct mc_command cmd = { 0 };
303 	int err;
304 
305 	/* prepare command */
306 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_CONF_BUFFER_LAYOUT,
307 					  cmd_flags,
308 					  token);
309 
310 	/* send command to mc*/
311 	err = mc_send_command(mc_io, &cmd);
312 	if (err)
313 		return err;
314 
315 	/* retrieve response parameters */
316 	DPNI_RSP_GET_TX_CONF_BUFFER_LAYOUT(cmd, layout);
317 
318 	return 0;
319 }
320 
321 int dpni_set_tx_conf_buffer_layout(struct fsl_mc_io *mc_io,
322 				   uint32_t cmd_flags,
323 				   uint16_t token,
324 				   const struct dpni_buffer_layout *layout)
325 {
326 	struct mc_command cmd = { 0 };
327 
328 	/* prepare command */
329 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_CONF_BUFFER_LAYOUT,
330 					  cmd_flags,
331 					  token);
332 	DPNI_CMD_SET_TX_CONF_BUFFER_LAYOUT(cmd, layout);
333 
334 	/* send command to mc*/
335 	return mc_send_command(mc_io, &cmd);
336 }
337 
338 int dpni_get_qdid(struct fsl_mc_io *mc_io,
339 		  uint32_t cmd_flags,
340 		  uint16_t token,
341 		  uint16_t *qdid)
342 {
343 	struct mc_command cmd = { 0 };
344 	int err;
345 
346 	/* prepare command */
347 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QDID,
348 					  cmd_flags,
349 					  token);
350 
351 	/* send command to mc*/
352 	err = mc_send_command(mc_io, &cmd);
353 	if (err)
354 		return err;
355 
356 	/* retrieve response parameters */
357 	DPNI_RSP_GET_QDID(cmd, *qdid);
358 
359 	return 0;
360 }
361 
362 int dpni_get_tx_data_offset(struct fsl_mc_io *mc_io,
363 			    uint32_t cmd_flags,
364 			    uint16_t token,
365 			    uint16_t *data_offset)
366 {
367 	struct mc_command cmd = { 0 };
368 	int err;
369 
370 	/* prepare command */
371 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_DATA_OFFSET,
372 					  cmd_flags,
373 					  token);
374 
375 	/* send command to mc*/
376 	err = mc_send_command(mc_io, &cmd);
377 	if (err)
378 		return err;
379 
380 	/* retrieve response parameters */
381 	DPNI_RSP_GET_TX_DATA_OFFSET(cmd, *data_offset);
382 
383 	return 0;
384 }
385 
386 int dpni_get_counter(struct fsl_mc_io *mc_io,
387 		     uint32_t cmd_flags,
388 		     uint16_t token,
389 		     enum dpni_counter counter,
390 		     uint64_t *value)
391 {
392 	struct mc_command cmd = { 0 };
393 	int err;
394 
395 	/* prepare command */
396 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_COUNTER,
397 					  cmd_flags,
398 					  token);
399 	DPNI_CMD_GET_COUNTER(cmd, counter);
400 
401 	/* send command to mc*/
402 	err = mc_send_command(mc_io, &cmd);
403 	if (err)
404 		return err;
405 
406 	/* retrieve response parameters */
407 	DPNI_RSP_GET_COUNTER(cmd, *value);
408 
409 	return 0;
410 }
411 
412 int dpni_set_counter(struct fsl_mc_io *mc_io,
413 		     uint32_t cmd_flags,
414 		     uint16_t token,
415 		     enum dpni_counter counter,
416 		     uint64_t value)
417 {
418 	struct mc_command cmd = { 0 };
419 
420 	/* prepare command */
421 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_COUNTER,
422 					  cmd_flags,
423 					  token);
424 	DPNI_CMD_SET_COUNTER(cmd, counter, value);
425 
426 	/* send command to mc*/
427 	return mc_send_command(mc_io, &cmd);
428 }
429 
430 int dpni_set_link_cfg(struct fsl_mc_io *mc_io,
431 		      uint32_t cmd_flags,
432 		      uint16_t token,
433 		      const struct dpni_link_cfg *cfg)
434 {
435 	struct mc_command cmd = { 0 };
436 
437 	/* prepare command */
438 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_LINK_CFG,
439 					  cmd_flags,
440 					  token);
441 	DPNI_CMD_SET_LINK_CFG(cmd, cfg);
442 
443 	/* send command to mc*/
444 	return mc_send_command(mc_io, &cmd);
445 }
446 
447 int dpni_get_link_state(struct fsl_mc_io *mc_io,
448 			uint32_t cmd_flags,
449 			uint16_t token,
450 			struct dpni_link_state *state)
451 {
452 	struct mc_command cmd = { 0 };
453 	int err;
454 
455 	/* prepare command */
456 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_LINK_STATE,
457 					  cmd_flags,
458 					  token);
459 
460 	/* send command to mc*/
461 	err = mc_send_command(mc_io, &cmd);
462 	if (err)
463 		return err;
464 
465 	/* retrieve response parameters */
466 	DPNI_RSP_GET_LINK_STATE(cmd, state);
467 
468 	return 0;
469 }
470 
471 
472 int dpni_set_primary_mac_addr(struct fsl_mc_io *mc_io,
473 			      uint32_t cmd_flags,
474 			      uint16_t token,
475 			      const uint8_t mac_addr[6])
476 {
477 	struct mc_command cmd = { 0 };
478 
479 	/* prepare command */
480 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_PRIM_MAC,
481 					  cmd_flags,
482 					  token);
483 	DPNI_CMD_SET_PRIMARY_MAC_ADDR(cmd, mac_addr);
484 
485 	/* send command to mc*/
486 	return mc_send_command(mc_io, &cmd);
487 }
488 
489 int dpni_get_primary_mac_addr(struct fsl_mc_io *mc_io,
490 			      uint32_t cmd_flags,
491 			      uint16_t token,
492 			      uint8_t mac_addr[6])
493 {
494 	struct mc_command cmd = { 0 };
495 	int err;
496 
497 	/* prepare command */
498 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PRIM_MAC,
499 					  cmd_flags,
500 					  token);
501 
502 	/* send command to mc*/
503 	err = mc_send_command(mc_io, &cmd);
504 	if (err)
505 		return err;
506 
507 	/* retrieve response parameters */
508 	DPNI_RSP_GET_PRIMARY_MAC_ADDR(cmd, mac_addr);
509 
510 	return 0;
511 }
512 
513 int dpni_add_mac_addr(struct fsl_mc_io *mc_io,
514 		      uint32_t cmd_flags,
515 		      uint16_t token,
516 		      const uint8_t mac_addr[6])
517 {
518 	struct mc_command cmd = { 0 };
519 
520 	/* prepare command */
521 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_MAC_ADDR,
522 					  cmd_flags,
523 					  token);
524 	DPNI_CMD_ADD_MAC_ADDR(cmd, mac_addr);
525 
526 	/* send command to mc*/
527 	return mc_send_command(mc_io, &cmd);
528 }
529 
530 int dpni_remove_mac_addr(struct fsl_mc_io *mc_io,
531 			 uint32_t cmd_flags,
532 			 uint16_t token,
533 			 const uint8_t mac_addr[6])
534 {
535 	struct mc_command cmd = { 0 };
536 
537 	/* prepare command */
538 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_MAC_ADDR,
539 					  cmd_flags,
540 					  token);
541 	DPNI_CMD_REMOVE_MAC_ADDR(cmd, mac_addr);
542 
543 	/* send command to mc*/
544 	return mc_send_command(mc_io, &cmd);
545 }
546 
547 int dpni_set_tx_flow(struct fsl_mc_io *mc_io,
548 		     uint32_t cmd_flags,
549 		     uint16_t token,
550 		     uint16_t *flow_id,
551 		     const struct dpni_tx_flow_cfg *cfg)
552 {
553 	struct mc_command cmd = { 0 };
554 	int err;
555 
556 	/* prepare command */
557 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_FLOW,
558 					  cmd_flags,
559 					  token);
560 	DPNI_CMD_SET_TX_FLOW(cmd, *flow_id, cfg);
561 
562 	/* send command to mc*/
563 	err = mc_send_command(mc_io, &cmd);
564 	if (err)
565 		return err;
566 
567 	/* retrieve response parameters */
568 	DPNI_RSP_SET_TX_FLOW(cmd, *flow_id);
569 
570 	return 0;
571 }
572 
573 int dpni_get_tx_flow(struct fsl_mc_io *mc_io,
574 		     uint32_t cmd_flags,
575 		     uint16_t token,
576 		     uint16_t flow_id,
577 		     struct dpni_tx_flow_attr *attr)
578 {
579 	struct mc_command cmd = { 0 };
580 	int err;
581 
582 	/* prepare command */
583 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_FLOW,
584 					  cmd_flags,
585 					  token);
586 	DPNI_CMD_GET_TX_FLOW(cmd, flow_id);
587 
588 	/* send command to mc*/
589 	err = mc_send_command(mc_io, &cmd);
590 	if (err)
591 		return err;
592 
593 	/* retrieve response parameters */
594 	DPNI_RSP_GET_TX_FLOW(cmd, attr);
595 
596 	return 0;
597 }
598 
599 int dpni_set_rx_flow(struct fsl_mc_io *mc_io,
600 		     uint32_t cmd_flags,
601 		     uint16_t token,
602 		     uint8_t tc_id,
603 		     uint16_t flow_id,
604 		     const struct dpni_queue_cfg *cfg)
605 {
606 	struct mc_command cmd = { 0 };
607 
608 	/* prepare command */
609 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_FLOW,
610 					  cmd_flags,
611 					  token);
612 	DPNI_CMD_SET_RX_FLOW(cmd, tc_id, flow_id, cfg);
613 
614 	/* send command to mc*/
615 	return mc_send_command(mc_io, &cmd);
616 }
617 
618 int dpni_get_rx_flow(struct fsl_mc_io *mc_io,
619 		     uint32_t cmd_flags,
620 		     uint16_t token,
621 		     uint8_t tc_id,
622 		     uint16_t flow_id,
623 		     struct dpni_queue_attr *attr)
624 {
625 	struct mc_command cmd = { 0 };
626 	int err;
627 	/* prepare command */
628 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_RX_FLOW,
629 					  cmd_flags,
630 					  token);
631 	DPNI_CMD_GET_RX_FLOW(cmd, tc_id, flow_id);
632 
633 	/* send command to mc*/
634 	err = mc_send_command(mc_io, &cmd);
635 	if (err)
636 		return err;
637 
638 	/* retrieve response parameters */
639 	DPNI_RSP_GET_RX_FLOW(cmd, attr);
640 
641 	return 0;
642 }
643 
644 int dpni_set_tx_conf(struct fsl_mc_io	*mc_io,
645 		     uint32_t		cmd_flags,
646 		     uint16_t		token,
647 		     uint16_t		flow_id,
648 		     const struct dpni_tx_conf_cfg	*cfg)
649 {
650 	struct mc_command cmd = { 0 };
651 
652 	/* prepare command */
653 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_CONF,
654 					  cmd_flags,
655 					  token);
656 	DPNI_CMD_SET_TX_CONF(cmd, flow_id, cfg);
657 
658 	/* send command to mc*/
659 	return mc_send_command(mc_io, &cmd);
660 }
661 
662 int dpni_get_tx_conf(struct fsl_mc_io		*mc_io,
663 		     uint32_t			cmd_flags,
664 		     uint16_t			token,
665 		     uint16_t			flow_id,
666 		     struct dpni_tx_conf_attr	*attr)
667 {
668 	struct mc_command cmd = { 0 };
669 	int err;
670 
671 	/* prepare command */
672 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_CONF,
673 					  cmd_flags,
674 					  token);
675 	DPNI_CMD_GET_TX_CONF(cmd, flow_id);
676 
677 	/* send command to mc*/
678 	err = mc_send_command(mc_io, &cmd);
679 	if (err)
680 		return err;
681 
682 	DPNI_RSP_GET_TX_CONF(cmd, attr);
683 
684 	return 0;
685 }
686