[PATCH 1/1] board: toradex: Make A53 get RAM size from DT in K3 boards

Suhaas Joshi s-joshi at ti.com
Thu Feb 12 11:32:28 CET 2026


On 09:25-20260212, Francesco Dolcini wrote:
> Hello Suhaas,
> 
> On Wed, Feb 11, 2026 at 04:43:28PM +0530, Suhaas Joshi wrote:
> > `dram_init()` is called by R5 SPL and U-Boot, both. It starts by
> > computing the size of the RAM. In verdin-am62(p), it does so by calling
> > `get_ram_size()`. This function computes the size of the RAM by writing
> > over the RAM.
> > 
> > When R5 computes the size of the RAM, it does not update the DT with
> > this size. As a result, when A53 invokes `dram_init()` again, it has to
> > compute the size through `get_ram_size()` again.
> > 
> > Commit 13c54cf588d82 and 0c3a6f748c9 add firewall over ATF's and OPTEE's
> > regions. This firewall is added during the R5 SPL stage of boot. So when
> > A53 attempts to write over RAM in `get_ram_size()`, it writes over the
> > protected region. Since A53 is a non-secure core, this is blocked by the
> > firewall.
> > 
> > To fix this, do the following:
> >     * Implement `spl_perform_board_fixups()` function for verdin-am62
> >       and verdin-am62p. Make this function call `fixup_memory_node()`,
> >       which updates the DT.
> >     * Add an if-block in `dram_init()`, to ensure that only R5 is able
> >       to call `get_ram_size()`, and that A53 reads this size from the
> >       DT.
> > 
> > Signed-off-by: Suhaas Joshi <s-joshi at ti.com>
> 
> I was able to test it on a verdin am62, with 1GB of RAM, and it works as
> expected. I also agree that get_ram_size() should be called only on the
> R5 SPL.
> 
> There is a small change that I would do however, please see the inline
> comment in the code.
> 
> Tested-by: Francesco Dolcini <francesco.dolcini at toradex.com> # Verdin AM62
> 
> 
> > ---
> >  board/toradex/verdin-am62/verdin-am62.c   | 10 ++++++++++
> >  board/toradex/verdin-am62p/verdin-am62p.c | 11 +++++++++++
> >  2 files changed, 21 insertions(+)
> > 
> > diff --git a/board/toradex/verdin-am62/verdin-am62.c b/board/toradex/verdin-am62/verdin-am62.c
> > index 069aa6c7909..1aa106afbd9 100644
> > --- a/board/toradex/verdin-am62/verdin-am62.c
> > +++ b/board/toradex/verdin-am62/verdin-am62.c
> > @@ -24,6 +24,9 @@ DECLARE_GLOBAL_DATA_PTR;
> >  
> >  int dram_init(void)
> >  {
> > +	if (!IS_ENABLED(CONFIG_CPU_V7R))
> > +		return fdtdec_setup_mem_size_base();
> 
> change this to
> 
> if (!IS_ENABLED(CONFIG_TARGET_VERDIN_AM62_R5) || !IS_ENABLED(CONFIG_SPL_BUILD))
> 
> this way is clear that we want the get_ram_size() only on R5 SPL. It
> will make the code and the intention more clear, with no changes on the
> generated code.
> 
> > diff --git a/board/toradex/verdin-am62p/verdin-am62p.c b/board/toradex/verdin-am62p/verdin-am62p.c
> > index 7c631f380ff..12693c1a46b 100644
> > --- a/board/toradex/verdin-am62p/verdin-am62p.c
> > +++ b/board/toradex/verdin-am62p/verdin-am62p.c
> > @@ -18,6 +18,7 @@
> >  #include <k3-ddrss.h>
> >  #include <spl.h>
> >  #include <linux/sizes.h>
> > +#include <mach/k3-ddr.h>
> >  
> >  #include "../common/tdx-cfg-block.h"
> >  
> > @@ -57,6 +58,9 @@ static void read_hw_cfg(void)
> >  
> >  int dram_init(void)
> >  {
> > +	if (!IS_ENABLED(CONFIG_CPU_V7R))
> > +		return fdtdec_setup_mem_size_base();
> 
> same comment here
> 
> if (!IS_ENABLED(CONFIG_TARGET_VERDIN_AM62P_R5) || !IS_ENABLED(CONFIG_SPL_BUILD))
> 
> with these 2 small changes also add
> 
> Reviewed-by: Francesco Dolcini <francesco.dolcini at toradex.com>

Done, I have sent the v2:
https://lore.kernel.org/u-boot/20260212102847.1560553-1-s-joshi@ti.com/T/#t

Do let me know if there are any other issues in v2. Thanks for testing
this out.

Regards
Suhaas

> 
> Thanks for the support on solving this regression.
> 
> Francesco
> 


More information about the U-Boot mailing list