diff mbox series

[v2] stm32mp: Reserve OPTEE area in EFI memory map

Message ID 20240422150645.1613198-1-patrice.chotard@foss.st.com
State Accepted
Delegated to: Patrick Delaunay
Headers show
Series [v2] stm32mp: Reserve OPTEE area in EFI memory map | expand

Commit Message

Patrice CHOTARD April 22, 2024, 3:06 p.m. UTC
Since commit 7b78d6438a2b3 ("efi_loader: Reserve unaccessible memory")
memory region above ram_top is tagged in EFI memory map as
EFI_BOOT_SERVICES_DATA.
In case of STM32MP1/STM32MP13 platforms, above ram_top, there is one
reserved-memory region tagged "no-map" dedicated to OP-TEE :
 _ addr=de000000 size=2000000 for stm32mp157x-dkx and stm32mp135f-dk
 _ addr=fe000000 size=2000000 for stm32mp157c-ev1

Before booting kernel, EFI memory map is first built, the OPTEE region is
tagged as EFI_BOOT_SERVICES_DATA and when reserving LMB, the tag LMB_NONE
is used.

Then after, the LMB are completed by boot_fdt_add_mem_rsv_regions()
which try to add again the same OPTEE region (addr=de000000 size=2000000
in case of stm32mp157x-dkx / stm32mp135f-dk or addr=fe000000 size=2000000
in case for stm2mp157c-ev1)
but now with LMB_NOMAP tag which produces the following error message :

 _ for stm32mp157x-dkx / stm32mp135f-dk :
  "ERROR: reserving fdt memory region failed (addr=de000000 size=2000000 flags=4)"

 _ for stm32mp157c-ev1 :
  "ERROR: reserving fdt memory region failed (addr=fe000000 size=2000000 flags=4)"

To avoid this, OPTEE area shouldn't be used by EFI, so we need to mark
it as reserved.

Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>

---

Changes in v2:
 _ update commit message by adding information about memory area
   dedicated for OPTEE for various STM32MP1/STM32MP13 boards.

 arch/arm/mach-stm32mp/dram_init.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

Comments

Patrick DELAUNAY June 14, 2024, 8:43 a.m. UTC | #1
Hi,

On 4/22/24 17:06, Patrice Chotard wrote:
> Since commit 7b78d6438a2b3 ("efi_loader: Reserve unaccessible memory")
> memory region above ram_top is tagged in EFI memory map as
> EFI_BOOT_SERVICES_DATA.
> In case of STM32MP1/STM32MP13 platforms, above ram_top, there is one
> reserved-memory region tagged "no-map" dedicated to OP-TEE :
>   _ addr=de000000 size=2000000 for stm32mp157x-dkx and stm32mp135f-dk
>   _ addr=fe000000 size=2000000 for stm32mp157c-ev1
>
> Before booting kernel, EFI memory map is first built, the OPTEE region is
> tagged as EFI_BOOT_SERVICES_DATA and when reserving LMB, the tag LMB_NONE
> is used.
>
> Then after, the LMB are completed by boot_fdt_add_mem_rsv_regions()
> which try to add again the same OPTEE region (addr=de000000 size=2000000
> in case of stm32mp157x-dkx / stm32mp135f-dk or addr=fe000000 size=2000000
> in case for stm2mp157c-ev1)
> but now with LMB_NOMAP tag which produces the following error message :
>
>   _ for stm32mp157x-dkx / stm32mp135f-dk :
>    "ERROR: reserving fdt memory region failed (addr=de000000 size=2000000 flags=4)"
>
>   _ for stm32mp157c-ev1 :
>    "ERROR: reserving fdt memory region failed (addr=fe000000 size=2000000 flags=4)"
>
> To avoid this, OPTEE area shouldn't be used by EFI, so we need to mark
> it as reserved.
>
> Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
>
> ---
>
> Changes in v2:
>   _ update commit message by adding information about memory area
>     dedicated for OPTEE for various STM32MP1/STM32MP13 boards.
>
>   arch/arm/mach-stm32mp/dram_init.c | 12 ++++++++++++
>   1 file changed, 12 insertions(+)
>
> diff --git a/arch/arm/mach-stm32mp/dram_init.c b/arch/arm/mach-stm32mp/dram_init.c
> index fb1208fc5d5..f67f54f2ae0 100644
> --- a/arch/arm/mach-stm32mp/dram_init.c
> +++ b/arch/arm/mach-stm32mp/dram_init.c
> @@ -7,6 +7,7 @@
>   
>   #include <common.h>
>   #include <dm.h>
> +#include <efi_loader.h>
>   #include <image.h>
>   #include <init.h>
>   #include <lmb.h>
> @@ -75,3 +76,14 @@ phys_addr_t board_get_usable_ram_top(phys_size_t total_size)
>   
>   	return reg + size;
>   }
> +
> +void efi_add_known_memory(void)
> +{
> +	if (IS_ENABLED(CONFIG_EFI_LOADER))
> +		/*
> +		 * Memory over ram_top is reserved to OPTEE.
> +		 * Declare to EFI only memory area below ram_top
> +		 */
> +		efi_add_memory_map(gd->ram_base, gd->ram_top - gd->ram_base,
> +				   EFI_CONVENTIONAL_MEMORY);
> +}

