[PATCH 1/1] efi_loader: expose the device-tree file name

Heinrich Schuchardt heinrich.schuchardt at canonical.com
Wed Oct 18 01:06:13 CEST 2023


On 17.10.23 17:17, Mark Kettenis wrote:
>> From: Heinrich Schuchardt <heinrich.schuchardt at 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.schuchardt at 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
>>
>>



More information about the U-Boot mailing list