diff options
author | Soeren Moch <smoch@web.de> | 2017-11-04 16:14:09 +0100 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2017-11-12 16:18:16 -0500 |
commit | be135cc5eb4499f5eedd1b6d968ca51aa79df684 (patch) | |
tree | 4802fd183eb6740636b96d39a355e2213e812417 | |
parent | ae147ab4a8bfabddcd7f83d893996a88c0ca1151 (diff) |
Revert "console: simplify puts()"
This reverts commit c61d0009feb966e0e93254a8c435a1889085e6b8.
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>
-rw-r--r-- | common/console.c | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/common/console.c b/common/console.c index f83528ca60..d763f2c684 100644 --- a/common/console.c +++ b/common/console.c @@ -450,6 +450,12 @@ static void pre_console_putc(const char c) 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) { unsigned long in = 0, out = 0; @@ -477,6 +483,7 @@ static void print_pre_console_buffer(int flushpoint) } #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(int flushpoint) {} #endif @@ -518,8 +525,41 @@ void putc(const char c) void puts(const char *s) { - while (*s) - putc(*s++); +#ifdef CONFIG_DEBUG_UART + 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 |