static int sysconfig_isc_finish(struct sysconfig_priv *priv)
{
struct gpio_desc *done_gpio = priv->done;
u32 status;
int ret;
if (done_gpio) {
ret = sysconfig_isc_disable(priv);
if (ret)
return ret;
return sysconfig_poll_gpio(done_gpio, true);
}
ret = sysconfig_poll_status(priv, &status);
if (ret)
return ret;
/* ВАЖНО: Выводим финальный статус ПЛИС перед выходом */
dev_info(priv->dev, "FINISHING: Device status register is 0x%08X\n", status);
if ((status & SYSCONFIG_STATUS_DONE) &&
!(status & SYSCONFIG_STATUS_BUSY) &&
!(status & SYSCONFIG_STATUS_ERR)) {
dev_info(priv->dev, "SUCCESS: DONE bit is set! FPGA is starting user logic...\n");
/* Отключаем режим программирования */
ret = sysconfig_isc_disable(priv);
if (ret)
return ret;
/* Принудительно шлем REFRESH для старта прошивки, если DONE сам не запустил её */
return sysconfig_lsc_refresh(priv);
}
dev_err(priv->dev, "ERROR: FPGA rejected bitstream. Status error flags present.\n");
return -EFAULT;
}