From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hans de Goede Date: Mon, 12 Jan 2015 12:05:57 +0100 Subject: [U-Boot] [U-Boot, 1/2] console: Use pre-console buffer to get complete log on all consoles In-Reply-To: <1420700552-17474-1-git-send-email-siarhei.siamashka@gmail.com> References: <1420700552-17474-1-git-send-email-siarhei.siamashka@gmail.com> Message-ID: <54B3AA95.2010902@redhat.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi, On 08-01-15 08:02, Siarhei Siamashka wrote: > Currently the pre-console buffer can accumulate early log messages > and flush them to the serial console as soon as it becomes available. > > This patch just adds one more pre-console buffer flushing point and > does all the same for the other consoles too. This is particularly > useful for the vga/hdmi/lcd console, where we can see all the older > messages now (except for the log messages from SPL). > > Naturally, we don't want to get an extra copy of the log messages > on the serial console again at the second flushing point, so the > serial console has to be explicitly filtered out. > > Signed-off-by: Siarhei Siamashka Thanks for writing this, this is something which I wanted to have for a while now :) Code wise this looks good to me: Acked-by: Hans de Goede I wonder who should pick this patch up though, Tom can you pick this up ? Siarhei can you respin the sunxi patch for this using the address I suggested in my other mail ? Regards, Hans > --- > common/console.c | 46 +++++++++++++++++++++++++++++++++++++++++----- > 1 file changed, 41 insertions(+), 5 deletions(-) > > diff --git a/common/console.c b/common/console.c > index 29560c3..fc1963b 100644 > --- a/common/console.c > +++ b/common/console.c > @@ -199,6 +199,20 @@ static void console_putc(int file, const char c) > } > } > > +#ifdef CONFIG_PRE_CONSOLE_BUFFER > +static void console_putc_noserial(int file, const char c) > +{ > + int i; > + struct stdio_dev *dev; > + > + for (i = 0; i < cd_count[file]; i++) { > + dev = console_devices[file][i]; > + if (dev->putc != NULL && strcmp(dev->name, "serial") != 0) > + dev->putc(dev, c); > + } > +} > +#endif > + > static void console_puts(int file, const char *s) > { > int i; > @@ -236,6 +250,14 @@ static inline void console_putc(int file, const char c) > stdio_devices[file]->putc(stdio_devices[file], c); > } > > +#ifdef CONFIG_PRE_CONSOLE_BUFFER > +static inline void console_putc_noserial(int file, const char c) > +{ > + if (strcmp(stdio_devices[file]->name, "serial") != 0) > + stdio_devices[file]->putc(stdio_devices[file], c); > +} > +#endif > + > static inline void console_puts(int file, const char *s) > { > stdio_devices[file]->puts(stdio_devices[file], s); > @@ -382,6 +404,9 @@ int tstc(void) > return serial_tstc(); > } > > +#define PRE_CONSOLE_FLUSHPOINT1_SERIAL 0 > +#define PRE_CONSOLE_FLUSHPOINT2_EVERYTHING_BUT_SERIAL 1 > + > #ifdef CONFIG_PRE_CONSOLE_BUFFER > #define CIRC_BUF_IDX(idx) ((idx) % (unsigned long)CONFIG_PRE_CON_BUF_SZ) > > @@ -398,7 +423,7 @@ static void pre_console_puts(const char *s) > pre_console_putc(*s++); > } > > -static void print_pre_console_buffer(void) > +static void print_pre_console_buffer(int flushpoint) > { > unsigned long i = 0; > char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR; > @@ -407,12 +432,20 @@ static void print_pre_console_buffer(void) > i = gd->precon_buf_idx - CONFIG_PRE_CON_BUF_SZ; > > while (i < gd->precon_buf_idx) > - putc(buffer[CIRC_BUF_IDX(i++)]); > + switch (flushpoint) { > + case PRE_CONSOLE_FLUSHPOINT1_SERIAL: > + putc(buffer[CIRC_BUF_IDX(i++)]); > + break; > + case PRE_CONSOLE_FLUSHPOINT2_EVERYTHING_BUT_SERIAL: > + console_putc_noserial(stdout, > + buffer[CIRC_BUF_IDX(i++)]); > + break; > + } > } > #else > static inline void pre_console_putc(const char c) {} > static inline void pre_console_puts(const char *s) {} > -static inline void print_pre_console_buffer(void) {} > +static inline void print_pre_console_buffer(int flushpoint) {} > #endif > > void putc(const char c) > @@ -441,6 +474,7 @@ void putc(const char c) > fputc(stdout, c); > } else { > /* Send directly to the handler */ > + pre_console_putc(c); > serial_putc(c); > } > } > @@ -472,6 +506,7 @@ void puts(const char *s) > fputs(stdout, s); > } else { > /* Send directly to the handler */ > + pre_console_puts(s); > serial_puts(s); > } > } > @@ -679,7 +714,7 @@ int console_init_f(void) > gd->flags |= GD_FLG_SILENT; > #endif > > - print_pre_console_buffer(); > + print_pre_console_buffer(PRE_CONSOLE_FLUSHPOINT1_SERIAL); > > return 0; > } > @@ -794,6 +829,7 @@ done: > if ((stdio_devices[stdin] == NULL) && (stdio_devices[stdout] == NULL)) > return 0; > #endif > + print_pre_console_buffer(PRE_CONSOLE_FLUSHPOINT2_EVERYTHING_BUT_SERIAL); > return 0; > } > > @@ -869,7 +905,7 @@ int console_init_r(void) > if ((stdio_devices[stdin] == NULL) && (stdio_devices[stdout] == NULL)) > return 0; > #endif > - > + print_pre_console_buffer(PRE_CONSOLE_FLUSHPOINT2_EVERYTHING_BUT_SERIAL); > return 0; > } > >