[PATCH] stm32mp: Fix handling of OPTEE in the middle of DRAM

Patrice CHOTARD patrice.chotard at foss.st.com
Wed Dec 3 15:52:05 CET 2025



On 11/19/25 00:17, Marek Vasut wrote:
> STM32MP13xx may have OPTEE-OS at 0xdd000000 even on systems with 1 GiB
> of DRAM at 0xc0000000, which is not the end of DRAM anymore. This puts
> the OPTEE-OS in the middle of DRAM. Currently, the code sets RAM top to
> 0xdd000000 and prevents the DRAM range past OPTEE at 0xe0000000..0xffffffff
> from being set as cacheable and from being usable. The code also sets the
> area over OPTEE as invalid region in MMU tables, which is not correct.
> 
> Adjust the code such, that it only ever sets RAM top just before OPTEE
> in case the OPTEE is really at the end of DRAM, mainly to be backward
> compatible. Furthermore, adjust the MMU table configuration such, that
> the regions over the OPTEE are simply skipped and not reconfigured, and
> the regions between end of OPTEE and RAM top are set as cacheable, if
> any actually exist.
> 
> Signed-off-by: Marek Vasut <marek.vasut at mailbox.org>
> ---
> Cc: Patrice Chotard <patrice.chotard at foss.st.com>
> Cc: Patrick Delaunay <patrick.delaunay at foss.st.com>
> Cc: Tom Rini <trini at konsulko.com>
> Cc: u-boot at lists.denx.de
> Cc: u-boot at dh-electronics.com
> Cc: uboot-stm32 at st-md-mailman.stormreply.com
> ---
>  arch/arm/mach-stm32mp/dram_init.c    |  4 +++-
>  arch/arm/mach-stm32mp/stm32mp1/cpu.c | 11 ++++++-----
>  2 files changed, 9 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/arm/mach-stm32mp/dram_init.c b/arch/arm/mach-stm32mp/dram_init.c
> index 34b958d7afd..e36e42e7c61 100644
> --- a/arch/arm/mach-stm32mp/dram_init.c
> +++ b/arch/arm/mach-stm32mp/dram_init.c
> @@ -65,6 +65,7 @@ int dram_init(void)
>  
>  phys_addr_t board_get_usable_ram_top(phys_size_t total_size)
>  {
> +	phys_addr_t top = gd->ram_top;
>  	phys_size_t size;
>  	phys_addr_t reg;
>  	u32 optee_start, optee_size;
> @@ -86,7 +87,8 @@ phys_addr_t board_get_usable_ram_top(phys_size_t total_size)
>  	/* Reserved memory for OP-TEE at END of DDR for STM32MP1 SoC */
>  	if (IS_ENABLED(CONFIG_STM32MP13X) || IS_ENABLED(CONFIG_STM32MP15X)) {
>  		if (!optee_get_reserved_memory(&optee_start, &optee_size))
> -			reg = ALIGN(optee_start - size, MMU_SECTION_SIZE);
> +			if (optee_start + optee_size == top)
> +				reg = ALIGN(optee_start - size, MMU_SECTION_SIZE);
>  	}
>  
>  	/* before relocation, mark the U-Boot memory as cacheable by default */
> diff --git a/arch/arm/mach-stm32mp/stm32mp1/cpu.c b/arch/arm/mach-stm32mp/stm32mp1/cpu.c
> index e0c6f8ba937..252aef1852e 100644
> --- a/arch/arm/mach-stm32mp/stm32mp1/cpu.c
> +++ b/arch/arm/mach-stm32mp/stm32mp1/cpu.c
> @@ -82,11 +82,12 @@ void dram_bank_mmu_setup(int bank)
>  	     i++) {
>  		addr = i << MMU_SECTION_SHIFT;
>  		option = DCACHE_DEFAULT_OPTION;
> -		if (use_lmb &&
> -		    (lmb_is_reserved_flags(i << MMU_SECTION_SHIFT, LMB_NOMAP) ||
> -		     (gd->ram_top && addr >= gd->ram_top))
> -		   )
> -			option = 0; /* INVALID ENTRY in TLB */
> +		if (use_lmb) {
> +			if (lmb_is_reserved_flags(i << MMU_SECTION_SHIFT, LMB_NOMAP))
> +				continue;
> +			if (gd->ram_top && addr >= gd->ram_top)
> +				option = 0; /* INVALID ENTRY in TLB */
> +		}
>  		set_section_dcache(i, option);
>  	}
>  }


Hi Marek

Reviewed-by: Patrice Chotard <patrice.chotard at foss.st.com>
Tested-by: Patrice Chotard <patrice.chotard at foss.st.com>

Tested on stm32mp135f-dk and stm32mp157c-dk2 boards.

Thanks
Patrice


More information about the U-Boot mailing list