diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2022-06-29 09:00:56 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2022-06-29 09:00:56 +0200 |
commit | 4708257d5e1345088aa2b3f2f76bb8bb37f7368d (patch) | |
tree | 3ff8a917ff03fb8bf01485600cc116818f3f974c | |
parent | 968a6e5b505ea9d05485d3ac648cade6d9d7b7f3 (diff) | |
parent | eb2b2ae07f074fdad79840f78d3dcd88105a5fb1 (diff) | |
download | barebox-4708257d5e1345088aa2b3f2f76bb8bb37f7368d.tar.gz barebox-4708257d5e1345088aa2b3f2f76bb8bb37f7368d.tar.xz |
Merge branch 'for-next/earlycon'
-rw-r--r-- | common/bootm.c | 24 | ||||
-rw-r--r-- | common/console.c | 17 | ||||
-rw-r--r-- | drivers/serial/amba-pl011.c | 2 | ||||
-rw-r--r-- | drivers/serial/atmel.c | 3 | ||||
-rw-r--r-- | drivers/serial/serial_imx.c | 2 | ||||
-rw-r--r-- | drivers/serial/serial_litex.c | 3 | ||||
-rw-r--r-- | drivers/serial/serial_lpuart.c | 2 | ||||
-rw-r--r-- | drivers/serial/serial_ns16550.c | 21 | ||||
-rw-r--r-- | drivers/serial/stm-serial.c | 2 | ||||
-rw-r--r-- | drivers/video/efi_gop.c | 18 | ||||
-rw-r--r-- | include/console.h | 2 |
11 files changed, 93 insertions, 3 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) diff --git a/drivers/serial/amba-pl011.c b/drivers/serial/amba-pl011.c index 345c58e274..b53ff6877b 100644 --- a/drivers/serial/amba-pl011.c +++ b/drivers/serial/amba-pl011.c @@ -202,6 +202,8 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id) cdev->getc = pl011_getc; cdev->setbrg = pl011_setbaudrate; cdev->linux_console_name = "ttyAMA"; + cdev->linux_earlycon_name = "pl011"; + cdev->phys_base = uart->base; pl011_init_port(cdev); diff --git a/drivers/serial/atmel.c b/drivers/serial/atmel.c index f83835da9a..9e20754998 100644 --- a/drivers/serial/atmel.c +++ b/drivers/serial/atmel.c @@ -427,11 +427,14 @@ static int atmel_serial_probe(struct device_d *dev) cdev->setbrg = atmel_serial_setbaudrate; cdev->set_mode = atmel_serial_set_mode; cdev->linux_console_name = "ttyAT"; + cdev->linux_earlycon_name = "atmel_serial"; ret = atmel_serial_init_port(cdev); if (ret) return ret; + cdev->phys_base = uart->base; + /* Enable UART */ console_register(cdev); diff --git a/drivers/serial/serial_imx.c b/drivers/serial/serial_imx.c index 6a933c930e..cf9c3f02a7 100644 --- a/drivers/serial/serial_imx.c +++ b/drivers/serial/serial_imx.c @@ -234,6 +234,8 @@ static int imx_serial_probe(struct device_d *dev) cdev->flush = imx_serial_flush; cdev->setbrg = imx_serial_setbaudrate; cdev->linux_console_name = "ttymxc"; + cdev->linux_earlycon_name = "ec_imx6q"; + cdev->phys_base = priv->regs; if (dev->device_node) { devname = of_alias_get(dev->device_node); if (devname) { diff --git a/drivers/serial/serial_litex.c b/drivers/serial/serial_litex.c index 3643427ef4..554fee71a3 100644 --- a/drivers/serial/serial_litex.c +++ b/drivers/serial/serial_litex.c @@ -74,6 +74,9 @@ static int litex_serial_probe(struct device_d *dev) cdev->putc = &litex_serial_putc; cdev->getc = &litex_serial_getc; cdev->setbrg = NULL; + cdev->linux_console_name = "ttyLXU"; + cdev->linux_earlycon_name = "liteuart"; + cdev->phys_base = IOMEM(iores->start); console_register(cdev); diff --git a/drivers/serial/serial_lpuart.c b/drivers/serial/serial_lpuart.c index b1a5d60b41..720018c9ac 100644 --- a/drivers/serial/serial_lpuart.c +++ b/drivers/serial/serial_lpuart.c @@ -160,6 +160,8 @@ static int lpuart_serial_probe(struct device_d *dev) } cdev->linux_console_name = "ttyLP"; + cdev->linux_earlycon_name = "lpuart"; + cdev->phys_base = lpuart->base; lpuart_setup(lpuart->base, clk_get_rate(lpuart->clk)); diff --git a/drivers/serial/serial_ns16550.c b/drivers/serial/serial_ns16550.c index f93a89ab95..0d67ec4358 100644 --- a/drivers/serial/serial_ns16550.c +++ b/drivers/serial/serial_ns16550.c @@ -39,11 +39,13 @@ struct ns16550_priv { unsigned iobase; void (*write_reg)(struct ns16550_priv *, uint8_t val, unsigned offset); uint8_t (*read_reg)(struct ns16550_priv *, unsigned offset); + const char *access_type; }; struct ns16550_drvdata { void (*init_port)(struct console_device *cdev); const char *linux_console_name; + const char *linux_earlycon_name; }; static inline struct ns16550_priv *to_ns16550_priv(struct console_device *cdev) @@ -323,22 +325,27 @@ static void ns16550_probe_dt(struct device_d *dev, struct ns16550_priv *priv) priv->mmiobase += offset; of_property_read_u32(np, "reg-shift", &priv->plat.shift); of_property_read_u32(np, "reg-io-width", &width); + switch (width) { case 1: priv->read_reg = ns16550_read_reg_mmio_8; priv->write_reg = ns16550_write_reg_mmio_8; + priv->access_type = "mmio"; break; case 2: priv->read_reg = ns16550_read_reg_mmio_16; priv->write_reg = ns16550_write_reg_mmio_16; + priv->access_type = "mmio16"; break; case 4: if (of_device_is_big_endian(np)) { priv->read_reg = ns16550_read_reg_mmio_32be; priv->write_reg = ns16550_write_reg_mmio_32be; + priv->access_type = "mmio32be"; } else { priv->read_reg = ns16550_read_reg_mmio_32; priv->write_reg = ns16550_write_reg_mmio_32; + priv->access_type = "mmio32"; } break; default: @@ -350,25 +357,30 @@ static void ns16550_probe_dt(struct device_d *dev, struct ns16550_priv *priv) static struct ns16550_drvdata ns16450_drvdata = { .init_port = ns16450_serial_init_port, .linux_console_name = "ttyS", + .linux_earlycon_name = "uart8250", }; static struct ns16550_drvdata ns16550_drvdata = { .init_port = ns16550_serial_init_port, .linux_console_name = "ttyS", + .linux_earlycon_name = "uart8250", }; static __maybe_unused struct ns16550_drvdata omap_drvdata = { .init_port = ns16550_omap_init_port, .linux_console_name = "ttyO", + .linux_earlycon_name = "omap8250", }; static __maybe_unused struct ns16550_drvdata jz_drvdata = { .init_port = ns16550_jz_init_port, + .linux_earlycon_name = "jz4740_uart", }; static __maybe_unused struct ns16550_drvdata rpi_drvdata = { .init_port = rpi_init_port, .linux_console_name = "ttyS", + .linux_earlycon_name = "bcm2835aux", }; static int ns16550_init_iomem(struct device_d *dev, struct ns16550_priv *priv) @@ -391,14 +403,17 @@ static int ns16550_init_iomem(struct device_d *dev, struct ns16550_priv *priv) case IORESOURCE_MEM_8BIT: priv->read_reg = ns16550_read_reg_mmio_8; priv->write_reg = ns16550_write_reg_mmio_8; + priv->access_type = "mmio"; break; case IORESOURCE_MEM_16BIT: priv->read_reg = ns16550_read_reg_mmio_16; priv->write_reg = ns16550_write_reg_mmio_16; + priv->access_type = "mmio16"; break; case IORESOURCE_MEM_32BIT: priv->read_reg = ns16550_read_reg_mmio_32; priv->write_reg = ns16550_write_reg_mmio_32; + priv->access_type = "mmio32"; break; } @@ -436,6 +451,8 @@ static int ns16550_init_ioport(struct device_d *dev, struct ns16550_priv *priv) break; } + priv->access_type = "io"; + return 0; } @@ -497,6 +514,10 @@ static int ns16550_probe(struct device_d *dev) cdev->setbrg = ns16550_setbaudrate; cdev->flush = ns16550_flush; cdev->linux_console_name = devtype->linux_console_name; + cdev->linux_earlycon_name = basprintf("%s,%s", devtype->linux_earlycon_name, + priv->access_type); + cdev->phys_base = !strcmp(priv->access_type, "io") ? + IOMEM((ulong)priv->iobase) : priv->mmiobase; priv->fcrval = FCRVAL; diff --git a/drivers/serial/stm-serial.c b/drivers/serial/stm-serial.c index 30aaba94f0..b4b2c4cc8f 100644 --- a/drivers/serial/stm-serial.c +++ b/drivers/serial/stm-serial.c @@ -149,12 +149,14 @@ static int stm_serial_probe(struct device_d *dev) cdev->setbrg = stm_serial_setbaudrate; cdev->dev = dev; cdev->linux_console_name = "ttyAMA"; + cdev->linux_earlycon_name = "pl011"; dev->priv = priv; iores = dev_request_mem_resource(dev, 0); if (IS_ERR(iores)) return PTR_ERR(iores); priv->base = IOMEM(iores->start); + cdev->phys_base = priv->base; priv->clk = clk_get(dev, NULL); if (IS_ERR(priv->clk)) return PTR_ERR(priv->clk); diff --git a/drivers/video/efi_gop.c b/drivers/video/efi_gop.c index 52387f30dc..5e9bc406e1 100644 --- a/drivers/video/efi_gop.c +++ b/drivers/video/efi_gop.c @@ -238,11 +238,23 @@ static int efi_gop_probe(struct efi_device *efidev) priv->fb.current_mode = priv->mode; ret = register_framebuffer(&priv->fb); - if (!ret) { - priv->dev->priv = &priv->fb; - return 0; + if (ret) + goto free_modes; + + priv->dev->priv = &priv->fb; + + if (IS_ENABLED(CONFIG_FRAMEBUFFER_CONSOLE)) { + struct console_device *cdev; + + cdev = console_get_by_dev(&priv->fb.dev); + if (cdev) + dev_add_param_fixed(&cdev->class_dev, "linux.bootargs.earlycon", + "earlycon=efifb"); } + return 0; + +free_modes: if (priv->fb.modes.modes) { int i; diff --git a/include/console.h b/include/console.h index 5d5783ca66..7fea8eeb9e 100644 --- a/include/console.h +++ b/include/console.h @@ -53,6 +53,8 @@ struct console_device { unsigned int baudrate_param; const char *linux_console_name; + const char *linux_earlycon_name; + void __iomem *phys_base; struct cdev devfs; struct cdev_operations fops; |