[U-Boot] [PATCH] ARM: socfpga: Remove socfpga_sdram_apply_static_cfg()

Simon Goldschmidt simon.k.r.goldschmidt at gmail.com
Fri Apr 26 06:39:35 UTC 2019


On Tue, Apr 23, 2019 at 6:14 PM Marek Vasut <marex at denx.de> wrote:
>
> The usage of socfpga_sdram_apply_static_cfg() seems rather dubious and
> is confirmed to lead to a rare system hang when enabling bridges. This
> patch removes the socfpga_sdram_apply_static_cfg() altogether, because
> it's use seems unjustified and problematic.
>
> The socfpga_sdram_apply_static_cfg() triggers write to SDRAM staticcfg
> register to set the applycfg bit, which according to old vendor U-Boot
> sources can only be written when there is no traffic between the SDRAM
> controller and the rest of the system. Empirical measurements confirm
> this, setting the applycfg bit when there is traffic between the SDRAM
> controller and CPU leads to the SDRAM controller accesses being blocked
> shortly after.
>
> Altera originally solved this by moving the entire code which sets the
> staticcfg register to OCRAM [1]. The commit message claims that the
> applycfg bit needs to be set after write to fpgaportrst register. This
> is however inverted by Altera shortly after in [2], where the order
> becomes the exact opposite of what commit message [1] claims to be the
> required order. The explanation points to a possible problem in AMP
> use-case, where the FPGA might be sending transactions through the F2S
> bridge.
>
> However, the AMP is only the tip of the iceberg here. Any of the other
> L2, L3 or L4 masters can trigger transactions to the SDRAM. It becomes
> rather non-trivial to guarantee there are no transactions to the SDRAM
> controller.
>
> The SoCFPGA SDRAM driver always writes the applycfg bit in SPL. Thus,
> writing the applycfg again in bridge enable code seems redundant and
> can presumably be dropped.
>
> [1] https://github.com/altera-opensource/u-boot-socfpga/commit/75905816ec95b0ccd515700b922628d7aa9036f8
> [2] https://github.com/altera-opensource/u-boot-socfpga/commit/8ba6986b04a91d23c7adf529186b34c8d2967ad5
>
> Signed-off-by: Marek Vasut <marex at denx.de>
> Cc: Chin Liang See <chin.liang.see at intel.com>
> Cc: Dinh Nguyen <dinguyen at kernel.org>
> Cc: Simon Goldschmidt <simon.k.r.goldschmidt at gmail.com>
> Cc: Tien Fong Chee <tien.fong.chee at intel.com>

Good catch!

Reviewed-by: Simon Goldschmidt <simon.k.r.goldschmidt at gmail.com>

> ---
>  arch/arm/mach-socfpga/misc_gen5.c | 31 -------------------------------
>  1 file changed, 31 deletions(-)
>
> diff --git a/arch/arm/mach-socfpga/misc_gen5.c b/arch/arm/mach-socfpga/misc_gen5.c
> index 7876953595..eeba199edc 100644
> --- a/arch/arm/mach-socfpga/misc_gen5.c
> +++ b/arch/arm/mach-socfpga/misc_gen5.c
> @@ -220,35 +220,6 @@ static struct socfpga_reset_manager *reset_manager_base =
>  static struct socfpga_sdr_ctrl *sdr_ctrl =
>         (struct socfpga_sdr_ctrl *)SDR_CTRLGRP_ADDRESS;
>
> -static 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 abuse 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;
> @@ -263,14 +234,12 @@ void do_bridge_reset(int enable, unsigned int mask)
>                 }
>
>                 writel(iswgrp_handoff[2], &sysmgr_regs->fpgaintfgrp_module);
> -               socfpga_sdram_apply_static_cfg();
>                 writel(iswgrp_handoff[3], &sdr_ctrl->fpgaport_rst);
>                 writel(iswgrp_handoff[0], &reset_manager_base->brg_mod_reset);
>                 writel(iswgrp_handoff[1], &nic301_regs->remap);
>         } else {
>                 writel(0, &sysmgr_regs->fpgaintfgrp_module);
>                 writel(0, &sdr_ctrl->fpgaport_rst);
> -               socfpga_sdram_apply_static_cfg();
>                 writel(0, &reset_manager_base->brg_mod_reset);
>                 writel(1, &nic301_regs->remap);
>         }
> --
> 2.20.1
>


More information about the U-Boot mailing list