summaryrefslogtreecommitdiff
path: root/power
diff options
context:
space:
mode:
authorravindr1 <ravindra@intel.com>2020-11-05 03:57:48 +0530
committerCommit Bot <commit-bot@chromium.org>2020-11-23 09:31:45 +0000
commit5e3ff7b30e7313aec7144d9ffdf166e0900e7435 (patch)
tree2ff5f8606448133bae290bf8c9b40c4a465181f9 /power
parent4a399faf37a8c14797ea9f60e6430e678e6f8a15 (diff)
downloadchrome-ec-5e3ff7b30e7313aec7144d9ffdf166e0900e7435.tar.gz
Ectool: support reboot AP from G3 state with configurable delay.
On using Ectool command - reboot_ap_on_g3 [<delay>] && shutdown -h now, AP must perform a reboot from G3 state to S0 state with configurable delay in seconds on it's next corresponding shutdown cycle. BUG=b:172885634 BRANCH=none TEST=Run Ectool command - reboot_ap_on_g3 50 && shutdown -h now. Change-Id: I2c5eb304d27a9647f0adc220d91de2d0b4061460 Signed-off-by: ravindr1 <ravindra@intel.corp-partner.google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2528731 Reviewed-by: Keith Short <keithshort@chromium.org>
Diffstat (limited to 'power')
-rw-r--r--power/common.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/power/common.c b/power/common.c
index 637a367854..f5091d795c 100644
--- a/power/common.c
+++ b/power/common.c
@@ -77,18 +77,33 @@ static int pause_in_s5;
#endif
static bool want_reboot_ap_at_g3;/* Want to reboot AP from G3? */
+/* Want to reboot AP from G3 with delay? */
+static uint64_t reboot_ap_at_g3_delay;
static enum ec_status
host_command_reboot_ap_on_g3(struct host_cmd_handler_args *args)
{
+ const struct ec_params_reboot_ap_on_g3_v1 *cmd = args->params;
+
/* Store request for processing at g3 */
want_reboot_ap_at_g3 = true;
+ switch (args->version) {
+ case 0:
+ break;
+ case 1:
+ /* Store user specified delay to wait in G3 state */
+ reboot_ap_at_g3_delay = cmd->reboot_ap_at_g3_delay;
+ break;
+ default:
+ return EC_RES_INVALID_PARAM;
+ }
+
return EC_RES_SUCCESS;
}
DECLARE_HOST_COMMAND(EC_CMD_REBOOT_AP_ON_G3,
host_command_reboot_ap_on_g3,
- EC_VER_MASK(0));
+ EC_VER_MASK(0) | EC_VER_MASK(1));
__overridable int power_signal_get_level(enum gpio_signal signal)
{
@@ -419,8 +434,19 @@ static enum power_state power_common_state(enum power_state state)
switch (state) {
case POWER_G3:
if (want_g3_exit || want_reboot_ap_at_g3) {
+ uint64_t i;
+
want_g3_exit = 0;
want_reboot_ap_at_g3 = false;
+ reboot_ap_at_g3_delay = reboot_ap_at_g3_delay * MSEC;
+ /*
+ * G3->S0 transition should happen only after the
+ * user specified delay. Hence, wait until the
+ * user specified delay times out.
+ */
+ for (i = 0; i < reboot_ap_at_g3_delay; i += 100)
+ msleep(100);
+ reboot_ap_at_g3_delay = 0;
return POWER_G3S5;
}