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

Patrice CHOTARD patrice.chotard at foss.st.com
Fri Dec 5 13:54:19 CET 2025



On 12/3/25 15:52, Patrice CHOTARD wrote:
> 
> 
> 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
Applied to u-boot-stm32/next

Thanks
Patrice


More information about the U-Boot mailing list