mirror of https://github.com/OpenIPC/firmware.git
95 lines
2.9 KiB
Diff
95 lines
2.9 KiB
Diff
diff -drupN a/drivers/of/fdt.c b/drivers/of/fdt.c
|
|
--- a/drivers/of/fdt.c 2018-08-06 17:23:04.000000000 +0300
|
|
+++ b/drivers/of/fdt.c 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -1063,42 +1063,66 @@ int __init early_init_dt_scan_memory(uns
|
|
return 0;
|
|
}
|
|
|
|
+/*
|
|
+ * Convert configs to something easy to use in C code
|
|
+ */
|
|
+#if defined(CONFIG_CMDLINE_FORCE)
|
|
+static const int overwrite_incoming_cmdline = 1;
|
|
+static const int read_dt_cmdline;
|
|
+static const int concat_cmdline;
|
|
+#elif defined(CONFIG_CMDLINE_EXTEND)
|
|
+static const int overwrite_incoming_cmdline;
|
|
+static const int read_dt_cmdline = 1;
|
|
+static const int concat_cmdline = 1;
|
|
+#else /* CMDLINE_FROM_BOOTLOADER */
|
|
+static const int overwrite_incoming_cmdline;
|
|
+static const int read_dt_cmdline = 1;
|
|
+static const int concat_cmdline;
|
|
+#endif
|
|
+
|
|
+#ifdef CONFIG_CMDLINE
|
|
+static const char *config_cmdline = CONFIG_CMDLINE;
|
|
+#else
|
|
+static const char *config_cmdline = "";
|
|
+#endif
|
|
+
|
|
int __init early_init_dt_scan_chosen(unsigned long node, const char *uname,
|
|
int depth, void *data)
|
|
{
|
|
- int l;
|
|
- const char *p;
|
|
+ int l = 0;
|
|
+ const char *p = NULL;
|
|
+ char *cmdline = data;
|
|
|
|
pr_debug("search \"chosen\", depth: %d, uname: %s\n", depth, uname);
|
|
|
|
- if (depth != 1 || !data ||
|
|
+ if (depth != 1 || !cmdline ||
|
|
(strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 0))
|
|
return 0;
|
|
|
|
early_init_dt_check_for_initrd(node);
|
|
|
|
- /* 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));
|
|
+ /* Put CONFIG_CMDLINE in if forced or if data had nothing in it to start */
|
|
+ if (overwrite_incoming_cmdline || !cmdline[0])
|
|
+ strlcpy(cmdline, config_cmdline, 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.
|
|
- */
|
|
-#ifdef CONFIG_CMDLINE
|
|
-#if defined(CONFIG_CMDLINE_EXTEND)
|
|
- strlcat(data, " ", COMMAND_LINE_SIZE);
|
|
- strlcat(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE);
|
|
-#elif defined(CONFIG_CMDLINE_FORCE)
|
|
- strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE);
|
|
-#else
|
|
- /* No arguments from boot loader, use kernel's cmdl*/
|
|
- if (!((char *)data)[0])
|
|
- strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE);
|
|
-#endif
|
|
-#endif /* CONFIG_CMDLINE */
|
|
+ /* Retrieve command line unless forcing */
|
|
+ if (read_dt_cmdline)
|
|
+ p = of_get_flat_dt_prop(node, "bootargs", &l);
|
|
+
|
|
+ if (p != NULL && l > 0) {
|
|
+ if (concat_cmdline) {
|
|
+ int cmdline_len;
|
|
+ int copy_len;
|
|
+ strlcat(cmdline, " ", COMMAND_LINE_SIZE);
|
|
+ cmdline_len = strlen(cmdline);
|
|
+ copy_len = COMMAND_LINE_SIZE - cmdline_len - 1;
|
|
+ copy_len = min((int)l, copy_len);
|
|
+ strncpy(cmdline + cmdline_len, p, copy_len);
|
|
+ cmdline[cmdline_len + copy_len] = '\0';
|
|
+ } else {
|
|
+ strlcpy(cmdline, p, min((int)l, COMMAND_LINE_SIZE));
|
|
+ }
|
|
+ }
|
|
|
|
pr_debug("Command line is: %s\n", (char*)data);
|
|
|