[RFC PATCH 1/1] efi_loader: Call efi_init_early() even earlier

Heinrich Schuchardt xypron.glpk at gmx.de
Mon Jan 13 08:29:46 CET 2025


On 1/13/25 00:58, Sam Protsenko wrote:
> At least in case of the E850-96 board all DM devices are probed in
> initr_dm(), before efi_init_early() call. Eventually efi_bl_init()
> registers the EVT_DM_POST_PROBE_EVENT event, but all DM devices
> (including eMMC) are already probed by then, so no events are caught.
> Because of that efi_disk_probe() is never called, so EFI disk objects
> are not created and EFI subsystem can't function correctly, showing the
> next symptoms:
>    - 'efidebug dh' output shows nothing
>    - attempt to add boot devices in 'eficonfig' shows this message:
>      "No block device found!"
>    - 'bootefi selftest $fdtcontroladdr' shows this warning:
>      "Cannot persist EFI variables without system partition"
>    - booting GRUB with 'bootefi' runs minimal GRUB shell which doesn't
>      see any block devices as well, probably because EFI vars weren't
>      passed
>
> Move efi_init_early() call before initr_dm() in init_sequence_r[] so
> that EVT_DM_POST_PROBE_EVENT in efi_bl_init() can actually catch all DM
> probe events and create corresponding EFI objects. That fixes the
> described problem and makes it possible to run EFI apps like GRUB
> correctly, add entries in 'eficonfig', and makes 'efivar --list' command
> in Linux rootfs actually show EFI variables.
>
> This patch doubles down on the approach taken in commit 5e847f7729b3
> ("efi_loader: call efi_init_early() earlier"), taking a different path
> than another fix proposed earlier in "Pull-request efi-2025-01-rc4" [1].
> There was also a related discussion in the "efi_loader: more tightly
> integrate UEFI disks to driver model" patch series [2].

There are two DM functions:

- dm_initr
- dm_initr_dm_devices

Before dm_initr() gd->dm_root points to the pre-relocation tree. So I
guess we should not register the DM events for EFI before that point.

Shouldn't the DM devices only be scanned in initr_dm_devices? Why is
E850-96 doing so in dm_initr?

@Simon
We really need to document the dm_initr* functions. Could you, please,
suggest code comments to be added common/board_r.c.

Please, also describe enum bootstage_id including
BOOTSTAGE_ID_ACCUM_DM_R. I am clueless why the value exists.

Do you have an idea why dm_init_and_scan() would cause probing? Why is
this function called in dm_initr() and not in initr_dm_devices()?

Best regards

Heinrich

>
> [1] https://lore.kernel.org/u-boot/8910d434-2d77-425f-aa81-8eb803078aef@gmx.de/
> [2] https://lists.denx.de/pipermail/u-boot/2022-April/481753.html
>
> Fixes: 5e847f7729b3 ("efi_loader: call efi_init_early() earlier")
> Signed-off-by: Sam Protsenko <semen.protsenko at linaro.org>
> ---
>   common/board_r.c | 12 +++++-------
>   1 file changed, 5 insertions(+), 7 deletions(-)
>
> diff --git a/common/board_r.c b/common/board_r.c
> index f63c6aed4d5d..323a56c2018c 100644
> --- a/common/board_r.c
> +++ b/common/board_r.c
> @@ -617,6 +617,11 @@ static init_fnc_t init_sequence_r[] = {
>   #endif
>   #ifdef CONFIG_SYS_NONCACHED_MEMORY
>   	noncached_init,
> +#endif
> +	initr_lmb,
> +#ifdef CONFIG_EFI_LOADER
> +	efi_memory_init,
> +	efi_init_early,
>   #endif
>   	initr_of_live,
>   #ifdef CONFIG_DM
> @@ -636,10 +641,6 @@ static init_fnc_t init_sequence_r[] = {
>   	 */
>   #ifdef CONFIG_CLOCKS
>   	set_cpu_clk_info, /* Setup clock information */
> -#endif
> -	initr_lmb,
> -#ifdef CONFIG_EFI_LOADER
> -	efi_memory_init,
>   #endif
>   #ifdef CONFIG_BINMAN_FDT
>   	initr_binman,
> @@ -684,9 +685,6 @@ static init_fnc_t init_sequence_r[] = {
>   	/* initialize higher level parts of CPU like time base and timers */
>   	cpu_init_r,
>   #endif
> -#ifdef CONFIG_EFI_LOADER
> -	efi_init_early,
> -#endif
>   #ifdef CONFIG_CMD_NAND
>   	initr_nand,
>   #endif



More information about the U-Boot mailing list