From be135cc5eb4499f5eedd1b6d968ca51aa79df684 Mon Sep 17 00:00:00 2001 From: Soeren Moch Date: Sat, 4 Nov 2017 16:14:09 +0100 Subject: [PATCH] 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 Signed-off-by: Soeren Moch Tested-by: Uwe Scheffler Reviewed-by: Simon Glass --- common/console.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file 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