xref: /openbmc/u-boot/drivers/net/fsl-mc/dpni.c (revision ef64e782)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright 2013-2016 Freescale Semiconductor, Inc.
4  * Copyright 2017 NXP
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_cfg(const struct dpni_cfg	*cfg,
12 		     uint8_t			*cfg_buf)
13 {
14 	uint64_t *params = (uint64_t *)cfg_buf;
15 
16 	DPNI_PREP_CFG(params, cfg);
17 
18 	return 0;
19 }
20 
21 int dpni_extract_cfg(struct dpni_cfg	*cfg,
22 		     const uint8_t	*cfg_buf)
23 {
24 	uint64_t *params = (uint64_t *)cfg_buf;
25 
26 	DPNI_EXT_CFG(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 		uint16_t dprc_token,
73 		uint32_t cmd_flags,
74 		const struct dpni_cfg *cfg,
75 		uint32_t *obj_id)
76 {
77 	struct mc_command cmd = { 0 };
78 	int err;
79 
80 	/* prepare command */
81 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_CREATE,
82 					  cmd_flags,
83 					  dprc_token);
84 	DPNI_CMD_CREATE(cmd, cfg);
85 
86 	/* send command to mc*/
87 	err = mc_send_command(mc_io, &cmd);
88 	if (err)
89 		return err;
90 
91 	/* retrieve response parameters */
92 	 MC_CMD_READ_OBJ_ID(cmd, *obj_id);
93 
94 	return 0;
95 }
96 
97 int dpni_destroy(struct fsl_mc_io *mc_io,
98 		 uint16_t dprc_token,
99 		 uint32_t cmd_flags,
100 		 uint32_t obj_id)
101 {
102 	struct mc_command cmd = { 0 };
103 
104 	/* prepare command */
105 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_DESTROY,
106 					  cmd_flags,
107 					  dprc_token);
108 
109 	/* set object id to destroy */
110 	CMD_DESTROY_SET_OBJ_ID_PARAM0(cmd, obj_id);
111 
112 	/* send command to mc*/
113 	return mc_send_command(mc_io, &cmd);
114 }
115 
116 int dpni_set_pools(struct fsl_mc_io *mc_io,
117 		   uint32_t cmd_flags,
118 		   uint16_t token,
119 		   const struct dpni_pools_cfg *cfg)
120 {
121 	struct mc_command cmd = { 0 };
122 
123 	/* prepare command */
124 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_POOLS,
125 					  cmd_flags,
126 					  token);
127 	DPNI_CMD_SET_POOLS(cmd, cfg);
128 
129 	/* send command to mc*/
130 	return mc_send_command(mc_io, &cmd);
131 }
132 
133 int dpni_enable(struct fsl_mc_io *mc_io,
134 		uint32_t cmd_flags,
135 		uint16_t token)
136 {
137 	struct mc_command cmd = { 0 };
138 
139 	/* prepare command */
140 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE,
141 					  cmd_flags,
142 					  token);
143 
144 	/* send command to mc*/
145 	return mc_send_command(mc_io, &cmd);
146 }
147 
148 int dpni_disable(struct fsl_mc_io *mc_io,
149 		 uint32_t cmd_flags,
150 		 uint16_t token)
151 {
152 	struct mc_command cmd = { 0 };
153 
154 	/* prepare command */
155 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_DISABLE,
156 					  cmd_flags,
157 					  token);
158 
159 	/* send command to mc*/
160 	return mc_send_command(mc_io, &cmd);
161 }
162 
163 int dpni_reset(struct fsl_mc_io *mc_io,
164 	       uint32_t cmd_flags,
165 	       uint16_t token)
166 {
167 	struct mc_command cmd = { 0 };
168 
169 	/* prepare command */
170 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET,
171 					  cmd_flags,
172 					  token);
173 
174 	/* send command to mc*/
175 	return mc_send_command(mc_io, &cmd);
176 }
177 
178 int dpni_get_attributes(struct fsl_mc_io *mc_io,
179 			uint32_t cmd_flags,
180 			uint16_t token,
181 			struct dpni_attr *attr)
182 {
183 	struct mc_command cmd = { 0 };
184 	int err;
185 
186 	/* prepare command */
187 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_ATTR,
188 					  cmd_flags,
189 					  token);
190 	/* send command to mc*/
191 	err = mc_send_command(mc_io, &cmd);
192 	if (err)
193 		return err;
194 
195 	/* retrieve response parameters */
196 	DPNI_RSP_GET_ATTR(cmd, attr);
197 
198 	return 0;
199 }
200 
201 int dpni_set_errors_behavior(struct fsl_mc_io *mc_io,
202 			     uint32_t cmd_flags,
203 			     uint16_t token,
204 			      struct dpni_error_cfg *cfg)
205 {
206 	struct mc_command cmd = { 0 };
207 
208 	/* prepare command */
209 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_ERRORS_BEHAVIOR,
210 					  cmd_flags,
211 					  token);
212 	DPNI_CMD_SET_ERRORS_BEHAVIOR(cmd, cfg);
213 
214 	/* send command to mc*/
215 	return mc_send_command(mc_io, &cmd);
216 }
217 
218 int dpni_set_buffer_layout(struct fsl_mc_io *mc_io,
219 			   uint32_t cmd_flags,
220 			   uint16_t token,
221 			   const struct dpni_buffer_layout *layout,
222 			   enum dpni_queue_type type)
223 {
224 	struct mc_command cmd = { 0 };
225 
226 	/* prepare command */
227 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_BUFFER_LAYOUT,
228 					  cmd_flags,
229 					  token);
230 	DPNI_CMD_SET_BUFFER_LAYOUT(cmd, layout, type);
231 
232 	/* send command to mc*/
233 	return mc_send_command(mc_io, &cmd);
234 }
235 
236 int dpni_get_qdid(struct fsl_mc_io *mc_io,
237 		  uint32_t cmd_flags,
238 		  uint16_t token,
239 		  uint16_t *qdid)
240 {
241 	struct mc_command cmd = { 0 };
242 	int err;
243 
244 	/* prepare command */
245 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QDID,
246 					  cmd_flags,
247 					  token);
248 
249 	/* send command to mc*/
250 	err = mc_send_command(mc_io, &cmd);
251 	if (err)
252 		return err;
253 
254 	/* retrieve response parameters */
255 	DPNI_RSP_GET_QDID(cmd, *qdid);
256 
257 	return 0;
258 }
259 
260 int dpni_get_tx_data_offset(struct fsl_mc_io *mc_io,
261 			    uint32_t cmd_flags,
262 			    uint16_t token,
263 			    uint16_t *data_offset)
264 {
265 	struct mc_command cmd = { 0 };
266 	int err;
267 
268 	/* prepare command */
269 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_DATA_OFFSET,
270 					  cmd_flags,
271 					  token);
272 
273 	/* send command to mc*/
274 	err = mc_send_command(mc_io, &cmd);
275 	if (err)
276 		return err;
277 
278 	/* retrieve response parameters */
279 	DPNI_RSP_GET_TX_DATA_OFFSET(cmd, *data_offset);
280 
281 	return 0;
282 }
283 
284 int dpni_set_link_cfg(struct fsl_mc_io *mc_io,
285 		      uint32_t cmd_flags,
286 		      uint16_t token,
287 		      const struct dpni_link_cfg *cfg)
288 {
289 	struct mc_command cmd = { 0 };
290 
291 	/* prepare command */
292 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_LINK_CFG,
293 					  cmd_flags,
294 					  token);
295 	DPNI_CMD_SET_LINK_CFG(cmd, cfg);
296 
297 	/* send command to mc*/
298 	return mc_send_command(mc_io, &cmd);
299 }
300 
301 int dpni_get_link_state(struct fsl_mc_io *mc_io,
302 			uint32_t cmd_flags,
303 			uint16_t token,
304 			struct dpni_link_state *state)
305 {
306 	struct mc_command cmd = { 0 };
307 	int err;
308 
309 	/* prepare command */
310 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_LINK_STATE,
311 					  cmd_flags,
312 					  token);
313 
314 	/* send command to mc*/
315 	err = mc_send_command(mc_io, &cmd);
316 	if (err)
317 		return err;
318 
319 	/* retrieve response parameters */
320 	DPNI_RSP_GET_LINK_STATE(cmd, state);
321 
322 	return 0;
323 }
324 
325 
326 int dpni_set_primary_mac_addr(struct fsl_mc_io *mc_io,
327 			      uint32_t cmd_flags,
328 			      uint16_t token,
329 			      const uint8_t mac_addr[6])
330 {
331 	struct mc_command cmd = { 0 };
332 
333 	/* prepare command */
334 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_PRIM_MAC,
335 					  cmd_flags,
336 					  token);
337 	DPNI_CMD_SET_PRIMARY_MAC_ADDR(cmd, mac_addr);
338 
339 	/* send command to mc*/
340 	return mc_send_command(mc_io, &cmd);
341 }
342 
343 int dpni_get_primary_mac_addr(struct fsl_mc_io *mc_io,
344 			      uint32_t cmd_flags,
345 			      uint16_t token,
346 			      uint8_t mac_addr[6])
347 {
348 	struct mc_command cmd = { 0 };
349 	int err;
350 
351 	/* prepare command */
352 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PRIM_MAC,
353 					  cmd_flags,
354 					  token);
355 
356 	/* send command to mc*/
357 	err = mc_send_command(mc_io, &cmd);
358 	if (err)
359 		return err;
360 
361 	/* retrieve response parameters */
362 	DPNI_RSP_GET_PRIMARY_MAC_ADDR(cmd, mac_addr);
363 
364 	return 0;
365 }
366 
367 int dpni_add_mac_addr(struct fsl_mc_io *mc_io,
368 		      uint32_t cmd_flags,
369 		      uint16_t token,
370 		      const uint8_t mac_addr[6])
371 {
372 	struct mc_command cmd = { 0 };
373 
374 	/* prepare command */
375 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_MAC_ADDR,
376 					  cmd_flags,
377 					  token);
378 	DPNI_CMD_ADD_MAC_ADDR(cmd, mac_addr);
379 
380 	/* send command to mc*/
381 	return mc_send_command(mc_io, &cmd);
382 }
383 
384 int dpni_remove_mac_addr(struct fsl_mc_io *mc_io,
385 			 uint32_t cmd_flags,
386 			 uint16_t token,
387 			 const uint8_t mac_addr[6])
388 {
389 	struct mc_command cmd = { 0 };
390 
391 	/* prepare command */
392 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_MAC_ADDR,
393 					  cmd_flags,
394 					  token);
395 	DPNI_CMD_REMOVE_MAC_ADDR(cmd, mac_addr);
396 
397 	/* send command to mc*/
398 	return mc_send_command(mc_io, &cmd);
399 }
400 
401 int dpni_get_api_version(struct fsl_mc_io *mc_io,
402 			 u32 cmd_flags,
403 			 u16 *major_ver,
404 			 u16 *minor_ver)
405 {
406 	struct mc_command cmd = { 0 };
407 	int err;
408 
409 	/* prepare command */
410 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_API_VERSION,
411 					  cmd_flags, 0);
412 
413 	/* send command to mc */
414 	err = mc_send_command(mc_io, &cmd);
415 	if (err)
416 		return err;
417 
418 	/* retrieve response parameters */
419 	mc_cmd_read_api_version(&cmd, major_ver, minor_ver);
420 
421 	return 0;
422 }
423 
424 int dpni_set_queue(struct fsl_mc_io *mc_io,
425 	uint32_t cmd_flags,
426 	uint16_t token,
427 	enum dpni_queue_type type,
428 	uint8_t tc,
429 	uint8_t index,
430 	const struct dpni_queue *queue)
431 {
432 	struct mc_command cmd = { 0 };
433 	/* prepare command */
434 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QUEUE,
435 					  cmd_flags,
436 					  token);
437 	DPNI_CMD_SET_QUEUE(cmd, type, tc, index, queue);
438 
439 	/* send command to mc*/
440 	return mc_send_command(mc_io, &cmd);
441 }
442 
443 int dpni_get_queue(struct fsl_mc_io *mc_io,
444 	uint32_t cmd_flags,
445 	uint16_t token,
446 	enum dpni_queue_type type,
447 	uint8_t tc,
448 	uint8_t index,
449 	struct dpni_queue *queue)
450 {
451 	struct mc_command cmd = { 0 };
452 	int err;
453 
454 	/* prepare command */
455 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QUEUE,
456 					  cmd_flags,
457 					  token);
458 	DPNI_CMD_GET_QUEUE(cmd, type, tc, index);
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_QUEUE(cmd, queue);
467 	return 0;
468 }
469 
470 int dpni_set_tx_confirmation_mode(struct fsl_mc_io *mc_io,
471 	uint32_t cmd_flags,
472 	uint16_t token,
473 	enum dpni_confirmation_mode mode)
474 {
475 	struct dpni_tx_confirmation_mode *cmd_params;
476 	struct mc_command cmd = { 0 };
477 
478 	/* prepare command */
479 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_CONFIRMATION_MODE,
480 					  cmd_flags,
481 					  token);
482 
483 	cmd_params = (struct dpni_tx_confirmation_mode *)cmd.params;
484 	cmd_params->confirmation_mode = mode;
485 
486 	/* send command to mc*/
487 	return mc_send_command(mc_io, &cmd);
488 }
489 
490 int dpni_get_statistics(struct fsl_mc_io *mc_io,
491 			uint32_t cmd_flags,
492 			uint16_t token,
493 			uint8_t  page,
494 			struct dpni_statistics *stat)
495 {
496 	struct mc_command cmd = { 0 };
497 	int err;
498 
499 	/* prepare command */
500 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_STATISTICS,
501 					  cmd_flags, token);
502 	DPNI_CMD_GET_STATISTICS(cmd, page);
503 
504 	/* send command to mc*/
505 	err = mc_send_command(mc_io, &cmd);
506 	if (err)
507 		return err;
508 
509 	/* retrieve response parameters */
510 	DPNI_RSP_GET_STATISTICS(cmd, stat);
511 
512 	return 0;
513 }
514 
515 int dpni_reset_statistics(struct fsl_mc_io *mc_io,
516 			  uint32_t cmd_flags,
517 			  uint16_t token)
518 {
519 	struct mc_command cmd = { 0 };
520 
521 	/* prepare command */
522 	cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET_STATISTICS,
523 					  cmd_flags, token);
524 
525 	/* send command to mc*/
526 	return mc_send_command(mc_io, &cmd);
527 }
528 
529