| /* Copyright 2013 The ChromiumOS Authors |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| * |
| * Test system_common. |
| */ |
| |
| #include "common.h" |
| #include "console.h" |
| #include "host_command.h" |
| #include "system.h" |
| #include "test_util.h" |
| #include "timer.h" |
| #include "util.h" |
| |
| #define TEST_STATE_STEP_2 (1 << 0) |
| #define TEST_STATE_FAIL (1 << 1) |
| |
| static int test_reboot_on_shutdown(void) |
| { |
| struct ec_params_reboot_ec params; |
| |
| /* Fails if the system reboots unexpectedly */ |
| system_set_scratchpad(TEST_STATE_FAIL); |
| |
| test_chipset_on(); |
| crec_msleep(30); |
| |
| params.cmd = EC_REBOOT_COLD; |
| params.flags = EC_REBOOT_FLAG_ON_AP_SHUTDOWN; |
| |
| TEST_EQ(test_send_host_command(EC_CMD_REBOOT_EC, 0, ¶ms, |
| sizeof(params), NULL, 0), |
| EC_SUCCESS, "%d"); |
| |
| system_set_scratchpad(TEST_STATE_STEP_2); |
| test_chipset_off(); |
| crec_msleep(30); |
| |
| /* Shouldn't reach here */ |
| return EC_ERROR_UNKNOWN; |
| } |
| |
| static int test_cancel_reboot(void) |
| { |
| struct ec_params_reboot_ec params; |
| |
| /* Fails if the system reboots unexpectedly */ |
| system_set_scratchpad(TEST_STATE_FAIL); |
| |
| test_chipset_on(); |
| crec_msleep(30); |
| |
| params.cmd = EC_REBOOT_COLD; |
| params.flags = EC_REBOOT_FLAG_ON_AP_SHUTDOWN; |
| |
| TEST_EQ(test_send_host_command(EC_CMD_REBOOT_EC, 0, ¶ms, |
| sizeof(params), NULL, 0), |
| EC_SUCCESS, "%d"); |
| |
| params.cmd = EC_REBOOT_CANCEL; |
| params.flags = 0; |
| |
| TEST_EQ(test_send_host_command(EC_CMD_REBOOT_EC, 0, ¶ms, |
| sizeof(params), NULL, 0), |
| EC_SUCCESS, "%d"); |
| |
| test_chipset_off(); |
| crec_msleep(30); |
| |
| return EC_SUCCESS; |
| } |
| |
| static void run_test_step1(void) |
| { |
| if (test_reboot_on_shutdown() != EC_SUCCESS) |
| test_fail(); |
| } |
| |
| static void run_test_step2(void) |
| { |
| if (test_cancel_reboot() != EC_SUCCESS) |
| test_fail(); |
| |
| system_set_scratchpad(0); |
| test_pass(); |
| } |
| |
| static void fail_and_clean_up(void) |
| { |
| system_set_scratchpad(0); |
| test_fail(); |
| } |
| |
| void run_test(int argc, const char **argv) |
| { |
| uint32_t state = 0; |
| |
| /* The return value isn't checked here on purpose. The scratchpad file |
| * may exist from a previous run or it may be in a clean state. A |
| * previous run of this test should reset the scratchpad value to 0 |
| * regardless of the final result. |
| */ |
| system_get_scratchpad(&state); |
| |
| test_reset(); |
| |
| if (state == 0) |
| run_test_step1(); |
| else if (state & TEST_STATE_STEP_2) |
| run_test_step2(); |
| else if (state & TEST_STATE_FAIL) |
| fail_and_clean_up(); |
| } |