On 17.10.23 17:17, Mark Kettenis wrote:
From: Heinrich Schuchardt <heinrich.schucha...@canonical.com>
Date: Tue, 17 Oct 2023 10:55:07 +0200
Forward and backward compatibility of Linux kernel device-trees is
sometimes missing. One solution approach is to load a kernel specific
device-tree. This can either be done via a U-Boot scripts (like the one
generated by Debian package flash-kernel or by a boot loader like GRUB.
The boot loader approach currently requires to know the device-tree name
before first boot which makes it unusable for generic images.
Even if the device trees are compatible, we often see that additonal
nodes get added at a later stage. So the ability to load a more
complete device tree for the OS is useful and means a user doesn't
necessarily need to update U-Boot to make additional devices work in
their OS.
OpenBSD should call the EFI_DT_FIXUP_PROTOCOL exposed by U-Boot after
loading device-trees.
https://github.com/U-Boot-EFI/EFI_DT_FIXUP_PROTOCOL
Expose the device-tree file name as EFI variable FdtFile.
This will allow bootloaders to load a kernel specific device-tree.
Right. I'm considering adding support for loading device trees to the
OpenBSD bootloader and this feature would be really useful since it
would allow me to automagically load the right device tree from the
root filesystem of the OS.
Is my understanding right that this is a null-terminated (8-bit) ASCII
string? Can this variable be documented somewhere, maybe together
with the EFI_DT_FIXUP_PROTOCOL?
Yes, the string is NUL terminated ASCII. The best place for
documentation would be the EBBR specification.
Best regards
Heinrich
Signed-off-by: Heinrich Schuchardt <heinrich.schucha...@canonical.com>
---
lib/efi_loader/efi_setup.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c
index e6de685e87..b24feb94dc 100644
--- a/lib/efi_loader/efi_setup.c
+++ b/lib/efi_loader/efi_setup.c
@@ -26,6 +26,27 @@ void __weak allow_unaligned(void)
{
}
+/**
+ * efi_init_fdtfile() - set EFI variable FdtFile
+ *
+ * Return: status code
+ */
+static efi_status_t efi_init_fdtfile(void)
+{
+ char *val;
+
+ val = env_get("fdtfile");
+ if (!val)
+ return EFI_SUCCESS;
+
+ return efi_set_variable_int(u"FdtFile",
+ &efi_u_boot_guid,
+ EFI_VARIABLE_BOOTSERVICE_ACCESS |
+ EFI_VARIABLE_RUNTIME_ACCESS |
+ EFI_VARIABLE_READ_ONLY,
+ strlen(val) + 1, val, false);
+}
+
/**
* efi_init_platform_lang() - define supported languages
*
@@ -250,6 +271,11 @@ efi_status_t efi_init_obj_list(void)
if (ret != EFI_SUCCESS)
goto out;
+ /* Define EFI variable FdtFile */
+ ret = efi_init_fdtfile();
+ if (ret != EFI_SUCCESS)
+ goto out;
+
/* Indicate supported features */
ret = efi_init_os_indications();
if (ret != EFI_SUCCESS)
--
2.40.1