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 <[email protected]>
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 <[email protected]> # 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 <[email protected]> Thanks for the support on solving this regression. Francesco

