summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomasz Michalec <tm@semihalf.com>2021-10-13 13:10:43 +0200
committerCommit Bot <commit-bot@chromium.org>2021-10-26 18:02:37 +0000
commit04f8d53e7fc152877b012d05bfe22a222ca7cf77 (patch)
tree7e660e9fd7c7300815a1fd1a088e35cf3146b8ac
parent4ae7e684cd31a49fe213690ea8331c39c07f4773 (diff)
downloadchrome-ec-04f8d53e7fc152877b012d05bfe22a222ca7cf77.tar.gz
zephyr: drivers: add TCPCI missing tcpm_drv tests
This patch adds missing unit tests for following functions from tcpci_tcpm_drv: - tcpci_tcpc_enable_auto_discharge_disconnect() - tcpci_tcpc_drp_toggle() - tcpci_get_chip_info() - tcpci_enter_low_power_mode() - tcpci_set_bist_test_mode() BUG=b:184857030 BRANCH=none TEST=make configure --test zephyr/test/drivers Signed-off-by: Tomasz Michalec <tm@semihalf.com> Change-Id: Ia15b66c8dd5e9019661ff92228d5017e451a43e2 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3220339 Reviewed-by: Abe Levkoy <alevkoy@chromium.org> Reviewed-by: Aaron Massey <aaronmassey@google.com> Tested-by: Tomasz Michalec <tmichalec@google.com> Commit-Queue: Tomasz Michalec <tmichalec@google.com>
-rw-r--r--zephyr/test/drivers/src/tcpci.c222
1 files changed, 221 insertions, 1 deletions
diff --git a/zephyr/test/drivers/src/tcpci.c b/zephyr/test/drivers/src/tcpci.c
index 5c664c7368..49e9e263ba 100644
--- a/zephyr/test/drivers/src/tcpci.c
+++ b/zephyr/test/drivers/src/tcpci.c
@@ -853,6 +853,221 @@ static void test_tcpci_alert_rx_message(void)
zassert_false(tcpm_has_pending_message(USBC_PORT_C0), NULL);
}
+/** Test TCPCI auto discharge on disconnect */
+static void test_tcpci_auto_discharge(void)
+{
+ const struct emul *emul = emul_get_binding(DT_LABEL(EMUL_LABEL));
+ uint8_t initial_ctrl;
+ uint8_t exp_ctrl;
+
+ /* Set initial value for POWER ctrl register. Chosen arbitrary. */
+ initial_ctrl = TCPC_REG_POWER_CTRL_VBUS_VOL_MONITOR_DIS |
+ TCPC_REG_POWER_CTRL_FORCE_DISCHARGE;
+ tcpci_emul_set_reg(emul, TCPC_REG_POWER_CTRL, initial_ctrl);
+
+ /* Test discharge enable */
+ exp_ctrl = initial_ctrl | TCPC_REG_POWER_CTRL_AUTO_DISCHARGE_DISCONNECT;
+ tcpci_tcpc_enable_auto_discharge_disconnect(USBC_PORT_C0, 1);
+ check_tcpci_reg(emul, TCPC_REG_POWER_CTRL, exp_ctrl);
+
+ /* Test discharge disable */
+ exp_ctrl = initial_ctrl &
+ ~TCPC_REG_POWER_CTRL_AUTO_DISCHARGE_DISCONNECT;
+ tcpci_tcpc_enable_auto_discharge_disconnect(USBC_PORT_C0, 0);
+ check_tcpci_reg(emul, TCPC_REG_POWER_CTRL, exp_ctrl);
+}
+
+/** Test TCPCI drp toggle */
+static void test_tcpci_drp_toggle(void)
+{
+ const struct emul *emul = emul_get_binding(DT_LABEL(EMUL_LABEL));
+ struct i2c_emul *i2c_emul = tcpci_emul_get_i2c_emul(emul);
+ uint8_t exp_tcpc_ctrl, exp_role_ctrl, initial_tcpc_ctrl;
+
+ /* Set TCPCI to revision 2 */
+ tcpc_config[USBC_PORT_C0].flags = TCPC_FLAGS_TCPCI_REV2_0;
+ tcpci_emul_set_rev(emul, TCPCI_EMUL_REV2_0_VER1_1);
+
+ /* Test error on failed role CTRL set */
+ i2c_common_emul_set_write_fail_reg(i2c_emul, TCPC_REG_ROLE_CTRL);
+ zassert_equal(EC_ERROR_INVAL, tcpci_tcpc_drp_toggle(USBC_PORT_C0),
+ NULL);
+
+ /* Test error on failed TCPC CTRL set */
+ i2c_common_emul_set_write_fail_reg(i2c_emul, TCPC_REG_TCPC_CTRL);
+ zassert_equal(EC_ERROR_INVAL, tcpci_tcpc_drp_toggle(USBC_PORT_C0),
+ NULL);
+
+ /* Test error on failed command set */
+ i2c_common_emul_set_write_fail_reg(i2c_emul, TCPC_REG_COMMAND);
+ zassert_equal(EC_ERROR_INVAL, tcpci_tcpc_drp_toggle(USBC_PORT_C0),
+ NULL);
+ i2c_common_emul_set_write_fail_reg(i2c_emul,
+ I2C_COMMON_EMUL_NO_FAIL_REG);
+
+ /* Set initial value for TCPC ctrl register. Chosen arbitrary. */
+ initial_tcpc_ctrl = TCPC_REG_TCPC_CTRL_DEBUG_ACC_CONTROL |
+ TCPC_REG_TCPC_CTRL_BIST_TEST_MODE;
+ tcpci_emul_set_reg(emul, TCPC_REG_TCPC_CTRL, initial_tcpc_ctrl);
+
+ /*
+ * Test correct registers values for rev 2.0. Role control CC lines
+ * have to be set to RP with DRP enabled and smallest RP value.
+ */
+ exp_tcpc_ctrl = initial_tcpc_ctrl |
+ TCPC_REG_TCPC_CTRL_EN_LOOK4CONNECTION_ALERT;
+ exp_role_ctrl = TCPC_REG_ROLE_CTRL_SET(TYPEC_DRP, TYPEC_RP_USB,
+ TYPEC_CC_RP, TYPEC_CC_RP);
+ zassert_equal(EC_SUCCESS, tcpci_tcpc_drp_toggle(USBC_PORT_C0), NULL);
+ check_tcpci_reg(emul, TCPC_REG_TCPC_CTRL, exp_tcpc_ctrl);
+ check_tcpci_reg(emul, TCPC_REG_ROLE_CTRL, exp_role_ctrl);
+ check_tcpci_reg(emul, TCPC_REG_COMMAND,
+ TCPC_REG_COMMAND_LOOK4CONNECTION);
+
+ /* Set TCPCI to revision 1 */
+ tcpc_config[USBC_PORT_C0].flags = 0;
+ tcpci_emul_set_rev(emul, TCPCI_EMUL_REV1_0_VER1_0);
+
+ /* Set initial value for TCPC ctrl register. Chosen arbitrary. */
+ initial_tcpc_ctrl = TCPC_REG_TCPC_CTRL_DEBUG_ACC_CONTROL |
+ TCPC_REG_TCPC_CTRL_BIST_TEST_MODE;
+ tcpci_emul_set_reg(emul, TCPC_REG_TCPC_CTRL, initial_tcpc_ctrl);
+
+ /*
+ * Test correct registers values for rev 1.0. Role control CC lines
+ * have to be set to RD with DRP enabled and smallest RP value.
+ * Only CC lines setting is different from rev 2.0
+ */
+ exp_tcpc_ctrl = initial_tcpc_ctrl |
+ TCPC_REG_TCPC_CTRL_EN_LOOK4CONNECTION_ALERT;
+ exp_role_ctrl = TCPC_REG_ROLE_CTRL_SET(TYPEC_DRP, TYPEC_RP_USB,
+ TYPEC_CC_RD, TYPEC_CC_RD);
+ zassert_equal(EC_SUCCESS, tcpci_tcpc_drp_toggle(USBC_PORT_C0), NULL);
+ check_tcpci_reg(emul, TCPC_REG_TCPC_CTRL, exp_tcpc_ctrl);
+ check_tcpci_reg(emul, TCPC_REG_ROLE_CTRL, exp_role_ctrl);
+ check_tcpci_reg(emul, TCPC_REG_COMMAND,
+ TCPC_REG_COMMAND_LOOK4CONNECTION);
+}
+
+/** Test TCPCI get chip info */
+static void test_tcpci_get_chip_info(void)
+{
+ const struct emul *emul = emul_get_binding(DT_LABEL(EMUL_LABEL));
+ struct i2c_emul *i2c_emul = tcpci_emul_get_i2c_emul(emul);
+ struct ec_response_pd_chip_info_v1 info;
+ uint16_t vendor, product, bcd;
+
+ /* Test error on failed vendor id get */
+ i2c_common_emul_set_read_fail_reg(i2c_emul, TCPC_REG_VENDOR_ID);
+ zassert_equal(EC_ERROR_INVAL, tcpci_get_chip_info(USBC_PORT_C0, 1,
+ &info), NULL);
+
+ /* Test error on failed product id get */
+ i2c_common_emul_set_read_fail_reg(i2c_emul, TCPC_REG_PRODUCT_ID);
+ zassert_equal(EC_ERROR_INVAL, tcpci_get_chip_info(USBC_PORT_C0, 1,
+ &info), NULL);
+
+ /* Test error on failed BCD get */
+ i2c_common_emul_set_read_fail_reg(i2c_emul, TCPC_REG_VENDOR_ID);
+ zassert_equal(EC_ERROR_INVAL, tcpci_get_chip_info(USBC_PORT_C0, 1,
+ &info), NULL);
+ i2c_common_emul_set_read_fail_reg(i2c_emul,
+ I2C_COMMON_EMUL_NO_FAIL_REG);
+
+ /* Test reading chip info. Values chosen arbitrary. */
+ vendor = 0x1234;
+ product = 0x5678;
+ bcd = 0x9876;
+ tcpci_emul_set_reg(emul, TCPC_REG_VENDOR_ID, vendor);
+ tcpci_emul_set_reg(emul, TCPC_REG_PRODUCT_ID, product);
+ tcpci_emul_set_reg(emul, TCPC_REG_BCD_DEV, bcd);
+ zassert_equal(EC_SUCCESS, tcpci_get_chip_info(USBC_PORT_C0, 1, &info),
+ NULL);
+ zassert_equal(vendor, info.vendor_id, NULL);
+ zassert_equal(product, info.product_id, NULL);
+ zassert_equal(bcd, info.device_id, NULL);
+
+ /* Test reading cached chip info */
+ info.vendor_id = 0;
+ info.product_id = 0;
+ info.device_id = 0;
+ /* Make sure, that TCPC is not accessed */
+ i2c_common_emul_set_read_fail_reg(i2c_emul,
+ I2C_COMMON_EMUL_FAIL_ALL_REG);
+ zassert_equal(EC_SUCCESS, tcpci_get_chip_info(USBC_PORT_C0, 0, &info),
+ NULL);
+ i2c_common_emul_set_read_fail_reg(i2c_emul,
+ I2C_COMMON_EMUL_NO_FAIL_REG);
+ zassert_equal(vendor, info.vendor_id, NULL);
+ zassert_equal(product, info.product_id, NULL);
+ zassert_equal(bcd, info.device_id, NULL);
+}
+
+/** Test TCPCI enter low power mode */
+static void test_tcpci_low_power_mode(void)
+{
+ const struct emul *emul = emul_get_binding(DT_LABEL(EMUL_LABEL));
+ struct i2c_emul *i2c_emul = tcpci_emul_get_i2c_emul(emul);
+
+ /* Test error on failed command set */
+ i2c_common_emul_set_write_fail_reg(i2c_emul, TCPC_REG_COMMAND);
+ zassert_equal(EC_ERROR_INVAL, tcpci_enter_low_power_mode(USBC_PORT_C0),
+ NULL);
+ i2c_common_emul_set_write_fail_reg(i2c_emul,
+ I2C_COMMON_EMUL_NO_FAIL_REG);
+
+ /* Test correct command is issued */
+ zassert_equal(EC_SUCCESS, tcpci_enter_low_power_mode(USBC_PORT_C0),
+ NULL);
+ check_tcpci_reg(emul, TCPC_REG_COMMAND, TCPC_REG_COMMAND_I2CIDLE);
+}
+
+/** Test TCPCI set bist test mode */
+static void test_tcpci_set_bist_mode(void)
+{
+ const struct emul *emul = emul_get_binding(DT_LABEL(EMUL_LABEL));
+ struct i2c_emul *i2c_emul = tcpci_emul_get_i2c_emul(emul);
+ uint16_t exp_mask, initial_mask;
+ uint8_t exp_ctrl, initial_ctrl;
+
+ /* Test error on TCPC CTRL set */
+ i2c_common_emul_set_write_fail_reg(i2c_emul, TCPC_REG_TCPC_CTRL);
+ zassert_equal(EC_ERROR_INVAL, tcpci_set_bist_test_mode(USBC_PORT_C0, 1),
+ NULL);
+
+ /* Test error on alert mask set */
+ i2c_common_emul_set_write_fail_reg(i2c_emul, TCPC_REG_ALERT_MASK);
+ zassert_equal(EC_ERROR_INVAL, tcpci_set_bist_test_mode(USBC_PORT_C0, 1),
+ NULL);
+ i2c_common_emul_set_write_fail_reg(i2c_emul,
+ I2C_COMMON_EMUL_NO_FAIL_REG);
+
+ /* Set initial value for alert mask register. Chosen arbitrary. */
+ initial_mask = TCPC_REG_ALERT_MASK_ALL;
+ tcpci_emul_set_reg(emul, TCPC_REG_ALERT_MASK, initial_mask);
+
+ /* Set initial value for TCPC ctrl register. Chosen arbitrary. */
+ initial_ctrl = TCPC_REG_TCPC_CTRL_DEBUG_ACC_CONTROL |
+ TCPC_REG_TCPC_CTRL_EN_LOOK4CONNECTION_ALERT;
+ tcpci_emul_set_reg(emul, TCPC_REG_TCPC_CTRL, initial_ctrl);
+
+ /* Test enabling bist test mode */
+ exp_mask = initial_mask & ~TCPC_REG_ALERT_RX_STATUS;
+ exp_ctrl = initial_ctrl | TCPC_REG_TCPC_CTRL_BIST_TEST_MODE;
+ zassert_equal(EC_SUCCESS, tcpci_set_bist_test_mode(USBC_PORT_C0, 1),
+ NULL);
+ check_tcpci_reg(emul, TCPC_REG_TCPC_CTRL, exp_ctrl);
+ check_tcpci_reg(emul, TCPC_REG_ALERT_MASK, exp_mask);
+
+ /* Test disabling bist test mode */
+ exp_mask = initial_mask | TCPC_REG_ALERT_RX_STATUS;
+ exp_ctrl = initial_ctrl & ~TCPC_REG_TCPC_CTRL_BIST_TEST_MODE;
+ zassert_equal(EC_SUCCESS, tcpci_set_bist_test_mode(USBC_PORT_C0, 0),
+ NULL);
+ check_tcpci_reg(emul, TCPC_REG_TCPC_CTRL, exp_ctrl);
+ check_tcpci_reg(emul, TCPC_REG_ALERT_MASK, exp_mask);
+}
+
void test_suite_tcpci(void)
{
ztest_test_suite(tcpci,
@@ -871,6 +1086,11 @@ void test_suite_tcpci(void)
test_tcpci_get_rx_message_raw_rev1),
ztest_user_unit_test(test_tcpci_transmit_rev1),
ztest_user_unit_test(test_tcpci_alert),
- ztest_user_unit_test(test_tcpci_alert_rx_message));
+ ztest_user_unit_test(test_tcpci_alert_rx_message),
+ ztest_user_unit_test(test_tcpci_auto_discharge),
+ ztest_user_unit_test(test_tcpci_drp_toggle),
+ ztest_user_unit_test(test_tcpci_get_chip_info),
+ ztest_user_unit_test(test_tcpci_low_power_mode),
+ ztest_user_unit_test(test_tcpci_set_bist_mode));
ztest_run_test_suite(tcpci);
}