summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Liu <daveliu@freescale.com>2007-06-25 10:41:56 +0800
committerKim Phillips <kim.phillips@freescale.com>2007-08-10 01:12:03 -0500
commit9be39a67c9f8fef7107f5df09d673005f04d0963 (patch)
tree79b4dd35873605ea93f34b8113d527988919f270
parentff9658d7049bf8c8e8e0a05dbe5e9f7e91aa5a5d (diff)
downloadu-boot-imx-9be39a67c9f8fef7107f5df09d673005f04d0963.zip
u-boot-imx-9be39a67c9f8fef7107f5df09d673005f04d0963.tar.gz
u-boot-imx-9be39a67c9f8fef7107f5df09d673005f04d0963.tar.bz2
mpc83xx: Add support for the display of reset status
83xx processor family has many reset sources, such as power on reset, software hard reset, software soft reset, JTAG, bus monitor, software watchdog, check stop reset, external hard reset, external software reset. sometimes, to figure out the fault of system, we need to know the cause of reset early before the prompt of u-boot present. Signed-off-by: Dave Liu <daveliu@freescale.com> Signed-off-by: Kim Phillips <kim.phillips@freescale.com>
-rw-r--r--cpu/mpc83xx/cpu_init.c36
-rw-r--r--include/common.h2
-rw-r--r--lib_ppc/board.c6
3 files changed, 42 insertions, 2 deletions
diff --git a/cpu/mpc83xx/cpu_init.c b/cpu/mpc83xx/cpu_init.c
index 53a5f59..7224979 100644
--- a/cpu/mpc83xx/cpu_init.c
+++ b/cpu/mpc83xx/cpu_init.c
@@ -257,3 +257,39 @@ int cpu_init_r (void)
#endif
return 0;
}
+
+/*
+ * Figure out the cause of the reset
+ */
+int prt_83xx_rsr(void)
+{
+ static struct {
+ ulong mask;
+ char *desc;
+ } bits[] = {
+ {
+ RSR_SWSR, "Software Soft"}, {
+ RSR_SWHR, "Software Hard"}, {
+ RSR_JSRS, "JTAG Soft"}, {
+ RSR_CSHR, "Check Stop"}, {
+ RSR_SWRS, "Software Watchdog"}, {
+ RSR_BMRS, "Bus Monitor"}, {
+ RSR_SRS, "External/Internal Soft"}, {
+ RSR_HRS, "External/Internal Hard"}
+ };
+ static int n = sizeof bits / sizeof bits[0];
+ ulong rsr = gd->reset_status;
+ int i;
+ char *sep;
+
+ puts("Reset Status:");
+
+ sep = " ";
+ for (i = 0; i < n; i++)
+ if (rsr & bits[i].mask) {
+ printf("%s%s", sep, bits[i].desc);
+ sep = ", ";
+ }
+ puts("\n\n");
+ return 0;
+}
diff --git a/include/common.h b/include/common.h
index ac29d3a..a822d28 100644
--- a/include/common.h
+++ b/include/common.h
@@ -526,6 +526,8 @@ void cpu_init_f (void);
int cpu_init_r (void);
#if defined(CONFIG_8260)
int prt_8260_rsr (void);
+#elif defined(CONFIG_MPC83XX)
+int prt_83xx_rsr (void);
#endif
/* $(CPU)/interrupts.c */
diff --git a/lib_ppc/board.c b/lib_ppc/board.c
index 325f5c2..c87d46c 100644
--- a/lib_ppc/board.c
+++ b/lib_ppc/board.c
@@ -309,7 +309,9 @@ init_fnc_t *init_sequence[] = {
prt_8260_rsr,
prt_8260_clks,
#endif /* CONFIG_8260 */
-
+#if defined(CONFIG_MPC83XX)
+ prt_83xx_rsr,
+#endif
checkcpu,
#if defined(CONFIG_MPC5xxx)
prt_mpc5xxx_clks,
@@ -376,7 +378,7 @@ void board_init_f (ulong bootflag)
/* compiler optimization barrier needed for GCC >= 3.4 */
__asm__ __volatile__("": : :"memory");
-#if !defined(CONFIG_CPM2)
+#if !defined(CONFIG_CPM2) && !defined(CONFIG_MPC83XX)
/* Clear initial global data */
memset ((void *) gd, 0, sizeof (gd_t));
#endif