blob: 3bb2561cb6f7cf68d1ff10101623067b4bcc2df2 [file] [log] [blame]
Hadi Asyrafi616da772019-06-27 11:34:03 +08001/*
Abdul Halim, Muhammad Hadi Asyrafib45f15e2020-05-14 15:32:43 +08002 * Copyright (c) 2020, Intel Corporation. All rights reserved.
Hadi Asyrafi616da772019-06-27 11:34:03 +08003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <lib/mmio.h>
8#include <common/debug.h>
Hadi Asyrafia91818f2019-11-12 14:55:26 +08009#include <drivers/delay_timer.h>
Hadi Asyrafi616da772019-06-27 11:34:03 +080010
Hadi Asyrafi6f8a2b22019-10-23 18:34:14 +080011#include "socfpga_mailbox.h"
Hadi Asyrafic5168162019-10-21 16:25:07 +080012#include "socfpga_sip_svc.h"
Hadi Asyrafi616da772019-06-27 11:34:03 +080013
Abdul Halim, Muhammad Hadi Asyrafid84bfef2020-02-25 16:28:10 +080014static int fill_mailbox_circular_buffer(uint32_t header_cmd, uint32_t *args,
Hadi Asyrafi616da772019-06-27 11:34:03 +080015 int len)
16{
Abdul Halim, Muhammad Hadi Asyrafi20a07f32020-05-18 11:16:48 +080017 uint32_t sdm_read_offset, cmd_free_offset;
Hadi Asyrafi616da772019-06-27 11:34:03 +080018 int i;
19
20 cmd_free_offset = mmio_read_32(MBOX_OFFSET + MBOX_CIN);
Abdul Halim, Muhammad Hadi Asyrafi20a07f32020-05-18 11:16:48 +080021 sdm_read_offset = mmio_read_32(MBOX_OFFSET + MBOX_COUT);
22
23 if ((cmd_free_offset < sdm_read_offset) &&
24 (cmd_free_offset + len > sdm_read_offset)) {
25 return MBOX_BUFFER_FULL;
26 }
Hadi Asyrafi616da772019-06-27 11:34:03 +080027
Hadi Asyrafi616da772019-06-27 11:34:03 +080028 mmio_write_32(MBOX_OFFSET + MBOX_CMD_BUFFER + (cmd_free_offset++ * 4),
29 header_cmd);
30
31
32 for (i = 0; i < len; i++) {
33 cmd_free_offset %= MBOX_CMD_BUFFER_SIZE;
34 mmio_write_32(MBOX_OFFSET + MBOX_CMD_BUFFER +
35 (cmd_free_offset++ * 4), args[i]);
36 }
37
38 cmd_free_offset %= MBOX_CMD_BUFFER_SIZE;
39 mmio_write_32(MBOX_OFFSET + MBOX_CIN, cmd_free_offset);
40
Abdul Halim, Muhammad Hadi Asyrafib45f15e2020-05-14 15:32:43 +080041 return MBOX_RET_OK;
Hadi Asyrafi616da772019-06-27 11:34:03 +080042}
43
Abdul Halim, Muhammad Hadi Asyrafi20a07f32020-05-18 11:16:48 +080044int mailbox_read_response(uint32_t *job_id, uint32_t *response, int resp_len)
Hadi Asyrafi616da772019-06-27 11:34:03 +080045{
46 int rin = 0;
47 int rout = 0;
Abdul Halim, Muhammad Hadi Asyrafi046e1f12020-02-12 19:57:44 +080048 int resp_data = 0;
Hadi Asyrafi616da772019-06-27 11:34:03 +080049
Hadi Asyrafia91818f2019-11-12 14:55:26 +080050 if (mmio_read_32(MBOX_OFFSET + MBOX_DOORBELL_FROM_SDM))
51 mmio_write_32(MBOX_OFFSET + MBOX_DOORBELL_FROM_SDM, 0);
Hadi Asyrafi616da772019-06-27 11:34:03 +080052
53 rin = mmio_read_32(MBOX_OFFSET + MBOX_RIN);
54 rout = mmio_read_32(MBOX_OFFSET + MBOX_ROUT);
55
Hadi Asyrafia91818f2019-11-12 14:55:26 +080056 if (rout != rin) {
Abdul Halim, Muhammad Hadi Asyrafi046e1f12020-02-12 19:57:44 +080057 resp_data = mmio_read_32(MBOX_OFFSET +
Hadi Asyrafi616da772019-06-27 11:34:03 +080058 MBOX_RESP_BUFFER + ((rout++)*4));
59
60 rout %= MBOX_RESP_BUFFER_SIZE;
61 mmio_write_32(MBOX_OFFSET + MBOX_ROUT, rout);
62
Abdul Halim, Muhammad Hadi Asyrafi20a07f32020-05-18 11:16:48 +080063
64 if (MBOX_RESP_CLIENT_ID(resp_data) != MBOX_ATF_CLIENT_ID) {
Hadi Asyrafi616da772019-06-27 11:34:03 +080065 return MBOX_WRONG_ID;
66 }
67
Abdul Halim, Muhammad Hadi Asyrafi20a07f32020-05-18 11:16:48 +080068 *job_id = MBOX_RESP_JOB_ID(resp_data);
69
Abdul Halim, Muhammad Hadi Asyrafi046e1f12020-02-12 19:57:44 +080070 if (MBOX_RESP_ERR(resp_data) > 0) {
71 INFO("Error in response: %x\n", resp_data);
72 return -resp_data;
Hadi Asyrafi616da772019-06-27 11:34:03 +080073 }
Hadi Asyrafi616da772019-06-27 11:34:03 +080074
Abdul Halim, Muhammad Hadi Asyrafi94fae382020-04-29 22:26:40 +080075 return iterate_resp(MBOX_RESP_LEN(resp_data),
76 response, resp_len);
Hadi Asyrafi616da772019-06-27 11:34:03 +080077 }
Hadi Asyrafi616da772019-06-27 11:34:03 +080078 return MBOX_NO_RESPONSE;
79}
80
81
Abdul Halim, Muhammad Hadi Asyrafi20a07f32020-05-18 11:16:48 +080082int mailbox_poll_response(uint32_t job_id, int urgent, uint32_t *response,
Hadi Asyrafi9dfc0472019-11-12 16:39:46 +080083 int resp_len)
Hadi Asyrafi616da772019-06-27 11:34:03 +080084{
Hadi Asyrafia91818f2019-11-12 14:55:26 +080085 int timeout = 0xFFFFFF;
Hadi Asyrafi616da772019-06-27 11:34:03 +080086 int rin = 0;
87 int rout = 0;
Abdul Halim, Muhammad Hadi Asyrafi046e1f12020-02-12 19:57:44 +080088 int resp_data = 0;
Hadi Asyrafi616da772019-06-27 11:34:03 +080089
Hadi Asyrafi616da772019-06-27 11:34:03 +080090 while (1) {
Hadi Asyrafia91818f2019-11-12 14:55:26 +080091
Hadi Asyrafi616da772019-06-27 11:34:03 +080092 while (timeout > 0 &&
Hadi Asyrafia91818f2019-11-12 14:55:26 +080093 !(mmio_read_32(MBOX_OFFSET +
94 MBOX_DOORBELL_FROM_SDM) & 1)) {
Hadi Asyrafi616da772019-06-27 11:34:03 +080095 timeout--;
96 }
97
Hadi Asyrafia91818f2019-11-12 14:55:26 +080098 if (!timeout) {
Abdul Halim, Muhammad Hadi Asyrafi94fae382020-04-29 22:26:40 +080099 INFO("Timed out waiting for SDM\n");
Hadi Asyrafi616da772019-06-27 11:34:03 +0800100 return MBOX_TIMEOUT;
101 }
102
103 mmio_write_32(MBOX_OFFSET + MBOX_DOORBELL_FROM_SDM, 0);
104
105 if (urgent & 1) {
Hadi Asyrafia91818f2019-11-12 14:55:26 +0800106 mdelay(5);
Hadi Asyrafi616da772019-06-27 11:34:03 +0800107 if ((mmio_read_32(MBOX_OFFSET + MBOX_STATUS) &
108 MBOX_STATUS_UA_MASK) ^
109 (urgent & MBOX_STATUS_UA_MASK)) {
110 mmio_write_32(MBOX_OFFSET + MBOX_URG, 0);
Abdul Halim, Muhammad Hadi Asyrafib45f15e2020-05-14 15:32:43 +0800111 return MBOX_RET_OK;
Hadi Asyrafi616da772019-06-27 11:34:03 +0800112 }
113
114 mmio_write_32(MBOX_OFFSET + MBOX_URG, 0);
115 INFO("Error: Mailbox did not get UA");
Abdul Halim, Muhammad Hadi Asyrafib45f15e2020-05-14 15:32:43 +0800116 return MBOX_RET_ERROR;
Hadi Asyrafi616da772019-06-27 11:34:03 +0800117 }
118
119 rin = mmio_read_32(MBOX_OFFSET + MBOX_RIN);
120 rout = mmio_read_32(MBOX_OFFSET + MBOX_ROUT);
121
122 while (rout != rin) {
Abdul Halim, Muhammad Hadi Asyrafi046e1f12020-02-12 19:57:44 +0800123 resp_data = mmio_read_32(MBOX_OFFSET +
Hadi Asyrafi616da772019-06-27 11:34:03 +0800124 MBOX_RESP_BUFFER + ((rout++)*4));
125
126 rout %= MBOX_RESP_BUFFER_SIZE;
127 mmio_write_32(MBOX_OFFSET + MBOX_ROUT, rout);
128
Abdul Halim, Muhammad Hadi Asyrafi046e1f12020-02-12 19:57:44 +0800129 if (MBOX_RESP_CLIENT_ID(resp_data) != MBOX_ATF_CLIENT_ID
130 || MBOX_RESP_JOB_ID(resp_data) != job_id)
Hadi Asyrafi616da772019-06-27 11:34:03 +0800131 continue;
132
Abdul Halim, Muhammad Hadi Asyrafi046e1f12020-02-12 19:57:44 +0800133 if (MBOX_RESP_ERR(resp_data) > 0) {
134 INFO("Error in response: %x\n", resp_data);
135 return -MBOX_RESP_ERR(resp_data);
Hadi Asyrafi616da772019-06-27 11:34:03 +0800136 }
Hadi Asyrafi616da772019-06-27 11:34:03 +0800137
Abdul Halim, Muhammad Hadi Asyrafi94fae382020-04-29 22:26:40 +0800138 return iterate_resp(MBOX_RESP_LEN(resp_data),
139 response, resp_len);
140 }
141 }
142}
143
144int iterate_resp(int mbox_resp_len, uint32_t *resp_buf, int resp_len)
145{
146 uint32_t timeout;
147 int resp_data = 0, total_resp_len = 0;
148 int rin = mmio_read_32(MBOX_OFFSET + MBOX_RIN);
149 int rout = mmio_read_32(MBOX_OFFSET + MBOX_ROUT);
150
151 while (mbox_resp_len > 0) {
152 timeout = 0xFFFFFF;
153 mbox_resp_len--;
154 resp_data = mmio_read_32(MBOX_OFFSET +
155 MBOX_RESP_BUFFER +
156 (rout)*4);
157 if (resp_buf && resp_len) {
158 *(resp_buf + total_resp_len)
159 = resp_data;
160 resp_len--;
161 total_resp_len++;
162 }
163 rout++;
164 rout %= MBOX_RESP_BUFFER_SIZE;
165 mmio_write_32(MBOX_OFFSET + MBOX_ROUT, rout);
166
167 do {
168 timeout--;
169 rin = mmio_read_32(MBOX_OFFSET + MBOX_RIN);
170 } while ((rout == rin) && (mbox_resp_len > 0) && (timeout > 0));
171
172 if (timeout == 0) {
173 INFO("Timed out waiting for SDM\n");
174 return MBOX_TIMEOUT;
Hadi Asyrafi616da772019-06-27 11:34:03 +0800175 }
176 }
Abdul Halim, Muhammad Hadi Asyrafi94fae382020-04-29 22:26:40 +0800177 return total_resp_len;
Hadi Asyrafi616da772019-06-27 11:34:03 +0800178}
179
Abdul Halim, Muhammad Hadi Asyrafi20a07f32020-05-18 11:16:48 +0800180int mailbox_send_cmd_async(uint32_t *job_id, unsigned int cmd, uint32_t *args,
Abdul Halim, Muhammad Hadi Asyrafi2b7d13e2020-05-18 10:32:15 +0800181 int len, int indirect)
Hadi Asyrafi616da772019-06-27 11:34:03 +0800182{
Abdul Halim, Muhammad Hadi Asyrafi20a07f32020-05-18 11:16:48 +0800183 int status;
184
185 status = fill_mailbox_circular_buffer(
186 MBOX_CLIENT_ID_CMD(MBOX_ATF_CLIENT_ID) |
187 MBOX_JOB_ID_CMD(*job_id) |
188 MBOX_CMD_LEN_CMD(len) |
189 MBOX_INDIRECT(indirect) |
190 cmd, args, len);
191 if (status < 0) {
192 return status;
193 }
Tien Hock, Loh527234a2019-10-30 14:54:25 +0800194
195 mmio_write_32(MBOX_OFFSET + MBOX_DOORBELL_TO_SDM, 1);
Abdul Halim, Muhammad Hadi Asyrafi20a07f32020-05-18 11:16:48 +0800196 *job_id = (*job_id + 1) % MBOX_MAX_IND_JOB_ID;
Tien Hock, Loh527234a2019-10-30 14:54:25 +0800197
Abdul Halim, Muhammad Hadi Asyrafib45f15e2020-05-14 15:32:43 +0800198 return MBOX_RET_OK;
Hadi Asyrafi616da772019-06-27 11:34:03 +0800199}
200
Abdul Halim, Muhammad Hadi Asyrafi20a07f32020-05-18 11:16:48 +0800201int mailbox_send_cmd(uint32_t job_id, unsigned int cmd, uint32_t *args,
Hadi Asyrafi9dfc0472019-11-12 16:39:46 +0800202 int len, int urgent, uint32_t *response, int resp_len)
Hadi Asyrafi616da772019-06-27 11:34:03 +0800203{
Tien Hock, Loh527234a2019-10-30 14:54:25 +0800204 int status = 0;
Hadi Asyrafi616da772019-06-27 11:34:03 +0800205
206 if (urgent) {
207 urgent |= mmio_read_32(MBOX_OFFSET + MBOX_STATUS) &
208 MBOX_STATUS_UA_MASK;
209 mmio_write_32(MBOX_OFFSET + MBOX_URG, cmd);
Tien Hock, Loh527234a2019-10-30 14:54:25 +0800210 }
211
212 else {
Hadi Asyrafi616da772019-06-27 11:34:03 +0800213 status = fill_mailbox_circular_buffer(
214 MBOX_CLIENT_ID_CMD(MBOX_ATF_CLIENT_ID) |
215 MBOX_JOB_ID_CMD(job_id) |
Tien Hock, Loh527234a2019-10-30 14:54:25 +0800216 MBOX_CMD_LEN_CMD(len) |
Hadi Asyrafi616da772019-06-27 11:34:03 +0800217 cmd, args, len);
218 }
219
220 if (status)
221 return status;
222
Tien Hock, Loh527234a2019-10-30 14:54:25 +0800223 mmio_write_32(MBOX_OFFSET + MBOX_DOORBELL_TO_SDM, 1);
Hadi Asyrafi9dfc0472019-11-12 16:39:46 +0800224 status = mailbox_poll_response(job_id, urgent, response, resp_len);
Tien Hock, Loh527234a2019-10-30 14:54:25 +0800225
226 return status;
Hadi Asyrafi616da772019-06-27 11:34:03 +0800227}
228
Tien Hock, Loh527234a2019-10-30 14:54:25 +0800229void mailbox_clear_response(void)
230{
231 mmio_write_32(MBOX_OFFSET + MBOX_ROUT,
232 mmio_read_32(MBOX_OFFSET + MBOX_RIN));
233}
234
Hadi Asyrafi616da772019-06-27 11:34:03 +0800235void mailbox_set_int(int interrupt)
236{
237
238 mmio_write_32(MBOX_OFFSET+MBOX_INT, MBOX_COE_BIT(interrupt) |
239 MBOX_UAE_BIT(interrupt));
240}
241
242
243void mailbox_set_qspi_open(void)
244{
245 mailbox_set_int(MBOX_INT_FLAG_COE | MBOX_INT_FLAG_RIE);
Abdul Halim, Muhammad Hadi Asyrafib45f15e2020-05-14 15:32:43 +0800246 mailbox_send_cmd(MBOX_JOB_ID, MBOX_CMD_QSPI_OPEN, NULL, 0,
247 CMD_CASUAL, NULL, 0);
Hadi Asyrafi616da772019-06-27 11:34:03 +0800248}
249
250void mailbox_set_qspi_direct(void)
251{
Abdul Halim, Muhammad Hadi Asyrafib45f15e2020-05-14 15:32:43 +0800252 mailbox_send_cmd(MBOX_JOB_ID, MBOX_CMD_QSPI_DIRECT, NULL, 0,
253 CMD_CASUAL, NULL, 0);
Hadi Asyrafi616da772019-06-27 11:34:03 +0800254}
255
256void mailbox_set_qspi_close(void)
257{
258 mailbox_set_int(MBOX_INT_FLAG_COE | MBOX_INT_FLAG_RIE);
Abdul Halim, Muhammad Hadi Asyrafib45f15e2020-05-14 15:32:43 +0800259 mailbox_send_cmd(MBOX_JOB_ID, MBOX_CMD_QSPI_CLOSE, NULL, 0,
260 CMD_CASUAL, NULL, 0);
Hadi Asyrafi616da772019-06-27 11:34:03 +0800261}
262
Hadi Asyrafi616da772019-06-27 11:34:03 +0800263void mailbox_qspi_set_cs(int device_select)
264{
Abdul Halim, Muhammad Hadi Asyrafid84bfef2020-02-25 16:28:10 +0800265 uint32_t cs_setting = device_select;
Hadi Asyrafi616da772019-06-27 11:34:03 +0800266
267 /* QSPI device select settings at 31:28 */
268 cs_setting = (cs_setting << 28);
269 mailbox_set_int(MBOX_INT_FLAG_COE | MBOX_INT_FLAG_RIE);
270 mailbox_send_cmd(MBOX_JOB_ID, MBOX_CMD_QSPI_SET_CS, &cs_setting,
Abdul Halim, Muhammad Hadi Asyrafib45f15e2020-05-14 15:32:43 +0800271 1, CMD_CASUAL, NULL, 0);
Hadi Asyrafi616da772019-06-27 11:34:03 +0800272}
273
274void mailbox_reset_cold(void)
275{
276 mailbox_set_int(MBOX_INT_FLAG_COE | MBOX_INT_FLAG_RIE);
Abdul Halim, Muhammad Hadi Asyrafib45f15e2020-05-14 15:32:43 +0800277 mailbox_send_cmd(MBOX_JOB_ID, MBOX_CMD_REBOOT_HPS, NULL, 0,
278 CMD_CASUAL, NULL, 0);
Hadi Asyrafi616da772019-06-27 11:34:03 +0800279}
280
Hadi Asyrafi593c4c52019-12-17 19:22:17 +0800281int mailbox_rsu_get_spt_offset(uint32_t *resp_buf, uint32_t resp_buf_len)
282{
283 return mailbox_send_cmd(MBOX_JOB_ID, MBOX_GET_SUBPARTITION_TABLE,
Abdul Halim, Muhammad Hadi Asyrafib45f15e2020-05-14 15:32:43 +0800284 NULL, 0, CMD_CASUAL, (uint32_t *)resp_buf,
Hadi Asyrafi593c4c52019-12-17 19:22:17 +0800285 resp_buf_len);
286}
287
288struct rsu_status_info {
289 uint64_t current_image;
290 uint64_t fail_image;
291 uint32_t state;
292 uint32_t version;
293 uint32_t error_location;
294 uint32_t error_details;
295 uint32_t retry_counter;
296};
297
298int mailbox_rsu_status(uint32_t *resp_buf, uint32_t resp_buf_len)
299{
300 int ret;
301 struct rsu_status_info *info = (struct rsu_status_info *)resp_buf;
302
303 info->retry_counter = ~0;
304
Abdul Halim, Muhammad Hadi Asyrafib45f15e2020-05-14 15:32:43 +0800305 ret = mailbox_send_cmd(MBOX_JOB_ID, MBOX_RSU_STATUS, NULL, 0,
306 CMD_CASUAL, (uint32_t *)resp_buf,
307 resp_buf_len);
Hadi Asyrafi593c4c52019-12-17 19:22:17 +0800308
309 if (ret < 0)
310 return ret;
311
312 if (info->retry_counter != ~0)
313 if (!(info->version & RSU_VERSION_ACMF_MASK))
314 info->version |= RSU_VERSION_ACMF;
315
316 return ret;
317}
318
Abdul Halim, Muhammad Hadi Asyrafid84bfef2020-02-25 16:28:10 +0800319int mailbox_rsu_update(uint32_t *flash_offset)
Hadi Asyrafi593c4c52019-12-17 19:22:17 +0800320{
321 return mailbox_send_cmd(MBOX_JOB_ID, MBOX_RSU_UPDATE,
Abdul Halim, Muhammad Hadi Asyrafib45f15e2020-05-14 15:32:43 +0800322 flash_offset, 2,
323 CMD_CASUAL, NULL, 0);
Hadi Asyrafi593c4c52019-12-17 19:22:17 +0800324}
325
Abdul Halim, Muhammad Hadi Asyrafid84bfef2020-02-25 16:28:10 +0800326int mailbox_hps_stage_notify(uint32_t execution_stage)
Hadi Asyrafi593c4c52019-12-17 19:22:17 +0800327{
328 return mailbox_send_cmd(MBOX_JOB_ID, MBOX_HPS_STAGE_NOTIFY,
Abdul Halim, Muhammad Hadi Asyrafib45f15e2020-05-14 15:32:43 +0800329 &execution_stage, 1, CMD_CASUAL,
330 NULL, 0);
Hadi Asyrafi593c4c52019-12-17 19:22:17 +0800331}
332
Hadi Asyrafi616da772019-06-27 11:34:03 +0800333int mailbox_init(void)
334{
335 int status = 0;
336
337 mailbox_set_int(MBOX_INT_FLAG_COE | MBOX_INT_FLAG_RIE |
338 MBOX_INT_FLAG_UAE);
Hadi Asyrafia91818f2019-11-12 14:55:26 +0800339 mmio_write_32(MBOX_OFFSET + MBOX_URG, 0);
340 mmio_write_32(MBOX_OFFSET + MBOX_DOORBELL_FROM_SDM, 0);
341
Abdul Halim, Muhammad Hadi Asyrafib45f15e2020-05-14 15:32:43 +0800342 status = mailbox_send_cmd(0, MBOX_CMD_RESTART, NULL, 0,
343 CMD_URGENT, NULL, 0);
Hadi Asyrafi616da772019-06-27 11:34:03 +0800344
345 if (status)
346 return status;
347
Tien Hock, Loh527234a2019-10-30 14:54:25 +0800348 mailbox_set_int(MBOX_INT_FLAG_COE | MBOX_INT_FLAG_RIE |
349 MBOX_INT_FLAG_UAE);
Hadi Asyrafi616da772019-06-27 11:34:03 +0800350
Abdul Halim, Muhammad Hadi Asyrafib45f15e2020-05-14 15:32:43 +0800351 return MBOX_RET_OK;
Hadi Asyrafi616da772019-06-27 11:34:03 +0800352}
353
Abdul Halim, Muhammad Hadi Asyrafie59b9992020-02-11 20:17:05 +0800354int intel_mailbox_get_config_status(uint32_t cmd)
Hadi Asyrafic5168162019-10-21 16:25:07 +0800355{
Abdul Halim, Muhammad Hadi Asyrafie59b9992020-02-11 20:17:05 +0800356 int status;
357 uint32_t res, response[6];
Hadi Asyrafic5168162019-10-21 16:25:07 +0800358
Abdul Halim, Muhammad Hadi Asyrafib45f15e2020-05-14 15:32:43 +0800359 status = mailbox_send_cmd(MBOX_JOB_ID, cmd, NULL, 0, CMD_CASUAL, response,
360 ARRAY_SIZE(response));
Hadi Asyrafic5168162019-10-21 16:25:07 +0800361
362 if (status < 0)
Hadi Asyrafi2b9198d2019-11-12 15:03:00 +0800363 return status;
Hadi Asyrafic5168162019-10-21 16:25:07 +0800364
365 res = response[RECONFIG_STATUS_STATE];
366 if (res && res != MBOX_CFGSTAT_STATE_CONFIG)
Hadi Asyrafi2b9198d2019-11-12 15:03:00 +0800367 return res;
Hadi Asyrafic5168162019-10-21 16:25:07 +0800368
369 res = response[RECONFIG_STATUS_PIN_STATUS];
370 if (!(res & PIN_STATUS_NSTATUS))
Hadi Asyrafi2b9198d2019-11-12 15:03:00 +0800371 return MBOX_CFGSTAT_STATE_ERROR_HARDWARE;
Hadi Asyrafic5168162019-10-21 16:25:07 +0800372
373 res = response[RECONFIG_STATUS_SOFTFUNC_STATUS];
374 if (res & SOFTFUNC_STATUS_SEU_ERROR)
Hadi Asyrafi2b9198d2019-11-12 15:03:00 +0800375 return MBOX_CFGSTAT_STATE_ERROR_HARDWARE;
Hadi Asyrafic5168162019-10-21 16:25:07 +0800376
377 if ((res & SOFTFUNC_STATUS_CONF_DONE) &&
378 (res & SOFTFUNC_STATUS_INIT_DONE))
Abdul Halim, Muhammad Hadi Asyrafib45f15e2020-05-14 15:32:43 +0800379 return MBOX_RET_OK;
Hadi Asyrafic5168162019-10-21 16:25:07 +0800380
Hadi Asyrafi2b9198d2019-11-12 15:03:00 +0800381 return MBOX_CFGSTAT_STATE_CONFIG;
Hadi Asyrafic5168162019-10-21 16:25:07 +0800382}
Hadi Asyrafi6aeb55d2019-12-24 14:43:22 +0800383
384int intel_mailbox_is_fpga_not_ready(void)
385{
386 int ret = intel_mailbox_get_config_status(MBOX_RECONFIG_STATUS);
387
388 if (ret && ret != MBOX_CFGSTAT_STATE_CONFIG)
389 ret = intel_mailbox_get_config_status(MBOX_CONFIG_STATUS);
390
391 return ret;
392}