Re: [RFC PATCH] always probe UART HW when options are not specified

From: Sebastian Frias
Date: Tue Dec 22 2015 - 12:56:34 EST


On 12/21/2015 05:50 PM, Sebastian Frias wrote:
You need to use the format documented in
Documentation/kernel-parameters.text:

console= [KNL] Output console device and options.

uart[8250],io,<addr>[,options]
uart[8250],mmio,<addr>[,options]
uart[8250],mmio16,<addr>[,options]
uart[8250],mmio32,<addr>[,options]
uart[8250],0x<addr>[,options]
Start an early, polled-mode console on the 8250/16550
UART at the specified I/O port or MMIO address,
switching to the matching ttyS device later.
MMIO inter-register address stride is either 8-bit
(mmio), 16-bit (mmio16), or 32-bit (mmio32).
If none of [io|mmio|mmio16|mmio32], <addr> is assumed
to be equivalent to 'mmio'. 'options' are specified in
the same format described for ttyS above; if unspecified,
the h/w is not re-initialized.

The iotype and the uart address are not options.

Do you mean they are mandatory?
How do they relate to the keys present on the DT? Because the device is
already described in the DT:

uart: serial@10700 {
compatible = "ralink,rt2880-uart";
reg = <0x10700 0x30>;
interrupts = <1 IRQ_TYPE_LEVEL_HIGH>;
clock-frequency = <7372800>;
reg-shift = <2>;
};

Are we supposed to duplicate such information (ie: addr) in the
commandline as well?


By the way, I tried using the following command line 'console=uart,mmio32,0x10700,115200n8r mem=256M earlyprintk debug ignore_loglevel' but I think I'm still missing something regarding this, because it does not work, here's a log of Linux 4.1.13+:


1: [arch/arm/kernel/setup.c:932] setup_arch(): r1 = 0xf34, r2 = 0x803b3b50, cmdline ''
1: [arch/arm/kernel/devtree.c:195] arch_get_next_mach(): infoBegin 0xc024faac, mdesc 0xc024faac
1: [arch/arm/kernel/devtree.c:195] arch_get_next_mach(): infoBegin 0xc024faac, mdesc 0xc024fb14
1: [drivers/of/fdt.c:106] of_fdt_is_compatible(): sigma,tango4 vs sigma,vantage-1172
1: [arch/arm/kernel/devtree.c:195] arch_get_next_mach(): infoBegin 0xc024faac, mdesc 0xc024fb7c
1: [drivers/of/fdt.c:749] of_flat_dt_match_machine(): Machine model: Sigma Designs SMP8758 Vantage-1172 Rev E1
1: [arch/arm/kernel/devtree.c:256] setup_machine_fdt(): about to call early_init_dt_scan_nodes
1: [drivers/of/fdt.c:1057] early_init_dt_scan_nodes(): bootcmdline ''
1: [drivers/of/fdt.c:1062] early_init_dt_scan_nodes(): bootcmdline after of_scan_flat_dt 'console=uart,mmio32,0x10700,115200n8r mem=256M earlyprintk debug ignore_loglevel'
1: [arch/arm/kernel/setup.c:946] setup_arch(): using DT at r2
1: [arch/arm/kernel/setup.c:949] setup_arch(): machine name Sigma Tango DT
1: [arch/arm/kernel/setup.c:967] setup_arch(): before parse_early_param
1: [init/main.c:468] parse_early_param(): bootcmdline 'console=uart,mmio32,0x10700,115200n8r mem=256M earlyprintk debug ignore_loglevel'
1: [init/main.c:473] parse_early_param(): mark
1: [init/main.c:428] do_early_param(): enter with: 'console' 'uart,mmio32,0x10700,115200n8r'
1: [init/main.c:446] do_early_param(): 'earlycon', setup_func 0xc024b868
1: [drivers/tty/serial/earlycon.c:214] param_setup_earlycon(): 'uart,mmio32,0x10700,115200n8r'
1: [drivers/tty/serial/earlycon.c:181] setup_earlycon(): 'uart,mmio32,0x10700,115200n8r'
1: [drivers/tty/serial/earlycon.c:132] register_earlycon(): 'mmio32,0x10700,115200n8r' 'uart'
1: [drivers/tty/serial/earlycon.c:86] parse_options(): 'mmio32,0x10700,115200n8r'
1: [drivers/tty/serial/earlycon.c:91] parse_options(): addr 0x00010700, options '115200n8r'
1: [drivers/tty/serial/earlycon.c:117] parse_options(): Early serial console at MMIO32 0x10700 (options '115200n8r')
1: [drivers/tty/serial/earlycon.c:138] register_earlycon(): '(null)'
1: [drivers/tty/serial/earlycon.c:62] earlycon_map(): paddr 0x00010700 size 64

As you can see, now that the options are more complete, the match for "earlycon" succeeds, but it does not work, the last log is in earlycon_map() function.
When using just "console=uart", the "earlycon" match will fail but a match for "earlyprink" will succeed. That one will hook printch() from the arch-dependent code to a somewhat simpler 'earlycon' (arch/arm/kernel/early_printk.c).

I think the code is the same on mainline.

Also, regarding my previous question about using a HW described in DT for earlycon, I noticed there's a of_setup_earlycon() in drivers/tty/serial/earlycon.c but that is hooked to drivers/of/fdt.c:setup_of_earlycon() which is not called. I do have CONFIG_SERIAL_EARLYCON=y.

I also have a similar issue (ie: get blocked right after the call to earlycon_map function, log is obviously different from above) if attempt to use of_setup_earlycon.
My DT has roughly:

aliases {
serial0 = &uart;
};

chosen {
bootargs = "earlycon console mem=256M earlyprintk debug ignore_loglevel";
stdout-path = "serial0:115200n8";
};

uart: serial@10700 {
compatible = "ralink,rt2880-uart";
reg = <0x10700 0x30>;
interrupts = <1 IRQ_TYPE_LEVEL_HIGH>;
clock-frequency = <7372800>;
reg-shift = <2>;
};


and then I hack drivers/tty/serial/8250/8250_early.c by adding:

OF_EARLYCON_DECLARE(rt2880, "ralink,rt2880-uart", early_serial8250_setup);

at the end of the file, trying to mimic commit d05f15707bb7659d2b863fafa1a918f286d74a63

I'm still trying to figure out the right bootargs, so that's why both "earlycon" and "console" are there. Suggestions welcome.

Thanks in advance and Merry Christmas!




--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/