grub2/0001-arm64-Move-firmware-fdt-search-into-global-function.patch
Michael Chang 2e14e5acb8 Accepting request 365018 from home:algraf:arm-efi
This is another attempt at getting U-Boot EFI based boot support work
with grub2.

The major change to the last sr is that this time around I dropped the
patch to force uuid setting, since with newer u-boot code we don't need
that anymore :).

Thanks a lot for the review!

Alex

- Make mkconfig search for zImage on arm
  * grub2-mkconfig-arm.patch

- Add support to directly pass an EFI FDT table to a kernel on 32bit arm
  * 0001-arm64-Move-firmware-fdt-search-into-global-function.patch
  * 0002-arm-efi-Use-fdt-from-firmware-when-available.patch

OBS-URL: https://build.opensuse.org/request/show/365018
OBS-URL: https://build.opensuse.org/package/show/Base:System/grub2?expand=0&rev=207
2016-03-04 02:44:35 +00:00

107 lines
3.1 KiB
Diff

From 3750bd8d7cf8a7a7bbbda3354bea64f86cb34910 Mon Sep 17 00:00:00 2001
From: Alexander Graf <agraf@suse.de>
Date: Mon, 4 Jan 2016 22:00:04 +0100
Subject: [PATCH 1/2] arm64: Move firmware fdt search into global function
Searching for a device tree that EFI passes to us via configuration tables
is nothing architecture specific. Move it into generic code.
Signed-off-by: Alexander Graf <agraf@suse.de>
---
grub-core/kern/efi/init.c | 22 ++++++++++++++++++++++
grub-core/loader/arm64/fdt.c | 24 +-----------------------
include/grub/efi/efi.h | 2 ++
3 files changed, 25 insertions(+), 23 deletions(-)
diff --git a/grub-core/kern/efi/init.c b/grub-core/kern/efi/init.c
index e9c85de..fb90ecd 100644
--- a/grub-core/kern/efi/init.c
+++ b/grub-core/kern/efi/init.c
@@ -72,6 +72,28 @@ grub_machine_get_bootlocation (char **device, char **path)
}
}
+void *
+grub_efi_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;
+}
+
void
grub_efi_fini (void)
{
diff --git a/grub-core/loader/arm64/fdt.c b/grub-core/loader/arm64/fdt.c
index 5202c14..db49cf6 100644
--- a/grub-core/loader/arm64/fdt.c
+++ b/grub-core/loader/arm64/fdt.c
@@ -28,28 +28,6 @@
static void *loaded_fdt;
static void *fdt;
-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;
-}
-
void *
grub_fdt_load (grub_size_t additional_size)
{
@@ -65,7 +43,7 @@ grub_fdt_load (grub_size_t additional_size)
if (loaded_fdt)
raw_fdt = loaded_fdt;
else
- raw_fdt = get_firmware_fdt();
+ raw_fdt = grub_efi_get_firmware_fdt();
size =
raw_fdt ? grub_fdt_get_totalsize (raw_fdt) : GRUB_FDT_EMPTY_TREE_SZ;
diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h
index 0e6fd86..2acf85e 100644
--- a/include/grub/efi/efi.h
+++ b/include/grub/efi/efi.h
@@ -81,6 +81,8 @@ extern void (*EXPORT_VAR(grub_efi_net_config)) (grub_efi_handle_t hnd,
char **device,
char **path);
+void *EXPORT_FUNC(grub_efi_get_firmware_fdt)(void);
+
grub_addr_t grub_efi_modules_addr (void);
void grub_efi_mm_init (void);
--
2.7.1