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