Skip to contentSkip to conversation

serial/sifive: select SERIAL_EARLYCON

PATCH In review Christoph Hellwig 5 participants 19 messages Sep 10, 2019 – Oct 4, 2019

Subsystems (5)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 serial/sifive: select SERIAL_EARLYCON

The sifive serial driver implements earlycon support, but unless another driver is built in that supports earlycon support it won't be usable. Explicitly select SERIAL_EARLYCON instead.

---
 drivers/tty/serial/Kconfig | 1 +
 1 file changed, 1 insertion(+)
drivers/tty/serial/Kconfig +1 -0
index 530cb966092f..6b77a72278e3 100644
@@ -1075,6 +1075,7 @@ config SERIAL_SIFIVE_CONSOLE
 	bool "Console on SiFive UART"
 	depends on SERIAL_SIFIVE=y
 	select SERIAL_CORE_CONSOLE
+	select SERIAL_EARLYCON
 	help
 	  Select this option if you would like to use a SiFive UART as the
 	  system console.
Signature · 1 line
2.20.1
#1 lore raw
Quoted 1 line · Christoph Hellwig

The sifive serial driver implements earlycon support,

It should probably be documented in admin-guide/kernel-parameters.txt.

Andreas.

Signature · 3 lines
Andreas Schwab, SUSE Labs, [email protected]
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."
#2 lore raw
Quoted 5 lines · Andreas Schwab
Quoted 1 line · Christoph Hellwig

The sifive serial driver implements earlycon support,

It should probably be documented in admin-guide/kernel-parameters.txt.

How so? Wіth OF and a stdout path you just set earlycon on the command line without any arguments and it will be found.

#3 lore raw
Quoted 9 lines · Christoph Hellwig
Quoted 5 lines · Andreas Schwab
Quoted 1 line · Christoph Hellwig

The sifive serial driver implements earlycon support,

It should probably be documented in admin-guide/kernel-parameters.txt.

How so? Wіth OF and a stdout path you just set earlycon on the command line without any arguments and it will be found.

Doesn't work for me.

[    0.000000] Malformed early option 'earlycon'

Andreas.

Signature · 3 lines
Andreas Schwab, SUSE Labs, [email protected]
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."
#4 lore raw
Quoted 6 lines · Andreas Schwab
Quoted 2 lines

How so? Wіth OF and a stdout path you just set earlycon on the command line without any arguments and it will be found.

Doesn't work for me.

[    0.000000] Malformed early option 'earlycon'

That functionality is implemented by param_setup_earlycon and early_init_dt_scan_chosen_stdout. Check why those aren't built into your kernel.

#5 lore raw
Quoted 11 lines · Christoph Hellwig
Quoted 6 lines · Andreas Schwab
Quoted 2 lines

How so? Wіth OF and a stdout path you just set earlycon on the command line without any arguments and it will be found.

Doesn't work for me.

[    0.000000] Malformed early option 'earlycon'

That functionality is implemented by param_setup_earlycon and early_init_dt_scan_chosen_stdout. Check why those aren't built into your kernel.

They are.

Andreas.

Signature · 3 lines
Andreas Schwab, SUSE Labs, [email protected]
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."
#6 lore raw
In reply to Christoph Hellwig
Quoted 11 lines · Christoph Hellwig
Quoted 6 lines · Andreas Schwab
Quoted 2 lines

How so? Wіth OF and a stdout path you just set earlycon on the command line without any arguments and it will be found.

Doesn't work for me.

[    0.000000] Malformed early option 'earlycon'

That functionality is implemented by param_setup_earlycon and early_init_dt_scan_chosen_stdout. Check why those aren't built into your kernel.

OpenEmbedded passes "earlycon=sbi", which I can find in the doumentation. I can't find anything about just "earlycon". I've sent a patch adding sbi to the list of earlycon arguments.

#7 lore raw
Quoted 3 lines · Palmer Dabbelt

OpenEmbedded passes "earlycon=sbi", which I can find in the doumentation. I can't find anything about just "earlycon". I've sent a patch adding sbi to the list of earlycon arguments.

earlycon without arguments is documented, although just for ARM64. I can send a patch to update it to properly cover all DT platforms in addition.

#8 lore raw
Quoted 8 lines · Christoph Hellwig
Quoted 3 lines · Palmer Dabbelt

OpenEmbedded passes "earlycon=sbi", which I can find in the doumentation. I can't find anything about just "earlycon". I've sent a patch adding sbi to the list of earlycon arguments.

earlycon without arguments is documented, although just for ARM64. I can send a patch to update it to properly cover all DT platforms in addition.

Thanks. I've kind of lost track of the thread, but assuming that does the "automatically pick an earlycon" stuff then that's probably what we should be using in the distros.

