[U-Boot] [PATCH 5/6] main: Process FDT options even without CONFIG_BOOTDELAY
Simon Glass
sjg at chromium.org
Mon Mar 24 16:51:10 CET 2014
At present when this option is not defined, we do not process the FDT
options - for example we do not run the boot command specified by the FDT.
Move this code into the common function and make sure it is always called
when CONFIG_OF_CONTROL is defined.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
common/main.c | 69 ++++++++++++++++++++++++++++++++++++++---------------------
1 file changed, 45 insertions(+), 24 deletions(-)
diff --git a/common/main.c b/common/main.c
index 2fdea01..0a65593 100644
--- a/common/main.c
+++ b/common/main.c
@@ -269,7 +269,7 @@ static int abortboot(int bootdelay)
* printing the error message to console.
*/
-#if defined(CONFIG_BOOTDELAY) && defined(CONFIG_OF_CONTROL)
+#if defined(CONFIG_OF_CONTROL)
static void secure_boot_cmd(char *cmd)
{
#ifdef CONFIG_CMDLINE
@@ -309,29 +309,54 @@ err:
*/
hang();
}
+#endif /* CONFIG_OF_CONTROL */
-static void process_fdt_options(const void *blob)
+/**
+ * Process options contained in the device tree
+ *
+ * This handles various features provided by the device tree, which can
+ * affect environment variables or operation on start-up.
+ *
+ * @param blob Device tree to process
+ * @param cmdp Returns the boot command obtained from the FDT
+ */
+static void process_fdt_options(const void *blob, char **cmdp)
{
+#ifdef CONFIG_OF_CONTROL
ulong addr;
+ char *s = *cmdp, *env;
+
+ /* Allow the fdt to override the boot command */
+ env = fdtdec_get_config_string(blob, "bootcmd");
+ if (env)
+ s = env;
/* Add an env variable to point to a kernel payload, if available */
- addr = fdtdec_get_config_int(gd->fdt_blob, "kernel-offset", 0);
+ addr = fdtdec_get_config_int(blob, "kernel-offset", 0);
if (addr)
setenv_addr("kernaddr", (void *)(CONFIG_SYS_TEXT_BASE + addr));
/* Add an env variable to point to a root disk, if available */
- addr = fdtdec_get_config_int(gd->fdt_blob, "rootdisk-offset", 0);
+ addr = fdtdec_get_config_int(blob, "rootdisk-offset", 0);
if (addr)
setenv_addr("rootaddr", (void *)(CONFIG_SYS_TEXT_BASE + addr));
-}
+
+ /*
+ * If the bootsecure option was chosen, use secure_boot_cmd().
+ * Always use 'env' in this case, since bootsecure requres that the
+ * bootcmd was specified in the FDT too.
+ */
+ if (fdtdec_get_config_int(blob, "bootsecure", 0)) {
+ secure_boot_cmd(s);
+ panic("Secure boot command returned");
+ }
+ *cmdp = s;
#endif /* CONFIG_OF_CONTROL */
+}
#ifdef CONFIG_BOOTDELAY
static void process_boot_delay(void)
{
-#ifdef CONFIG_OF_CONTROL
- char *env;
-#endif
char *s;
int bootdelay;
#ifdef CONFIG_BOOTCOUNT_LIMIT
@@ -379,23 +404,8 @@ static void process_boot_delay(void)
else
#endif /* CONFIG_BOOTCOUNT_LIMIT */
s = getenv ("bootcmd");
-#ifdef CONFIG_OF_CONTROL
- /* Allow the fdt to override the boot command */
- env = fdtdec_get_config_string(gd->fdt_blob, "bootcmd");
- if (env)
- s = env;
- process_fdt_options(gd->fdt_blob);
-
- /*
- * If the bootsecure option was chosen, use secure_boot_cmd().
- * Always use 'env' in this case, since bootsecure requres that the
- * bootcmd was specified in the FDT too.
- */
- if (fdtdec_get_config_int(gd->fdt_blob, "bootsecure", 0))
- secure_boot_cmd(env);
-
-#endif /* CONFIG_OF_CONTROL */
+ process_fdt_options(gd->fdt_blob, &s);
debug ("### main_loop: bootcmd=\"%s\"\n", s ? s : "<UNDEFINED>");
@@ -482,6 +492,17 @@ void main_loop(void)
#ifdef CONFIG_BOOTDELAY
process_boot_delay();
+#else
+ char *s = NULL;
+
+ process_fdt_options(gd->fdt_blob, &s);
+ if (s) {
+# ifdef CONFIG_CMDLINE
+ run_command_list(s, -1, 0);
+# else
+ board_run_command(s);
+# endif
+ }
#endif
/*
* Main Loop for Monitor Command Processing
--
1.9.1.423.g4596e3a
More information about the U-Boot
mailing list