diff mbox series

[v1,1/3] common: ns3: add error logging support

Message ID 20200517083257.22191-2-rayagonda.kokatanur@broadcom.com
State Deferred
Delegated to: Tom Rini
Headers show
Series add elog support for broadcom NS3 soc | expand

Commit Message

Rayagonda Kokatanur May 17, 2020, 8:32 a.m. UTC
From: Sheetal Tigadoli <sheetal.tigadoli@broadcom.com>

Add error logging support in uboot for ns3 platform.

We log the bootup msgs from all bootstages(BL2, BL31, BL33, and Linux)
on to DDR. When a watchdog is triggered from any of the bootstages,
CRMU copies these logs to QSPI error logging space.

Later when doing the post-mortem analysis, we parse the QSPI error
log space.

Signed-off-by: Sheetal Tigadoli <sheetal.tigadoli@broadcom.com>
Signed-off-by: Rayagonda Kokatanur <rayagonda.kokatanur@broadcom.com>
---
 common/Kconfig            |  8 +++++++
 common/Makefile           |  1 +
 common/bcm_elog.c         | 49 +++++++++++++++++++++++++++++++++++++++
 common/console.c          | 22 ++++++++++++++++++
 configs/bcm_ns3_defconfig |  1 +
 include/bcm_elog.h        | 37 +++++++++++++++++++++++++++++
 6 files changed, 118 insertions(+)
 create mode 100644 common/bcm_elog.c
 create mode 100644 include/bcm_elog.h

Comments

Simon Glass May 25, 2020, 5:03 p.m. UTC | #1
Hi Rayagonda,

On Sun, 17 May 2020 at 02:33, Rayagonda Kokatanur
<rayagonda.kokatanur@broadcom.com> wrote:
>
> From: Sheetal Tigadoli <sheetal.tigadoli@broadcom.com>
>
> Add error logging support in uboot for ns3 platform.
>
> We log the bootup msgs from all bootstages(BL2, BL31, BL33, and Linux)
> on to DDR. When a watchdog is triggered from any of the bootstages,
> CRMU copies these logs to QSPI error logging space.
>
> Later when doing the post-mortem analysis, we parse the QSPI error
> log space.

Is there a doc somewhere describing the format? If not you should add
something to the top of your source file.

>
> Signed-off-by: Sheetal Tigadoli <sheetal.tigadoli@broadcom.com>
> Signed-off-by: Rayagonda Kokatanur <rayagonda.kokatanur@broadcom.com>
> ---
>  common/Kconfig            |  8 +++++++
>  common/Makefile           |  1 +
>  common/bcm_elog.c         | 49 +++++++++++++++++++++++++++++++++++++++
>  common/console.c          | 22 ++++++++++++++++++
>  configs/bcm_ns3_defconfig |  1 +
>  include/bcm_elog.h        | 37 +++++++++++++++++++++++++++++
>  6 files changed, 118 insertions(+)
>  create mode 100644 common/bcm_elog.c
>  create mode 100644 include/bcm_elog.h
>
> diff --git a/common/Kconfig b/common/Kconfig
> index 30cba15948..3980ba31e0 100644
> --- a/common/Kconfig
> +++ b/common/Kconfig
> @@ -634,6 +634,14 @@ config SYS_STDIO_DEREGISTER
>           removed (for example a USB keyboard) then this option can be
>           enabled to ensure this is handled correctly.
>
> +config BCM_ELOG
> +       bool "Broadcom error logging support"
> +       default n

Not needed

