[PATCH] FPGA2SDRAM setup fix

Chee, Tien Fong tienfong.chee at altera.com
Mon Nov 17 08:37:25 CET 2025


Hi,

On 20/10/2025 9:35 pm, Brian Sune wrote:
> After testing, w/o proper setup
> the FPGA2SDRAM bridge will not work and stall.
> Pulling from official fix and w/o this initialization,
> both 2025.07 and 2025.10 also suffer stall on U-Boot
> and distro. Any FPGA to HPS-SDRAM action will immediate
> stall the CPU. As such, this patch fix the issue.
>
> Signed-off-by: Brian Sune<briansune at gmail.com>
> ---
>   arch/arm/mach-socfpga/misc_gen5.c | 34 ++++++++++++++++++++++++++++++-
>   1 file changed, 33 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/mach-socfpga/misc_gen5.c b/arch/arm/mach-socfpga/misc_gen5.c
> index b136691c685..5259ef54d73 100644
> --- a/arch/arm/mach-socfpga/misc_gen5.c
> +++ b/arch/arm/mach-socfpga/misc_gen5.c
> @@ -217,6 +217,34 @@ int arch_early_init_r(void)
>   static struct socfpga_sdr_ctrl *sdr_ctrl =
>   	(struct socfpga_sdr_ctrl *)SDR_CTRLGRP_ADDRESS;
>   
> +void socfpga_sdram_apply_static_cfg(void)
> +{
> +	const u32 applymask = 0x8;
> +	u32 val = readl(&sdr_ctrl->static_cfg) | applymask;
> +
> +	/*
> +	 * SDRAM staticcfg register specific:
> +	 * When applying the register setting, the CPU must not access
> +	 * SDRAM. Luckily for us, we can use i-cache here to help us
> +	 * circumvent the SDRAM access issue. The idea is to make sure
> +	 * that the code is in one full i-cache line by branching past
> +	 * it and back. Once it is in the i-cache, we execute the core
> +	 * of the code and apply the register settings.
> +	 *
> +	 * The code below uses 7 instructions, while the Cortex-A9 has
> +	 * 32-byte cachelines, thus the limit is 8 instructions total.
> +	 */
> +	asm volatile(".align	5			\n"
> +		     "		b 2f			\n"
> +		     "1: 	str %0,	[%1]		\n"
> +		     "		dsb			\n"
> +		     "		isb			\n"
> +		     "		b 3f			\n"
> +		     "2:	b 1b			\n"
> +		     "3:	nop			\n"
> +		    : : "r"(val), "r"(&sdr_ctrl->static_cfg) : "memory", "cc");
> +}
> +
>   void do_bridge_reset(int enable, unsigned int mask)
>   {
>   	int i;
> @@ -234,7 +262,10 @@ void do_bridge_reset(int enable, unsigned int mask)
>   		writel(iswgrp_handoff[2],
>   		       socfpga_get_sysmgr_addr() +
>   		       SYSMGR_GEN5_FPGAINFGRP_MODULE);
> -		writel(iswgrp_handoff[3], &sdr_ctrl->fpgaport_rst);
> +		if (iswgrp_handoff[3]) {
> +			writel(iswgrp_handoff[3], &sdr_ctrl->fpgaport_rst);
> +			socfpga_sdram_apply_static_cfg();
> +		}
>   		writel(iswgrp_handoff[0],
>   		       socfpga_get_rstmgr_addr() + RSTMGR_GEN5_BRGMODRST);
>   		writel(iswgrp_handoff[1], &nic301_regs->remap);
> @@ -246,6 +277,7 @@ void do_bridge_reset(int enable, unsigned int mask)
>   		writel(0, socfpga_get_sysmgr_addr() +
>   		       SYSMGR_GEN5_FPGAINFGRP_MODULE);
>   		writel(0, &sdr_ctrl->fpgaport_rst);
> +		socfpga_sdram_apply_static_cfg();
>   		writel(0x7, socfpga_get_rstmgr_addr() + RSTMGR_GEN5_BRGMODRST);
>   		writel(1, &nic301_regs->remap);
>   	}


Reviewed-by: Tien Fong Chee <tien.fong.chee at altera.com>

Best regards,
Tien Fong


More information about the U-Boot mailing list