[U-Boot] [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 scheffler.u@web.de Signed-off-by: Soeren Moch smoch@web.de --- Cc: Masahiro Yamada yamada.masahiro@socionext.com Cc: Simon Glass sjg@chromium.org Cc: Tom Rini trini@konsulko.com Cc: Uwe Scheffler scheffler.u@web.de Cc: u-boot@lists.denx.de
Tom, can you pull this in as fix for 2017.11?
Thanks, Soeren --- common/console.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-)
diff --git a/common/console.c b/common/console.c index f83528c..d763f2c 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

Hello,
Am 04.11.2017 um 16:14 schrieb Soeren Moch:
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
Cc: Masahiro Yamada yamada.masahiro@socionext.com Cc: Simon Glass sjg@chromium.org Cc: Tom Rini trini@konsulko.com Cc: Uwe Scheffler scheffler.u@web.de Cc: u-boot@lists.denx.de
Tom, can you pull this in as fix for 2017.11?
The patch works. I have successfully tested with a Matrix-ARM board (TBS2910) Rev-2.1. Thank you, Sören.
Regards, Uwe
Thanks, Soeren
common/console.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-)
diff --git a/common/console.c b/common/console.c index f83528c..d763f2c 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
2.7.4

On Sat, Nov 04, 2017 at 04:14:09PM +0100, Soeren Moch wrote:
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
Cc: Masahiro Yamada yamada.masahiro@socionext.com Cc: Simon Glass sjg@chromium.org Cc: Tom Rini trini@konsulko.com Cc: Uwe Scheffler scheffler.u@web.de Cc: u-boot@lists.denx.de
Tom, can you pull this in as fix for 2017.11?
Looks like some of the CC got eaten? Masahiro, Simon, any comments? Thanks!

2017-11-07 1:50 GMT+09:00 Tom Rini trini@konsulko.com:
On Sat, Nov 04, 2017 at 04:14:09PM +0100, Soeren Moch wrote:
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
Cc: Masahiro Yamada yamada.masahiro@socionext.com Cc: Simon Glass sjg@chromium.org Cc: Tom Rini trini@konsulko.com Cc: Uwe Scheffler scheffler.u@web.de Cc: u-boot@lists.denx.de
Tom, can you pull this in as fix for 2017.11?
Looks like some of the CC got eaten? Masahiro, Simon, any comments? Thanks!
I do not know anything about this board.
Feel free to go ahead if this is a problem.

On 4 November 2017 at 09:14, Soeren Moch smoch@web.de wrote:
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
Cc: Masahiro Yamada yamada.masahiro@socionext.com Cc: Simon Glass sjg@chromium.org Cc: Tom Rini trini@konsulko.com Cc: Uwe Scheffler scheffler.u@web.de Cc: u-boot@lists.denx.de
Tom, can you pull this in as fix for 2017.11?
Thanks, Soeren
common/console.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-)
Reviewed-by: Simon Glass sjg@chromium.org

On Sat, Nov 04, 2017 at 04:14:09PM +0100, Soeren Moch wrote:
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
Applied to u-boot/master, thanks!
participants (5)
-
Masahiro Yamada
-
Simon Glass
-
Soeren Moch
-
Tom Rini
-
U. Scheffler