It seen like a temporary workaround after commit 7b78d6438a2b3
("efi_loader: Reserve unaccessible memory") to avoid warnings.

And it is working because in the default memory mapping
OP-TEE base address == RAM_TOP and the rest of memory is
used by OP-TEE tagged "no map" (protected by firewall)


Reviewed-by: Patrick Delaunay <patrick.delaunay@foss.st.com>

FYI: workaround because  the memory above ram_top is
      "already occupied by firmware" =
      and it is OP-TEE for STM32MP2 platform.

     For me the LMB type used by EFI in not correct for OP-TEE usage region
     with "no-map" tag in device tree=  see boot_fdt_add_mem_rsv_regions()
     for linux DT parsing

     and we have no way to indicated this LMB tag= LMB_NOMAP with EFI stack
     (with enum efi_memory_type ?)


     EFI_BOOT_SERVICES_DATA => doesn't means NOMAP flag for LMB....
     so something is missing in EFI side like EFI_BOOT_NOMAP  to be used in board
     implementation of efi_add_known_memory() ?


Thanks
Patrick
Patrice CHOTARD June 14, 2024, 11:53 a.m. UTC | #2
On 6/14/24 10:43, Patrick DELAUNAY wrote:
> Hi,
> 
> On 4/22/24 17:06, Patrice Chotard wrote:
>> Since commit 7b78d6438a2b3 ("efi_loader: Reserve unaccessible memory")
>> memory region above ram_top is tagged in EFI memory map as
>> EFI_BOOT_SERVICES_DATA.
>> In case of STM32MP1/STM32MP13 platforms, above ram_top, there is one
>> reserved-memory region tagged "no-map" dedicated to OP-TEE :
>>   _ addr=de000000 size=2000000 for stm32mp157x-dkx and stm32mp135f-dk
>>   _ addr=fe000000 size=2000000 for stm32mp157c-ev1
>>
>> Before booting kernel, EFI memory map is first built, the OPTEE region is
>> tagged as EFI_BOOT_SERVICES_DATA and when reserving LMB, the tag LMB_NONE
>> is used.
>>
>> Then after, the LMB are completed by boot_fdt_add_mem_rsv_regions()
>> which try to add again the same OPTEE region (addr=de000000 size=2000000
>> in case of stm32mp157x-dkx / stm32mp135f-dk or addr=fe000000 size=2000000
>> in case for stm2mp157c-ev1)
>> but now with LMB_NOMAP tag which produces the following error message :
>>
>>   _ for stm32mp157x-dkx / stm32mp135f-dk :
>>    "ERROR: reserving fdt memory region failed (addr=de000000 size=2000000 flags=4)"
>>
>>   _ for stm32mp157c-ev1 :
>>    "ERROR: reserving fdt memory region failed (addr=fe000000 size=2000000 flags=4)"
>>
>> To avoid this, OPTEE area shouldn't be used by EFI, so we need to mark
>> it as reserved.
>>
>> Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
>>
>> ---
>>
>> Changes in v2:
>>   _ update commit message by adding information about memory area
>>     dedicated for OPTEE for various STM32MP1/STM32MP13 boards.
>>
>>   arch/arm/mach-stm32mp/dram_init.c | 12 ++++++++++++
>>   1 file changed, 12 insertions(+)
>>
>> diff --git a/arch/arm/mach-stm32mp/dram_init.c b/arch/arm/mach-stm32mp/dram_init.c
>> index fb1208fc5d5..f67f54f2ae0 100644
>> --- a/arch/arm/mach-stm32mp/dram_init.c
>> +++ b/arch/arm/mach-stm32mp/dram_init.c
>> @@ -7,6 +7,7 @@
>>     #include <common.h>
>>   #include <dm.h>
>> +#include <efi_loader.h>
>>   #include <image.h>
>>   #include <init.h>
>>   #include <lmb.h>
>> @@ -75,3 +76,14 @@ phys_addr_t board_get_usable_ram_top(phys_size_t total_size)
>>         return reg + size;
>>   }
>> +
>> +void efi_add_known_memory(void)
>> +{
>> +    if (IS_ENABLED(CONFIG_EFI_LOADER))
>> +        /*
>> +         * Memory over ram_top is reserved to OPTEE.
>> +         * Declare to EFI only memory area below ram_top
>> +         */
>> +        efi_add_memory_map(gd->ram_base, gd->ram_top - gd->ram_base,
>> +                   EFI_CONVENTIONAL_MEMORY);
>> +}
> 
> It seen like a temporary workaround after commit 7b78d6438a2b3
> ("efi_loader: Reserve unaccessible memory") to avoid warnings.
> 
> And it is working because in the default memory mapping
> OP-TEE base address == RAM_TOP and the rest of memory is
> used by OP-TEE tagged "no map" (protected by firewall)
> 
> 
> Reviewed-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
> 
> FYI: workaround because  the memory above ram_top is
>      "already occupied by firmware" =
>      and it is OP-TEE for STM32MP2 platform.
> 
>     For me the LMB type used by EFI in not correct for OP-TEE usage region
>     with "no-map" tag in device tree=  see boot_fdt_add_mem_rsv_regions()
>     for linux DT parsing
> 
>     and we have no way to indicated this LMB tag= LMB_NOMAP with EFI stack
>     (with enum efi_memory_type ?)
> 
> 
>     EFI_BOOT_SERVICES_DATA => doesn't means NOMAP flag for LMB....
>     so something is missing in EFI side like EFI_BOOT_NOMAP  to be used in board
>     implementation of efi_add_known_memory() ?
> 
> 
> Thanks
> Patrick
> 
> 
> 
> 
> 


Applied to u-boot-stm32/next

Thanks
Patrice
diff mbox series

Patch

diff --git a/arch/arm/mach-stm32mp/dram_init.c b/arch/arm/mach-stm32mp/dram_init.c
index fb1208fc5d5..f67f54f2ae0 100644
--- a/arch/arm/mach-stm32mp/dram_init.c
+++ b/arch/arm/mach-stm32mp/dram_init.c
@@ -7,6 +7,7 @@ 
 
 #include <common.h>
 #include <dm.h>
+#include <efi_loader.h>
 #include <image.h>
 #include <init.h>
 #include <lmb.h>
@@ -75,3 +76,14 @@  phys_addr_t board_get_usable_ram_top(phys_size_t total_size)
 
 	return reg + size;
 }
+
+void efi_add_known_memory(void)
+{
+	if (IS_ENABLED(CONFIG_EFI_LOADER))
+		/*
+		 * Memory over ram_top is reserved to OPTEE.
+		 * Declare to EFI only memory area below ram_top
+		 */
+		efi_add_memory_map(gd->ram_base, gd->ram_top - gd->ram_base,
+				   EFI_CONVENTIONAL_MEMORY);
+}