> +       help
> +         Enables broadcom error logging support to be used with brcm
> +         platforms, say Y to this option to enable the logging support.
> +         If unsure, say N.
> +
>  endmenu
>
>  menu "Logging"
> diff --git a/common/Makefile b/common/Makefile
> index 2e7a090588..dced769dcf 100644
> --- a/common/Makefile
> +++ b/common/Makefile
> @@ -95,6 +95,7 @@ else
>  obj-$(CONFIG_SPL_SERIAL_SUPPORT) += console.o
>  endif
>  else
> +obj-$(CONFIG_BCM_ELOG) += bcm_elog.o
>  obj-y += console.o
>  endif # CONFIG_SPL_BUILD
>
> diff --git a/common/bcm_elog.c b/common/bcm_elog.c
> new file mode 100644
> index 0000000000..8e89a500b9
> --- /dev/null
> +++ b/common/bcm_elog.c
> @@ -0,0 +1,49 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright 2020 Broadcom.
> + */
> +
> +#include <bcm_elog.h>
> +
> +/* Log one character */
> +int log2ddr(const char ch)
> +{
> +       u32 offset, len;
> +       uintptr_t base = BCM_ELOG_UBOOT_BASE;

This should really be in a driver. Have you looked at logging? See for
example log_syslog.c which is an example of writing log info obtained
from the log() function.

If that doesn't work then perhaps have a UCLASS_MISC driver that you
can write to?

> +
> +       offset = readl(base + BCM_ELOG_OFF_OFFSET);
> +       len = readl(base + BCM_ELOG_LEN_OFFSET);
> +       writeb(ch, base + offset);
> +       offset++;
> +
> +       /* log buffer is now full and need to wrap around */
> +       if (offset >= BCM_ELOG_UBOOT_SIZE)
> +               offset = BCM_ELOG_HEADER_LEN;
> +
> +       /* only increment length when log buffer is not full */
> +       if (len < BCM_ELOG_UBOOT_SIZE - BCM_ELOG_HEADER_LEN)
> +               len++;
> +
> +       writel(offset, base + BCM_ELOG_OFF_OFFSET);
> +       writel(len, base + BCM_ELOG_LEN_OFFSET);
> +
> +       return 0;
> +}
> +
> +/* Routine to initialize error logging */
> +void bcm_elog_init(uintptr_t base, uint32_t size)
> +{
> +       u32 val;
> +
> +       /*
> +        * If a valid signature is found, it means logging is already
> +        * initialize. In this case, we should not re-initialize the entry
> +        * header in the designated memory
> +        */
> +       val = readl(base + BCM_ELOG_SIG_OFFSET);
> +       if (val != BCM_ELOG_SIG_VAL) {
> +               writel(base + BCM_ELOG_SIG_OFFSET, BCM_ELOG_SIG_VAL);
> +               writel(base + BCM_ELOG_OFF_OFFSET, BCM_ELOG_HEADER_LEN);
> +               writel(base + BCM_ELOG_LEN_OFFSET, 0);
> +       }
> +}
> diff --git a/common/console.c b/common/console.c
> index e398530a13..a65fdc16c2 100644
> --- a/common/console.c
> +++ b/common/console.c
> @@ -20,6 +20,10 @@
>  #include <env_internal.h>
>  #include <watchdog.h>
>
> +#ifdef CONFIG_BCM_ELOG
> +#include <bcm_elog.h>
> +#endif

Can't add this to common code, sorry.

Hopefully U-Boot's logging can help here?

