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
|