[PATCH v2 1/1] efi_loader: put device tree into EfiACPIReclaimMemory
Grant Likely
grant.likely at arm.com
Tue May 12 16:18:20 CEST 2020
On 11/05/2020 12:55, Heinrich Schuchardt wrote:
> On 11.05.20 10:48, Grant Likely wrote:
>> On 07/05/2020 19:19, Heinrich Schuchardt wrote:
>>> According to the UEFI spec ACPI tables should be placed in
>>> EfiACPIReclaimMemory. Let's do the same with the device tree.
>>>
>>> Suggested-by: Ard Biesheuvel <ardb at kernel.org>
>>> Cc: Grant Likely <grant.likely at arm.com>
>>> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
>>> ---
>>> v2:
>>> adjust the unit test
>>
>> Is there any impact to changing the memory type for current users? Does
>> the kernel currently expect the EFI_BOOT_SERVICES_DATA memory type? What
>> happens if Grub or another EFI application replaces the DTB table? Will
>> it try to use a different memory type, and will that matter?
>
> If we are using GRUB, linux_boot() allocates EFI_LOADER_DATA memory and
> copies the FDT to it. When the devicetree command is used GRUB also
> allocates EFI_LOADER_DATA.
>
> So changes in U-Boot have no effect on what Linux sees if booted via GRUB.
>
> Both EFI_BOOT_SERVICES_DATA and EFI_LOADER_DATA are meant to be gone
> past ExitBootServices(). EfiACPIReclaimMemory is were the UEFI payload
> is adviced to consider if keeping the memory at runtime is needed.
>
> The current patch therefore makes no difference to Linux before
> ExitBootServices(). A side effect could be that Linux unnecessarily
> keeps the EfiACPIReclaimMemory instead of reusing it. But Linux's
> is_usable_memory() in drivers/firmware/efi/arm-init.c treats
> EFI_ACPI_RECLAIM_MEMORY, EFI_ACPI_RECLAIM_MEMORY,
> EFI_ACPI_RECLAIM_MEMORY just the same.
Okay. Works for me.
g.
> @Daniel, Leif
> A patch for the EBBR specification suggests to use
> EFI_ACPI_RECLAIM_MEMORY for the devicetree passed to Linux. Please,
> consider if you would apply this in GRUB too.
>
> Best regards
>
> Heinrich
>
>>
>> g.
>>
>>> ---
>>> cmd/bootefi.c | 4 ++--
>>> lib/efi_selftest/efi_selftest_memory.c | 4 ++--
>>> 2 files changed, 4 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/cmd/bootefi.c b/cmd/bootefi.c
>>> index 54b4b8f984..06573b14e9 100644
>>> --- a/cmd/bootefi.c
>>> +++ b/cmd/bootefi.c
>>> @@ -127,13 +127,13 @@ static efi_status_t copy_fdt(void **fdtp)
>>> new_fdt_addr = (uintptr_t)map_sysmem(fdt_ram_start + 0x7f00000 +
>>> fdt_size, 0);
>>> ret = efi_allocate_pages(EFI_ALLOCATE_MAX_ADDRESS,
>>> - EFI_BOOT_SERVICES_DATA, fdt_pages,
>>> + EFI_ACPI_RECLAIM_MEMORY, fdt_pages,
>>> &new_fdt_addr);
>>> if (ret != EFI_SUCCESS) {
>>> /* If we can't put it there, put it somewhere */
>>> new_fdt_addr = (ulong)memalign(EFI_PAGE_SIZE, fdt_size);
>>> ret = efi_allocate_pages(EFI_ALLOCATE_MAX_ADDRESS,
>>> - EFI_BOOT_SERVICES_DATA, fdt_pages,
>>> + EFI_ACPI_RECLAIM_MEMORY, fdt_pages,
>>> &new_fdt_addr);
>>> if (ret != EFI_SUCCESS) {
>>> printf("ERROR: Failed to reserve space for FDT\n");
>>> diff --git a/lib/efi_selftest/efi_selftest_memory.c
>>> b/lib/efi_selftest/efi_selftest_memory.c
>>> index e71732dc6d..4d32a28006 100644
>>> --- a/lib/efi_selftest/efi_selftest_memory.c
>>> +++ b/lib/efi_selftest/efi_selftest_memory.c
>>> @@ -176,9 +176,9 @@ static int execute(void)
>>> /* Check memory reservation for the device tree */
>>> if (fdt_addr &&
>>> find_in_memory_map(map_size, memory_map, desc_size, fdt_addr,
>>> - EFI_BOOT_SERVICES_DATA) != EFI_ST_SUCCESS) {
>>> + EFI_ACPI_RECLAIM_MEMORY) != EFI_ST_SUCCESS) {
>>> efi_st_error
>>> - ("Device tree not marked as boot services data\n");
>>> + ("Device tree not marked as ACPI reclaim memory\n");
>>> return EFI_ST_FAILURE;
>>> }
>>> return EFI_ST_SUCCESS;
>>> --
>>> 2.26.2
>>>
>
More information about the U-Boot
mailing list