> +
>  DECLARE_GLOBAL_DATA_PTR;
>
>  static int on_console(const char *name, const char *value, enum env_op op,
> @@ -536,6 +540,9 @@ void putc(const char c)
>         if (!gd->have_console)
>                 return pre_console_putc(c);
>
> +#ifdef CONFIG_BCM_ELOG
> +       log2ddr(c);
> +#endif
>         if (gd->flags & GD_FLG_DEVINIT) {
>                 /* Send to the standard output */
>                 fputc(stdout, c);
> @@ -587,6 +594,17 @@ void puts(const char *s)
>         if (!gd->have_console)
>                 return pre_console_puts(s);
>
> +#ifdef CONFIG_BCM_ELOG
> +       {
> +               const char *tmp = s;
> +
> +               while (*tmp) {
> +                       int c = *tmp++;
> +
> +                       log2ddr(c);
> +               }
> +       }
> +#endif
>         if (gd->flags & GD_FLG_DEVINIT) {
>                 /* Send to the standard output */
>                 fputs(stdout, s);
> @@ -790,6 +808,10 @@ int console_init_f(void)
>
>         print_pre_console_buffer(PRE_CONSOLE_FLUSHPOINT1_SERIAL);
>
> +#ifdef CONFIG_BCM_ELOG
> +       bcm_elog_init(BCM_ELOG_UBOOT_BASE, BCM_ELOG_UBOOT_SIZE);
> +#endif
> +
>         return 0;
>  }
>
> diff --git a/configs/bcm_ns3_defconfig b/configs/bcm_ns3_defconfig
> index 13fe9d439e..a2201bf0c9 100644
> --- a/configs/bcm_ns3_defconfig
> +++ b/configs/bcm_ns3_defconfig
> @@ -14,6 +14,7 @@ CONFIG_LOGLEVEL=7
>  CONFIG_SILENT_CONSOLE=y
>  CONFIG_SILENT_U_BOOT_ONLY=y
>  # CONFIG_SILENT_CONSOLE_UPDATE_ON_SET is not set
> +CONFIG_BCM_ELOG=y
>  CONFIG_SUPPORT_RAW_INITRD=y
>  # CONFIG_DISPLAY_CPUINFO is not set
>  CONFIG_HUSH_PARSER=y
> diff --git a/include/bcm_elog.h b/include/bcm_elog.h
> new file mode 100644
> index 0000000000..7ba99f1cf7
> --- /dev/null
> +++ b/include/bcm_elog.h
> @@ -0,0 +1,37 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright 2020 Broadcom.
> + *
> + */
> +
> +#ifndef __BCM_ELOG_H__
> +#define __BCM_ELOG_H__
> +
> +#include <asm/io.h>
> +#include <linux/types.h>
> +
> +/* Default AP error logging base address */
> +#ifndef ELOG_AP_UART_LOG_BASE
> +#define ELOG_AP_UART_LOG_BASE  0x8f110000
> +#endif
> +
> +/* Reserve 16K to store error logs */
> +#define BCM_ELOG_UBOOT_BASE    ELOG_AP_UART_LOG_BASE
> +#define BCM_ELOG_UBOOT_SIZE    0x4000

This should go in the devicetree node for your driver.

> +
> +/* error logging signature */
> +#define BCM_ELOG_SIG_OFFSET    0x0000
> +#define BCM_ELOG_SIG_VAL       0x75767971
> +
> +/* current logging offset that points to where new logs should be added */
> +#define BCM_ELOG_OFF_OFFSET    0x0004
> +
> +/* current logging length (excluding header) */
> +#define BCM_ELOG_LEN_OFFSET    0x0008
> +
> +#define BCM_ELOG_HEADER_LEN    12
> +
> +int log2ddr(const char ch);
> +void bcm_elog_init(uintptr_t base, uint32_t size);
> +
> +#endif /* __BCM_ELOG_H__ */
> --
> 2.17.1
>

Regards,
Simon
Tom Rini Aug. 14, 2020, 7:52 p.m. UTC | #2
On Sun, May 17, 2020 at 02:02:55PM +0530, Rayagonda Kokatanur wrote:

> From: Sheetal Tigadoli <sheetal.tigadoli@broadcom.com>
> 
> Add error logging support in uboot for ns3 platform.
> 
> We log the bootup msgs from all bootstages(BL2, BL31, BL33, and Linux)
> on to DDR. When a watchdog is triggered from any of the bootstages,
> CRMU copies these logs to QSPI error logging space.
> 
> Later when doing the post-mortem analysis, we parse the QSPI error
> log space.
> 
> Signed-off-by: Sheetal Tigadoli <sheetal.tigadoli@broadcom.com>
> Signed-off-by: Rayagonda Kokatanur <rayagonda.kokatanur@broadcom.com>

This, and the series that starts with "cmd: bcm: add nitro boot command"
seem to conflict.  Can you please resubmit any further outstanding
patches?  Thanks!
Rayagonda Kokatanur Aug. 20, 2020, 3:12 p.m. UTC | #3
Hi Tom,


On Sat, Aug 15, 2020 at 1:22 AM Tom Rini <trini@konsulko.com> wrote:
>
> On Sun, May 17, 2020 at 02:02:55PM +0530, Rayagonda Kokatanur wrote:
>
> > From: Sheetal Tigadoli <sheetal.tigadoli@broadcom.com>
> >
> > Add error logging support in uboot for ns3 platform.
> >
> > We log the bootup msgs from all bootstages(BL2, BL31, BL33, and Linux)
> > on to DDR. When a watchdog is triggered from any of the bootstages,
> > CRMU copies these logs to QSPI error logging space.
> >
> > Later when doing the post-mortem analysis, we parse the QSPI error
> > log space.
> >
> > Signed-off-by: Sheetal Tigadoli <sheetal.tigadoli@broadcom.com>
> > Signed-off-by: Rayagonda Kokatanur <rayagonda.kokatanur@broadcom.com>
>
> This, and the series that starts with "cmd: bcm: add nitro boot command"
> seem to conflict.  Can you please resubmit any further outstanding
> patches?  Thanks!

Rebased the patch and sent a v2 patch.

Thanks,
Rayagonda

>
> --
> Tom
diff mbox series

Patch

diff --git a/common/Kconfig b/common/Kconfig
index 30cba15948..3980ba31e0 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -634,6 +634,14 @@  config SYS_STDIO_DEREGISTER
 	  removed (for example a USB keyboard) then this option can be
 	  enabled to ensure this is handled correctly.
 
+config BCM_ELOG
+	bool "Broadcom error logging support"
+	default n
+	help
+	  Enables broadcom error logging support to be used with brcm
+	  platforms, say Y to this option to enable the logging support.
+	  If unsure, say N.
+
 endmenu
 
 menu "Logging"
diff --git a/common/Makefile b/common/Makefile
index 2e7a090588..dced769dcf 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -95,6 +95,7 @@  else
 obj-$(CONFIG_SPL_SERIAL_SUPPORT) += console.o
 endif
 else
+obj-$(CONFIG_BCM_ELOG) += bcm_elog.o
 obj-y += console.o
 endif # CONFIG_SPL_BUILD
 
diff --git a/common/bcm_elog.c b/common/bcm_elog.c
new file mode 100644
index 0000000000..8e89a500b9
--- /dev/null
+++ b/common/bcm_elog.c
@@ -0,0 +1,49 @@ 
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2020 Broadcom.
+ */
+
+#include <bcm_elog.h>
+
+/* Log one character */
+int log2ddr(const char ch)
+{
+	u32 offset, len;
+	uintptr_t base = BCM_ELOG_UBOOT_BASE;
+
+	offset = readl(base + BCM_ELOG_OFF_OFFSET);
+	len = readl(base + BCM_ELOG_LEN_OFFSET);
+	writeb(ch, base + offset);
+	offset++;
+
+	/* log buffer is now full and need to wrap around */
+	if (offset >= BCM_ELOG_UBOOT_SIZE)
+		offset = BCM_ELOG_HEADER_LEN;
+
+	/* only increment length when log buffer is not full */
+	if (len < BCM_ELOG_UBOOT_SIZE - BCM_ELOG_HEADER_LEN)
+		len++;
+
+	writel(offset, base + BCM_ELOG_OFF_OFFSET);
+	writel(len, base + BCM_ELOG_LEN_OFFSET);
+
+	return 0;
+}
+
+/* Routine to initialize error logging */
+void bcm_elog_init(uintptr_t base, uint32_t size)
+{
+	u32 val;
+
+	/*
+	 * If a valid signature is found, it means logging is already
+	 * initialize. In this case, we should not re-initialize the entry
+	 * header in the designated memory
+	 */
+	val = readl(base + BCM_ELOG_SIG_OFFSET);
+	if (val != BCM_ELOG_SIG_VAL) {
+		writel(base + BCM_ELOG_SIG_OFFSET, BCM_ELOG_SIG_VAL);
+		writel(base + BCM_ELOG_OFF_OFFSET, BCM_ELOG_HEADER_LEN);
+		writel(base + BCM_ELOG_LEN_OFFSET, 0);
+	}
+}
diff --git a/common/console.c b/common/console.c
index e398530a13..a65fdc16c2 100644
--- a/common/console.c
+++ b/common/console.c
@@ -20,6 +20,10 @@ 
 #include <env_internal.h>
 #include <watchdog.h>
 
+#ifdef CONFIG_BCM_ELOG
+#include <bcm_elog.h>
+#endif
+
 DECLARE_GLOBAL_DATA_PTR;
 
 static int on_console(const char *name, const char *value, enum env_op op,
@@ -536,6 +540,9 @@  void putc(const char c)
 	if (!gd->have_console)
 		return pre_console_putc(c);
 
+#ifdef CONFIG_BCM_ELOG
+	log2ddr(c);
+#endif
 	if (gd->flags & GD_FLG_DEVINIT) {
 		/* Send to the standard output */
 		fputc(stdout, c);
@@ -587,6 +594,17 @@  void puts(const char *s)
 	if (!gd->have_console)
 		return pre_console_puts(s);
 
+#ifdef CONFIG_BCM_ELOG
+	{
+		const char *tmp = s;
+
+		while (*tmp) {
+			int c = *tmp++;
+
+			log2ddr(c);
+		}
+	}
+#endif
 	if (gd->flags & GD_FLG_DEVINIT) {
 		/* Send to the standard output */
 		fputs(stdout, s);
@@ -790,6 +808,10 @@  int console_init_f(void)
 
 	print_pre_console_buffer(PRE_CONSOLE_FLUSHPOINT1_SERIAL);
 
+#ifdef CONFIG_BCM_ELOG
+	bcm_elog_init(BCM_ELOG_UBOOT_BASE, BCM_ELOG_UBOOT_SIZE);
+#endif
+
 	return 0;
 }
 
diff --git a/configs/bcm_ns3_defconfig b/configs/bcm_ns3_defconfig
index 13fe9d439e..a2201bf0c9 100644
--- a/configs/bcm_ns3_defconfig
+++ b/configs/bcm_ns3_defconfig
@@ -14,6 +14,7 @@  CONFIG_LOGLEVEL=7
 CONFIG_SILENT_CONSOLE=y
 CONFIG_SILENT_U_BOOT_ONLY=y
 # CONFIG_SILENT_CONSOLE_UPDATE_ON_SET is not set
+CONFIG_BCM_ELOG=y
 CONFIG_SUPPORT_RAW_INITRD=y
 # CONFIG_DISPLAY_CPUINFO is not set
 CONFIG_HUSH_PARSER=y
diff --git a/include/bcm_elog.h b/include/bcm_elog.h
new file mode 100644
index 0000000000..7ba99f1cf7
--- /dev/null
+++ b/include/bcm_elog.h
@@ -0,0 +1,37 @@ 
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2020 Broadcom.
+ *
+ */
+
+#ifndef __BCM_ELOG_H__
+#define __BCM_ELOG_H__
+
+#include <asm/io.h>
+#include <linux/types.h>
+
+/* Default AP error logging base address */
+#ifndef ELOG_AP_UART_LOG_BASE
+#define ELOG_AP_UART_LOG_BASE	0x8f110000
+#endif
+
+/* Reserve 16K to store error logs */
+#define BCM_ELOG_UBOOT_BASE	ELOG_AP_UART_LOG_BASE
+#define BCM_ELOG_UBOOT_SIZE	0x4000
+
+/* error logging signature */
+#define BCM_ELOG_SIG_OFFSET	0x0000
+#define BCM_ELOG_SIG_VAL	0x75767971
+
+/* current logging offset that points to where new logs should be added */
+#define BCM_ELOG_OFF_OFFSET	0x0004
+
+/* current logging length (excluding header) */
+#define BCM_ELOG_LEN_OFFSET	0x0008
+
+#define BCM_ELOG_HEADER_LEN	12
+
+int log2ddr(const char ch);
+void bcm_elog_init(uintptr_t base, uint32_t size);
+
+#endif /* __BCM_ELOG_H__ */