blob: 217b1a6a8865b4afe0d7205579e84f9cf576b5a7 [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>
14#include <asm/amlogic/arch/stick_mem.h>
15/*
16run get_rebootmode //set reboot_mode env with current mode
17*/
18
19int do_get_rebootmode (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
20{
21 uint32_t reboot_mode_val;
22
23 reboot_mode_val = ((readl(AO_SEC_SD_CFG15) >> 12) & 0xf);
24 //this step prevent the reboot mode val stored in sticky register lost
25 //during the reset
26 if (reboot_mode_val == 0)
27 reboot_mode_val |= stick_reboot_flag;
28
29 debug("reboot_mode(0x%x)=0x%x\n", AO_SEC_SD_CFG15, reboot_mode_val);
30
31 switch (reboot_mode_val)
32 {
33 case AMLOGIC_COLD_BOOT:
34 {
35 env_set("reboot_mode","cold_boot");
36 break;
37 }
38 case AMLOGIC_NORMAL_BOOT:
39 {
40 env_set("reboot_mode","normal");
41 break;
42 }
43 case AMLOGIC_FACTORY_RESET_REBOOT:
44 {
45 env_set("reboot_mode","factory_reset");
46 break;
47 }
48 case AMLOGIC_UPDATE_REBOOT:
49 {
50 env_set("reboot_mode","update");
51 break;
52 }
53 case AMLOGIC_FASTBOOT_REBOOT:
54 {
55 env_set("reboot_mode","fastboot");
56 break;
57 }
58 case AMLOGIC_BOOTLOADER_REBOOT:
59 {
60 env_set("reboot_mode","bootloader");
61 break;
62 }
63 case AMLOGIC_SUSPEND_REBOOT:
64 {
65 env_set("reboot_mode","suspend_off");
66 break;
67 }
68 case AMLOGIC_HIBERNATE_REBOOT:
69 {
70 env_set("reboot_mode","hibernate");
71 break;
72 }
73 case AMLOGIC_SHUTDOWN_REBOOT:
74 {
75 env_set("reboot_mode","shutdown_reboot");
76 break;
77 }
78 case AMLOGIC_RESCUEPARTY_REBOOT:
79 {
80 env_set("reboot_mode", "rescueparty");
81 break;
82 }
83 case AMLOGIC_KERNEL_PANIC:
84 {
85 env_set("reboot_mode","kernel_panic");
86 break;
87 }
88 case AMLOGIC_WATCHDOG_REBOOT:
89 {
90 env_set("reboot_mode","watchdog_reboot");
91 break;
92 }
93 case AMLOGIC_RPMBP_REBOOT:
94 {
95 env_set("reboot_mode","rpmbp");
96 break;
97 }
98 case AMLOGIC_QUIESCENT_REBOOT:
99 {
100 env_set("reboot_mode","quiescent");
101 break;
102 }
103 case AMLOGIC_RECOVERY_QUIESCENT_REBOOT:
104 {
105 env_set("reboot_mode","recovery_quiescent");
106 break;
107 }
108#ifdef AMLOGIC_FFV_REBOOT
109 case AMLOGIC_FFV_REBOOT:
110 {
111 env_set("reboot_mode", "ffv_reboot");
112 break;
113 }
114#endif
115 default:
116 {
117 env_set("reboot_mode","charging");
118 break;
119 }
120 }
121
122#ifdef CONFIG_CMD_FASTBOOT
123 switch (reboot_mode_val) {
124 case AMLOGIC_FASTBOOT_REBOOT: {
125 env_set("reboot_mode","fastboot");
126 break;
127 }
128 case AMLOGIC_BOOTLOADER_REBOOT: {
Xindong Xud9441422024-01-18 10:20:45 +0800129 env_set("reboot_mode", "fastboot");
Bo Lv72d0e902023-01-02 14:27:34 +0000130 break;
131 }
132 }
133#endif
134
135#if defined(CONFIG_AML_RPMB)
136 run_command("rpmb_state",0);
137#endif
138
139 return 0;
140}
141
142int do_reboot (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
143{
144 uint32_t reboot_mode_val = AMLOGIC_NORMAL_BOOT;
145 if (argc <= 1) {
146 printf("reboot use default mode: normal\n");
147 }
148 else {
149 printf("reboot mode: %s\n", argv[1]);
150 char * mode = argv[1];
151
152 if (strcmp(mode, "next") == 0) {
153 store_restore_bootidx();
154 reboot_mode_val = AMLOGIC_COLD_BOOT;
155 } else if (strcmp(mode, "next,quiescent") == 0) {
156 store_restore_bootidx();
157 reboot_mode_val = AMLOGIC_QUIESCENT_REBOOT;
158 } else if (strcmp(mode, "cold_boot") == 0)
159 reboot_mode_val = AMLOGIC_COLD_BOOT;
160 else if (strcmp(mode, "normal") == 0)
161 reboot_mode_val = AMLOGIC_NORMAL_BOOT;
Xindong Xud9441422024-01-18 10:20:45 +0800162 else if (strcmp(mode, "recovery") == 0) {
163 reboot_mode_val = AMLOGIC_FACTORY_RESET_REBOOT;
164 run_command("bcb recovery", 0);
165 } else if (strcmp(mode, "factory_reset") == 0)
Bo Lv72d0e902023-01-02 14:27:34 +0000166 reboot_mode_val = AMLOGIC_FACTORY_RESET_REBOOT;
167 else if (strcmp(mode, "update") == 0)
168 reboot_mode_val = AMLOGIC_UPDATE_REBOOT;
169 else if (strcmp(mode, "fastboot") == 0) {
170 if (dynamic_partition) {
171 printf("dynamic partition, enter fastbootd");
172 reboot_mode_val = AMLOGIC_FACTORY_RESET_REBOOT;
173 run_command("bcb fastbootd",0);
174 } else
175 reboot_mode_val = AMLOGIC_FASTBOOT_REBOOT;
176 } else if (strcmp(mode, "bootloader") == 0)
177 reboot_mode_val = AMLOGIC_BOOTLOADER_REBOOT;
178 else if (strcmp(mode, "suspend_off") == 0)
179 reboot_mode_val = AMLOGIC_SUSPEND_REBOOT;
180 else if (strcmp(mode, "hibernate") == 0)
181 reboot_mode_val = AMLOGIC_HIBERNATE_REBOOT;
182 else if (strcmp(mode, "rescueparty") == 0)
183 reboot_mode_val = AMLOGIC_RESCUEPARTY_REBOOT;
184 else if (strcmp(mode, "kernel_panic") == 0)
185 reboot_mode_val = AMLOGIC_KERNEL_PANIC;
186 else if (strcmp(mode, "rpmbp") == 0)
187 reboot_mode_val = AMLOGIC_RPMBP_REBOOT;
188#ifdef AMLOGIC_FFV_REBOOT
189 else if (strcmp(mode, "ffv_reboot") == 0)
190 reboot_mode_val = AMLOGIC_FFV_REBOOT;
191#endif
192 else {
193 printf("Can not find match reboot mode, use normal by default\n");
194 reboot_mode_val = AMLOGIC_NORMAL_BOOT;
195 }
196 }
197#ifdef CONFIG_USB_DEVICE_V2
198#if !(defined AML_USB_V2)
199 *P_RESET1_REGISTER |= (1<<17);
200 mdelay(200);
201#endif
202#endif
203 dcache_disable();
204
205 aml_reboot (PSCI_SYS_REBOOT, reboot_mode_val, 0, 0);
206 return 0;
207}
208
209/* USB BOOT FUNC sub command list*/
210#define CLEAR_USB_BOOT 1
211#define FORCE_USB_BOOT 2
212#define RUN_COMD_USB_BOOT 3
213#define PANIC_DUMP_USB_BOOT 4
214
215int do_set_usb_boot(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
216{
217 unsigned int usb_mode = 0;
218 if (argc <= 1) {
219 printf("usb flag default 0\n");
220 }
221 else {
222 usb_mode = simple_strtoul(argv[1], NULL, 16);
223 }
224 printf("usb flag: %d\n", usb_mode);
225 set_usb_boot_function(usb_mode);
226
227 return 0;
228}
229
230U_BOOT_CMD(
231 get_rebootmode, 1, 0, do_get_rebootmode,
232 "get reboot mode",
233 "/N\n"
234 " This command will get and set env 'reboot_mode'\n"
235 "get_rebootmode\n"
236);
237
238U_BOOT_CMD(
239 reboot, 2, 0, do_reboot,
240 "set reboot mode and reboot system",
241 "[rebootmode]/N\n"
242 " This command will set reboot mode and reboot system\n"
243 "\n"
244 " support following [rebootmode]:\n"
245 " cold_boot\n"
246 " normal[default]\n"
247 " factory_reset/recovery\n"
248 " update\n"
249 " fastboot\n"
250 " bootloader\n"
251 " suspend_off\n"
252 " hibernate\n"
253 " next <ONLY work for SC2>\n"
254 " crash_dump\n"
255);
256
257U_BOOT_CMD(
258 set_usb_boot, 2, 0, do_set_usb_boot,
259 "set usb boot mode",
260 "[usb boot mode]/N\n"
261 " support following [usb boot mode]:\n"
262 " 1: CLEAR_USB_BOOT\n"
263 " 2: FORCE_USB_BOOT[default]\n"
264 " 3: RUN_COMD_USB_BOOT/recovery\n"
265 " 4: PANIC_DUMP_USB_BOOT\n"
266);
267
268int do_systemoff(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
269{
270 aml_system_off();
271 return 0;
272}
273
274
275U_BOOT_CMD(
276 systemoff, 2, 1, do_systemoff,
277 "system off ",
278 "systemoff "
279);