Julien Grall
2013-May-22 11:50 UTC
[PATCH] drivers/exynos4210: Wait the end of last transfer before initializing the UART
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(+) 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); -- 1.7.10.4
Ian Campbell
2013-May-23 11:58 UTC
Re: [PATCH] drivers/exynos4210: Wait the end of last transfer before initializing the UART
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); >
Ian Campbell
2013-May-23 12:01 UTC
Re: [PATCH] drivers/exynos4210: Wait the end of last transfer before initializing the UART
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...
Julien Grall
2013-May-23 13:40 UTC
Re: [PATCH] drivers/exynos4210: Wait the end of last transfer before initializing the UART
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. -- Julien