socfpga_mailbox.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647
  1. /*
  2. * Copyright (c) 2020-2022, Intel Corporation. All rights reserved.
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. */
  6. #include <lib/mmio.h>
  7. #include <common/debug.h>
  8. #include <drivers/delay_timer.h>
  9. #include "socfpga_mailbox.h"
  10. #include "socfpga_sip_svc.h"
  11. static mailbox_payload_t mailbox_resp_payload;
  12. static mailbox_container_t mailbox_resp_ctr = {0, 0, &mailbox_resp_payload};
  13. static bool is_mailbox_cmdbuf_full(uint32_t cin)
  14. {
  15. uint32_t cout = mmio_read_32(MBOX_OFFSET + MBOX_COUT);
  16. return (((cin + 1U) % MBOX_CMD_BUFFER_SIZE) == cout);
  17. }
  18. static bool is_mailbox_cmdbuf_empty(uint32_t cin)
  19. {
  20. uint32_t cout = mmio_read_32(MBOX_OFFSET + MBOX_COUT);
  21. return (((cout + 1U) % MBOX_CMD_BUFFER_SIZE) == cin);
  22. }
  23. static int wait_for_mailbox_cmdbuf_empty(uint32_t cin)
  24. {
  25. unsigned int timeout = 200U;
  26. do {
  27. if (is_mailbox_cmdbuf_empty(cin)) {
  28. break;
  29. }
  30. mdelay(10U);
  31. } while (--timeout != 0U);
  32. if (timeout == 0U) {
  33. return MBOX_TIMEOUT;
  34. }
  35. return MBOX_RET_OK;
  36. }
  37. static int write_mailbox_cmd_buffer(uint32_t *cin, uint32_t cout,
  38. uint32_t data,
  39. bool *is_doorbell_triggered)
  40. {
  41. unsigned int timeout = 100U;
  42. do {
  43. if (is_mailbox_cmdbuf_full(*cin)) {
  44. if (!(*is_doorbell_triggered)) {
  45. mmio_write_32(MBOX_OFFSET +
  46. MBOX_DOORBELL_TO_SDM, 1U);
  47. *is_doorbell_triggered = true;
  48. }
  49. mdelay(10U);
  50. } else {
  51. mmio_write_32(MBOX_ENTRY_TO_ADDR(CMD, (*cin)++), data);
  52. *cin %= MBOX_CMD_BUFFER_SIZE;
  53. mmio_write_32(MBOX_OFFSET + MBOX_CIN, *cin);
  54. break;
  55. }
  56. } while (--timeout != 0U);
  57. if (timeout == 0U) {
  58. return MBOX_TIMEOUT;
  59. }
  60. if (*is_doorbell_triggered) {
  61. int ret = wait_for_mailbox_cmdbuf_empty(*cin);
  62. return ret;
  63. }
  64. return MBOX_RET_OK;
  65. }
  66. static int fill_mailbox_circular_buffer(uint32_t header_cmd, uint32_t *args,
  67. unsigned int len)
  68. {
  69. uint32_t sdm_read_offset, cmd_free_offset;
  70. unsigned int i;
  71. int ret;
  72. bool is_doorbell_triggered = false;
  73. cmd_free_offset = mmio_read_32(MBOX_OFFSET + MBOX_CIN);
  74. sdm_read_offset = mmio_read_32(MBOX_OFFSET + MBOX_COUT);
  75. ret = write_mailbox_cmd_buffer(&cmd_free_offset, sdm_read_offset,
  76. header_cmd, &is_doorbell_triggered);
  77. if (ret != 0) {
  78. goto restart_mailbox;
  79. }
  80. for (i = 0U; i < len; i++) {
  81. is_doorbell_triggered = false;
  82. ret = write_mailbox_cmd_buffer(&cmd_free_offset,
  83. sdm_read_offset, args[i],
  84. &is_doorbell_triggered);
  85. if (ret != 0) {
  86. goto restart_mailbox;
  87. }
  88. }
  89. mmio_write_32(MBOX_OFFSET + MBOX_DOORBELL_TO_SDM, 1U);
  90. return MBOX_RET_OK;
  91. restart_mailbox:
  92. /*
  93. * Attempt to restart mailbox if the driver not able to write
  94. * into mailbox command buffer
  95. */
  96. if (MBOX_CMD_MASK(header_cmd) != MBOX_CMD_RESTART) {
  97. INFO("Mailbox timed out: Attempting mailbox reset\n");
  98. ret = mailbox_init();
  99. if (ret == MBOX_TIMEOUT) {
  100. INFO("Error: Mailbox fail to restart\n");
  101. }
  102. }
  103. return MBOX_TIMEOUT;
  104. }
  105. int mailbox_read_response(unsigned int *job_id, uint32_t *response,
  106. unsigned int *resp_len)
  107. {
  108. uint32_t rin;
  109. uint32_t rout;
  110. uint32_t resp_data;
  111. unsigned int ret_resp_len;
  112. if (mmio_read_32(MBOX_OFFSET + MBOX_DOORBELL_FROM_SDM) == 1U) {
  113. mmio_write_32(MBOX_OFFSET + MBOX_DOORBELL_FROM_SDM, 0U);
  114. }
  115. rin = mmio_read_32(MBOX_OFFSET + MBOX_RIN);
  116. rout = mmio_read_32(MBOX_OFFSET + MBOX_ROUT);
  117. if (rout != rin) {
  118. resp_data = mmio_read_32(MBOX_ENTRY_TO_ADDR(RESP, (rout)++));
  119. rout %= MBOX_RESP_BUFFER_SIZE;
  120. mmio_write_32(MBOX_OFFSET + MBOX_ROUT, rout);
  121. if (MBOX_RESP_CLIENT_ID(resp_data) != MBOX_ATF_CLIENT_ID) {
  122. return MBOX_WRONG_ID;
  123. }
  124. *job_id = MBOX_RESP_JOB_ID(resp_data);
  125. ret_resp_len = MBOX_RESP_LEN(resp_data);
  126. if (iterate_resp(ret_resp_len, response, resp_len)
  127. != MBOX_RET_OK) {
  128. return MBOX_TIMEOUT;
  129. }
  130. if (MBOX_RESP_ERR(resp_data) > 0U) {
  131. INFO("Error in response: %x\n", resp_data);
  132. return -MBOX_RESP_ERR(resp_data);
  133. }
  134. return MBOX_RET_OK;
  135. }
  136. return MBOX_NO_RESPONSE;
  137. }
  138. int mailbox_read_response_async(unsigned int *job_id, uint32_t *header,
  139. uint32_t *response, unsigned int *resp_len,
  140. uint8_t ignore_client_id)
  141. {
  142. uint32_t rin;
  143. uint32_t rout;
  144. uint32_t resp_data;
  145. uint32_t ret_resp_len = 0;
  146. uint8_t is_done = 0;
  147. if ((mailbox_resp_ctr.flag & MBOX_PAYLOAD_FLAG_BUSY) != 0) {
  148. ret_resp_len = MBOX_RESP_LEN(
  149. mailbox_resp_ctr.payload->header) -
  150. mailbox_resp_ctr.index;
  151. }
  152. if (mmio_read_32(MBOX_OFFSET + MBOX_DOORBELL_FROM_SDM) == 1U) {
  153. mmio_write_32(MBOX_OFFSET + MBOX_DOORBELL_FROM_SDM, 0U);
  154. }
  155. rin = mmio_read_32(MBOX_OFFSET + MBOX_RIN);
  156. rout = mmio_read_32(MBOX_OFFSET + MBOX_ROUT);
  157. while (rout != rin && !is_done) {
  158. resp_data = mmio_read_32(MBOX_ENTRY_TO_ADDR(RESP, (rout)++));
  159. rout %= MBOX_RESP_BUFFER_SIZE;
  160. mmio_write_32(MBOX_OFFSET + MBOX_ROUT, rout);
  161. rin = mmio_read_32(MBOX_OFFSET + MBOX_RIN);
  162. if ((mailbox_resp_ctr.flag & MBOX_PAYLOAD_FLAG_BUSY) != 0) {
  163. mailbox_resp_ctr.payload->data[mailbox_resp_ctr.index] = resp_data;
  164. mailbox_resp_ctr.index++;
  165. ret_resp_len--;
  166. } else {
  167. if (!ignore_client_id) {
  168. if (MBOX_RESP_CLIENT_ID(resp_data) != MBOX_ATF_CLIENT_ID) {
  169. *resp_len = 0;
  170. return MBOX_WRONG_ID;
  171. }
  172. }
  173. *job_id = MBOX_RESP_JOB_ID(resp_data);
  174. ret_resp_len = MBOX_RESP_LEN(resp_data);
  175. mailbox_resp_ctr.payload->header = resp_data;
  176. mailbox_resp_ctr.flag |= MBOX_PAYLOAD_FLAG_BUSY;
  177. }
  178. if (ret_resp_len == 0) {
  179. is_done = 1;
  180. }
  181. }
  182. if (is_done != 0) {
  183. /* copy header data to input address if applicable */
  184. if (header != 0) {
  185. *header = mailbox_resp_ctr.payload->header;
  186. }
  187. /* copy response data to input buffer if applicable */
  188. ret_resp_len = MBOX_RESP_LEN(mailbox_resp_ctr.payload->header);
  189. if ((ret_resp_len > 0) && (response != NULL) && (resp_len != NULL)) {
  190. if (*resp_len > ret_resp_len) {
  191. *resp_len = ret_resp_len;
  192. }
  193. memcpy((uint8_t *) response,
  194. (uint8_t *) mailbox_resp_ctr.payload->data,
  195. *resp_len * MBOX_WORD_BYTE);
  196. }
  197. /* reset async response param */
  198. mailbox_resp_ctr.index = 0;
  199. mailbox_resp_ctr.flag = 0;
  200. if (MBOX_RESP_ERR(mailbox_resp_ctr.payload->header) > 0U) {
  201. INFO("Error in async response: %x\n",
  202. mailbox_resp_ctr.payload->header);
  203. return -MBOX_RESP_ERR(mailbox_resp_ctr.payload->header);
  204. }
  205. return MBOX_RET_OK;
  206. }
  207. *resp_len = 0;
  208. return (mailbox_resp_ctr.flag & MBOX_PAYLOAD_FLAG_BUSY) ? MBOX_BUSY : MBOX_NO_RESPONSE;
  209. }
  210. int mailbox_poll_response(uint32_t job_id, uint32_t urgent, uint32_t *response,
  211. unsigned int *resp_len)
  212. {
  213. unsigned int timeout = 40U;
  214. unsigned int sdm_loop = 255U;
  215. unsigned int ret_resp_len;
  216. uint32_t rin;
  217. uint32_t rout;
  218. uint32_t resp_data;
  219. while (sdm_loop != 0U) {
  220. do {
  221. if (mmio_read_32(MBOX_OFFSET + MBOX_DOORBELL_FROM_SDM)
  222. == 1U) {
  223. break;
  224. }
  225. mdelay(10U);
  226. } while (--timeout != 0U);
  227. if (timeout == 0U) {
  228. break;
  229. }
  230. mmio_write_32(MBOX_OFFSET + MBOX_DOORBELL_FROM_SDM, 0U);
  231. if ((urgent & 1U) != 0U) {
  232. mdelay(5U);
  233. if ((mmio_read_32(MBOX_OFFSET + MBOX_STATUS) &
  234. MBOX_STATUS_UA_MASK) ^
  235. (urgent & MBOX_STATUS_UA_MASK)) {
  236. mmio_write_32(MBOX_OFFSET + MBOX_URG, 0U);
  237. return MBOX_RET_OK;
  238. }
  239. mmio_write_32(MBOX_OFFSET + MBOX_URG, 0U);
  240. INFO("Error: Mailbox did not get UA");
  241. return MBOX_RET_ERROR;
  242. }
  243. rin = mmio_read_32(MBOX_OFFSET + MBOX_RIN);
  244. rout = mmio_read_32(MBOX_OFFSET + MBOX_ROUT);
  245. while (rout != rin) {
  246. resp_data = mmio_read_32(MBOX_ENTRY_TO_ADDR(RESP,
  247. (rout)++));
  248. rout %= MBOX_RESP_BUFFER_SIZE;
  249. mmio_write_32(MBOX_OFFSET + MBOX_ROUT, rout);
  250. if (MBOX_RESP_CLIENT_ID(resp_data) != MBOX_ATF_CLIENT_ID
  251. || MBOX_RESP_JOB_ID(resp_data) != job_id) {
  252. continue;
  253. }
  254. ret_resp_len = MBOX_RESP_LEN(resp_data);
  255. if (iterate_resp(ret_resp_len, response, resp_len)
  256. != MBOX_RET_OK) {
  257. return MBOX_TIMEOUT;
  258. }
  259. if (MBOX_RESP_ERR(resp_data) > 0U) {
  260. INFO("Error in response: %x\n", resp_data);
  261. return -MBOX_RESP_ERR(resp_data);
  262. }
  263. return MBOX_RET_OK;
  264. }
  265. sdm_loop--;
  266. }
  267. INFO("Timed out waiting for SDM\n");
  268. return MBOX_TIMEOUT;
  269. }
  270. int iterate_resp(uint32_t mbox_resp_len, uint32_t *resp_buf,
  271. unsigned int *resp_len)
  272. {
  273. unsigned int timeout, total_resp_len = 0U;
  274. uint32_t resp_data;
  275. uint32_t rin = mmio_read_32(MBOX_OFFSET + MBOX_RIN);
  276. uint32_t rout = mmio_read_32(MBOX_OFFSET + MBOX_ROUT);
  277. while (mbox_resp_len > 0U) {
  278. timeout = 100U;
  279. mbox_resp_len--;
  280. resp_data = mmio_read_32(MBOX_ENTRY_TO_ADDR(RESP, (rout)++));
  281. if ((resp_buf != NULL) && (resp_len != NULL)
  282. && (*resp_len != 0U)) {
  283. *(resp_buf + total_resp_len)
  284. = resp_data;
  285. *resp_len = *resp_len - 1;
  286. total_resp_len++;
  287. }
  288. rout %= MBOX_RESP_BUFFER_SIZE;
  289. mmio_write_32(MBOX_OFFSET + MBOX_ROUT, rout);
  290. do {
  291. rin = mmio_read_32(MBOX_OFFSET + MBOX_RIN);
  292. if (rout == rin) {
  293. mdelay(10U);
  294. } else {
  295. break;
  296. }
  297. timeout--;
  298. } while ((mbox_resp_len > 0U) && (timeout != 0U));
  299. if (timeout == 0U) {
  300. INFO("Timed out waiting for SDM\n");
  301. return MBOX_TIMEOUT;
  302. }
  303. }
  304. if (resp_len)
  305. *resp_len = total_resp_len;
  306. return MBOX_RET_OK;
  307. }
  308. int mailbox_send_cmd_async_ext(uint32_t header_cmd, uint32_t *args,
  309. unsigned int len)
  310. {
  311. return fill_mailbox_circular_buffer(header_cmd, args, len);
  312. }
  313. int mailbox_send_cmd_async(uint32_t *job_id, uint32_t cmd, uint32_t *args,
  314. unsigned int len, unsigned int indirect)
  315. {
  316. int status;
  317. status = fill_mailbox_circular_buffer(
  318. MBOX_CLIENT_ID_CMD(MBOX_ATF_CLIENT_ID) |
  319. MBOX_JOB_ID_CMD(*job_id) |
  320. MBOX_CMD_LEN_CMD(len) |
  321. MBOX_INDIRECT(indirect) |
  322. cmd, args, len);
  323. if (status < 0) {
  324. return status;
  325. }
  326. *job_id = (*job_id + 1U) % MBOX_MAX_IND_JOB_ID;
  327. return MBOX_RET_OK;
  328. }
  329. int mailbox_send_cmd(uint32_t job_id, uint32_t cmd, uint32_t *args,
  330. unsigned int len, uint32_t urgent, uint32_t *response,
  331. unsigned int *resp_len)
  332. {
  333. int status = 0;
  334. if (urgent != 0U) {
  335. urgent |= mmio_read_32(MBOX_OFFSET + MBOX_STATUS) &
  336. MBOX_STATUS_UA_MASK;
  337. mmio_write_32(MBOX_OFFSET + MBOX_URG, cmd);
  338. mmio_write_32(MBOX_OFFSET + MBOX_DOORBELL_TO_SDM, 1U);
  339. }
  340. else {
  341. status = fill_mailbox_circular_buffer(
  342. MBOX_CLIENT_ID_CMD(MBOX_ATF_CLIENT_ID) |
  343. MBOX_JOB_ID_CMD(job_id) |
  344. MBOX_CMD_LEN_CMD(len) |
  345. cmd, args, len);
  346. }
  347. if (status != 0) {
  348. return status;
  349. }
  350. status = mailbox_poll_response(job_id, urgent, response, resp_len);
  351. return status;
  352. }
  353. void mailbox_clear_response(void)
  354. {
  355. mmio_write_32(MBOX_OFFSET + MBOX_ROUT,
  356. mmio_read_32(MBOX_OFFSET + MBOX_RIN));
  357. }
  358. void mailbox_set_int(uint32_t interrupt)
  359. {
  360. mmio_write_32(MBOX_OFFSET+MBOX_INT, MBOX_COE_BIT(interrupt) |
  361. MBOX_UAE_BIT(interrupt));
  362. }
  363. void mailbox_set_qspi_open(void)
  364. {
  365. mailbox_set_int(MBOX_INT_FLAG_COE | MBOX_INT_FLAG_RIE);
  366. mailbox_send_cmd(MBOX_JOB_ID, MBOX_CMD_QSPI_OPEN, NULL, 0U,
  367. CMD_CASUAL, NULL, NULL);
  368. }
  369. void mailbox_set_qspi_direct(void)
  370. {
  371. mailbox_send_cmd(MBOX_JOB_ID, MBOX_CMD_QSPI_DIRECT, NULL, 0U,
  372. CMD_CASUAL, NULL, NULL);
  373. }
  374. void mailbox_set_qspi_close(void)
  375. {
  376. mailbox_set_int(MBOX_INT_FLAG_COE | MBOX_INT_FLAG_RIE);
  377. mailbox_send_cmd(MBOX_JOB_ID, MBOX_CMD_QSPI_CLOSE, NULL, 0U,
  378. CMD_CASUAL, NULL, NULL);
  379. }
  380. void mailbox_qspi_set_cs(uint32_t device_select)
  381. {
  382. uint32_t cs_setting;
  383. /* QSPI device select settings at 31:28 */
  384. cs_setting = (device_select << 28);
  385. mailbox_set_int(MBOX_INT_FLAG_COE | MBOX_INT_FLAG_RIE);
  386. mailbox_send_cmd(MBOX_JOB_ID, MBOX_CMD_QSPI_SET_CS, &cs_setting,
  387. 1U, CMD_CASUAL, NULL, NULL);
  388. }
  389. void mailbox_hps_qspi_enable(void)
  390. {
  391. mailbox_set_qspi_open();
  392. mailbox_set_qspi_direct();
  393. }
  394. void mailbox_reset_cold(void)
  395. {
  396. mailbox_set_int(MBOX_INT_FLAG_COE | MBOX_INT_FLAG_RIE);
  397. mailbox_send_cmd(MBOX_JOB_ID, MBOX_CMD_REBOOT_HPS, NULL, 0U,
  398. CMD_CASUAL, NULL, NULL);
  399. }
  400. int mailbox_rsu_get_spt_offset(uint32_t *resp_buf, unsigned int resp_buf_len)
  401. {
  402. return mailbox_send_cmd(MBOX_JOB_ID, MBOX_GET_SUBPARTITION_TABLE,
  403. NULL, 0U, CMD_CASUAL, resp_buf,
  404. &resp_buf_len);
  405. }
  406. struct rsu_status_info {
  407. uint64_t current_image;
  408. uint64_t fail_image;
  409. uint32_t state;
  410. uint32_t version;
  411. uint32_t error_location;
  412. uint32_t error_details;
  413. uint32_t retry_counter;
  414. };
  415. int mailbox_rsu_status(uint32_t *resp_buf, unsigned int resp_buf_len)
  416. {
  417. int ret;
  418. struct rsu_status_info *info = (struct rsu_status_info *)resp_buf;
  419. info->retry_counter = ~0U;
  420. ret = mailbox_send_cmd(MBOX_JOB_ID, MBOX_RSU_STATUS, NULL, 0U,
  421. CMD_CASUAL, resp_buf,
  422. &resp_buf_len);
  423. if (ret < 0) {
  424. return ret;
  425. }
  426. if (info->retry_counter != ~0U) {
  427. if ((info->version & RSU_VERSION_ACMF_MASK) == 0U) {
  428. info->version |= RSU_VERSION_ACMF;
  429. }
  430. }
  431. return ret;
  432. }
  433. int mailbox_rsu_update(uint32_t *flash_offset)
  434. {
  435. return mailbox_send_cmd(MBOX_JOB_ID, MBOX_RSU_UPDATE,
  436. flash_offset, 2U,
  437. CMD_CASUAL, NULL, NULL);
  438. }
  439. int mailbox_hps_stage_notify(uint32_t execution_stage)
  440. {
  441. return mailbox_send_cmd(MBOX_JOB_ID, MBOX_HPS_STAGE_NOTIFY,
  442. &execution_stage, 1U, CMD_CASUAL,
  443. NULL, NULL);
  444. }
  445. int mailbox_init(void)
  446. {
  447. int status;
  448. mailbox_set_int(MBOX_INT_FLAG_COE | MBOX_INT_FLAG_RIE |
  449. MBOX_INT_FLAG_UAE);
  450. mmio_write_32(MBOX_OFFSET + MBOX_URG, 0U);
  451. mmio_write_32(MBOX_OFFSET + MBOX_DOORBELL_FROM_SDM, 0U);
  452. status = mailbox_send_cmd(0U, MBOX_CMD_RESTART, NULL, 0U,
  453. CMD_URGENT, NULL, NULL);
  454. if (status != 0) {
  455. return status;
  456. }
  457. mailbox_set_int(MBOX_INT_FLAG_COE | MBOX_INT_FLAG_RIE |
  458. MBOX_INT_FLAG_UAE);
  459. return MBOX_RET_OK;
  460. }
  461. int intel_mailbox_get_config_status(uint32_t cmd, bool init_done)
  462. {
  463. int status;
  464. uint32_t res, response[6];
  465. unsigned int resp_len = ARRAY_SIZE(response);
  466. status = mailbox_send_cmd(MBOX_JOB_ID, cmd, NULL, 0U, CMD_CASUAL,
  467. response, &resp_len);
  468. if (status < 0) {
  469. return status;
  470. }
  471. res = response[RECONFIG_STATUS_STATE];
  472. if ((res != 0U) && (res != MBOX_CFGSTAT_STATE_CONFIG)) {
  473. return res;
  474. }
  475. res = response[RECONFIG_STATUS_PIN_STATUS];
  476. if ((res & PIN_STATUS_NSTATUS) == 0U) {
  477. return MBOX_CFGSTAT_STATE_ERROR_HARDWARE;
  478. }
  479. res = response[RECONFIG_STATUS_SOFTFUNC_STATUS];
  480. if ((res & SOFTFUNC_STATUS_SEU_ERROR) != 0U) {
  481. ERROR("SoftFunction Status SEU ERROR\n");
  482. }
  483. if ((res & SOFTFUNC_STATUS_CONF_DONE) == 0U) {
  484. return MBOX_CFGSTAT_STATE_CONFIG;
  485. }
  486. if (init_done && (res & SOFTFUNC_STATUS_INIT_DONE) == 0U) {
  487. return MBOX_CFGSTAT_STATE_CONFIG;
  488. }
  489. return MBOX_RET_OK;
  490. }
  491. int intel_mailbox_is_fpga_not_ready(void)
  492. {
  493. int ret = intel_mailbox_get_config_status(MBOX_RECONFIG_STATUS, true);
  494. if ((ret != MBOX_RET_OK) && (ret != MBOX_CFGSTAT_STATE_CONFIG)) {
  495. ret = intel_mailbox_get_config_status(MBOX_CONFIG_STATUS,
  496. false);
  497. }
  498. return ret;
  499. }
  500. int mailbox_hwmon_readtemp(uint32_t chan, uint32_t *resp_buf)
  501. {
  502. unsigned int resp_len = sizeof(resp_buf);
  503. return mailbox_send_cmd(MBOX_JOB_ID, MBOX_HWMON_READTEMP, &chan, 1U,
  504. CMD_CASUAL, resp_buf,
  505. &resp_len);
  506. }
  507. int mailbox_hwmon_readvolt(uint32_t chan, uint32_t *resp_buf)
  508. {
  509. unsigned int resp_len = sizeof(resp_buf);
  510. return mailbox_send_cmd(MBOX_JOB_ID, MBOX_HWMON_READVOLT, &chan, 1U,
  511. CMD_CASUAL, resp_buf,
  512. &resp_len);
  513. }