diff options
author | Denis Brockus <dbrockus@google.com> | 2021-03-19 11:10:23 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-03-19 22:14:53 +0000 |
commit | 977a6125900860a2e2635cc7a64005d9d7fd32b1 (patch) | |
tree | 7656c73c12a373e35895d812b8f75a65b9130da5 /test/usb_tcpmv2_compliance_common.c | |
parent | 272a35b54b61abed1ea4134f58681e8c1ab81fc4 (diff) | |
download | chrome-ec-977a6125900860a2e2635cc7a64005d9d7fd32b1.tar.gz |
TCPMv2: Compliance Unit Test - allow PROC.PD.E3 flexibility
Allow the startup messages to be optional and don't require
a specific ordering. Also add PR_Swap when PD_ROLE_UFP.
BUG=none
BRANCH=none
TEST=make run-usb_tcpmv2_compliance
Signed-off-by: Denis Brockus <dbrockus@google.com>
Change-Id: Ifef6fa558a789c2ce34a9f9fbf38529dc90d5e6f
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2774580
Tested-by: Denis Brockus <dbrockus@chromium.org>
Auto-Submit: Denis Brockus <dbrockus@chromium.org>
Reviewed-by: Diana Z <dzigterman@chromium.org>
Commit-Queue: Diana Z <dzigterman@chromium.org>
Diffstat (limited to 'test/usb_tcpmv2_compliance_common.c')
-rw-r--r-- | test/usb_tcpmv2_compliance_common.c | 171 |
1 files changed, 121 insertions, 50 deletions
diff --git a/test/usb_tcpmv2_compliance_common.c b/test/usb_tcpmv2_compliance_common.c index 5273948de3..965bafacc6 100644 --- a/test/usb_tcpmv2_compliance_common.c +++ b/test/usb_tcpmv2_compliance_common.c @@ -364,60 +364,131 @@ int proc_pd_e3(void) */ int handle_attach_expected_msgs(enum pd_data_role data_role) { + int rv; + int found_index; + struct possible_tx possible[4]; + if (data_role == PD_ROLE_DFP) { - TEST_EQ(verify_tcpci_transmit(TCPC_TX_SOP, - PD_CTRL_GET_SOURCE_CAP, 0), - EC_SUCCESS, "%d"); - mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS); - task_wait_event(10 * MSEC); - partner_send_msg(PD_MSG_SOP, PD_DATA_SOURCE_CAP, 1, 0, &pdo); - - TEST_EQ(verify_tcpci_transmit(TCPC_TX_SOP, - PD_CTRL_GET_SINK_CAP, 0), - EC_SUCCESS, "%d"); - mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS); - task_wait_event(10 * MSEC); - partner_send_msg(PD_MSG_SOP, PD_DATA_SINK_CAP, 1, 0, &pdo); - - TEST_EQ(verify_tcpci_transmit(TCPC_TX_SOP_PRIME, 0, - PD_DATA_VENDOR_DEF), - EC_SUCCESS, "%d"); - mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS); - task_wait_event(10 * MSEC); - partner_send_msg(PD_MSG_SOP_PRIME, PD_CTRL_NOT_SUPPORTED, 0, 0, - NULL); - - TEST_EQ(verify_tcpci_transmit(TCPC_TX_SOP, 0, - PD_DATA_VENDOR_DEF), - EC_SUCCESS, "%d"); - mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS); - task_wait_event(10 * MSEC); - partner_send_msg(PD_MSG_SOP, PD_CTRL_NOT_SUPPORTED, 0, 0, NULL); + possible[0].tx_type = TCPC_TX_SOP; + possible[0].ctrl_msg = PD_CTRL_GET_SOURCE_CAP; + possible[0].data_msg = 0; + + possible[1].tx_type = TCPC_TX_SOP; + possible[1].ctrl_msg = PD_CTRL_GET_SINK_CAP; + possible[1].data_msg = 0; + + possible[2].tx_type = TCPC_TX_SOP_PRIME; + possible[2].ctrl_msg = 0; + possible[2].data_msg = PD_DATA_VENDOR_DEF; + + possible[3].tx_type = TCPC_TX_SOP; + possible[3].ctrl_msg = 0; + possible[3].data_msg = PD_DATA_VENDOR_DEF; + + do { + rv = verify_tcpci_possible_tx(possible, + 4, + &found_index, + NULL, + 0, + NULL, + -1); + + TEST_NE(rv, EC_ERROR_UNKNOWN, "%d"); + if (rv == EC_ERROR_TIMEOUT) + break; + + mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS); + task_wait_event(10 * MSEC); + + switch (found_index) { + case 0: /* PD_MSG_SOP PD_CTRL_GET_SOURCE_CAP */ + partner_send_msg(PD_MSG_SOP, + PD_DATA_SOURCE_CAP, + 1, 0, &pdo); + break; + case 1: /* PD_MSG_SOP PD_CTRL_GET_SINK_CAP */ + partner_send_msg(PD_MSG_SOP, + PD_DATA_SINK_CAP, + 1, 0, &pdo); + break; + case 2: /* TCPC_TX_SOP_PRIME PD_DATA_VENDOR_DEF */ + partner_send_msg(PD_MSG_SOP_PRIME, + PD_CTRL_NOT_SUPPORTED, + 0, 0, NULL); + break; + case 3: /* TCPC_TX_SOP PD_DATA_VENDOR_DEF */ + partner_send_msg(PD_MSG_SOP, + PD_CTRL_NOT_SUPPORTED, + 0, 0, NULL); + break; + default: + TEST_ASSERT(0); + break; + } + } while (rv != EC_ERROR_TIMEOUT); } else if (data_role == PD_ROLE_UFP) { - int vcs; - - TEST_EQ(verify_tcpci_transmit(TCPC_TX_SOP, - PD_CTRL_GET_SINK_CAP, 0), - EC_SUCCESS, "%d"); - mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS); - task_wait_event(10 * MSEC); - partner_send_msg(PD_MSG_SOP, PD_DATA_SINK_CAP, 1, 0, &pdo); - - TEST_EQ(verify_tcpci_transmit(TCPC_TX_SOP, PD_CTRL_DR_SWAP, 0), - EC_SUCCESS, "%d"); - mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS); - task_wait_event(10 * MSEC); - partner_send_msg(PD_MSG_SOP, PD_CTRL_REJECT, 0, 0, NULL); - - for (vcs = 0; vcs < 4; vcs++) { - TEST_EQ(verify_tcpci_transmit(TCPC_TX_SOP, - PD_CTRL_VCONN_SWAP, 0), - EC_SUCCESS, "%d"); + int vcs = 0; + + possible[0].tx_type = TCPC_TX_SOP; + possible[0].ctrl_msg = PD_CTRL_GET_SINK_CAP; + possible[0].data_msg = 0; + + possible[1].tx_type = TCPC_TX_SOP; + possible[1].ctrl_msg = PD_CTRL_DR_SWAP; + possible[1].data_msg = 0; + + possible[2].tx_type = TCPC_TX_SOP; + possible[2].ctrl_msg = PD_CTRL_PR_SWAP; + possible[2].data_msg = 0; + + possible[3].tx_type = TCPC_TX_SOP; + possible[3].ctrl_msg = PD_CTRL_VCONN_SWAP; + possible[3].data_msg = 0; + + do { + rv = verify_tcpci_possible_tx(possible, + 4, + &found_index, + NULL, + 0, + NULL, + -1); + + TEST_NE(rv, EC_ERROR_UNKNOWN, "%d"); + if (rv == EC_ERROR_TIMEOUT) + break; + mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS); task_wait_event(10 * MSEC); - partner_send_msg(PD_MSG_SOP, PD_CTRL_REJECT, 0, 0, - NULL); - } + + switch (found_index) { + case 0: /* PD_MSG_SOP PD_CTRL_GET_SINK_CAP */ + partner_send_msg(PD_MSG_SOP, + PD_DATA_SINK_CAP, + 1, 0, &pdo); + break; + case 1: /* TCPC_TX_SOP PD_CTRL_DR_SWAP */ + partner_send_msg(PD_MSG_SOP, + PD_CTRL_REJECT, + 0, 0, NULL); + break; + case 2: /* PD_MSG_SOP PD_CTRL_PR_SWAP */ + partner_send_msg(PD_MSG_SOP, + PD_CTRL_REJECT, + 0, 0, NULL); + break; + case 3: /* TCPC_TX_SOP PD_CTRL_VCONN_SWAP */ + TEST_LT(vcs++, 4, "%d"); + partner_send_msg(PD_MSG_SOP, + PD_CTRL_REJECT, + 0, 0, NULL); + break; + default: + TEST_ASSERT(0); + break; + } + } while (rv != EC_ERROR_TIMEOUT); } task_wait_event(1 * SECOND); return EC_SUCCESS; |