Thread (7 messages) 7 messages, 2 authors, 2018-09-19

Re: MPC83xx reset status register (RSR, offset 0x910)

flat view

From: Christophe Leroy <hidden>
Date: 2018-08-24 16:22:57
Subsystem: linux for powerpc (32-bit and 64-bit), linux for powerpc embedded ppc8xx and ppc83xx, the rest · Maintainers: Madhavan Srinivasan, Christophe Leroy, Linus Torvalds

Hi

On 08/03/2018 04:36 PM, Radu Rendec wrote:
Hi Everyone,

Is there any kernel code that handles the "reset status register" (RSR)
on MPC83xx? I looked at arch/powerpc/platforms/83xx/misc.c, but it seems
to only map the reset register area and it's static. The watchdog driver
(drivers/watchdog/mpc8xxx_wdt.c) doesn't seem to look at it either (for
the bootstatus flags).
How do you boot your Linux kernel ?

My 832x board boots using U-boot, and U-boot reads the RSR then clears it. So when Linux kernel reads it, it is just 0.
Basically I need to check the CPU reset reason and I thought I would ask
first, before starting to write any code of my own.
Anyway, find below a set of two patches I used for testing. Feel free to use them if you bootloader doesn't clear the register

Christophe

commit f5171b463b149d6d60816fd9673e0367c0d6a90c
Author: Christophe Leroy [off-list ref]
Date:   Wed Aug 22 12:49:42 2018 +0000

    powerpc/83xx: Show reset status at startup

    The 83xx has a register called Reset Status Register that
    shows the reason of the last reset.

    Print this reason at startup.

    Suggested-by: Radu Rendec [off-list ref]
diff --git a/arch/powerpc/platforms/83xx/misc.c b/arch/powerpc/platforms/83xx/misc.c
index 773559431459..a3dbc22088d9 100644
--- a/arch/powerpc/platforms/83xx/misc.c
+++ b/arch/powerpc/platforms/83xx/misc.c
@@ -24,6 +24,16 @@
 #include "mpc83xx.h"

 #define RST_OFFSET	0x00000900
+#define RST_STAT_REG	0x00000010
+#define RSR_BSF		BIT(15)
+#define RSR_SWSR	BIT(18)
+#define RSR_SWHR	BIT(19)
+#define RSR_JSRS	BIT(23)
+#define RSR_CSHR	BIT(27)
+#define RSR_SWRS	BIT(28)
+#define RSR_BMRS	BIT(29)
+#define RSR_SRS		BIT(30)
+#define RSR_HRS		BIT(31)
 #define RST_PROT_REG	0x00000018
 #define RST_CTRL_REG	0x0000001c
@@ -34,6 +44,32 @@ static int __init mpc83xx_restart_init(void)
 	/* map reset restart_reg_baseister space */
 	restart_reg_base = ioremap(get_immrbase() + RST_OFFSET, 0xff);

+	if (restart_reg_base) {
+		u32 status = in_be32(restart_reg_base + (RST_STAT_REG >> 2));
+
+		if (status & RSR_BSF)
+			pr_info("Reset Status: Boot Sequencer Fail\n");
+		if (status & RSR_SWSR)
+			pr_info("Reset Status: Software soft reset\n");
+		if (status & RSR_SWHR)
+			pr_info("Reset Status: Software hard reset\n");
+		if (status & RSR_JSRS)
+			pr_info("Reset Status: JTAG soft reset\n");
+		if (status & RSR_CSHR)
+			pr_info("Reset Status: Checkstop reset\n");
+		if (status & RSR_SWRS)
+			pr_info("Reset Status: Software watchdog reset\n");
+		if (status & RSR_BMRS)
+			pr_info("Reset Status: Bus monitor reset\n");
+		if (status & RSR_SRS)
+			pr_info("Reset Status: Soft reset\n");
+		if (status & RSR_HRS)
+			pr_info("Reset Status: Hard reset\n");
+
+		/* clear reset statuses */
+		out_be32(restart_reg_base + (RST_STAT_REG >> 2), status);
+	}
+
 	return 0;
 }

commit c1ef17dd9c736c5e1b94da68852ae761a193090f
Author: Christophe Leroy [off-list ref]
Date:   Wed Aug 22 12:19:02 2018 +0000

    powerpc/83xx: Move reset registers defines before functions

    Move the registers defines before/out of the functions.
    Reuse in another function.
diff --git a/arch/powerpc/platforms/83xx/misc.c b/arch/powerpc/platforms/83xx/misc.c
index d75c9816a5c9..773559431459 100644
--- a/arch/powerpc/platforms/83xx/misc.c
+++ b/arch/powerpc/platforms/83xx/misc.c
@@ -23,12 +23,16 @@

 #include "mpc83xx.h"

+#define RST_OFFSET	0x00000900
+#define RST_PROT_REG	0x00000018
+#define RST_CTRL_REG	0x0000001c
+
 static __be32 __iomem *restart_reg_base;

 static int __init mpc83xx_restart_init(void)
 {
 	/* map reset restart_reg_baseister space */
-	restart_reg_base = ioremap(get_immrbase() + 0x900, 0xff);
+	restart_reg_base = ioremap(get_immrbase() + RST_OFFSET, 0xff);

 	return 0;
 }
@@ -37,10 +41,6 @@ arch_initcall(mpc83xx_restart_init);

 void __noreturn mpc83xx_restart(char *cmd)
 {
-#define RST_OFFSET	0x00000900
-#define RST_PROT_REG	0x00000018
-#define RST_CTRL_REG	0x0000001c
-
 	local_irq_disable();

 	if (restart_reg_base) {
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help