[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