From: Simon Glass <sjg@chromium.org>
In some cases we may wish to return back to the program which started
U-Boot. Add the concept of a 'hot' reset, to support this.
Signed-off-by: Simon Glass <sjg@chromium.org>
---
cmd/boot.c | 1 +
doc/usage/cmd/reset.rst | 3 +++
drivers/sysreset/sysreset-uclass.c | 15 +++++++++++++--
drivers/sysreset/sysreset_sandbox.c | 1 +
include/sysreset.h | 3 +++
test/dm/sysreset.c | 2 ++
6 files changed, 23 insertions(+), 2 deletions(-)
@@ -60,6 +60,7 @@ U_BOOT_CMD(
reset, 2, 0, do_reset,
"Perform RESET of the CPU",
"- cold boot without level specifier\n"
+ "reset -h - hotreset if implemented\n"
"reset -w - warm reset if implemented"
);
@@ -22,6 +22,9 @@ DDR and peripherals, on some boards also resets external PMIC.
-w
Do warm WARM, reset CPU but keep peripheral/DDR/PMIC active.
+-h
+ Do a hot reset, if supported, which returns back to the program which
+ started U-Boot.
Return value
------------
@@ -125,8 +125,19 @@ int do_reset(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
if (argc > 2)
return CMD_RET_USAGE;
- if (argc == 2 && argv[1][0] == '-' && argv[1][1] == 'w') {
- reset_type = SYSRESET_WARM;
+ if (argc == 2 && argv[1][0] == '-') {
+ int type = argv[1][1];
+
+ switch (type) {
+ case 'h':
+ reset_type = SYSRESET_HOT;
+ break;
+ case 'w':
+ reset_type = SYSRESET_WARM;
+ break;
+ default:
+ return CMD_RET_USAGE;
+ }
}
printf("resetting ...\n");
@@ -65,6 +65,7 @@ static int sandbox_sysreset_request(struct udevice *dev, enum sysreset_t type)
return -EACCES;
sandbox_exit();
case SYSRESET_POWER:
+ case SYSRESET_HOT:
if (!state->sysreset_allowed[type])
return -EACCES;
sandbox_exit();
@@ -21,6 +21,9 @@ enum sysreset_t {
SYSRESET_POWER,
/** @SYSRESET_POWER_OFF: turn off power */
SYSRESET_POWER_OFF,
+ /** @SYSRESET_HOT: exit out of U-Boot (e.g. from EFI app) */
+ SYSRESET_HOT,
+
/** @SYSRESET_COUNT: number of available reset types */
SYSRESET_COUNT,
};
@@ -76,10 +76,12 @@ static int dm_test_sysreset_walk(struct unit_test_state *uts)
state->sysreset_allowed[SYSRESET_COLD] = false;
state->sysreset_allowed[SYSRESET_POWER] = false;
state->sysreset_allowed[SYSRESET_POWER_OFF] = false;
+ state->sysreset_allowed[SYSRESET_HOT] = false;
ut_asserteq(-EACCES, sysreset_walk(SYSRESET_WARM));
ut_asserteq(-EACCES, sysreset_walk(SYSRESET_COLD));
ut_asserteq(-EACCES, sysreset_walk(SYSRESET_POWER));
ut_asserteq(-EACCES, sysreset_walk(SYSRESET_POWER_OFF));
+ ut_asserteq(-EACCES, sysreset_walk(SYSRESET_HOT));
/*
* Enable cold system reset - this should make cold system reset work,