
On 1/25/23 17:15, Tom Rini wrote:
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);
snprintf(fname, size, "%s/%s", prefix, fdt_fname); log_debug("Using device tree: %s\n", 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",
snprintf(fname, size, "%s/%s%s%s%s.dtb", prefix, soc ? soc : "", soc ? "-" : "", board ? board : "", boardver ? boardver : ""); log_debug("Using default device tree: %s\n", fname);
- } 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.
On QEMU it is just what is needed. Other boards supply the device-tree via TF-A or OpenSBI. We should not start breaking boards.
A message "fil: returning err= -12" signals not caring about users.
Best regards
Heinrich