dprc.c 7.7 KB

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