Message ID | 1369223456-3701-1-git-send-email-julien.grall@linaro.org |
---|---|
State | Superseded |
Headers | show |
On Wed, 2013-05-22 at 12:50 +0100, Julien Grall wrote: > When early printk is enabled by the user, it's possible to loose the last > characters if the UART is initialized without waiting that the last transfer > was completed. It might actually be useful to do this in early_printk, i.e. a new early_uart_flush or so called from puts and early_puts (or even just from the putch hook). Any opinions? Perhaps we should take this fix as is for 4.3 and look at the alternatives for 4.4? > Signed-off-by: Julien Grall <julien.grall@linaro.org> > --- > xen/drivers/char/exynos4210-uart.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/xen/drivers/char/exynos4210-uart.c b/xen/drivers/char/exynos4210-uart.c > index f7971da..13758d4 100644 > --- a/xen/drivers/char/exynos4210-uart.c > +++ b/xen/drivers/char/exynos4210-uart.c > @@ -104,6 +104,12 @@ static void __init exynos4210_uart_init_preirq(struct serial_port *port) > unsigned int divisor; > uint32_t ulcon; > > +#ifdef EARLY_PRINTK > + /* Flush the UART */ > + while ( !(exynos4210_read(uart, UTRSTAT) & UTRSTAT_TX_EMPTY) ) > + cpu_relax(); > +#endif > + > /* reset, TX/RX disables */ > exynos4210_write(uart, UCON, 0); >
On Thu, 2013-05-23 at 12:58 +0100, Ian Campbell wrote: > On Wed, 2013-05-22 at 12:50 +0100, Julien Grall wrote: > > When early printk is enabled by the user, it's possible to loose the last > > characters if the UART is initialized without waiting that the last transfer > > was completed. > > It might actually be useful to do this in early_printk, i.e. a new > early_uart_flush or so called from puts and early_puts (or even just > from the putch hook). BTW, my concern here is crashing without flushing the buffer and therefore missing a useful message or having a misleading log...
On 05/23/2013 01:01 PM, Ian Campbell wrote: > On Thu, 2013-05-23 at 12:58 +0100, Ian Campbell wrote: >> On Wed, 2013-05-22 at 12:50 +0100, Julien Grall wrote: >>> When early printk is enabled by the user, it's possible to loose the last >>> characters if the UART is initialized without waiting that the last transfer >>> was completed. >> >> It might actually be useful to do this in early_printk, i.e. a new >> early_uart_flush or so called from puts and early_puts (or even just >> from the putch hook). > > BTW, my concern here is crashing without flushing the buffer and > therefore missing a useful message or having a misleading log... > > Right. The change is not complicate, so I will create early_uart_flush and call it in early_printk.
diff --git a/xen/drivers/char/exynos4210-uart.c b/xen/drivers/char/exynos4210-uart.c index f7971da..13758d4 100644 --- a/xen/drivers/char/exynos4210-uart.c +++ b/xen/drivers/char/exynos4210-uart.c @@ -104,6 +104,12 @@ static void __init exynos4210_uart_init_preirq(struct serial_port *port) unsigned int divisor; uint32_t ulcon; +#ifdef EARLY_PRINTK + /* Flush the UART */ + while ( !(exynos4210_read(uart, UTRSTAT) & UTRSTAT_TX_EMPTY) ) + cpu_relax(); +#endif + /* reset, TX/RX disables */ exynos4210_write(uart, UCON, 0);
When early printk is enabled by the user, it's possible to loose the last characters if the UART is initialized without waiting that the last transfer was completed. Signed-off-by: Julien Grall <julien.grall@linaro.org> --- xen/drivers/char/exynos4210-uart.c | 6 ++++++ 1 file changed, 6 insertions(+)