dpni.c 14 KB

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