diff options
author | Denis Brockus <dbrockus@chromium.org> | 2019-10-14 14:06:05 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-10-16 08:42:19 +0000 |
commit | 7a4e700b6488a138d0c5c55aaa47e626d90a5299 (patch) | |
tree | 7df9a085eed09ffbcff37b4c8a09c71b5e9af0ca /test/usb_pe_drp.c | |
parent | 2dd2eecaa743a65d8369c7799bbc1450b0d91d0e (diff) | |
download | chrome-ec-7a4e700b6488a138d0c5c55aaa47e626d90a5299.tar.gz |
pd: Add PE FRS unit test for new stack
BUG=none
BRANCH=none
TEST=make buildall -j
Change-Id: I55453ddf1d1da0fdee902a33e14357716fb12c4a
Signed-off-by: Denis Brockus <dbrockus@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1859826
Reviewed-by: Jett Rink <jettrink@chromium.org>
Diffstat (limited to 'test/usb_pe_drp.c')
-rw-r--r-- | test/usb_pe_drp.c | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/test/usb_pe_drp.c b/test/usb_pe_drp.c new file mode 100644 index 0000000000..b2457a8298 --- /dev/null +++ b/test/usb_pe_drp.c @@ -0,0 +1,134 @@ +/* Copyright 2019 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 USB PE module. + */ +#include "battery.h" +#include "common.h" +#include "task.h" +#include "test_util.h" +#include "timer.h" +#include "usb_emsg.h" +#include "usb_pe.h" +#include "usb_pe_sm.h" +#include "usb_prl_sm.h" +#include "usb_sm_checks.h" +#include "usb_tc_sm.h" + +/** + * STUB Section + */ +const struct svdm_response svdm_rsp = { + .identity = NULL, + .svids = NULL, + .modes = NULL, +}; + +/** + * Test section + */ +/* PE Fast Role Swap */ +static int test_pe_frs(void) +{ + pe_run(PORT0, EVT_IGNORED, ENABLED); + TEST_ASSERT(pe_is_running(PORT0)); + + /* + * FRS will only trigger when we are SNK, with an Explicit + * contract. So set this state up manually + */ + tc_prs_src_snk_assert_rd(PORT0); + pe_set_flag(PORT0, PE_FLAGS_EXPLICIT_CONTRACT); + set_state_pe(PORT0, PE_SNK_READY); + pe_run(PORT0, EVT_IGNORED, ENABLED); + TEST_ASSERT(get_state_pe(PORT0) == PE_SNK_READY); + + /* + * Trigger the Fast Role Switch from simulated ISR + */ + pe_got_frs_signal(PORT0); + TEST_ASSERT(pe_chk_flag(PORT0, PE_FLAGS_FAST_ROLE_SWAP_SIGNALED)); + + /* + * Verify we detected FRS and ready to start swap + */ + pe_run(PORT0, EVT_IGNORED, ENABLED); + TEST_ASSERT(get_state_pe(PORT0) == PE_PRS_SNK_SRC_SEND_SWAP); + TEST_ASSERT(pe_chk_flag(PORT0, PE_FLAGS_FAST_ROLE_SWAP_PATH)); + TEST_ASSERT(!pe_chk_flag(PORT0, PE_FLAGS_EXPLICIT_CONTRACT)); + + /* + * Make sure that we sent FR_Swap + */ + pe_run(PORT0, EVT_IGNORED, ENABLED); + TEST_ASSERT(fake_prl_get_last_sent_ctrl_msg(PORT0) == PD_CTRL_FR_SWAP); + TEST_ASSERT(get_state_pe(PORT0) == PE_PRS_SNK_SRC_SEND_SWAP); + TEST_ASSERT(pe_chk_flag(PORT0, PE_FLAGS_FAST_ROLE_SWAP_PATH)); + + /* + * Accept the partners PS_RDY control message + */ + emsg[PORT0].header = PD_HEADER(PD_CTRL_ACCEPT, 0, 0, 0, 0, 0, 0); + pe_set_flag(PORT0, PE_FLAGS_MSG_RECEIVED); + pe_run(PORT0, EVT_IGNORED, ENABLED); + TEST_ASSERT(!pe_chk_flag(PORT0, PE_FLAGS_MSG_RECEIVED)); + TEST_ASSERT(get_state_pe(PORT0) == PE_PRS_SNK_SRC_TRANSITION_TO_OFF); + TEST_ASSERT(pe_chk_flag(PORT0, PE_FLAGS_FAST_ROLE_SWAP_PATH)); + + /* + * Send back our PS_RDY + */ + emsg[PORT0].header = PD_HEADER(PD_CTRL_PS_RDY, 0, 0, 0, 0, 0, 0); + pe_set_flag(PORT0, PE_FLAGS_MSG_RECEIVED); + TEST_ASSERT(!tc_is_attached_src(PORT0)); + pe_run(PORT0, EVT_IGNORED, ENABLED); + TEST_ASSERT(!pe_chk_flag(PORT0, PE_FLAGS_MSG_RECEIVED)); + TEST_ASSERT(tc_is_attached_src(PORT0)); + TEST_ASSERT(get_state_pe(PORT0) == PE_PRS_SNK_SRC_ASSERT_RP); + TEST_ASSERT(pe_chk_flag(PORT0, PE_FLAGS_FAST_ROLE_SWAP_PATH)); + + /* + * We are now attached source, so move to next state + */ + pe_run(PORT0, EVT_IGNORED, ENABLED); + TEST_ASSERT(get_state_pe(PORT0) == PE_PRS_SNK_SRC_SOURCE_ON); + TEST_ASSERT(pe_chk_flag(PORT0, PE_FLAGS_FAST_ROLE_SWAP_PATH)); + + /* + * Move the time to be after our wait time. + */ + force_time((timestamp_t)(get_time().val + + PD_POWER_SUPPLY_TURN_ON_DELAY)); + + /* + * After delay we are ready to send our PS_RDY + */ + pe_run(PORT0, EVT_IGNORED, ENABLED); + TEST_ASSERT(get_state_pe(PORT0) == PE_PRS_SNK_SRC_SOURCE_ON); + TEST_ASSERT(pe_chk_flag(PORT0, PE_FLAGS_FAST_ROLE_SWAP_PATH)); + TEST_ASSERT(fake_prl_get_last_sent_ctrl_msg(PORT0) == PD_CTRL_PS_RDY); + + /* + * Fake the Transmit complete and this will bring us to Source Startup + */ + pe_set_flag(PORT0, PE_FLAGS_TX_COMPLETE); + pe_run(PORT0, EVT_IGNORED, ENABLED); + TEST_ASSERT(get_state_pe(PORT0) == PE_SRC_STARTUP); + TEST_ASSERT(!pe_chk_flag(PORT0, PE_FLAGS_FAST_ROLE_SWAP_PATH)); + + return EC_SUCCESS; +} + +void run_test(void) +{ + test_reset(); + + RUN_TEST(test_pe_frs); + + /* Do basic state machine sanity checks last. */ + RUN_TEST(test_pe_no_parent_cycles); + RUN_TEST(test_pe_no_empty_state); + + test_print_result(); +} |