Revert "console: simplify puts()"

This reverts commit c61d0009fe.

A tbs2910 board user reported a very slow console frambuffer as
regression in current u-boot. I could bisect this down to the
above mentioned commit.

This revert brings back the fast framebuffer console (one
cache flush per string in puts(), not after each char).

Reported-by: Uwe Scheffler <scheffler.u@web.de>
Signed-off-by: Soeren Moch <smoch@web.de>
Tested-by: Uwe Scheffler <scheffler.u@web.de>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Soeren Moch 2017-11-04 16:14:09 +01:00 committed by Tom Rini
parent ae147ab4a8
commit be135cc5eb

View File

@ -450,6 +450,12 @@ static void pre_console_putc(const char c)
unmap_sysmem(buffer); unmap_sysmem(buffer);
} }
static void pre_console_puts(const char *s)
{
while (*s)
pre_console_putc(*s++);
}
static void print_pre_console_buffer(int flushpoint) static void print_pre_console_buffer(int flushpoint)
{ {
unsigned long in = 0, out = 0; unsigned long in = 0, out = 0;
@ -477,6 +483,7 @@ static void print_pre_console_buffer(int flushpoint)
} }
#else #else
static inline void pre_console_putc(const char c) {} 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(int flushpoint) {} static inline void print_pre_console_buffer(int flushpoint) {}
#endif #endif
@ -518,8 +525,41 @@ void putc(const char c)
void puts(const char *s) void puts(const char *s)
{ {
while (*s) #ifdef CONFIG_DEBUG_UART
putc(*s++); if (!gd || !(gd->flags & GD_FLG_SERIAL_READY)) {
while (*s) {
int ch = *s++;
printch(ch);
}
return;
}
#endif
#ifdef CONFIG_CONSOLE_RECORD
if (gd && (gd->flags & GD_FLG_RECORD) && gd->console_out.start)
membuff_put(&gd->console_out, s, strlen(s));
#endif
#ifdef CONFIG_SILENT_CONSOLE
if (gd->flags & GD_FLG_SILENT)
return;
#endif
#ifdef CONFIG_DISABLE_CONSOLE
if (gd->flags & GD_FLG_DISABLE_CONSOLE)
return;
#endif
if (!gd->have_console)
return pre_console_puts(s);
if (gd->flags & GD_FLG_DEVINIT) {
/* Send to the standard output */
fputs(stdout, s);
} else {
/* Send directly to the handler */
pre_console_puts(s);
serial_puts(s);
}
} }
#ifdef CONFIG_CONSOLE_RECORD #ifdef CONFIG_CONSOLE_RECORD