summaryrefslogtreecommitdiff
path: root/meta-openbmc-mods/meta-common/recipes-bsp/u-boot/files/0020-Add-system-reset-status-support.patch
blob: 2e541561ad05c2c849af1989bcabc54e1828057e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
From 06445210bfda7f9bbbb36133e6818575bd6a0cc1 Mon Sep 17 00:00:00 2001
From: Yong Li <yong.b.li@linux.intel.com>
Date: Tue, 9 Apr 2019 14:42:05 +0800
Subject: [PATCH] Add system reset status support

Will display the reset reasons and other CPU information in u-boot,
and save the reset reasons into kernel command line,
for applications to query.

Signed-off-by: Yong Li <yong.b.li@linux.intel.com>
---
 arch/arm/include/asm/arch-aspeed/platform.h |  2 ++
 arch/arm/mach-aspeed/ast-scu.c              |  4 ++++
 board/aspeed/ast-g5/ast-g5-intel.c          | 30 +++++++++++++++++++++++++++++
 board/aspeed/ast-g5/ast-g5.c                |  7 +++++++
 4 files changed, 43 insertions(+)

diff --git a/arch/arm/include/asm/arch-aspeed/platform.h b/arch/arm/include/asm/arch-aspeed/platform.h
index 3b06e52..4e4140d 100644
--- a/arch/arm/include/asm/arch-aspeed/platform.h
+++ b/arch/arm/include/asm/arch-aspeed/platform.h
@@ -29,6 +29,8 @@
 #include <asm/arch/ast_g5_platform.h>
 #include <asm/arch/ast-g5-intel.h>
 #define CONFIG_BOARD_EARLY_INIT_F	1	/* Call board_early_init_f */
+#define CONFIG_BOARD_LATE_INIT		1	/* Call board_late_init */
+#define CONFIG_DISPLAY_CPUINFO		1
 #else
 #err "No define for platform.h"
 #endif
diff --git a/arch/arm/mach-aspeed/ast-scu.c b/arch/arm/mach-aspeed/ast-scu.c
index 3a9ba05..976c59b 100644
--- a/arch/arm/mach-aspeed/ast-scu.c
+++ b/arch/arm/mach-aspeed/ast-scu.c
@@ -494,6 +494,9 @@ void ast_scu_sys_rest_info(void)
 {
 	u32 rest = ast_scu_read(AST_SCU_SYS_CTRL);
 
+#ifdef AST_SOC_G5
+	printf("RST : 0x%02x\n", rest);
+#else
 	if (rest & SCU_SYS_EXT_RESET_FLAG) {
 		printf("RST : External\n");
 		ast_scu_write(SCU_SYS_EXT_RESET_FLAG, AST_SCU_SYS_CTRL);
@@ -506,6 +509,7 @@ void ast_scu_sys_rest_info(void)
 	} else {
 		printf("RST : CLK en\n");
 	}
+#endif
 }
 
 u32 ast_scu_get_vga_memsize(void)
diff --git a/board/aspeed/ast-g5/ast-g5-intel.c b/board/aspeed/ast-g5/ast-g5-intel.c
index bcaf81e..1e8708a 100644
--- a/board/aspeed/ast-g5/ast-g5-intel.c
+++ b/board/aspeed/ast-g5/ast-g5-intel.c
@@ -303,6 +303,36 @@ static inline void ast_scu_write(uint32_t val, uint32_t reg)
 #endif
 }
 
+void ast_g5_intel_late_init(void)
+{
+	char *cmdline = NULL;
+	char *cmdline_new = NULL;
+	char buf[32];
+	u32 rest = 0;
+
+	/* save and clear reset status */
+	rest = ast_scu_read(AST_SCU_SYS_CTRL);
+	snprintf(buf, sizeof(buf), " resetreason=0x%x", rest);
+	ast_scu_write(0, AST_SCU_SYS_CTRL);
+
+	cmdline = getenv("bootargs");
+	if (!cmdline) {
+		printf("Get bootargs fail!\n");
+		return;
+	}
+
+	cmdline_new = malloc(strlen(cmdline) + strlen(buf) + 1);
+	if (!cmdline_new) {
+		printf("Cannot malloc memory!\n");
+		return;
+	}
+
+	/* append the reset status into kernel command line */
+	snprintf(cmdline_new, strlen(cmdline) + strlen(buf) + 1, "%s%s", cmdline, buf);
+	setenv("bootargs", cmdline_new);
+	free(cmdline_new);
+}
+
 static void pwm_init(void)
 {
 	uint32_t val;
diff --git a/board/aspeed/ast-g5/ast-g5.c b/board/aspeed/ast-g5/ast-g5.c
index d41ef9c..0953677 100644
--- a/board/aspeed/ast-g5/ast-g5.c
+++ b/board/aspeed/ast-g5/ast-g5.c
@@ -19,6 +19,7 @@
 DECLARE_GLOBAL_DATA_PTR;
 
 extern void ast_g5_intel(void);
+extern void ast_g5_intel_late_init(void);
 
 int board_early_init_f(void)
 {
@@ -40,6 +41,12 @@ int board_init(void)
 	return 0;
 }
 
+int board_late_init(void)
+{
+	ast_g5_intel_late_init();
+	return 0;
+}
+
 int dram_init(void)
 {
 	u32 vga = ast_scu_get_vga_memsize();
-- 
2.7.4