From e2ca00ccfecacf743841367a3dab7092f2ce3ffc Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Fri, 5 Dec 2014 17:26:26 +0000 Subject: [PATCH 024/203] fdt: Add support for the CONFIG_CMDLINE_EXTEND option --- drivers/of/fdt.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -933,22 +933,38 @@ int __init early_init_dt_scan_chosen(uns /* Retrieve command line */ p = of_get_flat_dt_prop(node, "bootargs", &l); - if (p != NULL && l > 0) - strlcpy(data, p, min((int)l, COMMAND_LINE_SIZE)); - p = of_get_flat_dt_prop(node, "bootargs-append", &l); - if (p != NULL && l > 0) - strlcat(data, p, min_t(int, strlen(data) + (int)l, COMMAND_LINE_SIZE)); /* * CONFIG_CMDLINE is meant to be a default in case nothing else * managed to set the command line, unless CONFIG_CMDLINE_FORCE * is set in which case we override whatever was found earlier. + * + * However, it can be useful to be able to treat the default as + * a starting point to be extended using CONFIG_CMDLINE_EXTEND. */ + ((char *)data)[0] = '\0'; + #ifdef CONFIG_CMDLINE -#ifndef CONFIG_CMDLINE_FORCE - if (!((char *)data)[0]) + strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); + + if (p != NULL && l > 0) { +#if defined(CONFIG_CMDLINE_EXTEND) + int len = strlen(data); + if (len > 0) { + strlcat(data, " ", COMMAND_LINE_SIZE); + len++; + } + strlcpy((char *)data + len, p, min((int)l, COMMAND_LINE_SIZE - len)); +#elif defined(CONFIG_CMDLINE_FORCE) + pr_warning("Ignoring bootargs property (using the default kernel command line)\n"); +#else + /* Neither extend nor force - just override */ + strlcpy(data, p, min((int)l, COMMAND_LINE_SIZE)); #endif - strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); + } +#else /* CONFIG_CMDLINE */ + if (p != NULL && l > 0) + strlcpy(data, p, min((int)l, COMMAND_LINE_SIZE)); #endif /* CONFIG_CMDLINE */ pr_debug("Command line is: %s\n", (char*)data);