Re: [PATCH v2 10/11] socfpga: arria10: Wait for fifo empty after writing bitstream

2022-05-27 Thread Simon Glass
On Thu, 26 May 2022 at 07:38, Paweł Anikiel  wrote:
>
> For some reason, on the Mercury+ AA1 module, calling
> fpgamgr_wait_early_user_mode immediately after writing the peripheral
> bitstream leaves the fpga in a broken state (ddr calibration hangs).
> Adding a delay before the first sync word is written seems to fix this.
> Inspecting the fpgamgr registers before and after the delay,
> imgcfg_FifoEmpty is the only bit that changes. Waiting for this bit
> (instead of a hardcoded delay) also fixes the issue.
>
> Signed-off-by: Paweł Anikiel 
> ---
>  drivers/fpga/socfpga_arria10.c | 8 
>  1 file changed, 8 insertions(+)

Reviewed-by: Simon Glass 


[PATCH v2 10/11] socfpga: arria10: Wait for fifo empty after writing bitstream

2022-05-26 Thread Paweł Anikiel
For some reason, on the Mercury+ AA1 module, calling
fpgamgr_wait_early_user_mode immediately after writing the peripheral
bitstream leaves the fpga in a broken state (ddr calibration hangs).
Adding a delay before the first sync word is written seems to fix this.
Inspecting the fpgamgr registers before and after the delay,
imgcfg_FifoEmpty is the only bit that changes. Waiting for this bit
(instead of a hardcoded delay) also fixes the issue.

Signed-off-by: Paweł Anikiel 
---
 drivers/fpga/socfpga_arria10.c | 8 
 1 file changed, 8 insertions(+)

diff --git a/drivers/fpga/socfpga_arria10.c b/drivers/fpga/socfpga_arria10.c
index 07bfe3060e..d8089122af 100644
--- a/drivers/fpga/socfpga_arria10.c
+++ b/drivers/fpga/socfpga_arria10.c
@@ -80,6 +80,13 @@ static int wait_for_user_mode(void)
1, FPGA_TIMEOUT_MSEC, false);
 }
 
+static int wait_for_fifo_empty(void)
+{
+   return wait_for_bit_le32(_manager_base->imgcfg_stat,
+   ALT_FPGAMGR_IMGCFG_STAT_F2S_IMGCFG_FIFOEMPTY_SET_MSK,
+   1, FPGA_TIMEOUT_MSEC, false);
+}
+
 int is_fpgamgr_early_user_mode(void)
 {
return (readl(_manager_base->imgcfg_stat) &
@@ -874,6 +881,7 @@ int socfpga_loadfs(fpga_fs_info *fpga_fsinfo, const void 
*buf, size_t bsize,
 
WATCHDOG_RESET();
}
+   wait_for_fifo_empty();
 
if (fpga_loadfs.rbfinfo.section == periph_section) {
if (fpgamgr_wait_early_user_mode() != -ETIMEDOUT) {
-- 
2.36.1.124.g0e6072fb45-goog