#9 lore raw
Quoted 6 lines · Palmer Dabbelt
Quoted 5 lines · Christoph Hellwig
Quoted 3 lines · Palmer Dabbelt

OpenEmbedded passes "earlycon=sbi", which I can find in the doumentation. I can't find anything about just "earlycon". I've sent a patch adding sbi to the list of earlycon arguments.

Quoted 7 lines
Quoted 3 lines

earlycon without arguments is documented, although just for ARM64. I can send a patch to update it to properly cover all DT platforms in addition.

Thanks. I've kind of lost track of the thread, but assuming that does the "automatically pick an earlycon" stuff then that's probably what we should be using in the distros.

Except that it doesn't work.

Andreas.

Signature · 3 lines
Andreas Schwab, SUSE Labs, [email protected]
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."
#10 lore raw
Quoted 12 lines · On Mon, 16 Sep 2019 12:40:10 PDT (-0700), [email protected] wrote:
Quoted 10 lines · Palmer Dabbelt
Quoted 8 lines · Christoph Hellwig
Quoted 3 lines · Palmer Dabbelt

OpenEmbedded passes "earlycon=sbi", which I can find in the doumentation. I can't find anything about just "earlycon". I've sent a patch adding sbi to the list of earlycon arguments.

earlycon without arguments is documented, although just for ARM64. I can send a patch to update it to properly cover all DT platforms in addition.

Quoted 5 lines
Quoted 3 lines

Thanks. I've kind of lost track of the thread, but assuming that does the "automatically pick an earlycon" stuff then that's probably what we should be using in the distros.

Except that it doesn't work.

Sorry, once again I've lost track of the thread.

The code looks generic. The device tree in arch/riscv for the HiFive Unleashed doesn't have a stdout-path set, which if I understand correctly is used by the automatic earlycon stuff to pick a console. I gave this a quick test on QEMU, which finds a 16550 earlycon for me. I use openembedded's qemuriscv64 target, the following diff to make sure I'm getting an earlycon

drivers/tty/serial/8250/8250_early.c +1 -0
index 5cd8c36c8fcc..61290714bbcb 100644
@@ -106,6 +106,7 @@ static void early_serial8250_write(struct console *console,
       struct earlycon_device *device = console->data;
       struct uart_port *port = &device->port;
 
+       uart_console_write(port, "_e_", 3, serial_putc);
       uart_console_write(port, s, count, serial_putc);

}

and run this command line

/home/palmer/work/linux/openembedded-riscv64/build/tmp-glibc/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin/qemu-system-riscv64 -device virtio-net-device,netdev=net0,mac=52:54:00:12:35:02 -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::2323-:23,tftp=/home/palmer/work/linux/openembedded-riscv64/build/tmp-glibc/deploy/images/qemuriscv64 -drive id=disk0,file=/home/palmer/work/linux/openembedded-riscv64/build/tmp-glibc/deploy/images/qemuriscv64/core-image-full-cmdline-qemuriscv64-20190711162644.rootfs.ext4,if=none,format=raw -device virtio-blk-device,drive=disk0 -object rng-random,filename=/dev/urandom,id=rng0 -device virtio-rng-device,rng=rng0 -show-cursor -monitor null -device loader,file=/home/palmer/work/linux/linux/arch/riscv/boot/Image,addr=0x802000
00 -nographic -machine virt -m 512 -serial mon:stdio -serial null -kernel /home/palmer/work/linux/openembedded-riscv64/build/tmp-glibc/deploy/images/qemuriscv64/fw_jump.elf -append 'root=/dev/vda rw highres=off console=ttyS0 mem=512M ip=dhcp earlycon '

which gives me some early stuff and then some non-early stuff

_e_[ 0.407579] printk: console [ttyS0] disabled
_e_[ 0.409205] 10000000.uart: ttyS0 at MMIO 0x10000000 (irq = 10, base_baud = 230400) is a 16550A

[    0.410720] printk: console [ttyS0] enabled
_e_[    0.410720] printk: console [ttyS0] enabled
[    0.411391] printk: bootconsole [ns16550a0] disabled
_e_[    0.411391] printk: bootconsole [ns16550a0] disabled
[    0.420664] [drm] radeon kernel modesetting enabled.
[    0.428086] random: fast init done
[    0.429331] random: crng init done
[    0.440678] loop: module loaded
[    0.447607] virtio_blk virtio1: [vda] 262830 512-byte logical blocks (135 MB/128 MiB)
[    0.469483] libphy: Fixed MDIO Bus: probed

If you don't have something like "/chosen/stdout-path = &uart0;" in your device tree, then that's probably the issue. Here's where it's set in Christoph's k210:

http://git.infradead.org/users/hch/riscv.git/blob/f10e64873eafc68516b8884c06b9290b9887633b:/arch/riscv/boot/dts/kendryte/kd210.dts#l20

