[PATCH 1/1] efi_loader: run bootdev_hunt() to find ESP

Jonas Karlman jonas at kwiboo.se
Thu Nov 14 21:25:52 CET 2024


Hi Heinrich,

On 2024-11-13 20:55, Heinrich Schuchardt wrote:
> Some hard devices need specific routines to scan for block devices,
> e.g. NVMe (nvme scan), SCSI (scsi start).
> 
> Invoke bootdev_hunt() to find all block devices.
> 
> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
> ---
>  lib/efi_loader/efi_setup.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c
> index aa59bc7779d..8e0ff16f3eb 100644
> --- a/lib/efi_loader/efi_setup.c
> +++ b/lib/efi_loader/efi_setup.c
> @@ -7,6 +7,7 @@
>  
>  #define LOG_CATEGORY LOGC_EFI
>  
> +#include <bootdev.h>
>  #include <efi_loader.h>
>  #include <efi_variable.h>
>  #include <log.h>
> @@ -228,6 +229,13 @@ efi_status_t efi_init_obj_list(void)
>  	 * Probe block devices to find the ESP.
>  	 * efi_disks_register() must be called before efi_init_variables().
>  	 */
> +	if (CONFIG_IS_ENABLED(BOOTSTD)) {
> +		int r;
> +
> +		r = bootdev_hunt(NULL, 0);
> +		if (r)
> +			log_debug("No boot device available\n");
> +	}
>  	ret = efi_disks_register();
>  	if (ret != EFI_SUCCESS)
>  		goto out;

This is causing significant slower boot when trying to boot using
extlinux (or script) from mmc device on Rockchip, this will cause all
slow devices to be initialized before a quick mmc boot, e.g. pci init,
usb start and dhcp due to efi_mgr being the global bootmeth.

With this patch applied:

  U-Boot 2025.01-rc2 (Nov 14 2024 - 20:09:17 +0000)
  
  Model: Radxa ROCK 3B
  SoC:   RK3568J
  DRAM:  8 GiB (effective 7.7 GiB)
  PMIC:  RK809 (on=0x40, off=0x00)
  Core:  341 devices, 33 uclasses, devicetree: separate
  MMC:   mmc at fe000000: 2, mmc at fe2b0000: 1, mmc at fe310000: 0
  Loading Environment from nowhere... OK
  In:    serial at fe660000
  Out:   serial at fe660000
  Err:   serial at fe660000
  Net:   eth1: ethernet at fe010000, eth0: ethernet at fe2a0000
  Hit any key to stop autoboot:  0
  Scanning for bootflows in all bootdevs
  Seq  Method       State   Uclass    Part  Name                      Filename
  ---  -----------  ------  --------  ----  ------------------------  ----------------
  Scanning global bootmeth 'efi_mgr':
  pcie_dw_rockchip pcie at fe260000: PCIe-0 Link Fail
  pcie_dw_rockchip pcie at fe280000: PCIe-1 Link Fail
  ethernet at fe2a0000 Waiting for PHY auto negotiation to complete......... TIMEOUT !
  phy_startup() failed: -110
  FAILED: -110
  ethernet at fe010000 Waiting for PHY auto negotiation to complete......... TIMEOUT !
  phy_startup() failed: -110
  FAILED: -110
  BOOTP broadcast 1
  BOOTP broadcast 2
  BOOTP broadcast 3
  BOOTP broadcast 4
  BOOTP broadcast 5
  BOOTP broadcast 6
  BOOTP broadcast 7
  BOOTP broadcast 8
  BOOTP broadcast 9
  BOOTP broadcast 10
  BOOTP broadcast 11
  BOOTP broadcast 12
  BOOTP broadcast 13
  BOOTP broadcast 14
  BOOTP broadcast 15
  BOOTP broadcast 16
  BOOTP broadcast 17
  
  Retry time exceeded; starting again
  pcie_dw_rockchip pcie at fe260000: PCIe-0 Link Fail
  pcie_dw_rockchip pcie at fe280000: PCIe-1 Link Fail
  pcie_dw_rockchip pcie at fe260000: PCIe-0 Link Fail
  pcie_dw_rockchip pcie at fe280000: PCIe-1 Link Fail
  scanning bus for devices...
  Bus usb at fd000000: Register 2000140 NbrPorts 2
  Starting the controller
  USB XHCI 1.10
  Bus usb at fd800000: USB EHCI 1.00
  scanning bus usb at fd000000 for devices... 1 USB Device(s) found
  scanning bus usb at fd800000 for devices... 2 USB Device(s) found
  No boot device available
  Card did not respond to voltage select! : -110
  Cannot persist EFI variables without system partition
    0  efi_mgr      ready   (none)       0  <NULL>
  ** Booting bootflow '<NULL>' with efi_mgr
  Loading Boot0000 'mmc 1' failed
  Loading Boot0001 'mmc 0' failed
  EFI boot manager: Cannot load any image
  Boot failed (err=-14)
  Scanning bootdev 'mmc at fe2b0000.bootdev':
    1  extlinux     ready   mmc          1  mmc at fe2b0000.bootdev.part /extlinux/extlinux.conf
  ** Booting bootflow 'mmc at fe2b0000.bootdev.part_1' with extlinux
  1:      linux
  Retrieving file: /Image.gz
  Retrieving file: /initramfs.cpio.gz
     Uncompressing Kernel Image to 0
  ## Flattened Device Tree blob at eded3690
     Booting using the fdt blob at 0xeded3690
  Working FDT set to eded3690
     Loading Ramdisk to ecb0d000, end ecea1d3c ... OK
     Loading Device Tree to 00000000ecaf5000, end 00000000ecb0c6d7 ... OK
  Working FDT set to ecaf5000
  
  Starting kernel ...

I guess we can always disable efi_mgr on Rockchip, similar to sunxi, to
restore pre stdboot behavior.

Regards,
Jonas



More information about the U-Boot mailing list