summaryrefslogtreecommitdiff
path: root/meta-openbmc-mods/meta-ast2500/recipes-bsp/u-boot/files/0020-Add-system-reset-status-support.patch
blob: afdd610b396a08a29be971d1d53aa49298174436 (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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
From 54616ade08517374200a332e50f68ee9d0fbf5c5 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.

Change-Id: I87ada3ecf14368519e4d09035bb1e09fdc05469b
Signed-off-by: Yong Li <yong.b.li@linux.intel.com>
Signed-off-by: AppaRao Puli <apparao.puli@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          | 73 +++++++++++++++++++++++++++++
 board/aspeed/ast-g5/ast-g5.c                |  7 +++
 4 files changed, 86 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 01f8a13..e0bf9ee 100644
--- a/board/aspeed/ast-g5/ast-g5-intel.c
+++ b/board/aspeed/ast-g5/ast-g5-intel.c
@@ -303,6 +303,79 @@ static inline void ast_scu_write(uint32_t val, uint32_t reg)
 #endif
 }
 
+
+static void update_bootargs_cmd(const char *key, const char *value)
+{
+	int buf_len;
+	char *buf;
+	char *cmdline;
+	char comp_key[128];
+
+	if (!key || (key[0] == '\0')) {
+		printf("%s - Empty key not allowed\n", __func__);
+		return;
+	}
+
+	cmdline = getenv("bootargs");
+
+	/* Allocate space for maximum possible new command line */
+	if (value)
+		buf_len = strlen(cmdline) + strlen(key) + 3 + strlen(value);
+	else
+		buf_len = strlen(cmdline) + strlen(key) + 3;
+
+	buf = malloc(buf_len);
+	if (!buf) {
+		printf("%s: out of memory\n", __func__);
+		return;
+	}
+	memset(buf, 0, buf_len);
+
+	if (!cmdline) {
+		/* lets add key-value, though bootargs are empty */
+		snprintf(buf, buf_len, "%s=%s", key, (value ? value : ""));
+		setenv("bootargs", buf);
+		free(buf);
+		return;
+	}
+
+	snprintf(comp_key, sizeof(comp_key), "%s=", key);
+	char *start = strstr(cmdline, comp_key);
+
+	/* Check for full word match. Match should be start of cmdline
+	 * or there should be space before match */
+	if (start && ((start == cmdline) || (*(start-1) == ' '))) {
+		char *end = strchr(start, ' ');
+		strncpy(buf, cmdline, (start - cmdline));
+
+		if (end)
+			snprintf(buf, buf_len, "%s%s=%s %s", buf, key,
+				 (value ? value : ""), end+1);
+		else
+			snprintf(buf, buf_len, "%s%s=%s", buf, key,
+				 (value ? value : ""));
+	} else {
+		snprintf(buf, buf_len, "%s %s=%s", cmdline, key,
+			 (value ? value : ""));
+	}
+
+	setenv("bootargs", buf);
+	free(buf);
+}
+
+void ast_g5_intel_late_init(void)
+{
+	char value[32];
+	u32 reset_reason = 0;
+
+	/* save and clear reset status */
+	reset_reason = ast_scu_read(AST_SCU_SYS_CTRL);
+	snprintf(value, sizeof(value), "0x%x", reset_reason);
+	ast_scu_write(0, AST_SCU_SYS_CTRL);
+
+	update_bootargs_cmd("resetreason", value);
+}
+
 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();