From db67bdf3150f3dab2377da6b24b9cfed9c428e1b Mon Sep 17 00:00:00 2001 From: Denis Brockus Date: Fri, 19 Mar 2021 11:10:23 -0600 Subject: 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 Change-Id: Ifef6fa558a789c2ce34a9f9fbf38529dc90d5e6f Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2774580 Tested-by: Denis Brockus Auto-Submit: Denis Brockus Reviewed-by: Diana Z Commit-Queue: Diana Z Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2782371 Tested-by: Abe Levkoy Reviewed-by: Abe Levkoy Commit-Queue: Abe Levkoy --- common/mock/tcpci_i2c_mock.c | 13 ++- test/usb_tcpmv2_compliance_common.c | 171 +++++++++++++++++++++++++----------- 2 files changed, 130 insertions(+), 54 deletions(-) diff --git a/common/mock/tcpci_i2c_mock.c b/common/mock/tcpci_i2c_mock.c index 0cdaf8e3a4..a9cc09fb54 100644 --- a/common/mock/tcpci_i2c_mock.c +++ b/common/mock/tcpci_i2c_mock.c @@ -291,12 +291,15 @@ int verify_tcpci_possible_tx(struct possible_tx possible[], int *msg_len, int timeout) { + bool assert_on_timeout = true; uint64_t end_time; *found_index = -1; - if (timeout <= 0) + if (timeout <= 0) { timeout = VERIFY_TIMEOUT; + assert_on_timeout = false; + } end_time = get_time().val + timeout; /* @@ -348,12 +351,14 @@ int verify_tcpci_possible_tx(struct possible_tx possible[], tcpci_regs[TCPC_REG_TRANSMIT].value = 0; return EC_SUCCESS; } - break; + return EC_ERROR_UNKNOWN; } task_wait_event(5 * MSEC); } - TEST_ASSERT(0); - return EC_ERROR_UNKNOWN; + if (assert_on_timeout) + TEST_ASSERT(0); + + return EC_ERROR_TIMEOUT; } void mock_tcpci_receive(enum pd_msg_type sop, uint16_t header, 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; -- cgit v1.2.1