bootflow: bootmeth_efi: Handle fdt not available.

While booting with efi, if fdt isn't available externally,
just use the built-in one.

Reviewed-by: Simon Glass <sjg@chromium.org>

Signed-off-by: Shantur Rathore <i@shantur.com>
This commit is contained in:
Shantur Rathore
2023-11-19 16:55:00 +00:00
committed by Tom Rini
parent e31317e161
commit 184fc0379d
2 changed files with 15 additions and 6 deletions

View File

@@ -313,6 +313,7 @@ static int distro_efi_try_bootflow_files(struct udevice *dev,
*/ */
} else { } else {
log_debug("No device tree available\n"); log_debug("No device tree available\n");
bflow->flags |= BOOTFLOWF_USE_BUILTIN_FDT;
} }
return 0; return 0;
@@ -391,6 +392,7 @@ static int distro_efi_read_bootflow_net(struct bootflow *bflow)
bflow->fdt_addr = fdt_addr; bflow->fdt_addr = fdt_addr;
} else { } else {
log_debug("No device tree available\n"); log_debug("No device tree available\n");
bflow->flags |= BOOTFLOWF_USE_BUILTIN_FDT;
} }
bflow->state = BOOTFLOWST_READY; bflow->state = BOOTFLOWST_READY;
@@ -429,13 +431,11 @@ static int distro_efi_boot(struct udevice *dev, struct bootflow *bflow)
return log_msg_ret("read", ret); return log_msg_ret("read", ret);
/* /*
* use the provided device tree if available, else fall back to * use the provided device tree if not using the built-in fdt
* the control FDT
*/ */
if (bflow->fdt_fname) if (bflow->flags & ~BOOTFLOWF_USE_BUILTIN_FDT)
fdt = bflow->fdt_addr; fdt = bflow->fdt_addr;
else
fdt = (ulong)map_to_sysmem(gd->fdt_blob);
} else { } else {
/* /*
* This doesn't actually work for network devices: * This doesn't actually work for network devices:
@@ -452,7 +452,14 @@ static int distro_efi_boot(struct udevice *dev, struct bootflow *bflow)
* At some point we can add a real interface to bootefi so we can call * At some point we can add a real interface to bootefi so we can call
* this directly. For now, go through the CLI, like distro boot. * this directly. For now, go through the CLI, like distro boot.
*/ */
snprintf(cmd, sizeof(cmd), "bootefi %lx %lx", kernel, fdt); if (bflow->flags & BOOTFLOWF_USE_BUILTIN_FDT) {
log_debug("Booting with built-in fdt\n");
snprintf(cmd, sizeof(cmd), "bootefi %lx", kernel);
} else {
log_debug("Booting with external fdt\n");
snprintf(cmd, sizeof(cmd), "bootefi %lx %lx", kernel, fdt);
}
if (run_command(cmd, 0)) if (run_command(cmd, 0))
return log_msg_ret("run", -EINVAL); return log_msg_ret("run", -EINVAL);

View File

@@ -45,10 +45,12 @@ enum bootflow_state_t {
* CONFIG_OF_HAS_PRIOR_STAGE is enabled * CONFIG_OF_HAS_PRIOR_STAGE is enabled
* @BOOTFLOWF_STATIC_BUF: Indicates that @bflow->buf is statically set, rather * @BOOTFLOWF_STATIC_BUF: Indicates that @bflow->buf is statically set, rather
* than being allocated by malloc(). * than being allocated by malloc().
* @BOOTFLOWF_USE_BUILTIN_FDT : Indicates that current bootflow uses built-in FDT
*/ */
enum bootflow_flags_t { enum bootflow_flags_t {
BOOTFLOWF_USE_PRIOR_FDT = 1 << 0, BOOTFLOWF_USE_PRIOR_FDT = 1 << 0,
BOOTFLOWF_STATIC_BUF = 1 << 1, BOOTFLOWF_STATIC_BUF = 1 << 1,
BOOTFLOWF_USE_BUILTIN_FDT = 1 << 2,
}; };
/** /**