| 282 | } |
| 283 | |
| 284 | static int n3000_write_done(struct ifpga_sec_mgr *smgr) |
| 285 | { |
| 286 | struct intel_max10_device *dev = NULL; |
| 287 | uint32_t doorbell = 0; |
| 288 | uint32_t prog = 0; |
| 289 | uint32_t status = 0; |
| 290 | int ret = 0; |
| 291 | |
| 292 | if (!smgr || !smgr->max10_dev) |
| 293 | return -ENODEV; |
| 294 | dev = (struct intel_max10_device *)smgr->max10_dev; |
| 295 | |
| 296 | ret = max10_sys_read(dev, MAX10_DOORBELL, &doorbell); |
| 297 | if (ret < 0) { |
| 298 | dev_err(dev, |
| 299 | "Failed to read max10 doorbell register [e:%d]\n", |
| 300 | ret); |
| 301 | return ret; |
| 302 | } |
| 303 | |
| 304 | prog = SEC_PROGRESS_G(doorbell); |
| 305 | if (prog != SEC_PROGRESS_READY) |
| 306 | return -EBUSY; |
| 307 | |
| 308 | ret = max10_sys_update_bits(dev, MAX10_DOORBELL, HOST_STATUS, |
| 309 | HOST_STATUS_S(HOST_STATUS_WRITE_DONE)); |
| 310 | if (ret < 0) { |
| 311 | dev_err(dev, |
| 312 | "Failed to update max10 doorbell register [e:%d]\n", |
| 313 | ret); |
| 314 | return ret; |
| 315 | } |
| 316 | |
| 317 | ret = poll_timeout(dev, MAX10_DOORBELL, secure_prog_ready, |
| 318 | IFPGA_NIOS_HANDSHAKE_INTERVAL_MS, |
| 319 | IFPGA_NIOS_HANDSHAKE_TIMEOUT_MS); |
| 320 | if (ret < 0) { |
| 321 | dev_err(dev, |
| 322 | "Failed to poll max10 doorbell register [e:%d]\n", |
| 323 | ret); |
| 324 | return ret; |
| 325 | } |
| 326 | |
| 327 | ret = max10_sys_read(dev, MAX10_DOORBELL, &doorbell); |
| 328 | if (ret < 0) { |
| 329 | dev_err(dev, |
| 330 | "Failed to read max10 doorbell register [e:%d]\n", |
| 331 | ret); |
| 332 | return ret; |
| 333 | } |
| 334 | |
| 335 | status = SEC_STATUS_G(doorbell); |
| 336 | switch (status) { |
| 337 | case SEC_STATUS_NORMAL: |
| 338 | case SEC_STATUS_NIOS_OK: |
| 339 | case SEC_STATUS_USER_OK: |
| 340 | case SEC_STATUS_FACTORY_OK: |
| 341 | ret = 0; |
nothing calls this directly
no test coverage detected