[PATCH 16/16] bootstd: cros: Add ARM support
Simon Glass
sjg at chromium.org
Sun Jul 30 19:17:02 CEST 2023
Support booting ChromiumOS on ARM devices using FIT. Add an entry into the
boot implementation which does not require a command line. This can be
expanded over time as the bootm code is refactored.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
boot/Kconfig | 4 ++--
boot/bootm.c | 37 +++++++++++++++++++++++++++++++++++++
boot/bootmeth_cros.c | 16 ++++++++++------
include/bootm.h | 8 ++++++++
4 files changed, 57 insertions(+), 8 deletions(-)
diff --git a/boot/Kconfig b/boot/Kconfig
index e8fb03b80168..6fb5b1e8b430 100644
--- a/boot/Kconfig
+++ b/boot/Kconfig
@@ -464,8 +464,8 @@ config BOOTMETH_GLOBAL
config BOOTMETH_CROS
bool "Bootdev support for Chromium OS"
- depends on X86 || SANDBOX
- default y
+ depends on X86 || ARM || SANDBOX
+ default y if !ARM
help
Enables support for booting Chromium OS using bootdevs. This uses the
kernel A slot and obtains the kernel command line from the parameters
diff --git a/boot/bootm.c b/boot/bootm.c
index 75f0b4a9af8a..b1c3afe0a3ad 100644
--- a/boot/bootm.c
+++ b/boot/bootm.c
@@ -823,6 +823,43 @@ err:
return ret;
}
+int bootm_boot_start(ulong addr, const char *cmdline)
+{
+ static struct cmd_tbl cmd = {"bootm"};
+ char addr_str[30];
+ char *argv[] = {addr_str, NULL};
+ int states;
+ int ret;
+
+ /*
+ * TODO(sjg at chromium.org): This uses the command-line interface, but
+ * should not. To clean this up, the various bootm states need to be
+ * passed an info structure instead of cmdline flags. Then this can
+ * set up the required info and move through the states without needing
+ * the command line.
+ */
+ states = BOOTM_STATE_START | BOOTM_STATE_FINDOS | BOOTM_STATE_PRE_LOAD |
+ BOOTM_STATE_FINDOTHER | BOOTM_STATE_LOADOS |
+ BOOTM_STATE_OS_PREP | BOOTM_STATE_OS_FAKE_GO |
+ BOOTM_STATE_OS_GO;
+ if (IS_ENABLED(CONFIG_SYS_BOOT_RAMDISK_HIGH))
+ states |= BOOTM_STATE_RAMDISK;
+ if (IS_ENABLED(CONFIG_PPC) || IS_ENABLED(CONFIG_MIPS))
+ states |= BOOTM_STATE_OS_CMDLINE;
+ images.state |= states;
+
+ snprintf(addr_str, sizeof(addr_str), "%lx", addr);
+
+ ret = env_set("bootargs", cmdline);
+ if (ret) {
+ printf("Failed to set cmdline\n");
+ return ret;
+ }
+ ret = do_bootm_states(&cmd, 0, 1, argv, states, &images, 1);
+
+ return ret;
+}
+
#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
/**
* image_get_kernel - verify legacy format kernel image
diff --git a/boot/bootmeth_cros.c b/boot/bootmeth_cros.c
index 570e7028329c..da9bb6b4281c 100644
--- a/boot/bootmeth_cros.c
+++ b/boot/bootmeth_cros.c
@@ -417,13 +417,17 @@ static int cros_boot(struct udevice *dev, struct bootflow *bflow)
if (ret)
return log_msg_ret("rd", ret);
}
-#ifdef CONFIG_X86
- zboot_start(map_to_sysmem(bflow->buf), bflow->size, 0, 0,
- map_to_sysmem(bflow->x86_setup),
- bflow->cmdline);
-#endif
- return log_msg_ret("go", -EFAULT);
+ if (IS_ENABLED(CONFIG_X86)) {
+ ret = zboot_start(map_to_sysmem(bflow->buf), bflow->size, 0, 0,
+ map_to_sysmem(bflow->x86_setup),
+ bflow->cmdline);
+ } else {
+ ret = bootm_boot_start(map_to_sysmem(bflow->buf),
+ bflow->cmdline);
+ }
+
+ return log_msg_ret("go", ret);
}
static int cros_bootmeth_bind(struct udevice *dev)
diff --git a/include/bootm.h b/include/bootm.h
index 92870ff1a206..c3c7336207b1 100644
--- a/include/bootm.h
+++ b/include/bootm.h
@@ -163,4 +163,12 @@ const char *zimage_get_kernel_version(struct boot_params *params,
*/
void zimage_dump(struct boot_params *base_ptr, bool show_cmdline);
+/*
+ * bootm_boot_start() - Boot an image at the given address
+ *
+ * @addr: Image address
+ * @cmdline: Command line to set
+ */
+int bootm_boot_start(ulong addr, const char *cmdline);
+
#endif
--
2.41.0.487.g6d72f3e995-goog
More information about the U-Boot
mailing list