Read reset reason reg and show it in log and also save it as variable.
reset_reasons table is setting up priorities for variable.

Signed-off-by: Michal Simek <michal.si...@xilinx.com>
---

 arch/arm/include/asm/arch-zynqmp/hardware.h | 12 +++++-
 board/xilinx/zynqmp/zynqmp.c                | 43 +++++++++++++++++++++
 2 files changed, 54 insertions(+), 1 deletion(-)

diff --git a/arch/arm/include/asm/arch-zynqmp/hardware.h 
b/arch/arm/include/asm/arch-zynqmp/hardware.h
index 3f1f9498e356..7961a247e196 100644
--- a/arch/arm/include/asm/arch-zynqmp/hardware.h
+++ b/arch/arm/include/asm/arch-zynqmp/hardware.h
@@ -33,6 +33,14 @@
 #define PS_MODE2       BIT(2)
 #define PS_MODE3       BIT(3)
 
+#define RESET_REASON_DEBUG_SYS BIT(6)
+#define RESET_REASON_SOFT      BIT(5)
+#define RESET_REASON_SRST      BIT(4)
+#define RESET_REASON_PSONLY    BIT(3)
+#define RESET_REASON_PMU       BIT(2)
+#define RESET_REASON_INTERNAL  BIT(1)
+#define RESET_REASON_EXTERNAL  BIT(0)
+
 struct crlapb_regs {
        u32 reserved0[36];
        u32 cpu_r5_ctrl; /* 0x90 */
@@ -40,7 +48,9 @@ struct crlapb_regs {
        u32 timestamp_ref_ctrl; /* 0x128 */
        u32 reserved2[53];
        u32 boot_mode; /* 0x200 */
-       u32 reserved3[14];
+       u32 reserved3_0[7];
+       u32 reset_reason; /* 0x220 */
+       u32 reserved3_1[6];
        u32 rst_lpd_top; /* 0x23C */
        u32 reserved4[4];
        u32 boot_pin_ctrl; /* 0x250 */
diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
index 551921b888a0..4d886a914fa9 100644
--- a/board/xilinx/zynqmp/zynqmp.c
+++ b/board/xilinx/zynqmp/zynqmp.c
@@ -476,6 +476,47 @@ static int create_mmc_boot_commands(void)
        return 0;
 }
 
+static const struct {
+       u32 bit;
+       const char *name;
+} reset_reasons[] = {
+       { RESET_REASON_EXTERNAL, "EXTERNAL" },
+       { RESET_REASON_INTERNAL, "INTERNAL" },
+       { RESET_REASON_SOFT, "SOFT" },
+       { RESET_REASON_PSONLY, "PS-ONLY" },
+       { RESET_REASON_SRST, "SRST" },
+       { RESET_REASON_PMU, "PMU" },
+       { RESET_REASON_DEBUG_SYS, "DEBUG" },
+       {}
+};
+
+static u32 reset_reason(bool print)
+{
+       u32 ret;
+       int i;
+       const char *reason = NULL;
+
+       ret = readl(&crlapb_base->reset_reason);
+
+       if (print)
+               puts("Reset reason:\t");
+
+       for (i = 0; i < ARRAY_SIZE(reset_reasons); i++) {
+               if (ret & reset_reasons[i].bit) {
+                       reason = reset_reasons[i].name;
+                       if (print)
+                               printf("%s ", reset_reasons[i].name);
+               }
+       }
+
+       if (print)
+               puts("\n");
+
+       env_set("reset_reason", reason);
+
+       return ret;
+}
+
 int board_late_init(void)
 {
        u32 reg = 0;
@@ -593,6 +634,8 @@ int board_late_init(void)
 
        env_set("boot_targets", new_targets);
 
+       reset_reason(true);
+
        return 0;
 }
 
-- 
2.17.0

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to