but we don't set it for the HiFive Unleashed. I'd call that a bug, something like this

arch/riscv/boot/dts/sifive/hifive-unleashed-a00.dts +1 -0
index 93d68cbd64fe..6d0ec76d93fe 100644
@@ -13,6 +13,7 @@
       compatible = "sifive,hifive-unleashed-a00", "sifive,fu540-c000";
 
       chosen {
+               stdout-path = &uart0;
       };
 
       cpus {

should fix it. LMK if I've misunderstood something.

#11 lore raw
Quoted 16 lines · Palmer Dabbelt

but we don't set it for the HiFive Unleashed. I'd call that a bug, something like this

arch/riscv/boot/dts/sifive/hifive-unleashed-a00.dts +1 -0
index 93d68cbd64fe..6d0ec76d93fe 100644
@@ -13,6 +13,7 @@
       compatible = "sifive,hifive-unleashed-a00", "sifive,fu540-c000";
 
       chosen {
+               stdout-path = &uart0;
       };
 
       cpus {
Quoted 1 line

should fix it. LMK if I've misunderstood something.

If that's how it's supposed to work, ok. Other platforms add it in u-boot.

Andreas.

Signature · 3 lines
Andreas Schwab, SUSE Labs, [email protected]
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."
#12 lore raw
In reply to Palmer Dabbelt
Quoted 118 lines · Palmer Dabbelt
Quoted 17 lines · On Mon, 16 Sep 2019 12:40:10 PDT (-0700), [email protected] wrote:
Quoted 15 lines · Palmer Dabbelt
Quoted 12 lines · Christoph Hellwig
Quoted 5 lines · Palmer Dabbelt

OpenEmbedded passes "earlycon=sbi", which I can find in the doumentation.
I can't find anything about just "earlycon". I've sent a patch adding sbi
to the list of earlycon arguments.

earlycon without arguments is documented, although just for ARM64.
I can send a patch to update it to properly cover all DT platforms
in addition.

Quoted 7 lines
Quoted 5 lines

Thanks. I've kind of lost track of the thread, but assuming that does the
"automatically pick an earlycon" stuff then that's probably what we should
be using in the distros.

Except that it doesn't work.

Sorry, once again I've lost track of the thread.

The code looks generic. The device tree in arch/riscv for the HiFive Unleashed
doesn't have a stdout-path set, which if I understand correctly is used by the
automatic earlycon stuff to pick a console. I gave this a quick test on QEMU,
which finds a 16550 earlycon for me. I use openembedded's qemuriscv64 target,
the following diff to make sure I'm getting an earlycon

drivers/tty/serial/8250/8250_early.c +1 -0
index 5cd8c36c8fcc..61290714bbcb 100644
@@ -106,6 +106,7 @@ static void early_serial8250_write(struct console
 *console,
        struct earlycon_device *device = console->data;
        struct uart_port *port = &device->port;
 
+       uart_console_write(port, "_e_", 3, serial_putc);
        uart_console_write(port, s, count, serial_putc);
 }

and run this command line

/home/palmer/work/linux/openembedded-riscv64/build/tmp-
glibc/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot- native/usr/bin/qemu-system-riscv64 -device virtio-net- device,netdev=net0,mac=52:54:00:12:35:02 -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::2323- :23,tftp=/home/palmer/work/linux/openembedded-riscv64/build/tmp- glibc/deploy/images/qemuriscv64 -drive id=disk0,file=/home/palmer/work/linux/openembedded-riscv64/build/tmp- glibc/deploy/images/qemuriscv64/core-image-full-cmdline-qemuriscv64- 20190711162644.rootfs.ext4,if=none,format=raw -device virtio-blk- device,drive=disk0 -object rng-random,filename=/dev/urandom,id=rng0 -device virtio-rng-device,rng=rng0 -show-cursor -monitor null -device loader,file=/home/palmer/work/linux/linux/arch/riscv/boot/Image,addr= 0x80200000 -nographic -machine virt -m 512 -serial mon:stdio -serial null -kernel /home/palmer/work/linux/openembedded- riscv64/build/tmp-glibc/deploy/images/qemuriscv64/fw_jump.elf -append 'root=/dev/vda rw highres=off console=ttyS0 mem=512M ip=dhcp earlycon '

which gives me some early stuff and then some non-early stuff

_e_[ 0.407579] printk: console [ttyS0] disabled
_e_[ 0.409205] 10000000.uart: ttyS0 at MMIO 0x10000000 (irq = 10,
base_baud = 230400) is a 16550A

[    0.410720] printk: console [ttyS0] enabled
_e_[    0.410720] printk: console [ttyS0] enabled
[    0.411391] printk: bootconsole [ns16550a0] disabled
_e_[    0.411391] printk: bootconsole [ns16550a0] disabled
[    0.420664] [drm] radeon kernel modesetting enabled.
[    0.428086] random: fast init done
[    0.429331] random: crng init done
[    0.440678] loop: module loaded
[    0.447607] virtio_blk virtio1: [vda] 262830 512-byte logical
blocks (135 MB/128 MiB)
[    0.469483] libphy: Fixed MDIO Bus: probed

If you don't have something like "/chosen/stdout-path = &uart0;" in your device
tree, then that's probably the issue. Here's where it's set in Christoph's
k210:

http://git.infradead.org/users/hch/riscv.git/blob/f10e64873eafc68516b8884c06b9290b9887633b:/arch/riscv/boot/dts/kendryte/kd210.dts#l20

but we don't set it for the HiFive Unleashed. I'd call that a bug, something
like this

arch/riscv/boot/dts/sifive/hifive-unleashed-a00.dts +1 -0
index 93d68cbd64fe..6d0ec76d93fe 100644
@@ -13,6 +13,7 @@
        compatible = "sifive,hifive-unleashed-a00", "sifive,fu540-
 c000";
 
        chosen {
+               stdout-path = &uart0;
        };
 
        cpus {
Quoted 2 lines

should fix it. LMK if I've misunderstood something.

OpenSBI already adds this node to DT for U-Boot serial console. I have tested that just adding "earlycon" to the commandline works as long as you are using OpenSBI and SERIAL_EARLYCON is enabled.

If this entry can be added to dt residing in kernel, we can remove the code that adds the "stdout-path" from OpenSBI.

Quoted 4 lines

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

Signature · 2 lines
Regards,
Atish
#13 lore raw
In reply to Andreas Schwab
Quoted 7 lines · Andreas Schwab
Quoted 5 lines · Christoph Hellwig
Quoted 4 lines · Andreas Schwab
Quoted 1 line · Christoph Hellwig

The sifive serial driver implements earlycon support,

Quoted 8 lines
Quoted 4 lines
Quoted 1 line

It should probably be documented in admin-guide/kernel-parameters.txt.

How so? Wіth OF and a stdout path you just set earlycon on the command line without any arguments and it will be found.

Doesn't work for me.

[    0.000000] Malformed early option 'earlycon'

Try:

    earlycon=sifive,0x10010000

If it works, you should see this message on the kernel console very early in the boot:

[    0.000000] earlycon: sifive0 at MMIO 0x0000000010010000 (options '')

- Paul

#14 lore raw
Quoted 14 lines · Paul Walmsley
Quoted 12 lines · Andreas Schwab
Quoted 9 lines · Christoph Hellwig
Quoted 5 lines · Andreas Schwab
Quoted 1 line · Christoph Hellwig

The sifive serial driver implements earlycon support,

It should probably be documented in admin-guide/kernel-parameters.txt.

How so? Wіth OF and a stdout path you just set earlycon on the command line without any arguments and it will be found.

Quoted 7 lines
Quoted 3 lines

Doesn't work for me.

[    0.000000] Malformed early option 'earlycon'

Try:

    earlycon=sifive,0x10010000

That's not what Christoph wants.

Andreas.

Signature · 3 lines
Andreas Schwab, SUSE Labs, [email protected]
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."
#15 lore raw
Quoted 5 lines · Andreas Schwab
Quoted 3 lines

Try:

    earlycon=sifive,0x10010000

That's not what Christoph wants.

Well, what I want is auto selection if the device tree uses the stdout-path. My Kendryte DT uses that and it works like a charm. If it doesn't work for you on the U54 board chances are that your DT doesn't have the right settings and you have to use the line that Paul posted.

#16 lore raw
In reply to Andreas Schwab
Quoted 18 lines · Andreas Schwab
Quoted 16 lines · Paul Walmsley
Quoted 14 lines · Andreas Schwab
Quoted 9 lines · Christoph Hellwig
Quoted 5 lines · Andreas Schwab
Quoted 1 line · Christoph Hellwig

The sifive serial driver implements earlycon support,

It should probably be documented in admin-guide/kernel-parameters.txt.

How so? Wіth OF and a stdout path you just set earlycon on the command line without any arguments and it will be found.

Doesn't work for me.

Quoted 7 lines
Quoted 5 lines
Quoted 1 line
[    0.000000] Malformed early option 'earlycon'

Try:

    earlycon=sifive,0x10010000

That's not what Christoph wants.

I support Christoph's plan to add generic implicit earlycon support.

In the meantime, once v5.4-rc1 is released, I'll send a patch to add a sifive driver section to the earlycon documentation in admin-guide/kernel-parameters.txt. Thanks for the (earlier) suggestion.

- Paul