dpni.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  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_open(struct fsl_mc_io *mc_io,
  10. uint32_t cmd_flags,
  11. int dpni_id,
  12. uint16_t *token)
  13. {
  14. struct mc_command cmd = { 0 };
  15. int err;
  16. /* prepare command */
  17. cmd.header = mc_encode_cmd_header(DPNI_CMDID_OPEN,
  18. cmd_flags,
  19. 0);
  20. DPNI_CMD_OPEN(cmd, dpni_id);
  21. /* send command to mc*/
  22. err = mc_send_command(mc_io, &cmd);
  23. if (err)
  24. return err;
  25. /* retrieve response parameters */
  26. *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
  27. return 0;
  28. }
  29. int dpni_close(struct fsl_mc_io *mc_io,
  30. uint32_t cmd_flags,
  31. uint16_t token)
  32. {
  33. struct mc_command cmd = { 0 };
  34. /* prepare command */
  35. cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLOSE,
  36. cmd_flags,
  37. token);
  38. /* send command to mc*/
  39. return mc_send_command(mc_io, &cmd);
  40. }
  41. int dpni_set_pools(struct fsl_mc_io *mc_io,
  42. uint32_t cmd_flags,
  43. uint16_t token,
  44. const struct dpni_pools_cfg *cfg)
  45. {
  46. struct mc_command cmd = { 0 };
  47. /* prepare command */
  48. cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_POOLS,
  49. cmd_flags,
  50. token);
  51. DPNI_CMD_SET_POOLS(cmd, cfg);
  52. /* send command to mc*/
  53. return mc_send_command(mc_io, &cmd);
  54. }
  55. int dpni_enable(struct fsl_mc_io *mc_io,
  56. uint32_t cmd_flags,
  57. uint16_t token)
  58. {
  59. struct mc_command cmd = { 0 };
  60. /* prepare command */
  61. cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE,
  62. cmd_flags,
  63. token);
  64. /* send command to mc*/
  65. return mc_send_command(mc_io, &cmd);
  66. }
  67. int dpni_disable(struct fsl_mc_io *mc_io,
  68. uint32_t cmd_flags,
  69. uint16_t token)
  70. {
  71. struct mc_command cmd = { 0 };
  72. /* prepare command */
  73. cmd.header = mc_encode_cmd_header(DPNI_CMDID_DISABLE,
  74. cmd_flags,
  75. token);
  76. /* send command to mc*/
  77. return mc_send_command(mc_io, &cmd);
  78. }
  79. int dpni_reset(struct fsl_mc_io *mc_io,
  80. uint32_t cmd_flags,
  81. uint16_t token)
  82. {
  83. struct mc_command cmd = { 0 };
  84. /* prepare command */
  85. cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET,
  86. cmd_flags,
  87. token);
  88. /* send command to mc*/
  89. return mc_send_command(mc_io, &cmd);
  90. }
  91. int dpni_get_attributes(struct fsl_mc_io *mc_io,
  92. uint32_t cmd_flags,
  93. uint16_t token,
  94. struct dpni_attr *attr)
  95. {
  96. struct mc_command cmd = { 0 };
  97. int err;
  98. /* prepare command */
  99. cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_ATTR,
  100. cmd_flags,
  101. token);
  102. /* send command to mc*/
  103. err = mc_send_command(mc_io, &cmd);
  104. if (err)
  105. return err;
  106. /* retrieve response parameters */
  107. DPNI_RSP_GET_ATTR(cmd, attr);
  108. return 0;
  109. }
  110. int dpni_get_rx_buffer_layout(struct fsl_mc_io *mc_io,
  111. uint32_t cmd_flags,
  112. uint16_t token,
  113. struct dpni_buffer_layout *layout)
  114. {
  115. struct mc_command cmd = { 0 };
  116. int err;
  117. /* prepare command */
  118. cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_RX_BUFFER_LAYOUT,
  119. cmd_flags,
  120. token);
  121. /* send command to mc*/
  122. err = mc_send_command(mc_io, &cmd);
  123. if (err)
  124. return err;
  125. /* retrieve response parameters */
  126. DPNI_RSP_GET_RX_BUFFER_LAYOUT(cmd, layout);
  127. return 0;
  128. }
  129. int dpni_set_rx_buffer_layout(struct fsl_mc_io *mc_io,
  130. uint32_t cmd_flags,
  131. uint16_t token,
  132. const struct dpni_buffer_layout *layout)
  133. {
  134. struct mc_command cmd = { 0 };
  135. /* prepare command */
  136. cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_BUFFER_LAYOUT,
  137. cmd_flags,
  138. token);
  139. DPNI_CMD_SET_RX_BUFFER_LAYOUT(cmd, layout);
  140. /* send command to mc*/
  141. return mc_send_command(mc_io, &cmd);
  142. }
  143. int dpni_get_tx_buffer_layout(struct fsl_mc_io *mc_io,
  144. uint32_t cmd_flags,
  145. uint16_t token,
  146. struct dpni_buffer_layout *layout)
  147. {
  148. struct mc_command cmd = { 0 };
  149. int err;
  150. /* prepare command */
  151. cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_BUFFER_LAYOUT,
  152. cmd_flags,
  153. token);
  154. /* send command to mc*/
  155. err = mc_send_command(mc_io, &cmd);
  156. if (err)
  157. return err;
  158. /* retrieve response parameters */
  159. DPNI_RSP_GET_TX_BUFFER_LAYOUT(cmd, layout);
  160. return 0;
  161. }
  162. int dpni_set_tx_buffer_layout(struct fsl_mc_io *mc_io,
  163. uint32_t cmd_flags,
  164. uint16_t token,
  165. const struct dpni_buffer_layout *layout)
  166. {
  167. struct mc_command cmd = { 0 };
  168. /* prepare command */
  169. cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_BUFFER_LAYOUT,
  170. cmd_flags,
  171. token);
  172. DPNI_CMD_SET_TX_BUFFER_LAYOUT(cmd, layout);
  173. /* send command to mc*/
  174. return mc_send_command(mc_io, &cmd);
  175. }
  176. int dpni_get_tx_conf_buffer_layout(struct fsl_mc_io *mc_io,
  177. uint32_t cmd_flags,
  178. uint16_t token,
  179. struct dpni_buffer_layout *layout)
  180. {
  181. struct mc_command cmd = { 0 };
  182. int err;
  183. /* prepare command */
  184. cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_CONF_BUFFER_LAYOUT,
  185. cmd_flags,
  186. token);
  187. /* send command to mc*/
  188. err = mc_send_command(mc_io, &cmd);
  189. if (err)
  190. return err;
  191. /* retrieve response parameters */
  192. DPNI_RSP_GET_TX_CONF_BUFFER_LAYOUT(cmd, layout);
  193. return 0;
  194. }
  195. int dpni_set_tx_conf_buffer_layout(struct fsl_mc_io *mc_io,
  196. uint32_t cmd_flags,
  197. uint16_t token,
  198. const struct dpni_buffer_layout *layout)
  199. {
  200. struct mc_command cmd = { 0 };
  201. /* prepare command */
  202. cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_CONF_BUFFER_LAYOUT,
  203. cmd_flags,
  204. token);
  205. DPNI_CMD_SET_TX_CONF_BUFFER_LAYOUT(cmd, layout);
  206. /* send command to mc*/
  207. return mc_send_command(mc_io, &cmd);
  208. }
  209. int dpni_get_qdid(struct fsl_mc_io *mc_io,
  210. uint32_t cmd_flags,
  211. uint16_t token,
  212. uint16_t *qdid)
  213. {
  214. struct mc_command cmd = { 0 };
  215. int err;
  216. /* prepare command */
  217. cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QDID,
  218. cmd_flags,
  219. token);
  220. /* send command to mc*/
  221. err = mc_send_command(mc_io, &cmd);
  222. if (err)
  223. return err;
  224. /* retrieve response parameters */
  225. DPNI_RSP_GET_QDID(cmd, *qdid);
  226. return 0;
  227. }
  228. int dpni_get_tx_data_offset(struct fsl_mc_io *mc_io,
  229. uint32_t cmd_flags,
  230. uint16_t token,
  231. uint16_t *data_offset)
  232. {
  233. struct mc_command cmd = { 0 };
  234. int err;
  235. /* prepare command */
  236. cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_DATA_OFFSET,
  237. cmd_flags,
  238. token);
  239. /* send command to mc*/
  240. err = mc_send_command(mc_io, &cmd);
  241. if (err)
  242. return err;
  243. /* retrieve response parameters */
  244. DPNI_RSP_GET_TX_DATA_OFFSET(cmd, *data_offset);
  245. return 0;
  246. }
  247. int dpni_get_counter(struct fsl_mc_io *mc_io,
  248. uint32_t cmd_flags,
  249. uint16_t token,
  250. enum dpni_counter counter,
  251. uint64_t *value)
  252. {
  253. struct mc_command cmd = { 0 };
  254. int err;
  255. /* prepare command */
  256. cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_COUNTER,
  257. cmd_flags,
  258. token);
  259. DPNI_CMD_GET_COUNTER(cmd, counter);
  260. /* send command to mc*/
  261. err = mc_send_command(mc_io, &cmd);
  262. if (err)
  263. return err;
  264. /* retrieve response parameters */
  265. DPNI_RSP_GET_COUNTER(cmd, *value);
  266. return 0;
  267. }
  268. int dpni_set_counter(struct fsl_mc_io *mc_io,
  269. uint32_t cmd_flags,
  270. uint16_t token,
  271. enum dpni_counter counter,
  272. uint64_t value)
  273. {
  274. struct mc_command cmd = { 0 };
  275. /* prepare command */
  276. cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_COUNTER,
  277. cmd_flags,
  278. token);
  279. DPNI_CMD_SET_COUNTER(cmd, counter, value);
  280. /* send command to mc*/
  281. return mc_send_command(mc_io, &cmd);
  282. }
  283. int dpni_set_link_cfg(struct fsl_mc_io *mc_io,
  284. uint32_t cmd_flags,
  285. uint16_t token,
  286. const struct dpni_link_cfg *cfg)
  287. {
  288. struct mc_command cmd = { 0 };
  289. /* prepare command */
  290. cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_LINK_CFG,
  291. cmd_flags,
  292. token);
  293. DPNI_CMD_SET_LINK_CFG(cmd, cfg);
  294. /* send command to mc*/
  295. return mc_send_command(mc_io, &cmd);
  296. }
  297. int dpni_get_link_state(struct fsl_mc_io *mc_io,
  298. uint32_t cmd_flags,
  299. uint16_t token,
  300. struct dpni_link_state *state)
  301. {
  302. struct mc_command cmd = { 0 };
  303. int err;
  304. /* prepare command */
  305. cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_LINK_STATE,
  306. cmd_flags,
  307. token);
  308. /* send command to mc*/
  309. err = mc_send_command(mc_io, &cmd);
  310. if (err)
  311. return err;
  312. /* retrieve response parameters */
  313. DPNI_RSP_GET_LINK_STATE(cmd, state);
  314. return 0;
  315. }
  316. int dpni_set_primary_mac_addr(struct fsl_mc_io *mc_io,
  317. uint32_t cmd_flags,
  318. uint16_t token,
  319. const uint8_t mac_addr[6])
  320. {
  321. struct mc_command cmd = { 0 };
  322. /* prepare command */
  323. cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_PRIM_MAC,
  324. cmd_flags,
  325. token);
  326. DPNI_CMD_SET_PRIMARY_MAC_ADDR(cmd, mac_addr);
  327. /* send command to mc*/
  328. return mc_send_command(mc_io, &cmd);
  329. }
  330. int dpni_get_primary_mac_addr(struct fsl_mc_io *mc_io,
  331. uint32_t cmd_flags,
  332. uint16_t token,
  333. uint8_t mac_addr[6])
  334. {
  335. struct mc_command cmd = { 0 };
  336. int err;
  337. /* prepare command */
  338. cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PRIM_MAC,
  339. cmd_flags,
  340. token);
  341. /* send command to mc*/
  342. err = mc_send_command(mc_io, &cmd);
  343. if (err)
  344. return err;
  345. /* retrieve response parameters */
  346. DPNI_RSP_GET_PRIMARY_MAC_ADDR(cmd, mac_addr);
  347. return 0;
  348. }
  349. int dpni_add_mac_addr(struct fsl_mc_io *mc_io,
  350. uint32_t cmd_flags,
  351. uint16_t token,
  352. const uint8_t mac_addr[6])
  353. {
  354. struct mc_command cmd = { 0 };
  355. /* prepare command */
  356. cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_MAC_ADDR,
  357. cmd_flags,
  358. token);
  359. DPNI_CMD_ADD_MAC_ADDR(cmd, mac_addr);
  360. /* send command to mc*/
  361. return mc_send_command(mc_io, &cmd);
  362. }
  363. int dpni_remove_mac_addr(struct fsl_mc_io *mc_io,
  364. uint32_t cmd_flags,
  365. uint16_t token,
  366. const uint8_t mac_addr[6])
  367. {
  368. struct mc_command cmd = { 0 };
  369. /* prepare command */
  370. cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_MAC_ADDR,
  371. cmd_flags,
  372. token);
  373. DPNI_CMD_REMOVE_MAC_ADDR(cmd, mac_addr);
  374. /* send command to mc*/
  375. return mc_send_command(mc_io, &cmd);
  376. }
  377. int dpni_set_tx_flow(struct fsl_mc_io *mc_io,
  378. uint32_t cmd_flags,
  379. uint16_t token,
  380. uint16_t *flow_id,
  381. const struct dpni_tx_flow_cfg *cfg)
  382. {
  383. struct mc_command cmd = { 0 };
  384. int err;
  385. /* prepare command */
  386. cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_FLOW,
  387. cmd_flags,
  388. token);
  389. DPNI_CMD_SET_TX_FLOW(cmd, *flow_id, cfg);
  390. /* send command to mc*/
  391. err = mc_send_command(mc_io, &cmd);
  392. if (err)
  393. return err;
  394. /* retrieve response parameters */
  395. DPNI_RSP_SET_TX_FLOW(cmd, *flow_id);
  396. return 0;
  397. }
  398. int dpni_get_tx_flow(struct fsl_mc_io *mc_io,
  399. uint32_t cmd_flags,
  400. uint16_t token,
  401. uint16_t flow_id,
  402. struct dpni_tx_flow_attr *attr)
  403. {
  404. struct mc_command cmd = { 0 };
  405. int err;
  406. /* prepare command */
  407. cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_FLOW,
  408. cmd_flags,
  409. token);
  410. DPNI_CMD_GET_TX_FLOW(cmd, flow_id);
  411. /* send command to mc*/
  412. err = mc_send_command(mc_io, &cmd);
  413. if (err)
  414. return err;
  415. /* retrieve response parameters */
  416. DPNI_RSP_GET_TX_FLOW(cmd, attr);
  417. return 0;
  418. }
  419. int dpni_set_rx_flow(struct fsl_mc_io *mc_io,
  420. uint32_t cmd_flags,
  421. uint16_t token,
  422. uint8_t tc_id,
  423. uint16_t flow_id,
  424. const struct dpni_queue_cfg *cfg)
  425. {
  426. struct mc_command cmd = { 0 };
  427. /* prepare command */
  428. cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_FLOW,
  429. cmd_flags,
  430. token);
  431. DPNI_CMD_SET_RX_FLOW(cmd, tc_id, flow_id, cfg);
  432. /* send command to mc*/
  433. return mc_send_command(mc_io, &cmd);
  434. }
  435. int dpni_get_rx_flow(struct fsl_mc_io *mc_io,
  436. uint32_t cmd_flags,
  437. uint16_t token,
  438. uint8_t tc_id,
  439. uint16_t flow_id,
  440. struct dpni_queue_attr *attr)
  441. {
  442. struct mc_command cmd = { 0 };
  443. int err;
  444. /* prepare command */
  445. cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_RX_FLOW,
  446. cmd_flags,
  447. token);
  448. DPNI_CMD_GET_RX_FLOW(cmd, tc_id, flow_id);
  449. /* send command to mc*/
  450. err = mc_send_command(mc_io, &cmd);
  451. if (err)
  452. return err;
  453. /* retrieve response parameters */
  454. DPNI_RSP_GET_RX_FLOW(cmd, attr);
  455. return 0;
  456. }