[U-Boot] [PATCH] distro: load FDT from any partition on boot device

Alexander Graf agraf at suse.de
Thu Oct 5 12:39:32 UTC 2017



On 04.10.17 22:16, Rob Clark wrote:
> In the EFI_LOADER boot path, we were only checking the FAT partition
> containing the EFI payload for dtb files.  But this is somewhat of a
> fiction.  In reality there will be one small (V)FAT partition containing
> grub (or whatever the payload may be), and a second boot partition
> containing kernel/initrd/fdt (typically ext4).  It is this second
> partition where we should be looking for a FDT to load.
> 
> So instead scan all the partitions of the disk containing the EFI
> payload.  This matches where grub looks for kernel/initrd (barring
> custom grub.cfg, in which case the user can use grub's 'devicetree'
> command to load the correct FDT).
> 
> The other option is somehow passing the ${fdtfile} to grub so that it
> can load the FDT based on selected kernel version location (which grub
> knows) and SoC/board specific ${fdtfile} (which grub does not know).
> 
> Signed-off-by: Rob Clark <robdclark at gmail.com>
> ---
>   include/config_distro_bootcmd.h | 34 +++++++++++++++++++++++-----------
>   1 file changed, 23 insertions(+), 11 deletions(-)
> 
> diff --git a/include/config_distro_bootcmd.h b/include/config_distro_bootcmd.h
> index e232a62996..58b2fe3371 100644
> --- a/include/config_distro_bootcmd.h
> +++ b/include/config_distro_bootcmd.h
> @@ -126,25 +126,37 @@
>   		"fi\0"                                                    \
>   	\
>   	"load_efi_dtb="                                                   \
> -		"load ${devtype} ${devnum}:${distro_bootpart} "           \
> -			"${fdt_addr_r} ${prefix}${efi_fdtfile}\0"         \
> +		"load ${devtype} ${devnum}:${dtb_devp} "                  \
> +			"${fdt_addr_r} ${prefix}${efi_fdtfile} && "       \
> +		"run boot_efi_binary\0"                                   \
>   	\
>   	"efi_dtb_prefixes=/ /dtb/ /dtb/current/\0"                        \
> -	"scan_dev_for_efi="                                               \
> +	"scan_dev_for_dtb="                                               \
>   		"setenv efi_fdtfile ${fdtfile}; "                         \
>   		BOOTENV_EFI_SET_FDTFILE_FALLBACK                          \
> -		"for prefix in ${efi_dtb_prefixes}; do "                  \
> -			"if test -e ${devtype} "                          \
> -					"${devnum}:${distro_bootpart} "   \
> -					"${prefix}${efi_fdtfile}; then "  \
> -				"run load_efi_dtb; "                      \
> -			"fi;"                                             \
> -		"done;"                                                   \
> +		"part list ${devtype} ${devnum} dtb_devplist; "           \

part list spawns 128 error messages for me on a USB stick with an iso 
dd'ed onto it. I'm not sure we want to do that twice during boot.

> +		"env exists dtb_devplist || setenv dtb_devplist "         \
> +			"${distro_bootpart}; "                            \
> +		"for dtb_devp in ${dtb_devplist}; do "                    \
> +			"for prefix in ${efi_dtb_prefixes}; do "          \
> +				"if test -e ${devtype} "                  \
> +						"${devnum}:${dtb_devp} "  \
> +						"${prefix}${efi_fdtfile};"\
> +						" then "                  \
> +					"echo Found DTB ${devtype} "      \
> +						"${devnum}:${dtb_devp} "  \
> +						"${prefix}${efi_fdtfile};"\
> +					"run load_efi_dtb; "              \
> +				"fi;"                                     \
> +			"done; "                                          \
> +		"done; "                                                  \
> +		"run boot_efi_binary\0"                                   \

This will run the EFI binary twice if we find a DT on disk. Or really 
nr_dtb_parts_found + 1 times :).

We also don't want to loop through 50 other partitions if the 1st one 
already contained a dtb. Instead the loop really should end after the 
first successful boot attempt on that device.

(other distro targets should still get boot attempts, you may want to 
exit grub from dhcp to enter grub on scsi).

Furthermore I remember that Andreas worked in that area too before, 
let's make sure to CC him.


Alex


More information about the U-Boot mailing list