scu_api.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright 2018 NXP
  4. *
  5. * Peng Fan <peng.fan@nxp.com>
  6. */
  7. #include <common.h>
  8. #include <hang.h>
  9. #include <malloc.h>
  10. #include <asm/global_data.h>
  11. #include <asm/io.h>
  12. #include <dm.h>
  13. #include <firmware/imx/sci/sci.h>
  14. #include <misc.h>
  15. DECLARE_GLOBAL_DATA_PTR;
  16. #define B2U8(X) (((X) != SC_FALSE) ? (u8)(0x01U) : (u8)(0x00U))
  17. /* CLK and PM */
  18. int sc_pm_set_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk,
  19. sc_pm_clock_rate_t *rate)
  20. {
  21. struct udevice *dev = gd->arch.scu_dev;
  22. int size = sizeof(struct sc_rpc_msg_s);
  23. struct sc_rpc_msg_s msg;
  24. int ret;
  25. RPC_VER(&msg) = SC_RPC_VERSION;
  26. RPC_SVC(&msg) = (u8)SC_RPC_SVC_PM;
  27. RPC_FUNC(&msg) = (u8)PM_FUNC_SET_CLOCK_RATE;
  28. RPC_U32(&msg, 0U) = *(u32 *)rate;
  29. RPC_U16(&msg, 4U) = (u16)resource;
  30. RPC_U8(&msg, 6U) = (u8)clk;
  31. RPC_SIZE(&msg) = 3U;
  32. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  33. if (ret)
  34. printf("%s: rate:%u resource:%u: clk:%u res:%d\n",
  35. __func__, *rate, resource, clk, RPC_R8(&msg));
  36. *rate = RPC_U32(&msg, 0U);
  37. return ret;
  38. }
  39. int sc_pm_get_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk,
  40. sc_pm_clock_rate_t *rate)
  41. {
  42. struct udevice *dev = gd->arch.scu_dev;
  43. int size = sizeof(struct sc_rpc_msg_s);
  44. struct sc_rpc_msg_s msg;
  45. int ret;
  46. RPC_VER(&msg) = SC_RPC_VERSION;
  47. RPC_SVC(&msg) = (u8)SC_RPC_SVC_PM;
  48. RPC_FUNC(&msg) = (u8)PM_FUNC_GET_CLOCK_RATE;
  49. RPC_U16(&msg, 0U) = (u16)resource;
  50. RPC_U8(&msg, 2U) = (u8)clk;
  51. RPC_SIZE(&msg) = 2U;
  52. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  53. if (ret) {
  54. printf("%s: resource:%d clk:%d: res:%d\n",
  55. __func__, resource, clk, RPC_R8(&msg));
  56. return ret;
  57. }
  58. if (rate)
  59. *rate = RPC_U32(&msg, 0U);
  60. return 0;
  61. }
  62. int sc_pm_clock_enable(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk,
  63. sc_bool_t enable, sc_bool_t autog)
  64. {
  65. struct udevice *dev = gd->arch.scu_dev;
  66. int size = sizeof(struct sc_rpc_msg_s);
  67. struct sc_rpc_msg_s msg;
  68. int ret;
  69. RPC_VER(&msg) = SC_RPC_VERSION;
  70. RPC_SVC(&msg) = (u8)SC_RPC_SVC_PM;
  71. RPC_FUNC(&msg) = (u8)PM_FUNC_CLOCK_ENABLE;
  72. RPC_U16(&msg, 0U) = (u16)resource;
  73. RPC_U8(&msg, 2U) = (u8)clk;
  74. RPC_U8(&msg, 3U) = (u8)enable;
  75. RPC_U8(&msg, 4U) = (u8)autog;
  76. RPC_SIZE(&msg) = 3U;
  77. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  78. if (ret)
  79. printf("%s: resource:%d clk:%d: enable:%d autog: %d, res:%d\n",
  80. __func__, resource, clk, enable, autog, RPC_R8(&msg));
  81. return ret;
  82. }
  83. int sc_pm_set_clock_parent(sc_ipc_t ipc, sc_rsrc_t resource,
  84. sc_pm_clk_t clk, sc_pm_clk_parent_t parent)
  85. {
  86. struct udevice *dev = gd->arch.scu_dev;
  87. int size = sizeof(struct sc_rpc_msg_s);
  88. struct sc_rpc_msg_s msg;
  89. int ret;
  90. RPC_VER(&msg) = SC_RPC_VERSION;
  91. RPC_SVC(&msg) = (u8)SC_RPC_SVC_PM;
  92. RPC_FUNC(&msg) = (u8)PM_FUNC_SET_CLOCK_PARENT;
  93. RPC_U16(&msg, 0U) = (u16)resource;
  94. RPC_U8(&msg, 2U) = (u8)clk;
  95. RPC_U8(&msg, 3U) = (u8)parent;
  96. RPC_SIZE(&msg) = 2U;
  97. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  98. if (ret)
  99. printf("%s: resource:%d clk:%d: parent clk: %d, res:%d\n",
  100. __func__, resource, clk, parent, RPC_R8(&msg));
  101. return ret;
  102. }
  103. int sc_pm_set_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource,
  104. sc_pm_power_mode_t mode)
  105. {
  106. struct udevice *dev = gd->arch.scu_dev;
  107. int size = sizeof(struct sc_rpc_msg_s);
  108. struct sc_rpc_msg_s msg;
  109. int ret;
  110. if (!dev)
  111. hang();
  112. RPC_VER(&msg) = SC_RPC_VERSION;
  113. RPC_SVC(&msg) = (u8)SC_RPC_SVC_PM;
  114. RPC_FUNC(&msg) = (u8)PM_FUNC_SET_RESOURCE_POWER_MODE;
  115. RPC_U16(&msg, 0U) = (u16)resource;
  116. RPC_U8(&msg, 2U) = (u8)mode;
  117. RPC_SIZE(&msg) = 2U;
  118. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  119. if (ret)
  120. printf("%s: resource:%d mode:%d: res:%d\n",
  121. __func__, resource, mode, RPC_R8(&msg));
  122. return ret;
  123. }
  124. sc_bool_t sc_pm_is_partition_started(sc_ipc_t ipc, sc_rm_pt_t pt)
  125. {
  126. struct udevice *dev = gd->arch.scu_dev;
  127. int size = sizeof(struct sc_rpc_msg_s);
  128. struct sc_rpc_msg_s msg;
  129. int ret;
  130. u8 result;
  131. RPC_VER(&msg) = SC_RPC_VERSION;
  132. RPC_SVC(&msg) = (u8)(SC_RPC_SVC_PM);
  133. RPC_FUNC(&msg) = (u8)(PM_FUNC_IS_PARTITION_STARTED);
  134. RPC_U8(&msg, 0U) = (u8)(pt);
  135. RPC_SIZE(&msg) = 2U;
  136. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  137. result = RPC_R8(&msg);
  138. if (result != 0 && result != 1) {
  139. printf("%s: partition:%d res:%d\n",
  140. __func__, pt, RPC_R8(&msg));
  141. if (ret)
  142. printf("%s: partition:%d res:%d\n", __func__, pt,
  143. RPC_R8(&msg));
  144. }
  145. return !!result;
  146. }
  147. int sc_pm_resource_reset(sc_ipc_t ipc, sc_rsrc_t resource)
  148. {
  149. struct udevice *dev = gd->arch.scu_dev;
  150. int size = sizeof(struct sc_rpc_msg_s);
  151. struct sc_rpc_msg_s msg;
  152. int ret;
  153. RPC_VER(&msg) = SC_RPC_VERSION;
  154. RPC_SIZE(&msg) = 2U;
  155. RPC_SVC(&msg) = (u8)(SC_RPC_SVC_PM);
  156. RPC_FUNC(&msg) = (u8)(PM_FUNC_RESOURCE_RESET);
  157. RPC_U16(&msg, 0U) = (u16)(resource);
  158. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  159. if (ret)
  160. printf("%s: resource:%d res:%d\n",
  161. __func__, resource, RPC_R8(&msg));
  162. return ret;
  163. }
  164. /* PAD */
  165. int sc_pad_set(sc_ipc_t ipc, sc_pad_t pad, u32 val)
  166. {
  167. struct udevice *dev = gd->arch.scu_dev;
  168. int size = sizeof(struct sc_rpc_msg_s);
  169. struct sc_rpc_msg_s msg;
  170. int ret;
  171. if (!dev)
  172. hang();
  173. RPC_VER(&msg) = SC_RPC_VERSION;
  174. RPC_SVC(&msg) = (u8)SC_RPC_SVC_PAD;
  175. RPC_FUNC(&msg) = (u8)PAD_FUNC_SET;
  176. RPC_U32(&msg, 0U) = (u32)val;
  177. RPC_U16(&msg, 4U) = (u16)pad;
  178. RPC_SIZE(&msg) = 3U;
  179. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  180. if (ret)
  181. printf("%s: val:%d pad:%d: res:%d\n",
  182. __func__, val, pad, RPC_R8(&msg));
  183. return ret;
  184. }
  185. int sc_pad_get(sc_ipc_t ipc, sc_pad_t pad, u32 *val)
  186. {
  187. struct udevice *dev = gd->arch.scu_dev;
  188. int size = sizeof(struct sc_rpc_msg_s);
  189. struct sc_rpc_msg_s msg;
  190. int ret;
  191. if (!dev)
  192. hang();
  193. RPC_VER(&msg) = SC_RPC_VERSION;
  194. RPC_SIZE(&msg) = 2U;
  195. RPC_SVC(&msg) = (u8)(SC_RPC_SVC_PAD);
  196. RPC_FUNC(&msg) = (u8)(PAD_FUNC_GET);
  197. RPC_U16(&msg, 0U) = (u16)(pad);
  198. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  199. if (ret)
  200. printf("%s: pad:%d: res:%d\n",
  201. __func__, pad, RPC_R8(&msg));
  202. if (val)
  203. *val = (u32)RPC_U32(&msg, 0U);
  204. return ret;
  205. }
  206. /* MISC */
  207. int sc_misc_set_control(sc_ipc_t ipc, sc_rsrc_t resource,
  208. sc_ctrl_t ctrl, u32 val)
  209. {
  210. struct udevice *dev = gd->arch.scu_dev;
  211. int size = sizeof(struct sc_rpc_msg_s);
  212. struct sc_rpc_msg_s msg;
  213. int ret;
  214. if (!dev)
  215. hang();
  216. RPC_VER(&msg) = SC_RPC_VERSION;
  217. RPC_SVC(&msg) = (u8)SC_RPC_SVC_MISC;
  218. RPC_FUNC(&msg) = (u8)MISC_FUNC_SET_CONTROL;
  219. RPC_U32(&msg, 0U) = (u32)ctrl;
  220. RPC_U32(&msg, 4U) = (u32)val;
  221. RPC_U16(&msg, 8U) = (u16)resource;
  222. RPC_SIZE(&msg) = 4U;
  223. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  224. if (ret)
  225. printf("%s: ctrl:%d resource:%d: res:%d\n",
  226. __func__, ctrl, resource, RPC_R8(&msg));
  227. return ret;
  228. }
  229. int sc_misc_get_control(sc_ipc_t ipc, sc_rsrc_t resource, sc_ctrl_t ctrl,
  230. u32 *val)
  231. {
  232. struct udevice *dev = gd->arch.scu_dev;
  233. int size = sizeof(struct sc_rpc_msg_s);
  234. struct sc_rpc_msg_s msg;
  235. int ret;
  236. if (!dev)
  237. hang();
  238. RPC_VER(&msg) = SC_RPC_VERSION;
  239. RPC_SVC(&msg) = (u8)SC_RPC_SVC_MISC;
  240. RPC_FUNC(&msg) = (u8)MISC_FUNC_GET_CONTROL;
  241. RPC_U32(&msg, 0U) = (u32)ctrl;
  242. RPC_U16(&msg, 4U) = (u16)resource;
  243. RPC_SIZE(&msg) = 3U;
  244. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  245. if (ret)
  246. printf("%s: ctrl:%d resource:%d: res:%d\n",
  247. __func__, ctrl, resource, RPC_R8(&msg));
  248. if (val)
  249. *val = RPC_U32(&msg, 0U);
  250. return ret;
  251. }
  252. int sc_rm_set_master_sid(sc_ipc_t ipc, sc_rsrc_t resource, sc_rm_sid_t sid)
  253. {
  254. struct udevice *dev = gd->arch.scu_dev;
  255. struct sc_rpc_msg_s msg;
  256. int size = sizeof(struct sc_rpc_msg_s);
  257. int ret;
  258. RPC_VER(&msg) = SC_RPC_VERSION;
  259. RPC_SVC(&msg) = (u8)SC_RPC_SVC_RM;
  260. RPC_FUNC(&msg) = (u8)RM_FUNC_SET_MASTER_SID;
  261. RPC_U16(&msg, 0U) = (u16)resource;
  262. RPC_U16(&msg, 2U) = (u16)sid;
  263. RPC_SIZE(&msg) = 2U;
  264. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  265. if (ret)
  266. printf("%s: resource:%d sid:%d: res:%d\n",
  267. __func__, resource, sid, RPC_R8(&msg));
  268. return ret;
  269. }
  270. void sc_misc_get_boot_dev(sc_ipc_t ipc, sc_rsrc_t *boot_dev)
  271. {
  272. struct udevice *dev = gd->arch.scu_dev;
  273. int size = sizeof(struct sc_rpc_msg_s);
  274. struct sc_rpc_msg_s msg;
  275. int ret;
  276. if (!dev)
  277. hang();
  278. RPC_VER(&msg) = SC_RPC_VERSION;
  279. RPC_SVC(&msg) = (u8)SC_RPC_SVC_MISC;
  280. RPC_FUNC(&msg) = (u8)MISC_FUNC_GET_BOOT_DEV;
  281. RPC_SIZE(&msg) = 1U;
  282. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  283. if (ret)
  284. printf("%s: res:%d\n", __func__, RPC_R8(&msg));
  285. if (boot_dev)
  286. *boot_dev = RPC_U16(&msg, 0U);
  287. }
  288. void sc_misc_boot_status(sc_ipc_t ipc, sc_misc_boot_status_t status)
  289. {
  290. struct udevice *dev = gd->arch.scu_dev;
  291. int size = sizeof(struct sc_rpc_msg_s);
  292. struct sc_rpc_msg_s msg;
  293. int ret;
  294. if (!dev)
  295. hang();
  296. RPC_VER(&msg) = SC_RPC_VERSION;
  297. RPC_SVC(&msg) = (u8)SC_RPC_SVC_MISC;
  298. RPC_FUNC(&msg) = (u8)MISC_FUNC_BOOT_STATUS;
  299. RPC_U8(&msg, 0U) = (u8)status;
  300. RPC_SIZE(&msg) = 2U;
  301. ret = misc_call(dev, SC_TRUE, &msg, size, &msg, size);
  302. if (ret)
  303. printf("%s: status:%d res:%d\n",
  304. __func__, status, RPC_R8(&msg));
  305. }
  306. int sc_misc_get_boot_container(sc_ipc_t ipc, u8 *idx)
  307. {
  308. struct udevice *dev = gd->arch.scu_dev;
  309. int size = sizeof(struct sc_rpc_msg_s);
  310. struct sc_rpc_msg_s msg;
  311. int ret;
  312. if (!dev)
  313. hang();
  314. RPC_VER(&msg) = SC_RPC_VERSION;
  315. RPC_SIZE(&msg) = 1U;
  316. RPC_SVC(&msg) = (u8)SC_RPC_SVC_MISC;
  317. RPC_FUNC(&msg) = (u8)MISC_FUNC_GET_BOOT_CONTAINER;
  318. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  319. if (ret < 0)
  320. return ret;
  321. if (idx)
  322. *idx = (u8)RPC_U8(&msg, 0U);
  323. return 0;
  324. }
  325. void sc_misc_build_info(sc_ipc_t ipc, u32 *build, u32 *commit)
  326. {
  327. struct udevice *dev = gd->arch.scu_dev;
  328. int size = sizeof(struct sc_rpc_msg_s);
  329. struct sc_rpc_msg_s msg;
  330. int ret;
  331. if (!dev)
  332. hang();
  333. RPC_VER(&msg) = SC_RPC_VERSION;
  334. RPC_SVC(&msg) = SC_RPC_SVC_MISC;
  335. RPC_FUNC(&msg) = MISC_FUNC_BUILD_INFO;
  336. RPC_SIZE(&msg) = 1;
  337. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  338. if (ret < 0) {
  339. printf("%s: err: %d\n", __func__, ret);
  340. return;
  341. }
  342. if (build)
  343. *build = RPC_U32(&msg, 0);
  344. if (commit)
  345. *commit = RPC_U32(&msg, 4);
  346. }
  347. int sc_misc_otp_fuse_read(sc_ipc_t ipc, u32 word, u32 *val)
  348. {
  349. struct udevice *dev = gd->arch.scu_dev;
  350. int size = sizeof(struct sc_rpc_msg_s);
  351. struct sc_rpc_msg_s msg;
  352. int ret;
  353. if (!dev)
  354. hang();
  355. RPC_VER(&msg) = SC_RPC_VERSION;
  356. RPC_SVC(&msg) = SC_RPC_SVC_MISC;
  357. RPC_FUNC(&msg) = MISC_FUNC_OTP_FUSE_READ;
  358. RPC_U32(&msg, 0) = word;
  359. RPC_SIZE(&msg) = 2;
  360. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  361. if (ret < 0)
  362. return ret;
  363. if (val)
  364. *val = RPC_U32(&msg, 0U);
  365. return 0;
  366. }
  367. int sc_misc_get_temp(sc_ipc_t ipc, sc_rsrc_t resource, sc_misc_temp_t temp,
  368. s16 *celsius, s8 *tenths)
  369. {
  370. struct udevice *dev = gd->arch.scu_dev;
  371. int size = sizeof(struct sc_rpc_msg_s);
  372. struct sc_rpc_msg_s msg;
  373. int ret;
  374. RPC_VER(&msg) = SC_RPC_VERSION;
  375. RPC_SVC(&msg) = (u8)SC_RPC_SVC_MISC;
  376. RPC_FUNC(&msg) = (u8)MISC_FUNC_GET_TEMP;
  377. RPC_U16(&msg, 0U) = (u16)resource;
  378. RPC_U8(&msg, 2U) = (u8)temp;
  379. RPC_SIZE(&msg) = 2U;
  380. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  381. if (ret < 0)
  382. return ret;
  383. if (celsius)
  384. *celsius = RPC_I16(&msg, 0U);
  385. if (tenths)
  386. *tenths = RPC_I8(&msg, 2U);
  387. return 0;
  388. }
  389. void sc_misc_get_button_status(sc_ipc_t ipc, sc_bool_t *status)
  390. {
  391. struct sc_rpc_msg_s msg;
  392. struct udevice *dev = gd->arch.scu_dev;
  393. RPC_VER(&msg) = SC_RPC_VERSION;
  394. RPC_SIZE(&msg) = 1U;
  395. RPC_SVC(&msg) = (u8)(SC_RPC_SVC_MISC);
  396. RPC_FUNC(&msg) = (u8)(MISC_FUNC_GET_BUTTON_STATUS);
  397. misc_call(dev, SC_FALSE, &msg, 1U, &msg, 1U);
  398. if (status)
  399. *status = (sc_bool_t)(!!(RPC_U8(&msg, 0U)));
  400. }
  401. /* RM */
  402. sc_bool_t sc_rm_is_memreg_owned(sc_ipc_t ipc, sc_rm_mr_t mr)
  403. {
  404. struct udevice *dev = gd->arch.scu_dev;
  405. int size = sizeof(struct sc_rpc_msg_s);
  406. struct sc_rpc_msg_s msg;
  407. int ret;
  408. sc_err_t result;
  409. if (!dev)
  410. hang();
  411. RPC_VER(&msg) = SC_RPC_VERSION;
  412. RPC_SVC(&msg) = (u8)SC_RPC_SVC_RM;
  413. RPC_FUNC(&msg) = (u8)RM_FUNC_IS_MEMREG_OWNED;
  414. RPC_U8(&msg, 0U) = (u8)mr;
  415. RPC_SIZE(&msg) = 2U;
  416. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  417. result = RPC_R8(&msg);
  418. if (result != 0 && result != 1) {
  419. printf("%s: mr:%d res:%d\n", __func__, mr, RPC_R8(&msg));
  420. if (ret)
  421. printf("%s: mr:%d res:%d\n", __func__, mr,
  422. RPC_R8(&msg));
  423. }
  424. return (sc_bool_t)result;
  425. }
  426. int sc_rm_find_memreg(sc_ipc_t ipc, sc_rm_mr_t *mr, sc_faddr_t addr_start,
  427. sc_faddr_t addr_end)
  428. {
  429. struct udevice *dev = gd->arch.scu_dev;
  430. int size = sizeof(struct sc_rpc_msg_s);
  431. struct sc_rpc_msg_s msg;
  432. int ret;
  433. if (!dev)
  434. hang();
  435. RPC_VER(&msg) = SC_RPC_VERSION;
  436. RPC_SVC(&msg) = (u8)(SC_RPC_SVC_RM);
  437. RPC_FUNC(&msg) = (u8)(RM_FUNC_FIND_MEMREG);
  438. RPC_U32(&msg, 0U) = (u32)(addr_start >> 32ULL);
  439. RPC_U32(&msg, 4U) = (u32)(addr_start);
  440. RPC_U32(&msg, 8U) = (u32)(addr_end >> 32ULL);
  441. RPC_U32(&msg, 12U) = (u32)(addr_end);
  442. RPC_SIZE(&msg) = 5U;
  443. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  444. if (ret)
  445. printf("%s: start:0x%llx, end:0x%llx res:%d\n", __func__, addr_start, addr_end, RPC_R8(&msg));
  446. if (mr)
  447. *mr = RPC_U8(&msg, 0U);
  448. return ret;
  449. }
  450. int sc_rm_set_memreg_permissions(sc_ipc_t ipc, sc_rm_mr_t mr,
  451. sc_rm_pt_t pt, sc_rm_perm_t perm)
  452. {
  453. struct udevice *dev = gd->arch.scu_dev;
  454. int size = sizeof(struct sc_rpc_msg_s);
  455. struct sc_rpc_msg_s msg;
  456. int ret;
  457. if (!dev)
  458. hang();
  459. RPC_VER(&msg) = SC_RPC_VERSION;
  460. RPC_SVC(&msg) = (u8)(SC_RPC_SVC_RM);
  461. RPC_FUNC(&msg) = (u8)(RM_FUNC_SET_MEMREG_PERMISSIONS);
  462. RPC_U8(&msg, 0U) = (u8)(mr);
  463. RPC_U8(&msg, 1U) = (u8)(pt);
  464. RPC_U8(&msg, 2U) = (u8)(perm);
  465. RPC_SIZE(&msg) = 2U;
  466. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  467. if (ret) {
  468. printf("%s: mr:%u, pt:%u, perm:%u, res:%d\n", __func__,
  469. mr, pt, perm, RPC_R8(&msg));
  470. }
  471. return ret;
  472. }
  473. int sc_rm_get_memreg_info(sc_ipc_t ipc, sc_rm_mr_t mr, sc_faddr_t *addr_start,
  474. sc_faddr_t *addr_end)
  475. {
  476. struct udevice *dev = gd->arch.scu_dev;
  477. int size = sizeof(struct sc_rpc_msg_s);
  478. struct sc_rpc_msg_s msg;
  479. int ret;
  480. if (!dev)
  481. hang();
  482. RPC_VER(&msg) = SC_RPC_VERSION;
  483. RPC_SVC(&msg) = (u8)SC_RPC_SVC_RM;
  484. RPC_FUNC(&msg) = (u8)RM_FUNC_GET_MEMREG_INFO;
  485. RPC_U8(&msg, 0U) = (u8)mr;
  486. RPC_SIZE(&msg) = 2U;
  487. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  488. if (ret)
  489. printf("%s: mr:%d res:%d\n", __func__, mr, RPC_R8(&msg));
  490. if (addr_start)
  491. *addr_start = ((u64)RPC_U32(&msg, 0U) << 32U) |
  492. RPC_U32(&msg, 4U);
  493. if (addr_end)
  494. *addr_end = ((u64)RPC_U32(&msg, 8U) << 32U) |
  495. RPC_U32(&msg, 12U);
  496. return ret;
  497. }
  498. sc_bool_t sc_rm_is_resource_owned(sc_ipc_t ipc, sc_rsrc_t resource)
  499. {
  500. struct udevice *dev = gd->arch.scu_dev;
  501. int size = sizeof(struct sc_rpc_msg_s);
  502. struct sc_rpc_msg_s msg;
  503. int ret;
  504. u8 result;
  505. if (!dev)
  506. hang();
  507. RPC_VER(&msg) = SC_RPC_VERSION;
  508. RPC_SVC(&msg) = (u8)SC_RPC_SVC_RM;
  509. RPC_FUNC(&msg) = (u8)RM_FUNC_IS_RESOURCE_OWNED;
  510. RPC_U16(&msg, 0U) = (u16)resource;
  511. RPC_SIZE(&msg) = 2U;
  512. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  513. result = RPC_R8(&msg);
  514. if (result != 0 && result != 1) {
  515. printf("%s: resource:%d res:%d\n",
  516. __func__, resource, RPC_R8(&msg));
  517. if (ret)
  518. printf("%s: res:%d res:%d\n", __func__, resource,
  519. RPC_R8(&msg));
  520. }
  521. return !!result;
  522. }
  523. int sc_rm_partition_alloc(sc_ipc_t ipc, sc_rm_pt_t *pt, sc_bool_t secure,
  524. sc_bool_t isolated, sc_bool_t restricted,
  525. sc_bool_t grant, sc_bool_t coherent)
  526. {
  527. struct udevice *dev = gd->arch.scu_dev;
  528. struct sc_rpc_msg_s msg;
  529. int size = sizeof(struct sc_rpc_msg_s);
  530. int ret;
  531. RPC_VER(&msg) = SC_RPC_VERSION;
  532. RPC_SVC(&msg) = (u8)SC_RPC_SVC_RM;
  533. RPC_FUNC(&msg) = (u8)RM_FUNC_PARTITION_ALLOC;
  534. RPC_U8(&msg, 0U) = B2U8(secure);
  535. RPC_U8(&msg, 1U) = B2U8(isolated);
  536. RPC_U8(&msg, 2U) = B2U8(restricted);
  537. RPC_U8(&msg, 3U) = B2U8(grant);
  538. RPC_U8(&msg, 4U) = B2U8(coherent);
  539. RPC_SIZE(&msg) = 3U;
  540. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  541. if (ret) {
  542. printf("%s: secure:%u isolated:%u restricted:%u grant:%u coherent:%u res:%d\n",
  543. __func__, secure, isolated, restricted, grant, coherent,
  544. RPC_R8(&msg));
  545. }
  546. if (pt)
  547. *pt = RPC_U8(&msg, 0U);
  548. return ret;
  549. }
  550. int sc_rm_partition_free(sc_ipc_t ipc, sc_rm_pt_t pt)
  551. {
  552. struct udevice *dev = gd->arch.scu_dev;
  553. struct sc_rpc_msg_s msg;
  554. int size = sizeof(struct sc_rpc_msg_s);
  555. int ret;
  556. RPC_VER(&msg) = SC_RPC_VERSION;
  557. RPC_SVC(&msg) = (u8)SC_RPC_SVC_RM;
  558. RPC_FUNC(&msg) = (u8)RM_FUNC_PARTITION_FREE;
  559. RPC_U8(&msg, 0U) = (u8)pt;
  560. RPC_SIZE(&msg) = 2U;
  561. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  562. if (ret) {
  563. printf("%s: pt:%u res:%d\n",
  564. __func__, pt, RPC_R8(&msg));
  565. }
  566. return ret;
  567. }
  568. int sc_rm_get_partition(sc_ipc_t ipc, sc_rm_pt_t *pt)
  569. {
  570. struct udevice *dev = gd->arch.scu_dev;
  571. struct sc_rpc_msg_s msg;
  572. int size = sizeof(struct sc_rpc_msg_s);
  573. int ret;
  574. RPC_VER(&msg) = SC_RPC_VERSION;
  575. RPC_SVC(&msg) = (u8)SC_RPC_SVC_RM;
  576. RPC_FUNC(&msg) = (u8)RM_FUNC_GET_PARTITION;
  577. RPC_SIZE(&msg) = 1U;
  578. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  579. if (ret)
  580. printf("%s: res:%d\n", __func__, RPC_R8(&msg));
  581. if (pt)
  582. *pt = RPC_U8(&msg, 0U);
  583. return ret;
  584. }
  585. int sc_rm_set_parent(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rm_pt_t pt_parent)
  586. {
  587. struct udevice *dev = gd->arch.scu_dev;
  588. struct sc_rpc_msg_s msg;
  589. int size = sizeof(struct sc_rpc_msg_s);
  590. int ret;
  591. RPC_VER(&msg) = SC_RPC_VERSION;
  592. RPC_SVC(&msg) = (u8)SC_RPC_SVC_RM;
  593. RPC_FUNC(&msg) = (u8)RM_FUNC_SET_PARENT;
  594. RPC_U8(&msg, 0U) = (u8)pt;
  595. RPC_U8(&msg, 1U) = (u8)pt_parent;
  596. RPC_SIZE(&msg) = 2U;
  597. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  598. if (ret) {
  599. printf("%s: pt:%u, pt_parent:%u, res:%d\n",
  600. __func__, pt, pt_parent, RPC_R8(&msg));
  601. }
  602. return ret;
  603. }
  604. int sc_rm_assign_resource(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rsrc_t resource)
  605. {
  606. struct udevice *dev = gd->arch.scu_dev;
  607. struct sc_rpc_msg_s msg;
  608. int size = sizeof(struct sc_rpc_msg_s);
  609. int ret;
  610. RPC_VER(&msg) = SC_RPC_VERSION;
  611. RPC_SVC(&msg) = (u8)SC_RPC_SVC_RM;
  612. RPC_FUNC(&msg) = (u8)RM_FUNC_ASSIGN_RESOURCE;
  613. RPC_U16(&msg, 0U) = (u16)resource;
  614. RPC_U8(&msg, 2U) = (u8)pt;
  615. RPC_SIZE(&msg) = 2U;
  616. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  617. if (ret) {
  618. printf("%s: pt:%u, resource:%u, res:%d\n",
  619. __func__, pt, resource, RPC_R8(&msg));
  620. }
  621. return ret;
  622. }
  623. int sc_rm_assign_pad(sc_ipc_t ipc, sc_rm_pt_t pt, sc_pad_t pad)
  624. {
  625. struct udevice *dev = gd->arch.scu_dev;
  626. struct sc_rpc_msg_s msg;
  627. int size = sizeof(struct sc_rpc_msg_s);
  628. int ret;
  629. RPC_VER(&msg) = SC_RPC_VERSION;
  630. RPC_SVC(&msg) = (u8)SC_RPC_SVC_RM;
  631. RPC_FUNC(&msg) = (u8)RM_FUNC_ASSIGN_PAD;
  632. RPC_U16(&msg, 0U) = (u16)pad;
  633. RPC_U8(&msg, 2U) = (u8)pt;
  634. RPC_SIZE(&msg) = 2U;
  635. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  636. if (ret) {
  637. printf("%s: pt:%u, pad:%u, res:%d\n",
  638. __func__, pt, pad, RPC_R8(&msg));
  639. }
  640. return ret;
  641. }
  642. sc_bool_t sc_rm_is_pad_owned(sc_ipc_t ipc, sc_pad_t pad)
  643. {
  644. struct udevice *dev = gd->arch.scu_dev;
  645. struct sc_rpc_msg_s msg;
  646. int size = sizeof(struct sc_rpc_msg_s);
  647. int ret;
  648. u8 result;
  649. RPC_VER(&msg) = SC_RPC_VERSION;
  650. RPC_SVC(&msg) = (u8)SC_RPC_SVC_RM;
  651. RPC_FUNC(&msg) = (u8)RM_FUNC_IS_PAD_OWNED;
  652. RPC_U16(&msg, 0U) = (u16)pad;
  653. RPC_SIZE(&msg) = 2U;
  654. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  655. result = RPC_R8(&msg);
  656. if (result != 0 && result != 1) {
  657. printf("%s: pad:%d res:%d\n", __func__, pad, RPC_R8(&msg));
  658. if (ret) {
  659. printf("%s: pad:%d res:%d\n", __func__,
  660. pad, RPC_R8(&msg));
  661. }
  662. }
  663. return !!result;
  664. }
  665. int sc_rm_get_resource_owner(sc_ipc_t ipc, sc_rsrc_t resource,
  666. sc_rm_pt_t *pt)
  667. {
  668. struct udevice *dev = gd->arch.scu_dev;
  669. struct sc_rpc_msg_s msg;
  670. int size = sizeof(struct sc_rpc_msg_s);
  671. int ret;
  672. RPC_VER(&msg) = SC_RPC_VERSION;
  673. RPC_SVC(&msg) = (u8)SC_RPC_SVC_RM;
  674. RPC_FUNC(&msg) = (u8)RM_FUNC_GET_RESOURCE_OWNER;
  675. RPC_U16(&msg, 0U) = (u16)resource;
  676. RPC_SIZE(&msg) = 2U;
  677. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  678. if (pt)
  679. *pt = RPC_U8(&msg, 0U);
  680. return ret;
  681. }
  682. int sc_pm_cpu_start(sc_ipc_t ipc, sc_rsrc_t resource, sc_bool_t enable,
  683. sc_faddr_t address)
  684. {
  685. struct udevice *dev = gd->arch.scu_dev;
  686. struct sc_rpc_msg_s msg;
  687. int size = sizeof(struct sc_rpc_msg_s);
  688. int ret;
  689. RPC_VER(&msg) = SC_RPC_VERSION;
  690. RPC_SVC(&msg) = (u8)SC_RPC_SVC_PM;
  691. RPC_FUNC(&msg) = (u8)PM_FUNC_CPU_START;
  692. RPC_U32(&msg, 0U) = (u32)(address >> 32ULL);
  693. RPC_U32(&msg, 4U) = (u32)address;
  694. RPC_U16(&msg, 8U) = (u16)resource;
  695. RPC_U8(&msg, 10U) = B2U8(enable);
  696. RPC_SIZE(&msg) = 4U;
  697. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  698. if (ret) {
  699. printf("%s: resource:%d address:0x%llx: res:%d\n",
  700. __func__, resource, address, RPC_R8(&msg));
  701. }
  702. return ret;
  703. }
  704. void sc_pm_reboot(sc_ipc_t ipc, sc_pm_reset_type_t type)
  705. {
  706. struct udevice *dev = gd->arch.scu_dev;
  707. struct sc_rpc_msg_s msg;
  708. int size = sizeof(struct sc_rpc_msg_s);
  709. RPC_VER(&msg) = SC_RPC_VERSION;
  710. RPC_SVC(&msg) = (u8)(SC_RPC_SVC_PM);
  711. RPC_FUNC(&msg) = (u8)(PM_FUNC_REBOOT);
  712. RPC_U8(&msg, 0U) = (u8)(type);
  713. RPC_SIZE(&msg) = 2U;
  714. misc_call(dev, SC_TRUE, &msg, size, &msg, size);
  715. }
  716. int sc_pm_get_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource,
  717. sc_pm_power_mode_t *mode)
  718. {
  719. struct udevice *dev = gd->arch.scu_dev;
  720. struct sc_rpc_msg_s msg;
  721. int size = sizeof(struct sc_rpc_msg_s);
  722. int ret;
  723. RPC_VER(&msg) = SC_RPC_VERSION;
  724. RPC_SVC(&msg) = (u8)SC_RPC_SVC_PM;
  725. RPC_FUNC(&msg) = (u8)PM_FUNC_GET_RESOURCE_POWER_MODE;
  726. RPC_U16(&msg, 0U) = (u16)resource;
  727. RPC_SIZE(&msg) = 2U;
  728. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  729. if (ret) {
  730. printf("%s: resource:%d: res:%d\n",
  731. __func__, resource, RPC_R8(&msg));
  732. }
  733. if (mode)
  734. *mode = RPC_U8(&msg, 0U);
  735. return ret;
  736. }
  737. int sc_timer_set_wdog_window(sc_ipc_t ipc, sc_timer_wdog_time_t window)
  738. {
  739. struct udevice *dev = gd->arch.scu_dev;
  740. struct sc_rpc_msg_s msg;
  741. int size = sizeof(struct sc_rpc_msg_s);
  742. int ret;
  743. RPC_VER(&msg) = SC_RPC_VERSION;
  744. RPC_SIZE(&msg) = 2U;
  745. RPC_SVC(&msg) = (u8)(SC_RPC_SVC_TIMER);
  746. RPC_FUNC(&msg) = (u8)(TIMER_FUNC_SET_WDOG_WINDOW);
  747. RPC_U32(&msg, 0U) = (u32)(window);
  748. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  749. if (ret)
  750. printf("%s: window:%u: res:%d\n",
  751. __func__, window, RPC_R8(&msg));
  752. return ret;
  753. }
  754. int sc_seco_authenticate(sc_ipc_t ipc, sc_seco_auth_cmd_t cmd,
  755. sc_faddr_t addr)
  756. {
  757. struct udevice *dev = gd->arch.scu_dev;
  758. struct sc_rpc_msg_s msg;
  759. int size = sizeof(struct sc_rpc_msg_s);
  760. int ret;
  761. RPC_VER(&msg) = SC_RPC_VERSION;
  762. RPC_SVC(&msg) = (u8)SC_RPC_SVC_SECO;
  763. RPC_FUNC(&msg) = (u8)SECO_FUNC_AUTHENTICATE;
  764. RPC_U32(&msg, 0U) = (u32)(addr >> 32ULL);
  765. RPC_U32(&msg, 4U) = (u32)addr;
  766. RPC_U8(&msg, 8U) = (u8)cmd;
  767. RPC_SIZE(&msg) = 4U;
  768. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  769. if (ret)
  770. printf("%s: res:%d\n", __func__, RPC_R8(&msg));
  771. return ret;
  772. }
  773. int sc_seco_forward_lifecycle(sc_ipc_t ipc, u32 change)
  774. {
  775. struct udevice *dev = gd->arch.scu_dev;
  776. struct sc_rpc_msg_s msg;
  777. int size = sizeof(struct sc_rpc_msg_s);
  778. int ret;
  779. RPC_VER(&msg) = SC_RPC_VERSION;
  780. RPC_SVC(&msg) = (u8)SC_RPC_SVC_SECO;
  781. RPC_FUNC(&msg) = (u8)SECO_FUNC_FORWARD_LIFECYCLE;
  782. RPC_U32(&msg, 0U) = (u32)change;
  783. RPC_SIZE(&msg) = 2U;
  784. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  785. if (ret) {
  786. printf("%s: change:%u, res:%d\n", __func__,
  787. change, RPC_R8(&msg));
  788. }
  789. return ret;
  790. }
  791. int sc_seco_chip_info(sc_ipc_t ipc, u16 *lc, u16 *monotonic, u32 *uid_l,
  792. u32 *uid_h)
  793. {
  794. struct udevice *dev = gd->arch.scu_dev;
  795. struct sc_rpc_msg_s msg;
  796. int size = sizeof(struct sc_rpc_msg_s);
  797. int ret;
  798. RPC_VER(&msg) = SC_RPC_VERSION;
  799. RPC_SVC(&msg) = (u8)SC_RPC_SVC_SECO;
  800. RPC_FUNC(&msg) = (u8)SECO_FUNC_CHIP_INFO;
  801. RPC_SIZE(&msg) = 1U;
  802. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  803. if (ret)
  804. printf("%s: res:%d\n", __func__, RPC_R8(&msg));
  805. if (uid_l)
  806. *uid_l = RPC_U32(&msg, 0U);
  807. if (uid_h)
  808. *uid_h = RPC_U32(&msg, 4U);
  809. if (lc)
  810. *lc = RPC_U16(&msg, 8U);
  811. if (monotonic)
  812. *monotonic = RPC_U16(&msg, 10U);
  813. return ret;
  814. }
  815. void sc_seco_build_info(sc_ipc_t ipc, u32 *version, u32 *commit)
  816. {
  817. struct udevice *dev = gd->arch.scu_dev;
  818. struct sc_rpc_msg_s msg;
  819. int size = sizeof(struct sc_rpc_msg_s);
  820. RPC_VER(&msg) = SC_RPC_VERSION;
  821. RPC_SVC(&msg) = (u8)(SC_RPC_SVC_SECO);
  822. RPC_FUNC(&msg) = (u8)(SECO_FUNC_BUILD_INFO);
  823. RPC_SIZE(&msg) = 1U;
  824. misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  825. if (version)
  826. *version = RPC_U32(&msg, 0U);
  827. if (commit)
  828. *commit = RPC_U32(&msg, 4U);
  829. }
  830. int sc_seco_v2x_build_info(sc_ipc_t ipc, u32 *version, u32 *commit)
  831. {
  832. struct udevice *dev = gd->arch.scu_dev;
  833. struct sc_rpc_msg_s msg;
  834. int size = sizeof(struct sc_rpc_msg_s);
  835. int ret;
  836. RPC_VER(&msg) = SC_RPC_VERSION;
  837. RPC_SIZE(&msg) = 1U;
  838. RPC_SVC(&msg) = (u8)(SC_RPC_SVC_SECO);
  839. RPC_FUNC(&msg) = (u8)(SECO_FUNC_V2X_BUILD_INFO);
  840. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  841. if (ret)
  842. printf("%s: res:%d\n", __func__, RPC_R8(&msg));
  843. if (version)
  844. *version = RPC_U32(&msg, 0U);
  845. if (commit)
  846. *commit = RPC_U32(&msg, 4U);
  847. return ret;
  848. }
  849. int sc_seco_get_event(sc_ipc_t ipc, u8 idx, u32 *event)
  850. {
  851. struct udevice *dev = gd->arch.scu_dev;
  852. struct sc_rpc_msg_s msg;
  853. int size = sizeof(struct sc_rpc_msg_s);
  854. int ret;
  855. RPC_VER(&msg) = SC_RPC_VERSION;
  856. RPC_SVC(&msg) = (u8)SC_RPC_SVC_SECO;
  857. RPC_FUNC(&msg) = (u8)SECO_FUNC_GET_EVENT;
  858. RPC_U8(&msg, 0U) = (u8)idx;
  859. RPC_SIZE(&msg) = 2U;
  860. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  861. if (ret)
  862. printf("%s: idx: %u, res:%d\n", __func__, idx, RPC_R8(&msg));
  863. if (event)
  864. *event = RPC_U32(&msg, 0U);
  865. return ret;
  866. }
  867. int sc_seco_gen_key_blob(sc_ipc_t ipc, u32 id, sc_faddr_t load_addr,
  868. sc_faddr_t export_addr, u16 max_size)
  869. {
  870. struct udevice *dev = gd->arch.scu_dev;
  871. struct sc_rpc_msg_s msg;
  872. int size = sizeof(struct sc_rpc_msg_s);
  873. int ret;
  874. RPC_VER(&msg) = SC_RPC_VERSION;
  875. RPC_SVC(&msg) = (u8)SC_RPC_SVC_SECO;
  876. RPC_FUNC(&msg) = (u8)SECO_FUNC_GEN_KEY_BLOB;
  877. RPC_U32(&msg, 0U) = (u32)(load_addr >> 32ULL);
  878. RPC_U32(&msg, 4U) = (u32)load_addr;
  879. RPC_U32(&msg, 8U) = (u32)(export_addr >> 32ULL);
  880. RPC_U32(&msg, 12U) = (u32)export_addr;
  881. RPC_U32(&msg, 16U) = (u32)id;
  882. RPC_U16(&msg, 20U) = (u16)max_size;
  883. RPC_SIZE(&msg) = 7U;
  884. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  885. if (ret) {
  886. printf("%s: id: %u, load_addr 0x%llx, export_addr 0x%llx, res:%d\n",
  887. __func__, id, load_addr, export_addr, RPC_R8(&msg));
  888. }
  889. return ret;
  890. }
  891. int sc_seco_get_mp_key(sc_ipc_t ipc, sc_faddr_t dst_addr,
  892. u16 dst_size)
  893. {
  894. struct udevice *dev = gd->arch.scu_dev;
  895. struct sc_rpc_msg_s msg;
  896. int size = sizeof(struct sc_rpc_msg_s);
  897. int ret;
  898. RPC_VER(&msg) = SC_RPC_VERSION;
  899. RPC_SIZE(&msg) = 4U;
  900. RPC_SVC(&msg) = (u8)(SC_RPC_SVC_SECO);
  901. RPC_FUNC(&msg) = (u8)(SECO_FUNC_GET_MP_KEY);
  902. RPC_U32(&msg, 0U) = (u32)(dst_addr >> 32ULL);
  903. RPC_U32(&msg, 4U) = (u32)(dst_addr);
  904. RPC_U16(&msg, 8U) = (u16)(dst_size);
  905. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  906. if (ret)
  907. printf("%s, dst_addr:0x%llx, res:%d\n",
  908. __func__, dst_addr, RPC_R8(&msg));
  909. return ret;
  910. }
  911. int sc_seco_update_mpmr(sc_ipc_t ipc, sc_faddr_t addr, u8 size_m,
  912. u8 lock)
  913. {
  914. struct udevice *dev = gd->arch.scu_dev;
  915. struct sc_rpc_msg_s msg;
  916. int size = sizeof(struct sc_rpc_msg_s);
  917. int ret;
  918. RPC_VER(&msg) = SC_RPC_VERSION;
  919. RPC_SIZE(&msg) = 4U;
  920. RPC_SVC(&msg) = (u8)(SC_RPC_SVC_SECO);
  921. RPC_FUNC(&msg) = (u8)(SECO_FUNC_UPDATE_MPMR);
  922. RPC_U32(&msg, 0U) = (u32)(addr >> 32ULL);
  923. RPC_U32(&msg, 4U) = (u32)(addr);
  924. RPC_U8(&msg, 8U) = (u8)(size_m);
  925. RPC_U8(&msg, 9U) = (u8)(lock);
  926. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  927. if (ret)
  928. printf("%s, addr:0x%llx, size_m:%x, lock:0x%x, res:%d\n",
  929. __func__, addr, size_m, lock, RPC_R8(&msg));
  930. return ret;
  931. }
  932. int sc_seco_get_mp_sign(sc_ipc_t ipc, sc_faddr_t msg_addr,
  933. u16 msg_size, sc_faddr_t dst_addr,
  934. u16 dst_size)
  935. {
  936. struct udevice *dev = gd->arch.scu_dev;
  937. struct sc_rpc_msg_s msg;
  938. int size = sizeof(struct sc_rpc_msg_s);
  939. int ret;
  940. RPC_VER(&msg) = SC_RPC_VERSION;
  941. RPC_SIZE(&msg) = 6U;
  942. RPC_SVC(&msg) = (u8)(SC_RPC_SVC_SECO);
  943. RPC_FUNC(&msg) = (u8)(SECO_FUNC_GET_MP_SIGN);
  944. RPC_U32(&msg, 0U) = (u32)(msg_addr >> 32ULL);
  945. RPC_U32(&msg, 4U) = (u32)(msg_addr);
  946. RPC_U32(&msg, 8U) = (u32)(dst_addr >> 32ULL);
  947. RPC_U32(&msg, 12U) = (u32)(dst_addr);
  948. RPC_U16(&msg, 16U) = (u16)(msg_size);
  949. RPC_U16(&msg, 18U) = (u16)(dst_size);
  950. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  951. if (ret)
  952. printf("%s, msg_addr:0x%llx, msg_size:%x, dst_addr:0x%llx,"
  953. "dst_size:%x, res:%d\n", __func__, msg_addr, msg_size,
  954. dst_addr, dst_size, RPC_R8(&msg));
  955. return ret;
  956. }
  957. int sc_seco_secvio_config(sc_ipc_t ipc, u8 id, u8 access,
  958. u32 *data0, u32 *data1, u32 *data2, u32 *data3,
  959. u32 *data4, u8 size)
  960. {
  961. struct udevice *dev = gd->arch.scu_dev;
  962. struct sc_rpc_msg_s msg;
  963. int msg_size = sizeof(struct sc_rpc_msg_s);
  964. int ret;
  965. RPC_VER(&msg) = SC_RPC_VERSION;
  966. RPC_SIZE(&msg) = 7U;
  967. RPC_SVC(&msg) = (u8)(SC_RPC_SVC_SECO);
  968. RPC_FUNC(&msg) = (u8)(SECO_FUNC_SECVIO_CONFIG);
  969. RPC_U32(&msg, 0U) = (u32)(*data0);
  970. RPC_U32(&msg, 4U) = (u32)(*data1);
  971. RPC_U32(&msg, 8U) = (u32)(*data2);
  972. RPC_U32(&msg, 12U) = (u32)(*data3);
  973. RPC_U32(&msg, 16U) = (u32)(*data4);
  974. RPC_U8(&msg, 20U) = (u8)(id);
  975. RPC_U8(&msg, 21U) = (u8)(access);
  976. RPC_U8(&msg, 22U) = (u8)(size);
  977. ret = misc_call(dev, SC_FALSE, &msg, msg_size, &msg, msg_size);
  978. if (ret)
  979. printf("%s, id:0x%x, access:%x, res:%d\n",
  980. __func__, id, access, RPC_R8(&msg));
  981. *data0 = (u32)RPC_U32(&msg, 0U);
  982. *data1 = (u32)RPC_U32(&msg, 4U);
  983. *data2 = (u32)RPC_U32(&msg, 8U);
  984. *data3 = (u32)RPC_U32(&msg, 12U);
  985. *data4 = (u32)RPC_U32(&msg, 16U);
  986. return ret;
  987. }
  988. int sc_seco_secvio_dgo_config(sc_ipc_t ipc, u8 id, u8 access, u32 *data)
  989. {
  990. struct udevice *dev = gd->arch.scu_dev;
  991. struct sc_rpc_msg_s msg;
  992. int size = sizeof(struct sc_rpc_msg_s);
  993. int ret;
  994. RPC_VER(&msg) = SC_RPC_VERSION;
  995. RPC_SIZE(&msg) = 3U;
  996. RPC_SVC(&msg) = (u8)(SC_RPC_SVC_SECO);
  997. RPC_FUNC(&msg) = (u8)(SECO_FUNC_SECVIO_DGO_CONFIG);
  998. RPC_U32(&msg, 0U) = (u32)(*data);
  999. RPC_U8(&msg, 4U) = (u8)(id);
  1000. RPC_U8(&msg, 5U) = (u8)(access);
  1001. ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
  1002. if (ret)
  1003. printf("%s, id:0x%x, access:%x, res:%d\n",
  1004. __func__, id, access, RPC_R8(&msg));
  1005. if (data)
  1006. *data = RPC_U32(&msg, 0U);
  1007. return ret;
  1008. }