summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/mock/tcpci_i2c_mock.c78
-rw-r--r--common/usbc/usb_pe_drp_sm.c6
-rw-r--r--include/mock/tcpci_i2c_mock.h8
-rw-r--r--test/test_config.h1
-rw-r--r--test/usb_tcpmv2_tcpci.c47
5 files changed, 97 insertions, 43 deletions
diff --git a/common/mock/tcpci_i2c_mock.c b/common/mock/tcpci_i2c_mock.c
index 09864cc2d2..fa7268ddf4 100644
--- a/common/mock/tcpci_i2c_mock.c
+++ b/common/mock/tcpci_i2c_mock.c
@@ -10,7 +10,7 @@
#include "timer.h"
#define BUFFER_SIZE 100
-#define MOCK_WAIT_TIMEOUT (5 * SECOND)
+#define VERIFY_TIMEOUT (5 * SECOND)
struct tcpci_reg {
uint8_t offset;
@@ -138,31 +138,37 @@ static void print_header(const char *prefix, uint16_t header)
id, cnt, ext);
}
-int verify_tcpci_transmit(enum tcpm_transmit_type tx_type,
- enum pd_ctrl_msg_type ctrl_msg,
- enum pd_data_msg_type data_msg)
+static int verify_transmit(enum tcpm_transmit_type want_tx_type,
+ int want_tx_retry,
+ enum pd_ctrl_msg_type want_ctrl_msg,
+ enum pd_data_msg_type want_data_msg,
+ int timeout)
{
- uint64_t timeout = get_time().val + MOCK_WAIT_TIMEOUT;
+ uint64_t end_time = get_time().val + timeout;
TEST_EQ(tcpci_regs[TCPC_REG_TRANSMIT].value, 0, "%d");
- while (get_time().val < timeout) {
+ while (get_time().val < end_time) {
if (tcpci_regs[TCPC_REG_TRANSMIT].value != 0) {
+ int tx_type = TCPC_REG_TRANSMIT_TYPE(
+ tcpci_regs[TCPC_REG_TRANSMIT].value);
+ int tx_retry = TCPC_REG_TRANSMIT_RETRY(
+ tcpci_regs[TCPC_REG_TRANSMIT].value);
uint16_t header = UINT16_FROM_BYTE_ARRAY_LE(
tx_buffer, 1);
- int type = PD_HEADER_TYPE(header);
- int cnt = PD_HEADER_CNT(header);
- const uint16_t want_tx_reg = tx_type;
- const uint16_t tx_wo_retry =
- tcpci_regs[TCPC_REG_TRANSMIT].value & ~0x0030;
-
- /* Don't validate the retry portion of reg */
- TEST_EQ(tx_wo_retry, want_tx_reg, "0x%x");
- if (ctrl_msg != 0) {
- TEST_EQ(ctrl_msg, type, "0x%x");
- TEST_EQ(cnt, 0, "%d");
- } else {
- TEST_EQ(data_msg, type, "0x%x");
- TEST_GE(cnt, 1, "%d");
+ int pd_type = PD_HEADER_TYPE(header);
+ int pd_cnt = PD_HEADER_CNT(header);
+
+ TEST_EQ(tx_type, want_tx_type, "%d");
+ if (want_tx_retry >= 0)
+ TEST_EQ(tx_retry, want_tx_retry, "%d");
+
+ if (want_ctrl_msg != 0) {
+ TEST_EQ(pd_type, want_ctrl_msg, "0x%x");
+ TEST_EQ(pd_cnt, 0, "%d");
+ }
+ if (want_data_msg != 0) {
+ TEST_EQ(pd_type, want_data_msg, "0x%x");
+ TEST_GE(pd_cnt, 1, "%d");
}
tcpci_regs[TCPC_REG_TRANSMIT].value = 0;
return EC_SUCCESS;
@@ -173,25 +179,25 @@ int verify_tcpci_transmit(enum tcpm_transmit_type tx_type,
return EC_ERROR_UNKNOWN;
}
-int verify_tcpci_tx_retry_count(const uint8_t retry_count)
+int verify_tcpci_transmit(enum tcpm_transmit_type tx_type,
+ enum pd_ctrl_msg_type ctrl_msg,
+ enum pd_data_msg_type data_msg)
{
- uint64_t timeout = get_time().val + MOCK_WAIT_TIMEOUT;
-
- TEST_EQ(tcpci_regs[TCPC_REG_TRANSMIT].value, 0, "%d");
- while (get_time().val < timeout) {
- if (tcpci_regs[TCPC_REG_TRANSMIT].value != 0) {
- const uint16_t tx_retry = TCPC_REG_TRANSMIT_RETRY(
- tcpci_regs[TCPC_REG_TRANSMIT].value);
+ return verify_transmit(tx_type, -1, ctrl_msg, data_msg, VERIFY_TIMEOUT);
+}
- TEST_EQ(tx_retry, retry_count, "%d");
+int verify_tcpci_tx_timeout(enum tcpm_transmit_type tx_type,
+ enum pd_ctrl_msg_type ctrl_msg,
+ enum pd_data_msg_type data_msg,
+ int timeout)
+{
+ return verify_transmit(tx_type, -1, ctrl_msg, data_msg, timeout);
+}
- tcpci_regs[TCPC_REG_TRANSMIT].value = 0;
- return EC_SUCCESS;
- }
- task_wait_event(5 * MSEC);
- }
- TEST_ASSERT(0);
- return EC_ERROR_UNKNOWN;
+int verify_tcpci_tx_retry_count(enum tcpm_transmit_type tx_type,
+ int retry_count)
+{
+ return verify_transmit(tx_type, retry_count, 0, 0, VERIFY_TIMEOUT);
}
void mock_tcpci_receive(enum pd_msg_type sop, uint16_t header,
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c
index 34d597f162..5de59c56c2 100644
--- a/common/usbc/usb_pe_drp_sm.c
+++ b/common/usbc/usb_pe_drp_sm.c
@@ -736,7 +736,6 @@ static inline void send_ctrl_msg(int port, enum tcpm_transmit_type type,
#define prl_send_ext_data_msg DO_NOT_USE
#define prl_send_ctrl_msg DO_NOT_USE
-
static void pe_init(int port)
{
pe[port].flags = 0;
@@ -5583,7 +5582,7 @@ uint8_t pd_get_src_cap_cnt(int port)
void pd_dfp_discovery_init(int port)
{
- memset(&pe[port].discovery, 0, sizeof(pe[port].discovery));
+ memset(pe[port].discovery, 0, sizeof(pe[port].discovery));
memset(pe[port].partner_amodes, 0, sizeof(pe[port].partner_amodes));
/* Reset the DPM and DP modules to enable alternate mode entry. */
@@ -5600,13 +5599,14 @@ void pd_dfp_discovery_init(int port)
#ifdef CONFIG_USB_PD_ALT_MODE_DFP
struct pd_discovery *pd_get_am_discovery(int port, enum tcpm_transmit_type type)
{
+ ASSERT(type < DISCOVERY_TYPE_COUNT);
return &pe[port].discovery[type];
}
struct partner_active_modes *pd_get_partner_active_modes(int port,
enum tcpm_transmit_type type)
{
- assert(type < AMODE_TYPE_COUNT);
+ ASSERT(type < AMODE_TYPE_COUNT);
return &pe[port].partner_amodes[type];
}
diff --git a/include/mock/tcpci_i2c_mock.h b/include/mock/tcpci_i2c_mock.h
index 4734a2e1e2..4864c7fc96 100644
--- a/include/mock/tcpci_i2c_mock.h
+++ b/include/mock/tcpci_i2c_mock.h
@@ -18,7 +18,13 @@ int verify_tcpci_transmit(enum tcpm_transmit_type tx_type,
enum pd_ctrl_msg_type ctrl_msg,
enum pd_data_msg_type data_msg);
-int verify_tcpci_tx_retry_count(uint8_t retry_count);
+int verify_tcpci_tx_retry_count(enum tcpm_transmit_type tx_type,
+ int retry_count);
+
+int verify_tcpci_tx_timeout(enum tcpm_transmit_type tx_type,
+ enum pd_ctrl_msg_type ctrl_msg,
+ enum pd_data_msg_type data_msg,
+ int timeout);
void mock_tcpci_receive(enum pd_msg_type sop, uint16_t header,
uint32_t *payload);
diff --git a/test/test_config.h b/test/test_config.h
index 5f52e45952..e52d9b8995 100644
--- a/test/test_config.h
+++ b/test/test_config.h
@@ -445,6 +445,7 @@ int ncp15wb_calculate_temp(uint16_t adc);
#define I2C_PORT_HOST_TCPC 0
#define CONFIG_USB_PD_DEBUG_LEVEL 3
#define CONFIG_USB_PD_EXTENDED_MESSAGES
+#define CONFIG_USB_PD_DECODE_SOP
#endif
#ifdef TEST_USB_PD_INT
diff --git a/test/usb_tcpmv2_tcpci.c b/test/usb_tcpmv2_tcpci.c
index b383791faf..1ab0ec7f66 100644
--- a/test/usb_tcpmv2_tcpci.c
+++ b/test/usb_tcpmv2_tcpci.c
@@ -256,8 +256,8 @@ __maybe_unused static int test_retry_count_sop(void)
*
* Source Caps is SOP message which should be retried at TCPC layer
*/
- TEST_EQ(verify_tcpci_tx_retry_count(CONFIG_PD_RETRY_COUNT), EC_SUCCESS,
- "%d");
+ TEST_EQ(verify_tcpci_tx_retry_count(TCPC_TX_SOP, CONFIG_PD_RETRY_COUNT),
+ EC_SUCCESS, "%d");
return EC_SUCCESS;
}
@@ -299,7 +299,47 @@ __maybe_unused static int test_retry_count_hard_reset(void)
prl_execute_hard_reset(PORT0);
/* The retry count for hard resets should be 0 */
- TEST_EQ(verify_tcpci_tx_retry_count(0), EC_SUCCESS, "%d");
+ TEST_EQ(verify_tcpci_tx_retry_count(TCPC_TX_HARD_RESET, 0),
+ EC_SUCCESS, "%d");
+
+ return EC_SUCCESS;
+}
+
+__maybe_unused static int test_pd3_source_send_soft_reset(void)
+{
+ /*
+ * TD.PD.SRC3.E26.Soft_Reset sent regardless of Rp value
+ * a) Run PROC.PD.E1 Bring-up according to the UUT role.
+ * b) The Tester waits until it can start an AMS (Run PROC.PD.E3)...
+ */
+ TEST_EQ(test_connect_as_pd3_source(), EC_SUCCESS, "%d");
+
+ /*
+ * ...and sends a Get_Source_Cap message to the UUT.
+ */
+ mock_tcpci_receive(PD_MSG_SOP,
+ PD_HEADER(PD_CTRL_GET_SOURCE_CAP, PD_ROLE_SINK,
+ PD_ROLE_UFP, 3,
+ 0, PD_REV30, 0),
+ NULL);
+ mock_set_alert(TCPC_REG_ALERT_RX_STATUS);
+
+ /*
+ * c) Upon receipt of the Source_Capabilities Message, the Tester
+ * doesn’t reply with GoodCRC.
+ */
+ TEST_EQ(verify_tcpci_transmit(TCPC_TX_SOP, 0, PD_DATA_SOURCE_CAP),
+ EC_SUCCESS, "%d");
+ mock_set_alert(TCPC_REG_ALERT_TX_FAILED);
+
+ /*
+ * d) The Tester verifies that a Soft_Reset message is sent by the UUT
+ * within tReceive max (1.1 ms) + tSoftReset max (15 ms).
+ */
+ TEST_EQ(verify_tcpci_tx_timeout(
+ TCPC_TX_SOP, PD_CTRL_SOFT_RESET, 0, 15 * MSEC),
+ EC_SUCCESS, "%d");
+ mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS);
return EC_SUCCESS;
}
@@ -323,6 +363,7 @@ void run_test(int argc, char **argv)
RUN_TEST(test_connect_as_pd3_source);
RUN_TEST(test_retry_count_sop);
RUN_TEST(test_retry_count_hard_reset);
+ RUN_TEST(test_pd3_source_send_soft_reset);
test_print_result();
}