
On Wed, Jan 25, 2023 at 04:38:53PM +0100, Heinrich Schuchardt wrote:
On 1/25/23 04:11, Simon Glass wrote:
For EFI, the distro boot scripts search in three different directories for the .dtb file. The SOC-based filename fallback is supported only for 32-bit ARM.
Adjust the code to mirror this behaviour.
Signed-off-by: Simon Glass sjg@chromium.org Suggested-by: Mark Kettenis kettenis@openbsd.org
boot/bootmeth_efi.c | 63 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 9 deletions(-)
diff --git a/boot/bootmeth_efi.c b/boot/bootmeth_efi.c index 67c972e3fe4..f9544846e68 100644 --- a/boot/bootmeth_efi.c +++ b/boot/bootmeth_efi.c @@ -147,25 +147,57 @@ static int distro_efi_check(struct udevice *dev, struct bootflow_iter *iter) return 0; } -static void distro_efi_get_fdt_name(char *fname, int size) +/**
- distro_efi_get_fdt_name() - Get the filename for reading the .dtb file
- @fname: Place to put filename
- @size: Max size of filename
- @seq: Sequence number, to cycle through options (0=first)
- Returns: 0 on success, -ENOENT if the "fdtfile" env var does not exist,
- -EINVAL if there are no more options
- */
+static int distro_efi_get_fdt_name(char *fname, int size, int seq) { const char *fdt_fname;
- const char *prefix;
- /* select the prefix */
- switch (seq) {
- case 0:
/* this is the default */
prefix = "/dtb";
break;
- case 1:
prefix = "";
break;
- case 2:
prefix = "/dtb/current";
break;
- default:
return log_msg_ret("pref", -EINVAL);
- } fdt_fname = env_get("fdtfile"); if (fdt_fname) {
snprintf(fname, size, "dtb/%s", fdt_fname);
log_debug("Using device tree: %s\n", fname);snprintf(fname, size, "%s/%s", prefix, fdt_fname);
- } else {
- /* Use this fallback only for 32-bit ARM */
- } else if (IS_ENABLED(CONFIG_ARM) && !IS_ENABLED(CONFIG_ARM64)) { const char *soc = env_get("soc"); const char *board = env_get("board"); const char *boardver = env_get("boardver"); /* cf the code in label_boot() which seems very complex */
snprintf(fname, size, "dtb/%s%s%s%s.dtb",
log_debug("Using default device tree: %s\n", fname);snprintf(fname, size, "%s/%s%s%s%s.dtb", prefix, soc ? soc : "", soc ? "-" : "", board ? board : "", boardver ? boardver : "");
- } else {
}return log_msg_ret("env", -ENOENT);
- return 0; } static int distro_efi_read_bootflow_file(struct udevice *dev,
@@ -174,7 +206,7 @@ static int distro_efi_read_bootflow_file(struct udevice *dev, struct blk_desc *desc = NULL; ulong fdt_addr, size; char fname[256];
- int ret;
- int ret, seq; /* We require a partition table */ if (!bflow->part)
@@ -196,13 +228,22 @@ static int distro_efi_read_bootflow_file(struct udevice *dev, if (ret) return log_msg_ret("read", -EINVAL);
- distro_efi_get_fdt_name(fname, sizeof(fname));
- fdt_addr = env_get_hex("fdt_addr_r", 0);
- /* try the various available names */
- ret = -ENOENT;
- for (seq = 0; ret; seq++)
There are boards that don't have a dtb file available and that is ok. Don't loop past seq = 2.
{
ret = distro_efi_get_fdt_name(fname, sizeof(fname), seq);
if (ret)
return log_msg_ret("nam", ret);
ret = bootmeth_common_read_file(dev, bflow, fname, fdt_addr,
&size);
- }
- bflow->fdt_fname = strdup(fname); if (!bflow->fdt_fname) return log_msg_ret("fil", -ENOMEM);
This should not be an error. The Distroboot fallback is the device-tree at $fdtcontroladdr.
But it should note that it's using that because that's still quite often an unexpected feature to people.