| /* Copyright (c) 2013 The Chromium OS Authors. All rights reserved. |
| * 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(); |
| msleep(30); |
| |
| params.cmd = EC_REBOOT_COLD; |
| params.flags = EC_REBOOT_FLAG_ON_AP_SHUTDOWN; |
| |
| TEST_ASSERT(test_send_host_command( |
| EC_CMD_REBOOT_EC, 0, ¶ms, |
| sizeof(params), NULL, 0) == EC_SUCCESS); |
| |
| system_set_scratchpad(TEST_STATE_STEP_2); |
| test_chipset_off(); |
| 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(); |
| msleep(30); |
| |
| params.cmd = EC_REBOOT_COLD; |
| params.flags = EC_REBOOT_FLAG_ON_AP_SHUTDOWN; |
| |
| TEST_ASSERT(test_send_host_command( |
| EC_CMD_REBOOT_EC, 0, ¶ms, |
| sizeof(params), NULL, 0) == EC_SUCCESS); |
| |
| params.cmd = EC_REBOOT_CANCEL; |
| params.flags = 0; |
| |
| TEST_ASSERT(test_send_host_command( |
| EC_CMD_REBOOT_EC, 0, ¶ms, |
| sizeof(params), NULL, 0) == EC_SUCCESS); |
| |
| test_chipset_off(); |
| 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(void) |
| { |
| uint32_t state = system_get_scratchpad(); |
| |
| 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(); |
| } |