[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 1/2] arm: lookup devicetree via efi
From: |
Gerd Hoffmann |
Subject: |
[PATCH 1/2] arm: lookup devicetree via efi |
Date: |
Tue, 19 Jul 2016 14:45:44 +0200 |
arm64 already does this, arm should support it too.
Signed-off-by: Gerd Hoffmann <address@hidden>
---
grub-core/loader/arm/linux.c | 42 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/grub-core/loader/arm/linux.c b/grub-core/loader/arm/linux.c
index 5b39f02..106cfc3 100644
--- a/grub-core/loader/arm/linux.c
+++ b/grub-core/loader/arm/linux.c
@@ -221,6 +221,31 @@ failure:
return grub_error (GRUB_ERR_BAD_ARGUMENT, "unable to prepare FDT");
}
+#ifdef GRUB_MACHINE_EFI
+/* from ../arm64/fdt.c */
+static void *
+get_firmware_fdt (void)
+{
+ grub_efi_configuration_table_t *tables;
+ grub_efi_guid_t fdt_guid = GRUB_EFI_DEVICE_TREE_GUID;
+ void *firmware_fdt = NULL;
+ unsigned int i;
+
+ /* Look for FDT in UEFI config tables. */
+ tables = grub_efi_system_table->configuration_table;
+
+ for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
+ if (grub_memcmp (&tables[i].vendor_guid, &fdt_guid, sizeof (fdt_guid)) ==
0)
+ {
+ firmware_fdt = tables[i].vendor_table;
+ grub_dprintf ("linux", "found registered FDT @ %p\n", firmware_fdt);
+ break;
+ }
+
+ return firmware_fdt;
+}
+#endif
+
static grub_err_t
linux_boot (void)
{
@@ -237,6 +262,23 @@ linux_boot (void)
(char *) fdt_addr,
(char *) fdt_addr + 1);
+#ifdef GRUB_MACHINE_EFI
+ if (!fdt_valid) {
+ void *ptr = get_firmware_fdt();
+ int size = ptr ? grub_fdt_get_totalsize(ptr) : 0;
+ int extra = grub_strlen (linux_args) + 0x100;
+ if (ptr && size) {
+ fdt_addr = grub_efi_allocate_loader_memory (LINUX_FDT_PHYS_OFFSET, size
+ extra);
+ if (fdt_addr) {
+ grub_memcpy (fdt_addr, ptr, size);
+ fdt_valid = (fdt_addr && grub_fdt_check_header_nosize (fdt_addr) == 0);
+ grub_dprintf ("loader", "firmware fdt: memcpy(%p, %p, %d)\n",
+ fdt_addr, ptr, size);
+ }
+ }
+ }
+#endif
+
if (!fdt_valid && machine_type == GRUB_ARM_MACHINE_TYPE_FDT)
return grub_error (GRUB_ERR_FILE_NOT_FOUND,
N_("device tree must be supplied (see `devicetree'
command)"));
--
1.8.3.1