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