Merge git://git.denx.de/u-boot-samsung
[platform/kernel/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