]> git.ipfire.org Git - people/ms/u-boot.git/commitdiff
Revert "console: simplify puts()"
authorSoeren Moch <smoch@web.de>
Sat, 4 Nov 2017 15:14:09 +0000 (16:14 +0100)
committerTom Rini <trini@konsulko.com>
Sun, 12 Nov 2017 21:18:16 +0000 (16:18 -0500)
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>
common/console.c

index f83528ca603eaa3504c22a78503cb6deb674b5dd..d763f2c68460df82aae6ce933823835b0e419200 100644 (file)
@@ -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