At least on socfpga gen5, _debug_uart_putc() can be called
before debug_uart_init(), which leaves us stuck in an
infinite loop in the ns16550 debug uart driver.

Since this prevents debugging startup problems instead
of helping, let's add a field to 'gd' that prevents
calling the _debug_uart_putc() until debug_uart_init()
has been called.

Signed-off-by: Simon Goldschmidt <simon.k.r.goldschm...@gmail.com>
---

 include/asm-generic/global_data.h |  3 +++
 include/debug_uart.h              | 19 ++++++++++++++-----
 2 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/include/asm-generic/global_data.h 
b/include/asm-generic/global_data.h
index c83fc01b76..9de7f48476 100644
--- a/include/asm-generic/global_data.h
+++ b/include/asm-generic/global_data.h
@@ -122,6 +122,9 @@ typedef struct global_data {
        struct list_head log_head;      /* List of struct log_device */
        int log_fmt;                    /* Mask containing log format info */
 #endif
+#ifdef CONFIG_DEBUG_UART
+       int debug_uart_initialized;     /* No print before debug_uart_init */
+#endif
 } gd_t;
 #endif
 
diff --git a/include/debug_uart.h b/include/debug_uart.h
index 34e8b2fc81..4133c5612c 100644
--- a/include/debug_uart.h
+++ b/include/debug_uart.h
@@ -128,9 +128,12 @@ void printhex8(uint value);
 \
        static inline void _printch(int ch) \
        { \
-               if (ch == '\n') \
-                       _debug_uart_putc('\r'); \
-               _debug_uart_putc(ch); \
+               DECLARE_GLOBAL_DATA_PTR; \
+               if (gd->debug_uart_initialized) { \
+                       if (ch == '\n') \
+                               _debug_uart_putc('\r'); \
+                       _debug_uart_putc(ch); \
+               } \
        } \
 \
        void printch(int ch) \
@@ -146,8 +149,12 @@ void printhex8(uint value);
 \
        static inline void printhex1(uint digit) \
        { \
-               digit &= 0xf; \
-               _debug_uart_putc(digit > 9 ? digit - 10 + 'a' : digit + '0'); \
+               DECLARE_GLOBAL_DATA_PTR; \
+               if (gd->debug_uart_initialized) { \
+                       digit &= 0xf; \
+                       _debug_uart_putc(digit > 9 ? digit - 10 + 'a' : \
+                                        digit + '0'); \
+               } \
        } \
 \
        static inline void printhex(uint value, int digits) \
@@ -173,8 +180,10 @@ void printhex8(uint value);
 \
        void debug_uart_init(void) \
        { \
+               DECLARE_GLOBAL_DATA_PTR; \
                board_debug_uart_init(); \
                _debug_uart_init(); \
+               gd->debug_uart_initialized = 1; \
                _DEBUG_UART_ANNOUNCE \
        } \
 
-- 
2.17.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to