console: add a flag to prepend '\r' in the multi-console framework
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Tue, 23 Jul 2019 03:32:58 +0000 (12:32 +0900)
committerMasahiro Yamada <yamada.masahiro@socionext.com>
Mon, 19 Aug 2019 08:00:08 +0000 (17:00 +0900)
Currently, console drivers prepend '\r' to '\n' by themselves. This is
common enough to be supported in the framework.

Add a new flag, CONSOLE_FLAG_TRANSLATE_CRLF. A driver can set this
flag to ask the framework to transform LF into CRLF instead of doing
it by itself.

Change-Id: I4f5c5887591bc0a8749a105abe62b6562eaf503b
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
drivers/console/multi_console.c
include/drivers/console.h
plat/common/aarch64/crash_console_helpers.S

index d9eba7f020e017cff67244b0a694a2edcc1d0d75..215f49517a2dca48c26a84eb8c7338541eb53231 100644 (file)
@@ -70,6 +70,20 @@ void console_set_scope(console_t *console, unsigned int scope)
        console->flags = (console->flags & ~CONSOLE_FLAG_SCOPE_MASK) | scope;
 }
 
+static int do_putc(int c, console_t *console)
+{
+       int ret;
+
+       if ((c == '\n') &&
+           ((console->flags & CONSOLE_FLAG_TRANSLATE_CRLF) != 0)) {
+               ret = console->putc('\r', console);
+               if (ret < 0)
+                       return ret;
+       }
+
+       return console->putc(c, console);
+}
+
 int console_putc(int c)
 {
        int err = ERROR_NO_VALID_CONSOLE;
@@ -77,7 +91,7 @@ int console_putc(int c)
 
        for (console = console_list; console != NULL; console = console->next)
                if ((console->flags & console_state) && console->putc) {
-                       int ret = console->putc(c, console);
+                       int ret = do_putc(c, console);
                        if ((err == ERROR_NO_VALID_CONSOLE) || (ret < err))
                                err = ret;
                }
index cada771b43127a0b0b835a3903c68a9cf290858d..a4859d80f003b0b1b3d7add32831e700ff862363 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -21,7 +21,8 @@
 #define CONSOLE_FLAG_CRASH             (U(1) << 2)
 /* Bits 3 to 7 reserved for additional scopes in future expansion. */
 #define CONSOLE_FLAG_SCOPE_MASK                ((U(1) << 8) - 1)
-/* Bits 8 to 31 reserved for non-scope use in future expansion. */
+/* Bits 8 to 31 for non-scope use. */
+#define CONSOLE_FLAG_TRANSLATE_CRLF    (U(1) << 8)
 
 /* Returned by getc callbacks when receive FIFO is empty. */
 #define ERROR_NO_PENDING_CHAR          (-1)
index 2a48baf0a9a7fb702316dea1b093058803f7f3d0..e2950f5f7c55d87a8b9f90bb71a462df422bb1e5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -125,9 +125,18 @@ putc_loop:
        b.eq    putc_continue
        ldr     x2, [x15, #CONSOLE_T_PUTC]
        cbz     x2, putc_continue
+       cmp     w14, #'\n'
+       b.ne    putc
+       tst     w1, #CONSOLE_FLAG_TRANSLATE_CRLF
+       b.eq    putc
        mov     x1, x15
+       mov     w0, #'\r'
        blr     x2
+       ldr     x2, [x15, #CONSOLE_T_PUTC]
+putc:
+       mov     x1, x15
        mov     w0, w14
+       blr     x2
 putc_continue:
        ldr     x15, [x15]                      /* X15 = next struct */
        b       putc_loop