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

Francesco Dolcini francesco at dolcini.it
Thu Feb 12 09:25:18 CET 2026


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>

Thanks for the support on solving this regression.

Francesco



More information about the U-Boot mailing list