[PATCH] sunxi: restore modified memory
Andrey Skvortsov
andrej.skvortzov at gmail.com
Wed Dec 6 19:46:51 CET 2023
Hi Andre,
On 23-11-01 09:50, Andre Przywara wrote:
> On Fri, 21 Jul 2023 17:57:21 +0300
> Andrey Skvortsov <andrej.skvortzov at gmail.com> wrote:
>
> Hi Andrey,
>
> sorry for the late reply!
>
> > On A64 with 2G of RAM words at following addresses were modified with
> > 'aa55aa55' value:
> > - 50000000
> > - 60000000
> > - 84000000
> > - 88000000
> > - 90000000
> > - A0000000
> > - A0000200
> >
> > That made harder to pick memory range for persistent storage in RAM.
>
> In general I now think this patch is fine, since DRAM content can indeed
> be preserved across some reboot types.
> Some things below:
>
> > Signed-off-by: Andrey Skvortsov <andrej.skvortzov at gmail.com>
> > ---
> > arch/arm/mach-sunxi/dram_helpers.c | 16 ++++++++++++++--
> > arch/arm/mach-sunxi/dram_sunxi_dw.c | 16 ++++++++++++++--
> > 2 files changed, 28 insertions(+), 4 deletions(-)
> >
> > diff --git a/arch/arm/mach-sunxi/dram_helpers.c b/arch/arm/mach-sunxi/dram_helpers.c
> > index 2c873192e6..e3d236a4b3 100644
> > --- a/arch/arm/mach-sunxi/dram_helpers.c
> > +++ b/arch/arm/mach-sunxi/dram_helpers.c
> > @@ -32,12 +32,24 @@ void mctl_await_completion(u32 *reg, u32 mask, u32 val)
> > #ifndef CONFIG_MACH_SUNIV
> > bool mctl_mem_matches(u32 offset)
> > {
> > + unsigned long tmp_base;
> > + unsigned long tmp_offset;
>
> The type doesn't match the return type of readl.
> Please use uint32_t here.
> And the names are somewhat misleading, at least to my mind, since they are
> not a base address and an offset, but rather just values at a base
> address and at an offset from that.
> So I think val_base and val_offset would be better.
Thanks for the review.
> > + bool ret;
> > +
> > + /* Save original values */
> > + tmp_base = readl(CFG_SYS_SDRAM_BASE);
> > + tmp_offset = readl((ulong)CFG_SYS_SDRAM_BASE + offset);
> > +
> > /* Try to write different values to RAM at two addresses */
> > writel(0, CFG_SYS_SDRAM_BASE);
> > writel(0xaa55aa55, (ulong)CFG_SYS_SDRAM_BASE + offset);
> > dsb();
> > /* Check if the same value is actually observed when reading back */
> > - return readl(CFG_SYS_SDRAM_BASE) ==
> > - readl((ulong)CFG_SYS_SDRAM_BASE + offset);
> > + ret = readl(CFG_SYS_SDRAM_BASE) == readl((ulong)CFG_SYS_SDRAM_BASE + offset);
> > +
> > + /* Restore original values */
> > + writel(tmp_base, CFG_SYS_SDRAM_BASE);
> > + writel(tmp_offset, (ulong)CFG_SYS_SDRAM_BASE + offset);
> > + return ret;
> > }
> > #endif
> > diff --git a/arch/arm/mach-sunxi/dram_sunxi_dw.c b/arch/arm/mach-sunxi/dram_sunxi_dw.c
> > index 9107b114df..6245815fa2 100644
> > --- a/arch/arm/mach-sunxi/dram_sunxi_dw.c
> > +++ b/arch/arm/mach-sunxi/dram_sunxi_dw.c
> > @@ -657,13 +657,25 @@ static int mctl_channel_init(uint16_t socid, struct dram_para *para)
> > */
> > static bool mctl_mem_matches_base(u32 offset, ulong base)
>
> Mmh, somehow I dimly remember commenting on this before (some other
> patch?), but this function is essentially the same as above, isn't it?
> If someone has some spare cycles, they could be merged, implementing
> mctl_mem_matches() as a tiny wrapper around mctl_mem_matches_base(), to
> preserve all callers.
>
> Shouldn't block this patch, though.
Good point. I'll do this as part of v2 as a separate patch.
--
Best regards,
Andrey Skvortsov
More information about the U-Boot
mailing list