summaryrefslogtreecommitdiff
path: root/test/usb_pe_drp.c
diff options
context:
space:
mode:
authorDenis Brockus <dbrockus@chromium.org>2019-10-14 14:06:05 -0600
committerCommit Bot <commit-bot@chromium.org>2019-10-16 08:42:19 +0000
commit7a4e700b6488a138d0c5c55aaa47e626d90a5299 (patch)
tree7df9a085eed09ffbcff37b4c8a09c71b5e9af0ca /test/usb_pe_drp.c
parent2dd2eecaa743a65d8369c7799bbc1450b0d91d0e (diff)
downloadchrome-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.c134
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();
+}