dprc.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. /*
  2. * Freescale Layerscape MC I/O wrapper
  3. *
  4. * Copyright (C) 2013-2015 Freescale Semiconductor, Inc.
  5. * Author: German Rivera <German.Rivera@freescale.com>
  6. *
  7. * SPDX-License-Identifier: GPL-2.0+
  8. */
  9. #include <fsl-mc/fsl_mc_sys.h>
  10. #include <fsl-mc/fsl_mc_cmd.h>
  11. #include <fsl-mc/fsl_dprc.h>
  12. int dprc_get_container_id(struct fsl_mc_io *mc_io,
  13. uint32_t cmd_flags,
  14. int *container_id)
  15. {
  16. struct mc_command cmd = { 0 };
  17. int err;
  18. /* prepare command */
  19. cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_CONT_ID,
  20. cmd_flags,
  21. 0);
  22. /* send command to mc*/
  23. err = mc_send_command(mc_io, &cmd);
  24. if (err)
  25. return err;
  26. /* retrieve response parameters */
  27. DPRC_RSP_GET_CONTAINER_ID(cmd, *container_id);
  28. return 0;
  29. }
  30. int dprc_open(struct fsl_mc_io *mc_io,
  31. uint32_t cmd_flags,
  32. int container_id,
  33. uint16_t *token)
  34. {
  35. struct mc_command cmd = { 0 };
  36. int err;
  37. /* prepare command */
  38. cmd.header = mc_encode_cmd_header(DPRC_CMDID_OPEN, cmd_flags,
  39. 0);
  40. DPRC_CMD_OPEN(cmd, container_id);
  41. /* send command to mc*/
  42. err = mc_send_command(mc_io, &cmd);
  43. if (err)
  44. return err;
  45. /* retrieve response parameters */
  46. *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
  47. return 0;
  48. }
  49. int dprc_close(struct fsl_mc_io *mc_io,
  50. uint32_t cmd_flags,
  51. uint16_t token)
  52. {
  53. struct mc_command cmd = { 0 };
  54. /* prepare command */
  55. cmd.header = mc_encode_cmd_header(DPRC_CMDID_CLOSE, cmd_flags,
  56. token);
  57. /* send command to mc*/
  58. return mc_send_command(mc_io, &cmd);
  59. }
  60. int dprc_create_container(struct fsl_mc_io *mc_io,
  61. uint32_t cmd_flags,
  62. uint16_t token,
  63. struct dprc_cfg *cfg,
  64. int *child_container_id,
  65. uint64_t *child_portal_paddr)
  66. {
  67. struct mc_command cmd = { 0 };
  68. int err;
  69. /* prepare command */
  70. DPRC_CMD_CREATE_CONTAINER(cmd, cfg);
  71. cmd.header = mc_encode_cmd_header(DPRC_CMDID_CREATE_CONT,
  72. cmd_flags,
  73. token);
  74. /* send command to mc*/
  75. err = mc_send_command(mc_io, &cmd);
  76. if (err)
  77. return err;
  78. /* retrieve response parameters */
  79. DPRC_RSP_CREATE_CONTAINER(cmd, *child_container_id,
  80. *child_portal_paddr);
  81. return 0;
  82. }
  83. int dprc_destroy_container(struct fsl_mc_io *mc_io,
  84. uint32_t cmd_flags,
  85. uint16_t token,
  86. int child_container_id)
  87. {
  88. struct mc_command cmd = { 0 };
  89. /* prepare command */
  90. cmd.header = mc_encode_cmd_header(DPRC_CMDID_DESTROY_CONT,
  91. cmd_flags,
  92. token);
  93. DPRC_CMD_DESTROY_CONTAINER(cmd, child_container_id);
  94. /* send command to mc*/
  95. return mc_send_command(mc_io, &cmd);
  96. }
  97. int dprc_reset_container(struct fsl_mc_io *mc_io,
  98. uint32_t cmd_flags,
  99. uint16_t token,
  100. int child_container_id)
  101. {
  102. struct mc_command cmd = { 0 };
  103. /* prepare command */
  104. cmd.header = mc_encode_cmd_header(DPRC_CMDID_RESET_CONT,
  105. cmd_flags,
  106. token);
  107. DPRC_CMD_RESET_CONTAINER(cmd, child_container_id);
  108. /* send command to mc*/
  109. return mc_send_command(mc_io, &cmd);
  110. }
  111. int dprc_get_attributes(struct fsl_mc_io *mc_io,
  112. uint32_t cmd_flags,
  113. uint16_t token,
  114. struct dprc_attributes *attr)
  115. {
  116. struct mc_command cmd = { 0 };
  117. int err;
  118. /* prepare command */
  119. cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_ATTR,
  120. cmd_flags,
  121. token);
  122. /* send command to mc*/
  123. err = mc_send_command(mc_io, &cmd);
  124. if (err)
  125. return err;
  126. /* retrieve response parameters */
  127. DPRC_RSP_GET_ATTRIBUTES(cmd, attr);
  128. return 0;
  129. }
  130. int dprc_get_obj_count(struct fsl_mc_io *mc_io,
  131. uint32_t cmd_flags,
  132. uint16_t token,
  133. int *obj_count)
  134. {
  135. struct mc_command cmd = { 0 };
  136. int err;
  137. /* prepare command */
  138. cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_COUNT,
  139. cmd_flags,
  140. token);
  141. /* send command to mc*/
  142. err = mc_send_command(mc_io, &cmd);
  143. if (err)
  144. return err;
  145. /* retrieve response parameters */
  146. DPRC_RSP_GET_OBJ_COUNT(cmd, *obj_count);
  147. return 0;
  148. }
  149. int dprc_get_obj(struct fsl_mc_io *mc_io,
  150. uint32_t cmd_flags,
  151. uint16_t token,
  152. int obj_index,
  153. struct dprc_obj_desc *obj_desc)
  154. {
  155. struct mc_command cmd = { 0 };
  156. int err;
  157. /* prepare command */
  158. cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ,
  159. cmd_flags,
  160. token);
  161. DPRC_CMD_GET_OBJ(cmd, obj_index);
  162. /* send command to mc*/
  163. err = mc_send_command(mc_io, &cmd);
  164. if (err)
  165. return err;
  166. /* retrieve response parameters */
  167. DPRC_RSP_GET_OBJ(cmd, obj_desc);
  168. return 0;
  169. }
  170. int dprc_get_res_count(struct fsl_mc_io *mc_io,
  171. uint32_t cmd_flags,
  172. uint16_t token,
  173. char *type,
  174. int *res_count)
  175. {
  176. struct mc_command cmd = { 0 };
  177. int err;
  178. *res_count = 0;
  179. /* prepare command */
  180. cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_RES_COUNT,
  181. cmd_flags,
  182. token);
  183. DPRC_CMD_GET_RES_COUNT(cmd, type);
  184. /* send command to mc*/
  185. err = mc_send_command(mc_io, &cmd);
  186. if (err)
  187. return err;
  188. /* retrieve response parameters */
  189. DPRC_RSP_GET_RES_COUNT(cmd, *res_count);
  190. return 0;
  191. }
  192. int dprc_get_res_ids(struct fsl_mc_io *mc_io,
  193. uint32_t cmd_flags,
  194. uint16_t token,
  195. char *type,
  196. struct dprc_res_ids_range_desc *range_desc)
  197. {
  198. struct mc_command cmd = { 0 };
  199. int err;
  200. /* prepare command */
  201. cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_RES_IDS,
  202. cmd_flags,
  203. token);
  204. DPRC_CMD_GET_RES_IDS(cmd, range_desc, type);
  205. /* send command to mc*/
  206. err = mc_send_command(mc_io, &cmd);
  207. if (err)
  208. return err;
  209. /* retrieve response parameters */
  210. DPRC_RSP_GET_RES_IDS(cmd, range_desc);
  211. return 0;
  212. }
  213. int dprc_get_obj_region(struct fsl_mc_io *mc_io,
  214. uint32_t cmd_flags,
  215. uint16_t token,
  216. char *obj_type,
  217. int obj_id,
  218. uint8_t region_index,
  219. struct dprc_region_desc *region_desc)
  220. {
  221. struct mc_command cmd = { 0 };
  222. int err;
  223. /* prepare command */
  224. cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_REG,
  225. cmd_flags,
  226. token);
  227. DPRC_CMD_GET_OBJ_REGION(cmd, obj_type, obj_id, region_index);
  228. /* send command to mc*/
  229. err = mc_send_command(mc_io, &cmd);
  230. if (err)
  231. return err;
  232. /* retrieve response parameters */
  233. DPRC_RSP_GET_OBJ_REGION(cmd, region_desc);
  234. return 0;
  235. }
  236. int dprc_connect(struct fsl_mc_io *mc_io,
  237. uint32_t cmd_flags,
  238. uint16_t token,
  239. const struct dprc_endpoint *endpoint1,
  240. const struct dprc_endpoint *endpoint2,
  241. const struct dprc_connection_cfg *cfg)
  242. {
  243. struct mc_command cmd = { 0 };
  244. /* prepare command */
  245. cmd.header = mc_encode_cmd_header(DPRC_CMDID_CONNECT,
  246. cmd_flags,
  247. token);
  248. DPRC_CMD_CONNECT(cmd, endpoint1, endpoint2, cfg);
  249. /* send command to mc*/
  250. return mc_send_command(mc_io, &cmd);
  251. }
  252. int dprc_disconnect(struct fsl_mc_io *mc_io,
  253. uint32_t cmd_flags,
  254. uint16_t token,
  255. const struct dprc_endpoint *endpoint)
  256. {
  257. struct mc_command cmd = { 0 };
  258. /* prepare command */
  259. cmd.header = mc_encode_cmd_header(DPRC_CMDID_DISCONNECT,
  260. cmd_flags,
  261. token);
  262. DPRC_CMD_DISCONNECT(cmd, endpoint);
  263. /* send command to mc*/
  264. return mc_send_command(mc_io, &cmd);
  265. }
  266. int dprc_get_connection(struct fsl_mc_io *mc_io,
  267. uint32_t cmd_flags,
  268. uint16_t token,
  269. const struct dprc_endpoint *endpoint1,
  270. struct dprc_endpoint *endpoint2,
  271. int *state)
  272. {
  273. struct mc_command cmd = { 0 };
  274. int err;
  275. /* prepare command */
  276. cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_CONNECTION,
  277. cmd_flags,
  278. token);
  279. DPRC_CMD_GET_CONNECTION(cmd, endpoint1);
  280. /* send command to mc*/
  281. err = mc_send_command(mc_io, &cmd);
  282. if (err)
  283. return err;
  284. /* retrieve response parameters */
  285. DPRC_RSP_GET_CONNECTION(cmd, endpoint2, *state);
  286. return 0;
  287. }