MPC83xx reset status register (RSR, offset 0x910)

Christophe Leroy christophe.leroy at c-s.fr
Sat Aug 25 02:20:32 AEST 2018


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 <christophe.leroy at c-s.fr>
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 <radu.rendec at gmail.com>

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 <christophe.leroy at c-s.fr>
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) {


More information about the Linuxppc-dev mailing list