On Thu, 28 Dec 2023 00:28:43 +0300
Andrey Skvortsov <andrej.skvort...@gmail.com> wrote:

> Current sunxi DRAM initialisation code does several test accesses to the
> DRAM array to detect aliasing effects and so determine the correct
> row/column configuration. This changes the DRAM content, which breaks
> use cases like soft reset and Linux's ramoops mechanism.
> 
> Fix this problem by saving and restoring the content of the DRAM cells
> that is used for the test writes.
> 
> Signed-off-by: Andrey Skvortsov <andrej.skvort...@gmail.com>

Reviewed-by: Andre Przywara <andre.przyw...@arm.com>

Merged to sunxi/master.

Cheers,
Andre

> ---
>  arch/arm/mach-sunxi/dram_helpers.c | 16 ++++++++++++++--
>  1 file changed, 14 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm/mach-sunxi/dram_helpers.c 
> b/arch/arm/mach-sunxi/dram_helpers.c
> index 661186b648..e487f87bf3 100644
> --- a/arch/arm/mach-sunxi/dram_helpers.c
> +++ b/arch/arm/mach-sunxi/dram_helpers.c
> @@ -32,13 +32,25 @@ void mctl_await_completion(u32 *reg, u32 mask, u32 val)
>  #ifndef CONFIG_MACH_SUNIV
>  bool mctl_mem_matches_base(u32 offset, ulong base)
>  {
> +     u32 val_base;
> +     u32 val_offset;
> +     bool ret;
> +
> +     /* Save original values */
> +     val_base = readl(base);
> +     val_offset = readl(base + offset);
> +
>       /* Try to write different values to RAM at two addresses */
>       writel(0, base);
>       writel(0xaa55aa55, base + offset);
>       dsb();
>       /* Check if the same value is actually observed when reading back */
> -     return readl(base) ==
> -            readl(base + offset);
> +     ret = readl(base) == readl(base + offset);
> +
> +     /* Restore original values */
> +     writel(val_base, base);
> +     writel(val_offset, base + offset);
> +     return ret;
>  }
>  
>  /*

Reply via email to