summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2022-06-29 09:00:56 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2022-06-29 09:00:56 +0200
commit4708257d5e1345088aa2b3f2f76bb8bb37f7368d (patch)
tree3ff8a917ff03fb8bf01485600cc116818f3f974c /common
parent968a6e5b505ea9d05485d3ac648cade6d9d7b7f3 (diff)
parenteb2b2ae07f074fdad79840f78d3dcd88105a5fb1 (diff)
downloadbarebox-4708257d5e1345088aa2b3f2f76bb8bb37f7368d.tar.gz
barebox-4708257d5e1345088aa2b3f2f76bb8bb37f7368d.tar.xz
Merge branch 'for-next/earlycon'
Diffstat (limited to 'common')
-rw-r--r--common/bootm.c24
-rw-r--r--common/console.c17
2 files changed, 41 insertions, 0 deletions
diff --git a/common/bootm.c b/common/bootm.c
index 3c80e8bf94..712e6ebe49 100644
--- a/common/bootm.c
+++ b/common/bootm.c
@@ -41,6 +41,7 @@ static struct image_handler *bootm_find_handler(enum filetype filetype,
}
static int bootm_appendroot;
+static int bootm_earlycon;
static int bootm_provide_machine_id;
static int bootm_verbosity;
@@ -732,6 +733,26 @@ int bootm_boot(struct bootm_data *bootm_data)
}
}
+ if (bootm_earlycon) {
+ struct console_device *console;
+ const char *earlycon = NULL;
+
+ for_each_console(console) {
+ if (!(console->f_active & (CONSOLE_STDOUT | CONSOLE_STDERR)))
+ continue;
+
+ earlycon = dev_get_param(&console->class_dev, "linux.bootargs.earlycon");
+ if (earlycon)
+ break;
+ }
+
+ if (!earlycon)
+ earlycon = "earlycon";
+
+ pr_info("Adding \"%s\" to Kernel commandline\n", earlycon);
+ globalvar_add_simple("linux.bootargs.bootm.earlycon", earlycon);
+ }
+
if (bootm_data->provide_machine_id) {
const char *machine_id = getenv_nonempty("global.machine_id");
char *machine_id_bootarg;
@@ -798,6 +819,7 @@ err_out:
if (data->of_root_node && data->of_root_node != of_get_root_node())
of_delete_node(data->of_root_node);
+ globalvar_remove("linux.bootargs.bootm.earlycon");
globalvar_remove("linux.bootargs.bootm.appendroot");
free(data->os_header);
free(data->os_file);
@@ -897,6 +919,7 @@ static int bootm_init(void)
globalvar_add_simple("bootm.root_dev", NULL);
globalvar_add_simple("bootm.tee", NULL);
globalvar_add_simple_bool("bootm.appendroot", &bootm_appendroot);
+ globalvar_add_simple_bool("bootm.earlycon", &bootm_earlycon);
globalvar_add_simple_bool("bootm.provide_machine_id", &bootm_provide_machine_id);
if (IS_ENABLED(CONFIG_BOOTM_INITRD)) {
globalvar_add_simple("bootm.initrd", NULL);
@@ -936,6 +959,7 @@ BAREBOX_MAGICVAR(global.bootm.oftree, "bootm default oftree");
BAREBOX_MAGICVAR(global.bootm.tee, "bootm default tee image");
BAREBOX_MAGICVAR(global.bootm.verify, "bootm default verify level");
BAREBOX_MAGICVAR(global.bootm.verbose, "bootm default verbosity level (0=quiet)");
+BAREBOX_MAGICVAR(global.bootm.earlycon, "Add earlycon option to Kernel for early log output");
BAREBOX_MAGICVAR(global.bootm.appendroot, "Add root= option to Kernel to mount rootfs from the device the Kernel comes from (default, device can be overridden via global.bootm.root_dev)");
BAREBOX_MAGICVAR(global.bootm.root_dev, "bootm default root device (overrides default device in global.bootm.appendroot)");
BAREBOX_MAGICVAR(global.bootm.provide_machine_id, "If true, append systemd.machine_id=$global.machine_id to Kernel command line");
diff --git a/common/console.c b/common/console.c
index 8727b187cf..c442c2dde1 100644
--- a/common/console.c
+++ b/common/console.c
@@ -220,6 +220,21 @@ static void console_init_early(void)
initialized = CONSOLE_INITIALIZED_BUFFER;
}
+static void console_add_earlycon_param(struct console_device *cdev, unsigned baudrate)
+{
+ char *str;
+
+ if (!cdev->linux_earlycon_name)
+ return;
+
+ str = basprintf("earlycon=%s,0x%lx,%dn8", cdev->linux_earlycon_name,
+ (ulong)cdev->phys_base, baudrate);
+
+ dev_add_param_fixed(&cdev->class_dev, "linux.bootargs.earlycon", str);
+
+ free(str);
+}
+
static void console_set_stdoutpath(struct console_device *cdev, unsigned baudrate)
{
int id;
@@ -332,6 +347,8 @@ int console_register(struct console_device *newcdev)
console_set_stdoutpath(newcdev, baudrate);
}
+ console_add_earlycon_param(newcdev, baudrate);
+
if (newcdev->setbrg) {
ret = newcdev->setbrg(newcdev, baudrate);
if (ret)