Similar to what we already do to kernel's "console" parameter, add
code to allow serial drivers to expose their "earlycon"
setting. Unlike the plumbing for "console", "earlycon" is not
automatically added to kernel command line and has to be enabled by
the user.

Signed-off-by: Andrey Smirnov <[email protected]>
---
 Documentation/user/variables.rst |  1 +
 common/console.c                 | 25 +++++++++++++++++++++++++
 include/console.h                |  1 +
 3 files changed, 27 insertions(+)

diff --git a/Documentation/user/variables.rst b/Documentation/user/variables.rst
index ddfd48574..f3bcaa3a8 100644
--- a/Documentation/user/variables.rst
+++ b/Documentation/user/variables.rst
@@ -114,5 +114,6 @@ of all variables with special meaning along with a short 
description:
   bootsource                       The source barebox has been booted from
   bootsource_instance              The instance of the source barebox has been 
booted from
   global.boot.default              default boot order
+  global.linux.bootconsole         current console's "earlycon" setting for 
Linux kernel
   ...
 
diff --git a/common/console.c b/common/console.c
index 47ccf2e54..29d0f2779 100644
--- a/common/console.c
+++ b/common/console.c
@@ -253,6 +253,30 @@ static void console_set_stdoutpath(struct console_device 
*cdev)
        free(str);
 }
 
+static void console_set_boot_stdoutpath(struct console_device *cdev)
+{
+       char *str;
+
+       if (!cdev->linux_bootconsole_name)
+               return;
+
+       str = basprintf("earlycon=%s,%dn8", cdev->linux_bootconsole_name,
+                       cdev->baudrate);
+       /*
+        * linux.bootconsole is used instead of
+        * linux.bootargs.bootconsole in orger to make this feature
+        * optional. To enable, add
+        *
+        *     global linux.bootargs.bootconsole
+        *     global.linux.bootargs.bootconsole=${global.linux.bootconsole}
+        *
+        * somwhere in your boot scripts
+        */
+       globalvar_add_simple("linux.bootconsole", str);
+
+       free(str);
+}
+
 static int __console_puts(struct console_device *cdev, const char *s)
 {
        int n = 0;
@@ -360,6 +384,7 @@ int console_register(struct console_device *newcdev)
        if (newcdev->dev && of_device_is_stdout_path(newcdev->dev)) {
                activate = 1;
                console_set_stdoutpath(newcdev);
+               console_set_boot_stdoutpath(newcdev);
        }
 
        list_add_tail(&newcdev->list, &console_list);
diff --git a/include/console.h b/include/console.h
index 673921331..09d7ebae5 100644
--- a/include/console.h
+++ b/include/console.h
@@ -64,6 +64,7 @@ struct console_device {
        unsigned int baudrate_param;
 
        const char *linux_console_name;
+       const char *linux_bootconsole_name;
 
        struct cdev devfs;
        struct cdev_operations fops;
-- 
2.20.1


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to