blob: 267ff4c3f094c21b8bb9ee52bed0419d0fe62b4e [file] [log] [blame]
Bo Lv72d0e902023-01-02 14:27:34 +00001// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
2/*
3 * Copyright (c) 2019 Amlogic, Inc. All rights reserved.
4 */
5
6#include <common.h>
7#include <command.h>
8#include <asm/amlogic/arch/reboot.h>
9#include <asm/amlogic/arch/secure_apb.h>
10#include <asm/io.h>
11#include <asm/amlogic/arch/bl31_apis.h>
12#include <amlogic/partition_table.h>
13#include <amlogic/storage.h>
Yao Jie608e7b12023-11-20 17:01:54 +080014#include <asm/amlogic/arch/cpu_config.h>
Bo Lv72d0e902023-01-02 14:27:34 +000015#include <asm/amlogic/arch/stick_mem.h>
16/*
17run get_rebootmode //set reboot_mode env with current mode
18*/
19
20int do_get_rebootmode (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
21{
22 uint32_t reboot_mode_val;
Xindong Xu15e83fa2024-03-15 08:56:00 +080023 char *quiescent_env_bk;
Yao Jie608e7b12023-11-20 17:01:54 +080024 u32 stick_reboot_flag;
25 u32 bit_mask;
Bo Lv72d0e902023-01-02 14:27:34 +000026
Yao Jie608e7b12023-11-20 17:01:54 +080027#ifdef NO_EXTEND_REBOOT_MODE
28 bit_mask = 0xf;
29#else
30 bit_mask = 0x7f;
31#endif
32 reboot_mode_val = ((readl(AO_SEC_SD_CFG15) >> 12) & bit_mask);
Bo Lv72d0e902023-01-02 14:27:34 +000033 //this step prevent the reboot mode val stored in sticky register lost
Yao Jie608e7b12023-11-20 17:01:54 +080034 //during the exceptional reset, such as reset pin disturbance
35 stick_reboot_flag = get_stick_reboot_flag();
36 if (reboot_mode_val == AMLOGIC_COLD_BOOT &&
37 stick_reboot_flag == AMLOGIC_WATCHDOG_REBOOT) {
38 printf("Warning: system is reset abnormally!\n");
39 printf("Set reboot_mode to watchdog reboot\n");
40 reboot_mode_val = AMLOGIC_WATCHDOG_REBOOT;
41 }
Bo Lv72d0e902023-01-02 14:27:34 +000042
43 debug("reboot_mode(0x%x)=0x%x\n", AO_SEC_SD_CFG15, reboot_mode_val);
44
45 switch (reboot_mode_val)
46 {
47 case AMLOGIC_COLD_BOOT:
48 {
49 env_set("reboot_mode","cold_boot");
50 break;
51 }
52 case AMLOGIC_NORMAL_BOOT:
53 {
54 env_set("reboot_mode","normal");
55 break;
56 }
57 case AMLOGIC_FACTORY_RESET_REBOOT:
58 {
59 env_set("reboot_mode","factory_reset");
60 break;
61 }
62 case AMLOGIC_UPDATE_REBOOT:
63 {
64 env_set("reboot_mode","update");
65 break;
66 }
67 case AMLOGIC_FASTBOOT_REBOOT:
68 {
69 env_set("reboot_mode","fastboot");
70 break;
71 }
72 case AMLOGIC_BOOTLOADER_REBOOT:
73 {
74 env_set("reboot_mode","bootloader");
75 break;
76 }
77 case AMLOGIC_SUSPEND_REBOOT:
78 {
79 env_set("reboot_mode","suspend_off");
80 break;
81 }
82 case AMLOGIC_HIBERNATE_REBOOT:
83 {
84 env_set("reboot_mode","hibernate");
85 break;
86 }
87 case AMLOGIC_SHUTDOWN_REBOOT:
88 {
89 env_set("reboot_mode","shutdown_reboot");
90 break;
91 }
92 case AMLOGIC_RESCUEPARTY_REBOOT:
93 {
94 env_set("reboot_mode", "rescueparty");
95 break;
96 }
97 case AMLOGIC_KERNEL_PANIC:
98 {
99 env_set("reboot_mode","kernel_panic");
100 break;
101 }
102 case AMLOGIC_WATCHDOG_REBOOT:
103 {
104 env_set("reboot_mode","watchdog_reboot");
105 break;
106 }
107 case AMLOGIC_RPMBP_REBOOT:
108 {
109 env_set("reboot_mode","rpmbp");
110 break;
111 }
112 case AMLOGIC_QUIESCENT_REBOOT:
113 {
Xindong Xu15e83fa2024-03-15 08:56:00 +0800114 env_set("quiescent_env_bk", "quiescent");
115#if CONFIG_IS_ENABLED(AML_UPDATE_ENV)
116 run_command("update_env_part -p quiescent_env_bk;", 0);
117#else
118 run_command("defenv_reserv; saveenv;", 0);
119#endif
Bo Lv72d0e902023-01-02 14:27:34 +0000120 env_set("reboot_mode","quiescent");
121 break;
122 }
123 case AMLOGIC_RECOVERY_QUIESCENT_REBOOT:
124 {
Xindong Xu15e83fa2024-03-15 08:56:00 +0800125 env_set("quiescent_env_bk", "recovery_quiescent");
126#if CONFIG_IS_ENABLED(AML_UPDATE_ENV)
127 run_command("update_env_part -p quiescent_env_bk;", 0);
128#else
129 run_command("defenv_reserv; saveenv;", 0);
130#endif
Bo Lv72d0e902023-01-02 14:27:34 +0000131 env_set("reboot_mode","recovery_quiescent");
132 break;
133 }
134#ifdef AMLOGIC_FFV_REBOOT
135 case AMLOGIC_FFV_REBOOT:
136 {
137 env_set("reboot_mode", "ffv_reboot");
138 break;
139 }
140#endif
141 default:
142 {
143 env_set("reboot_mode","charging");
144 break;
145 }
146 }
147
148#ifdef CONFIG_CMD_FASTBOOT
149 switch (reboot_mode_val) {
150 case AMLOGIC_FASTBOOT_REBOOT: {
151 env_set("reboot_mode","fastboot");
152 break;
153 }
154 case AMLOGIC_BOOTLOADER_REBOOT: {
Xindong Xud9441422024-01-18 10:20:45 +0800155 env_set("reboot_mode", "fastboot");
Bo Lv72d0e902023-01-02 14:27:34 +0000156 break;
157 }
158 }
159#endif
160
Xindong Xu15e83fa2024-03-15 08:56:00 +0800161 quiescent_env_bk = env_get("quiescent_env_bk");
162 if (quiescent_env_bk &&
163 ((strcmp(quiescent_env_bk, "quiescent") == 0) ||
164 (strcmp(quiescent_env_bk, "recovery_quiescent") == 0))) {
165 printf("quiescent_env_bk: %s\n", quiescent_env_bk);
166 switch (reboot_mode_val) {
167 case AMLOGIC_COLD_BOOT:
168 case AMLOGIC_KERNEL_PANIC:
169 case AMLOGIC_WATCHDOG_REBOOT: {
170 printf("set reboot_mode %s\n", quiescent_env_bk);
171 env_set("reboot_mode", quiescent_env_bk);
172 break;
173 }
174 default: {
175 printf("clear quiescent_env_bk\n");
176 env_set("quiescent_env_bk", "0");
177#if CONFIG_IS_ENABLED(AML_UPDATE_ENV)
178 run_command("update_env_part -p quiescent_env_bk;", 0);
179#else
180 run_command("defenv_reserv; saveenv;", 0);
181#endif
182 break;
183 }
184 }
185 }
186
Bo Lv72d0e902023-01-02 14:27:34 +0000187#if defined(CONFIG_AML_RPMB)
188 run_command("rpmb_state",0);
189#endif
190
191 return 0;
192}
193
194int do_reboot (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
195{
196 uint32_t reboot_mode_val = AMLOGIC_NORMAL_BOOT;
197 if (argc <= 1) {
198 printf("reboot use default mode: normal\n");
199 }
200 else {
201 printf("reboot mode: %s\n", argv[1]);
202 char * mode = argv[1];
203
204 if (strcmp(mode, "next") == 0) {
205 store_restore_bootidx();
Xindong Xu22e8daf2024-03-12 18:08:41 +0800206 reboot_mode_val = AMLOGIC_NORMAL_BOOT;
Bo Lv72d0e902023-01-02 14:27:34 +0000207 } else if (strcmp(mode, "next,quiescent") == 0) {
208 store_restore_bootidx();
209 reboot_mode_val = AMLOGIC_QUIESCENT_REBOOT;
Xindong Xu22e8daf2024-03-12 18:08:41 +0800210 } else if (strcmp(mode, "next,bootloader") == 0) {
211 store_restore_bootidx();
212 reboot_mode_val = AMLOGIC_BOOTLOADER_REBOOT;
Bo Lv72d0e902023-01-02 14:27:34 +0000213 } else if (strcmp(mode, "cold_boot") == 0)
214 reboot_mode_val = AMLOGIC_COLD_BOOT;
215 else if (strcmp(mode, "normal") == 0)
216 reboot_mode_val = AMLOGIC_NORMAL_BOOT;
Xindong Xud9441422024-01-18 10:20:45 +0800217 else if (strcmp(mode, "recovery") == 0) {
218 reboot_mode_val = AMLOGIC_FACTORY_RESET_REBOOT;
219 run_command("bcb recovery", 0);
220 } else if (strcmp(mode, "factory_reset") == 0)
Bo Lv72d0e902023-01-02 14:27:34 +0000221 reboot_mode_val = AMLOGIC_FACTORY_RESET_REBOOT;
222 else if (strcmp(mode, "update") == 0)
223 reboot_mode_val = AMLOGIC_UPDATE_REBOOT;
224 else if (strcmp(mode, "fastboot") == 0) {
225 if (dynamic_partition) {
226 printf("dynamic partition, enter fastbootd");
227 reboot_mode_val = AMLOGIC_FACTORY_RESET_REBOOT;
228 run_command("bcb fastbootd",0);
229 } else
230 reboot_mode_val = AMLOGIC_FASTBOOT_REBOOT;
231 } else if (strcmp(mode, "bootloader") == 0)
232 reboot_mode_val = AMLOGIC_BOOTLOADER_REBOOT;
233 else if (strcmp(mode, "suspend_off") == 0)
234 reboot_mode_val = AMLOGIC_SUSPEND_REBOOT;
235 else if (strcmp(mode, "hibernate") == 0)
236 reboot_mode_val = AMLOGIC_HIBERNATE_REBOOT;
237 else if (strcmp(mode, "rescueparty") == 0)
238 reboot_mode_val = AMLOGIC_RESCUEPARTY_REBOOT;
239 else if (strcmp(mode, "kernel_panic") == 0)
240 reboot_mode_val = AMLOGIC_KERNEL_PANIC;
241 else if (strcmp(mode, "rpmbp") == 0)
242 reboot_mode_val = AMLOGIC_RPMBP_REBOOT;
243#ifdef AMLOGIC_FFV_REBOOT
244 else if (strcmp(mode, "ffv_reboot") == 0)
245 reboot_mode_val = AMLOGIC_FFV_REBOOT;
246#endif
247 else {
248 printf("Can not find match reboot mode, use normal by default\n");
249 reboot_mode_val = AMLOGIC_NORMAL_BOOT;
250 }
251 }
252#ifdef CONFIG_USB_DEVICE_V2
253#if !(defined AML_USB_V2)
254 *P_RESET1_REGISTER |= (1<<17);
255 mdelay(200);
256#endif
257#endif
258 dcache_disable();
259
260 aml_reboot (PSCI_SYS_REBOOT, reboot_mode_val, 0, 0);
261 return 0;
262}
263
264/* USB BOOT FUNC sub command list*/
265#define CLEAR_USB_BOOT 1
266#define FORCE_USB_BOOT 2
267#define RUN_COMD_USB_BOOT 3
268#define PANIC_DUMP_USB_BOOT 4
269
270int do_set_usb_boot(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
271{
272 unsigned int usb_mode = 0;
273 if (argc <= 1) {
274 printf("usb flag default 0\n");
275 }
276 else {
277 usb_mode = simple_strtoul(argv[1], NULL, 16);
278 }
279 printf("usb flag: %d\n", usb_mode);
280 set_usb_boot_function(usb_mode);
281
282 return 0;
283}
284
285U_BOOT_CMD(
286 get_rebootmode, 1, 0, do_get_rebootmode,
287 "get reboot mode",
288 "/N\n"
289 " This command will get and set env 'reboot_mode'\n"
290 "get_rebootmode\n"
291);
292
293U_BOOT_CMD(
294 reboot, 2, 0, do_reboot,
295 "set reboot mode and reboot system",
296 "[rebootmode]/N\n"
297 " This command will set reboot mode and reboot system\n"
298 "\n"
299 " support following [rebootmode]:\n"
300 " cold_boot\n"
301 " normal[default]\n"
302 " factory_reset/recovery\n"
303 " update\n"
304 " fastboot\n"
305 " bootloader\n"
306 " suspend_off\n"
307 " hibernate\n"
308 " next <ONLY work for SC2>\n"
309 " crash_dump\n"
310);
311
312U_BOOT_CMD(
313 set_usb_boot, 2, 0, do_set_usb_boot,
314 "set usb boot mode",
315 "[usb boot mode]/N\n"
316 " support following [usb boot mode]:\n"
317 " 1: CLEAR_USB_BOOT\n"
318 " 2: FORCE_USB_BOOT[default]\n"
319 " 3: RUN_COMD_USB_BOOT/recovery\n"
320 " 4: PANIC_DUMP_USB_BOOT\n"
321);
322
323int do_systemoff(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
324{
325 aml_system_off();
326 return 0;
327}
328
329
330U_BOOT_CMD(
331 systemoff, 2, 1, do_systemoff,
332 "system off ",
333 "systemoff "
334);