Skip to content
Snippets Groups Projects
Commit ad0c1a3d authored by Alexander Graf's avatar Alexander Graf Committed by Tom Rini
Browse files

efi_loader: Put fdt into convenient location


The uEFI spec doesn't dictate where the device tree should live at, but
legacy 32bit ARM grub2 has some assumptions that it may stay at its place
when it's already loaded by the firmware.

So let's put it somewhere where Linux that comes after would happily find
it - around the recommended 128MB line.

Signed-off-by: default avatarAlexander Graf <agraf@suse.de>
Tested-by: default avatarAndreas Färber <afaerber@suse.de>
parent 36c37a84
Branches
Tags
No related merge requests found
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
#include <errno.h> #include <errno.h>
#include <libfdt.h> #include <libfdt.h>
#include <libfdt_env.h> #include <libfdt_env.h>
#include <malloc.h> #include <memalign.h>
#include <asm/global_data.h> #include <asm/global_data.h>
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
...@@ -104,12 +104,34 @@ static struct efi_object bootefi_device_obj = { ...@@ -104,12 +104,34 @@ static struct efi_object bootefi_device_obj = {
static void *copy_fdt(void *fdt) static void *copy_fdt(void *fdt)
{ {
u64 fdt_size = fdt_totalsize(fdt); u64 fdt_size = fdt_totalsize(fdt);
unsigned long fdt_ram_start = -1L, fdt_pages;
u64 new_fdt_addr;
void *new_fdt; void *new_fdt;
int i;
/* Give us 64kb breathing room */ for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
fdt_size += 64 * 1024; u64 ram_start = gd->bd->bi_dram[i].start;
u64 ram_size = gd->bd->bi_dram[i].size;
new_fdt = malloc(fdt_size); if (!ram_size)
continue;
if (ram_start < fdt_ram_start)
fdt_ram_start = ram_start;
}
/* Give us at least 4kb breathing room */
fdt_size = ALIGN(fdt_size + 4096, 4096);
fdt_pages = fdt_size >> EFI_PAGE_SHIFT;
/* Safe fdt location is at 128MB */
new_fdt_addr = fdt_ram_start + (128 * 1024 * 1024) + fdt_size;
if (efi_allocate_pages(1, EFI_BOOT_SERVICES_DATA, fdt_pages,
&new_fdt_addr) != EFI_SUCCESS) {
/* If we can't put it there, put it somewhere */
new_fdt_addr = (ulong)memalign(4096, fdt_size);
}
new_fdt = (void*)(ulong)new_fdt_addr;
memcpy(new_fdt, fdt, fdt_totalsize(fdt)); memcpy(new_fdt, fdt, fdt_totalsize(fdt));
fdt_set_totalsize(new_fdt, fdt_size); fdt_set_totalsize(new_fdt, fdt_size);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment