diff mbox

[U-Boot,1/2] console: Allow pre-console buffer to also extract SPL log messages

Message ID 1421152210-14441-2-git-send-email-siarhei.siamashka@gmail.com
State Deferred
Delegated to: Hans de Goede
Headers show

Commit Message

Siarhei Siamashka Jan. 13, 2015, 12:30 p.m. UTC
It is possible to enable pre-console buffer in SPL and later extract
log messages from it when updating stdio consoles in u-boot.

Signed-off-by: Siarhei Siamashka <siarhei.siamashka@gmail.com>
---
 common/console.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 60 insertions(+), 5 deletions(-)

Comments

Simon Glass Jan. 13, 2015, 9:15 p.m. UTC | #1
Hi Siarhei,

On 13 January 2015 at 04:30, Siarhei Siamashka
<siarhei.siamashka@gmail.com> wrote:
> It is possible to enable pre-console buffer in SPL and later extract
> log messages from it when updating stdio consoles in u-boot.
>
> Signed-off-by: Siarhei Siamashka <siarhei.siamashka@gmail.com>
> ---
>  common/console.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 60 insertions(+), 5 deletions(-)
>
> diff --git a/common/console.c b/common/console.c
> index fc1963b..fbbe897 100644
> --- a/common/console.c
> +++ b/common/console.c
> @@ -404,17 +404,49 @@ int tstc(void)
>         return serial_tstc();
>  }
>
> +/*
> + * The pre-console buffer helps to ensure that log messages can reach stdio
> + * consoles even from the very bottom of SPL.
> + *
> + * To get the full use of it, the SPL build should have the following defines:
> + *   CONFIG_PRE_CONSOLE_BUFFER - define to enable the SPL pre-console buffer
> + *   CONFIG_PRE_CON_BUF_ADDR   - address in SRAM of the SPL pre-console buffer
> + *   CONFIG_PRE_CON_BUF_SZ     - size of the SPL pre-console buffer
> + *   CONFIG_PRE_CON_IDX_ADDR   - address of the index variable duplicate
> + *
> + * The main u-boot build should have the following defines:
> + *   CONFIG_PRE_CONSOLE_BUFFER - define to enable the main pre-console buffer
> + *   CONFIG_PRE_CON_BUF_ADDR   - address in DRAM of the main pre-console buffer
> + *   CONFIG_PRE_CON_BUF_SZ     - size of the main pre-console buffer
> + * and
> + *   CONFIG_SPL_PRE_CONSOLE_BUFFER - same as CONFIG_PRE_CONSOLE_BUFFER in SPL
> + *   CONFIG_SPL_PRE_CON_BUF_ADDR   - same as CONFIG_SPL_CON_BUF_ADDR in SPL
> + *   CONFIG_SPL_PRE_CON_BUF_SZ     - same as CONFIG_PRE_CON_BUF_SZ in SPL
> + *   CONFIG_SPL_PRE_CON_IDX_ADDR   - same as CONFIG_PRE_CON_IDX_ADDR in SPL

Could this not be the first word of the buffer?

> + */

These should all move to Kconfig I think, including the help text.

We might want to change SZ to SIZE.

>  #define PRE_CONSOLE_FLUSHPOINT1_SERIAL                 0
>  #define PRE_CONSOLE_FLUSHPOINT2_EVERYTHING_BUT_SERIAL  1
>
>  #ifdef CONFIG_PRE_CONSOLE_BUFFER
> +
> +#ifdef CONFIG_PRE_CON_IDX_ADDR
> +#define PRECON_BUF_IDX (*(unsigned long *)(CONFIG_PRE_CON_IDX_ADDR))
> +#else
> +#define PRECON_BUF_IDX (gd->precon_buf_idx)
> +#endif
> +
> +#define PRECON_SPL_BUF_IDX (*(unsigned long *)(CONFIG_SPL_PRE_CON_IDX_ADDR))
> +
>  #define CIRC_BUF_IDX(idx) ((idx) % (unsigned long)CONFIG_PRE_CON_BUF_SZ)
> +#define CIRC_SPL_BUF_IDX(idx) ((idx) % (unsigned long)CONFIG_SPL_PRE_CON_BUF_SZ)
>
>  static void pre_console_putc(const char c)
>  {
>         char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
>
>         buffer[CIRC_BUF_IDX(gd->precon_buf_idx++)] = c;
> +       /* Update the index variable duplicate */
> +       PRECON_BUF_IDX = gd->precon_buf_idx;
>  }
>
>  static void pre_console_puts(const char *s)
> @@ -425,13 +457,36 @@ static void pre_console_puts(const char *s)
>
>  static void print_pre_console_buffer(int flushpoint)
>  {
> -       unsigned long i = 0;
> -       char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
> +       unsigned long i;
> +       char *buffer;
> +
> +       /* Update the index variable duplicate (to do it at least once) */
> +       PRECON_BUF_IDX = gd->precon_buf_idx;
> +
> +#if defined(CONFIG_SPL_PRE_CONSOLE_BUFFER) && !defined(CONFIG_SPL_BUILD)
> +       i = 0;
> +       buffer = (char *)CONFIG_SPL_PRE_CON_BUF_ADDR;
> +
> +       if (PRECON_SPL_BUF_IDX > CONFIG_SPL_PRE_CON_BUF_SZ)
> +               i = PRECON_SPL_BUF_IDX - CONFIG_SPL_PRE_CON_BUF_SZ;
> +
> +       while (i < PRECON_SPL_BUF_IDX) {
> +               switch (flushpoint) {
> +               case PRE_CONSOLE_FLUSHPOINT2_EVERYTHING_BUT_SERIAL:
> +                       console_putc_noserial(stdout,
> +                                             buffer[CIRC_SPL_BUF_IDX(i)]);
> +                       break;
> +               }
> +               i++;
> +       }
> +#endif
> +       i = 0;
> +       buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
>
> -       if (gd->precon_buf_idx > CONFIG_PRE_CON_BUF_SZ)
> -               i = gd->precon_buf_idx - CONFIG_PRE_CON_BUF_SZ;
> +       if (PRECON_BUF_IDX > CONFIG_PRE_CON_BUF_SZ)
> +               i = PRECON_BUF_IDX - CONFIG_PRE_CON_BUF_SZ;
>
> -       while (i < gd->precon_buf_idx)
> +       while (i < PRECON_BUF_IDX)
>                 switch (flushpoint) {
>                 case PRE_CONSOLE_FLUSHPOINT1_SERIAL:
>                         putc(buffer[CIRC_BUF_IDX(i++)]);
> --
> 2.0.5
>

Regards,
Simon
diff mbox

Patch

diff --git a/common/console.c b/common/console.c
index fc1963b..fbbe897 100644
--- a/common/console.c
+++ b/common/console.c
@@ -404,17 +404,49 @@  int tstc(void)
 	return serial_tstc();
 }
 
+/*
+ * The pre-console buffer helps to ensure that log messages can reach stdio
+ * consoles even from the very bottom of SPL.
+ *
+ * To get the full use of it, the SPL build should have the following defines:
+ *   CONFIG_PRE_CONSOLE_BUFFER - define to enable the SPL pre-console buffer
+ *   CONFIG_PRE_CON_BUF_ADDR   - address in SRAM of the SPL pre-console buffer
+ *   CONFIG_PRE_CON_BUF_SZ     - size of the SPL pre-console buffer
+ *   CONFIG_PRE_CON_IDX_ADDR   - address of the index variable duplicate
+ *
+ * The main u-boot build should have the following defines:
+ *   CONFIG_PRE_CONSOLE_BUFFER - define to enable the main pre-console buffer
+ *   CONFIG_PRE_CON_BUF_ADDR   - address in DRAM of the main pre-console buffer
+ *   CONFIG_PRE_CON_BUF_SZ     - size of the main pre-console buffer
+ * and
+ *   CONFIG_SPL_PRE_CONSOLE_BUFFER - same as CONFIG_PRE_CONSOLE_BUFFER in SPL
+ *   CONFIG_SPL_PRE_CON_BUF_ADDR   - same as CONFIG_SPL_CON_BUF_ADDR in SPL
+ *   CONFIG_SPL_PRE_CON_BUF_SZ     - same as CONFIG_PRE_CON_BUF_SZ in SPL
+ *   CONFIG_SPL_PRE_CON_IDX_ADDR   - same as CONFIG_PRE_CON_IDX_ADDR in SPL
+ */
 #define PRE_CONSOLE_FLUSHPOINT1_SERIAL			0
 #define PRE_CONSOLE_FLUSHPOINT2_EVERYTHING_BUT_SERIAL	1
 
 #ifdef CONFIG_PRE_CONSOLE_BUFFER
+
+#ifdef CONFIG_PRE_CON_IDX_ADDR
+#define PRECON_BUF_IDX (*(unsigned long *)(CONFIG_PRE_CON_IDX_ADDR))
+#else
+#define PRECON_BUF_IDX (gd->precon_buf_idx)
+#endif
+
+#define PRECON_SPL_BUF_IDX (*(unsigned long *)(CONFIG_SPL_PRE_CON_IDX_ADDR))
+
 #define CIRC_BUF_IDX(idx) ((idx) % (unsigned long)CONFIG_PRE_CON_BUF_SZ)
+#define CIRC_SPL_BUF_IDX(idx) ((idx) % (unsigned long)CONFIG_SPL_PRE_CON_BUF_SZ)
 
 static void pre_console_putc(const char c)
 {
 	char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
 
 	buffer[CIRC_BUF_IDX(gd->precon_buf_idx++)] = c;
+	/* Update the index variable duplicate */
+	PRECON_BUF_IDX = gd->precon_buf_idx;
 }
 
 static void pre_console_puts(const char *s)
@@ -425,13 +457,36 @@  static void pre_console_puts(const char *s)
 
 static void print_pre_console_buffer(int flushpoint)
 {
-	unsigned long i = 0;
-	char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
+	unsigned long i;
+	char *buffer;
+
+	/* Update the index variable duplicate (to do it at least once) */
+	PRECON_BUF_IDX = gd->precon_buf_idx;
+
+#if defined(CONFIG_SPL_PRE_CONSOLE_BUFFER) && !defined(CONFIG_SPL_BUILD)
+	i = 0;
+	buffer = (char *)CONFIG_SPL_PRE_CON_BUF_ADDR;
+
+	if (PRECON_SPL_BUF_IDX > CONFIG_SPL_PRE_CON_BUF_SZ)
+		i = PRECON_SPL_BUF_IDX - CONFIG_SPL_PRE_CON_BUF_SZ;
+
+	while (i < PRECON_SPL_BUF_IDX) {
+		switch (flushpoint) {
+		case PRE_CONSOLE_FLUSHPOINT2_EVERYTHING_BUT_SERIAL:
+			console_putc_noserial(stdout,
+					      buffer[CIRC_SPL_BUF_IDX(i)]);
+			break;
+		}
+		i++;
+	}
+#endif
+	i = 0;
+	buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
 
-	if (gd->precon_buf_idx > CONFIG_PRE_CON_BUF_SZ)
-		i = gd->precon_buf_idx - CONFIG_PRE_CON_BUF_SZ;
+	if (PRECON_BUF_IDX > CONFIG_PRE_CON_BUF_SZ)
+		i = PRECON_BUF_IDX - CONFIG_PRE_CON_BUF_SZ;
 
-	while (i < gd->precon_buf_idx)
+	while (i < PRECON_BUF_IDX)
 		switch (flushpoint) {
 		case PRE_CONSOLE_FLUSHPOINT1_SERIAL:
 			putc(buffer[CIRC_BUF_IDX(i++)]);