summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSoeren Moch <smoch@web.de>2017-11-04 16:14:09 +0100
committerTom Rini <trini@konsulko.com>2017-11-12 16:18:16 -0500
commitbe135cc5eb4499f5eedd1b6d968ca51aa79df684 (patch)
tree4802fd183eb6740636b96d39a355e2213e812417
parentae147ab4a8bfabddcd7f83d893996a88c0ca1151 (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.c44
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