summaryrefslogtreecommitdiff
path: root/zephyr/test/drivers/default/src/tcpci.c
diff options
context:
space:
mode:
authorTom Hughes <tomhughes@chromium.org>2022-09-21 14:08:36 -0700
committerTom Hughes <tomhughes@chromium.org>2022-09-22 12:59:38 -0700
commitc453fd704268ef72de871b0c5ac7a989de662334 (patch)
treefcf6ce5810f9ff9e3c8cce434812dd75492269ed /zephyr/test/drivers/default/src/tcpci.c
parent6c1587ca70f558b4f96b3f0b18ad8b027d3ba99d (diff)
parent28712dae9d7ed1e694f7622cc083afa71090d4d5 (diff)
downloadchrome-ec-firmware-fpmcu-dartmonkey-release.tar.gz
Merge remote-tracking branch cros/main into firmware-fpmcu-dartmonkey-releasefirmware-fpmcu-dartmonkey-release
Generated by: ./util/update_release_branch.py --board dartmonkey --relevant_paths_file ./util/fingerprint-relevant-paths.txt firmware-fpmcu-dartmonkey-release Relevant changes: git log --oneline 6c1587ca70..28712dae9d -- board/nocturne_fp board/dartmonkey common/fpsensor docs/fingerprint driver/fingerprint util/getversion.sh ded9307b79 util/getversion.sh: Fix version when not in a git repo 956055e692 board: change Google USB vendor info 71b2ef709d Update license boilerplate text in source code files 33e11afda0 Revert "fpsensor: Build fpsensor source file with C++" c8d0360723 fpsensor: Build fpsensor source file with C++ bc113abd53 fpsensor: Fix g++ compiler error 150a58a0dc fpsensor: Fix fp_set_sensor_mode return type b33b5ce85b fpsensor: Remove nested designators for C++ compatibility 2e864b2539 tree-wide: const-ify argv for console commands 56d8b360f9 test: Add test for get ikm failure when seed not set 3a3d6c3690 test: Add test for fpsensor trivial key failure 233e6bbd08 fpsensor_crypto: Abstract calls to hmac_SHA256 0a041b285b docs/fingerprint: Typo correction c03fab67e2 docs/fingerprint: Fix the path of fputils.py 0b5d4baf5a util/getversion.sh: Fix empty file list handling 6e128fe760 FPMCU dev board environment with Satlab 3eb29b6aa5 builtin: Move ssize_t to sys/types.h 345d62ebd1 docs/fingerprint: Update power numbers for latest dartmonkey release c25ffdb316 common: Conditionally support printf %l and %i modifiers 9a3c514b45 test: Add a test to check if the debugger is connected 54e603413f Move standard library tests to their own file 43fa6b4bf8 docs/fingerprint: Update power numbers for latest bloonchipper release 25536f9a84 driver/fingerprint/fpc/bep/fpc_sensor_spi.c: Format with clang-format 4face99efd driver/fingerprint/fpc/libfp/fpc_sensor_pal.h: Format with clang-format 738de2b575 trng: Rename rand to trng_rand 14b8270edd docs/fingerprint: Update dragonclaw power numbers 0b268f93d1 driver/fingerprint/fpc/libfp/fpc_private.c: Format with clang-format f80da163f2 driver/fingerprint/fpc/libfp/fpc_private.h: Format with clang-format a0751778f4 board/nocturne_fp/ro_workarounds.c: Format with clang-format 5e9c85c9b1 driver/fingerprint/fpc/libfp/fpc_sensor_pal.c: Format with clang-format c1f9dd3cf8 driver/fingerprint/fpc/libfp/fpc_bio_algorithm.h: Format with clang-format eb1e1bed8d driver/fingerprint/fpc/libfp/fpc1145_private.h: Format with clang-format 6e7b611821 driver/fingerprint/fpc/bep/fpc_bio_algorithm.h: Format with clang-format e0589cd5e2 driver/fingerprint/fpc/bep/fpc1035_private.h: Format with clang-format 58f0246dbe board/nocturne_fp/board_ro.c: Format with clang-format 7905e556a0 common/fpsensor/fpsensor_crypto.c: Format with clang-format 21289d170c driver/fingerprint/fpc/bep/fpc1025_private.h: Format with clang-format 98a20f937e common/fpsensor/fpsensor_state.c: Format with clang-format a2d255d8af common/fpsensor/fpsensor.c: Format with clang-format 84e53a65da board/nocturne_fp/board.h: Format with clang-format 73055eeb3f driver/fingerprint/fpc/bep/fpc_private.c: Format with clang-format 0f7b5cb509 common/fpsensor/fpsensor_private.h: Format with clang-format 1ceade6e65 driver/fingerprint/fpc/bep/fpc_private.h: Format with clang-format dca9d74321 Revert "trng: Rename rand to trng_rand" a6b0b3554f trng: Rename rand to trng_rand 28d0b75b70 third_party/boringssl: Remove unused header BRANCH=None BUG=b:244387210 b:242720240 b:215613183 b:242720910 b:236386294 BUG=b:234181908 b:244781166 b:234781655 b:234143158 b:234181908 BUG=b:237344361 b:236025198 b:234181908 b:180945056 chromium:1098010 BUG=b:246424843 b:234181908 b:131913998 TEST=`make -j buildall` TEST=./util/run_device_tests.py --board dartmonkey Test "aes": PASSED Test "cec": PASSED Test "cortexm_fpu": PASSED Test "crc": PASSED Test "flash_physical": PASSED Test "flash_write_protect": PASSED Test "fpsensor_hw": PASSED Test "fpsensor_spi_ro": PASSED Test "fpsensor_spi_rw": PASSED Test "fpsensor_uart_ro": PASSED Test "fpsensor_uart_rw": PASSED Test "mpu_ro": PASSED Test "mpu_rw": PASSED Test "mutex": PASSED Test "pingpong": PASSED Test "printf": PASSED Test "queue": PASSED Test "rollback_region0": PASSED Test "rollback_region1": PASSED Test "rollback_entropy": PASSED Test "rtc": PASSED Test "sha256": PASSED Test "sha256_unrolled": PASSED Test "static_if": PASSED Test "stdlib": PASSED Test "system_is_locked_wp_on": PASSED Test "system_is_locked_wp_off": PASSED Test "timer_dos": PASSED Test "utils": PASSED Test "utils_str": PASSED Test "panic_data_dartmonkey_v2.0.2887": PASSED Test "panic_data_nocturne_fp_v2.2.64": PASSED Test "panic_data_nami_fp_v2.2.144": PASSED Force-Relevant-Builds: all Signed-off-by: Tom Hughes <tomhughes@chromium.org> Change-Id: I2c312583a709fedae8fe11d92c22328c3b634bc7
Diffstat (limited to 'zephyr/test/drivers/default/src/tcpci.c')
-rw-r--r--zephyr/test/drivers/default/src/tcpci.c524
1 files changed, 524 insertions, 0 deletions
diff --git a/zephyr/test/drivers/default/src/tcpci.c b/zephyr/test/drivers/default/src/tcpci.c
new file mode 100644
index 0000000000..e549e5056a
--- /dev/null
+++ b/zephyr/test/drivers/default/src/tcpci.c
@@ -0,0 +1,524 @@
+/* Copyright 2021 The ChromiumOS Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include <zephyr/kernel.h>
+#include <zephyr/ztest.h>
+#include <zephyr/drivers/gpio.h>
+#include <zephyr/drivers/gpio/gpio_emul.h>
+
+#include "common.h"
+#include "ec_tasks.h"
+#include "emul/emul_common_i2c.h"
+#include "emul/tcpc/emul_tcpci.h"
+#include "hooks.h"
+#include "i2c.h"
+#include "test/drivers/stubs.h"
+#include "test/drivers/tcpci_test_common.h"
+
+#include "tcpm/tcpci.h"
+#include "test/drivers/test_state.h"
+
+#define TCPCI_EMUL_NODE DT_NODELABEL(tcpci_emul)
+
+/** Test TCPCI init and vbus level */
+ZTEST(tcpci, test_generic_tcpci_init)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ test_tcpci_init(emul, common_data, USBC_PORT_C0);
+}
+
+/** Test TCPCI release */
+ZTEST(tcpci, test_generic_tcpci_release)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ test_tcpci_release(emul, common_data, USBC_PORT_C0);
+}
+
+/** Test TCPCI get cc */
+ZTEST(tcpci, test_generic_tcpci_get_cc)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ test_tcpci_get_cc(emul, common_data, USBC_PORT_C0);
+}
+
+/** Test TCPCI set cc */
+ZTEST(tcpci, test_generic_tcpci_set_cc)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ test_tcpci_set_cc(emul, common_data, USBC_PORT_C0);
+}
+
+/** Test TCPCI set polarity */
+ZTEST(tcpci, test_generic_tcpci_set_polarity)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ test_tcpci_set_polarity(emul, common_data, USBC_PORT_C0);
+}
+
+/** Test TCPCI set vconn */
+ZTEST(tcpci, test_generic_tcpci_set_vconn)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ test_tcpci_set_vconn(emul, common_data, USBC_PORT_C0);
+}
+
+/** Test TCPCI set msg header */
+ZTEST(tcpci, test_generic_tcpci_set_msg_header)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ test_tcpci_set_msg_header(emul, common_data, USBC_PORT_C0);
+}
+
+/** Test TCPCI rx and sop prime enable */
+ZTEST(tcpci, test_generic_tcpci_set_rx_detect)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ test_tcpci_set_rx_detect(emul, common_data, USBC_PORT_C0);
+}
+
+/** Test TCPCI get raw message from TCPC revision 2.0 */
+ZTEST(tcpci, test_generic_tcpci_get_rx_message_raw_rev2)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ /* Revision 2.0 is set by default in test_rules */
+ test_tcpci_get_rx_message_raw(emul, common_data, USBC_PORT_C0);
+}
+
+/** Test TCPCI get raw message from TCPC revision 1.0 */
+ZTEST(tcpci, test_generic_tcpci_get_rx_message_raw_rev1)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ tcpc_config[USBC_PORT_C0].flags = 0;
+ tcpci_emul_set_rev(emul, TCPCI_EMUL_REV1_0_VER1_0);
+
+ test_tcpci_get_rx_message_raw(emul, common_data, USBC_PORT_C0);
+}
+
+/** Test TCPCI transmitting message from TCPC revision 2.0 */
+ZTEST(tcpci, test_generic_tcpci_transmit_rev2)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ /* Revision 2.0 is set by default in test_rules */
+ test_tcpci_transmit(emul, common_data, USBC_PORT_C0);
+}
+
+/** Test TCPCI transmitting message from TCPC revision 1.0 */
+ZTEST(tcpci, test_generic_tcpci_transmit_rev1)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ tcpc_config[USBC_PORT_C0].flags = 0;
+ tcpci_emul_set_rev(emul, TCPCI_EMUL_REV1_0_VER1_0);
+
+ test_tcpci_transmit(emul, common_data, USBC_PORT_C0);
+}
+
+/** Test TCPCI alert */
+ZTEST(tcpci, test_generic_tcpci_alert)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ test_tcpci_alert(emul, common_data, USBC_PORT_C0);
+}
+
+/** Test TCPCI alert RX message */
+ZTEST(tcpci, test_generic_tcpci_alert_rx_message)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ test_tcpci_alert_rx_message(emul, common_data, USBC_PORT_C0);
+}
+
+/** Test TCPCI auto discharge on disconnect */
+ZTEST(tcpci, test_generic_tcpci_auto_discharge)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ test_tcpci_auto_discharge(emul, common_data, USBC_PORT_C0);
+}
+
+/** Test TCPCI drp toggle */
+ZTEST(tcpci, test_generic_tcpci_drp_toggle)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ test_tcpci_drp_toggle(emul, common_data, USBC_PORT_C0);
+}
+
+/** Test TCPCI get chip info */
+ZTEST(tcpci, test_generic_tcpci_get_chip_info)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ test_tcpci_get_chip_info(emul, common_data, USBC_PORT_C0);
+}
+
+/** Test TCPCI enter low power mode */
+ZTEST(tcpci, test_generic_tcpci_low_power_mode)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ test_tcpci_low_power_mode(emul, common_data, USBC_PORT_C0);
+}
+
+/** Test TCPCI set bist test mode */
+ZTEST(tcpci, test_generic_tcpci_set_bist_mode)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ test_tcpci_set_bist_mode(emul, common_data, USBC_PORT_C0);
+}
+
+/** Test TCPCI discharge vbus */
+ZTEST(tcpci, test_generic_tcpci_discharge_vbus)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ uint8_t exp_ctrl, initial_ctrl;
+
+ /* Set initial value for POWER ctrl register. Chosen arbitrary. */
+ initial_ctrl = TCPC_REG_POWER_CTRL_VBUS_VOL_MONITOR_DIS |
+ TCPC_REG_POWER_CTRL_VOLT_ALARM_DIS;
+ tcpci_emul_set_reg(emul, TCPC_REG_POWER_CTRL, initial_ctrl);
+
+ /* Test discharge enable */
+ exp_ctrl = initial_ctrl | TCPC_REG_POWER_CTRL_FORCE_DISCHARGE;
+ tcpci_tcpc_discharge_vbus(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_FORCE_DISCHARGE;
+ tcpci_tcpc_discharge_vbus(USBC_PORT_C0, 0);
+ check_tcpci_reg(emul, TCPC_REG_POWER_CTRL, exp_ctrl);
+}
+
+/** Test TCPC xfer */
+ZTEST(tcpci, test_tcpc_xfer)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ uint16_t val, exp_val;
+ uint8_t reg;
+
+ /* Set value to register (value and register chosen arbitrary) */
+ exp_val = 0x7fff;
+ reg = TCPC_REG_ALERT_MASK;
+ tcpci_emul_set_reg(emul, reg, exp_val);
+
+ /* Test reading value using tcpc_xfer() function */
+ zassert_equal(EC_SUCCESS,
+ tcpc_xfer(USBC_PORT_C0, &reg, 1, (uint8_t *)&val, 2),
+ NULL);
+ zassert_equal(exp_val, val, "0x%x != 0x%x", exp_val, val);
+}
+
+/** Test TCPCI debug accessory enable/disable */
+ZTEST(tcpci, test_generic_tcpci_debug_accessory)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ uint8_t exp_val, initial_val;
+
+ /* Set initial value for STD output register. Chosen arbitrary. */
+ initial_val = TCPC_REG_CONFIG_STD_OUTPUT_AUDIO_CONN_N |
+ TCPC_REG_CONFIG_STD_OUTPUT_MUX_USB |
+ TCPC_REG_CONFIG_STD_OUTPUT_CONNECTOR_FLIPPED |
+ TCPC_REG_CONFIG_STD_OUTPUT_DBG_ACC_CONN_N;
+ tcpci_emul_set_reg(emul, TCPC_REG_CONFIG_STD_OUTPUT, initial_val);
+
+ /* Test debug accessory connect */
+ exp_val = initial_val & ~TCPC_REG_CONFIG_STD_OUTPUT_DBG_ACC_CONN_N;
+ tcpci_tcpc_debug_accessory(USBC_PORT_C0, 1);
+ check_tcpci_reg(emul, TCPC_REG_CONFIG_STD_OUTPUT, exp_val);
+
+ /* Test debug accessory disconnect */
+ exp_val = initial_val | TCPC_REG_CONFIG_STD_OUTPUT_DBG_ACC_CONN_N;
+ tcpci_tcpc_debug_accessory(USBC_PORT_C0, 0);
+ check_tcpci_reg(emul, TCPC_REG_CONFIG_STD_OUTPUT, exp_val);
+}
+
+/* Setup TCPCI usb mux to behave as it is used only for usb mux */
+static void set_usb_mux_not_tcpc(void)
+{
+ usbc0_mux0.flags = USB_MUX_FLAG_NOT_TCPC;
+}
+
+/* Setup TCPCI usb mux to behave as it is used for usb mux and TCPC */
+static void set_usb_mux_tcpc(void)
+{
+ usbc0_mux0.flags = 0;
+}
+
+/** Test TCPCI mux init */
+ZTEST(tcpci, test_generic_tcpci_mux_init)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+ const struct usb_mux *tcpci_usb_mux = usb_muxes[USBC_PORT_C0].mux;
+
+ /* Set as usb mux with TCPC for first init call */
+ set_usb_mux_tcpc();
+
+ /* Make sure that TCPC is not accessed */
+ i2c_common_emul_set_read_fail_reg(common_data,
+ I2C_COMMON_EMUL_FAIL_ALL_REG);
+ zassert_equal(EC_SUCCESS, tcpci_tcpm_mux_init(tcpci_usb_mux), NULL);
+
+ /* Set as only usb mux without TCPC for rest of the test */
+ set_usb_mux_not_tcpc();
+
+ /* Test fail on power status read */
+ i2c_common_emul_set_read_fail_reg(common_data, TCPC_REG_POWER_STATUS);
+ zassert_equal(EC_ERROR_INVAL, tcpci_tcpm_mux_init(tcpci_usb_mux), NULL);
+ i2c_common_emul_set_read_fail_reg(common_data,
+ I2C_COMMON_EMUL_NO_FAIL_REG);
+
+ /* Test fail on uninitialised bit set */
+ tcpci_emul_set_reg(emul, TCPC_REG_POWER_STATUS,
+ TCPC_REG_POWER_STATUS_UNINIT);
+ zassert_equal(EC_ERROR_TIMEOUT, tcpci_tcpm_mux_init(tcpci_usb_mux),
+ NULL);
+
+ /* Set default power status for rest of the test */
+ tcpci_emul_set_reg(emul, TCPC_REG_POWER_STATUS,
+ TCPC_REG_POWER_STATUS_VBUS_DET);
+
+ /* Test fail on alert mask write fail */
+ i2c_common_emul_set_write_fail_reg(common_data, TCPC_REG_ALERT_MASK);
+ zassert_equal(EC_ERROR_UNKNOWN, tcpci_tcpm_mux_init(tcpci_usb_mux),
+ NULL);
+
+ /* Test fail on alert write fail */
+ i2c_common_emul_set_write_fail_reg(common_data, TCPC_REG_ALERT);
+ zassert_equal(EC_ERROR_UNKNOWN, tcpci_tcpm_mux_init(tcpci_usb_mux),
+ NULL);
+ i2c_common_emul_set_write_fail_reg(common_data,
+ I2C_COMMON_EMUL_NO_FAIL_REG);
+
+ /* Set arbitrary value to alert and alert mask registers */
+ tcpci_emul_set_reg(emul, TCPC_REG_ALERT, 0xffff);
+ tcpci_emul_set_reg(emul, TCPC_REG_ALERT_MASK, 0xffff);
+
+ /* Test success init */
+ zassert_equal(EC_SUCCESS, tcpci_tcpm_mux_init(tcpci_usb_mux), NULL);
+ check_tcpci_reg(emul, TCPC_REG_ALERT_MASK, 0);
+ check_tcpci_reg(emul, TCPC_REG_ALERT, 0);
+}
+
+/** Test TCPCI mux enter low power mode */
+ZTEST(tcpci, test_generic_tcpci_mux_enter_low_power)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+ const struct usb_mux *tcpci_usb_mux = usb_muxes[USBC_PORT_C0].mux;
+
+ /* Set as usb mux with TCPC for first enter_low_power call */
+ set_usb_mux_tcpc();
+
+ /* Make sure that TCPC is not accessed */
+ i2c_common_emul_set_write_fail_reg(common_data,
+ I2C_COMMON_EMUL_FAIL_ALL_REG);
+ zassert_equal(EC_SUCCESS, tcpci_tcpm_mux_enter_low_power(tcpci_usb_mux),
+ NULL);
+
+ /* Set as only usb mux without TCPC for rest of the test */
+ set_usb_mux_not_tcpc();
+
+ /* Test error on failed command set */
+ i2c_common_emul_set_write_fail_reg(common_data, TCPC_REG_COMMAND);
+ zassert_equal(EC_ERROR_INVAL,
+ tcpci_tcpm_mux_enter_low_power(tcpci_usb_mux), NULL);
+ i2c_common_emul_set_write_fail_reg(common_data,
+ I2C_COMMON_EMUL_NO_FAIL_REG);
+
+ /* Test correct command is issued */
+ zassert_equal(EC_SUCCESS, tcpci_tcpm_mux_enter_low_power(tcpci_usb_mux),
+ NULL);
+ check_tcpci_reg(emul, TCPC_REG_COMMAND, TCPC_REG_COMMAND_I2CIDLE);
+}
+
+/** Test TCPCI mux set and get */
+static void test_generic_tcpci_mux_set_get(void)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+ const struct usb_mux *tcpci_usb_mux = usb_muxes[USBC_PORT_C0].mux;
+ mux_state_t mux_state, mux_state_get;
+ uint16_t exp_val, initial_val;
+ bool ack;
+
+ mux_state = USB_PD_MUX_NONE;
+
+ /* Test fail on standard output config register read */
+ i2c_common_emul_set_read_fail_reg(common_data,
+ TCPC_REG_CONFIG_STD_OUTPUT);
+ zassert_equal(EC_ERROR_INVAL,
+ tcpci_tcpm_mux_set(tcpci_usb_mux, mux_state, &ack), NULL);
+ zassert_equal(EC_ERROR_INVAL,
+ tcpci_tcpm_mux_get(tcpci_usb_mux, &mux_state_get), NULL);
+ i2c_common_emul_set_read_fail_reg(common_data,
+ I2C_COMMON_EMUL_NO_FAIL_REG);
+
+ /* Test fail on standard output config register write */
+ i2c_common_emul_set_write_fail_reg(common_data,
+ TCPC_REG_CONFIG_STD_OUTPUT);
+ zassert_equal(EC_ERROR_INVAL,
+ tcpci_tcpm_mux_set(tcpci_usb_mux, mux_state, &ack), NULL);
+ i2c_common_emul_set_write_fail_reg(common_data,
+ I2C_COMMON_EMUL_NO_FAIL_REG);
+
+ /* Set initial value for STD output register. Chosen arbitrary. */
+ initial_val = TCPC_REG_CONFIG_STD_OUTPUT_AUDIO_CONN_N |
+ TCPC_REG_CONFIG_STD_OUTPUT_MUX_USB |
+ TCPC_REG_CONFIG_STD_OUTPUT_CONNECTOR_FLIPPED |
+ TCPC_REG_CONFIG_STD_OUTPUT_DBG_ACC_CONN_N;
+ tcpci_emul_set_reg(emul, TCPC_REG_CONFIG_STD_OUTPUT, initial_val);
+
+ /* Test setting/getting no MUX connection without polarity inverted */
+ exp_val = (initial_val & ~TCPC_REG_CONFIG_STD_OUTPUT_MUX_MASK) |
+ TCPC_REG_CONFIG_STD_OUTPUT_MUX_NONE;
+ exp_val &= ~TCPC_REG_CONFIG_STD_OUTPUT_CONNECTOR_FLIPPED;
+ mux_state = USB_PD_MUX_NONE;
+ zassert_equal(EC_SUCCESS,
+ tcpci_tcpm_mux_set(tcpci_usb_mux, mux_state, &ack), NULL);
+ check_tcpci_reg(emul, TCPC_REG_CONFIG_STD_OUTPUT, exp_val);
+ zassert_false(ack, "Ack from host shouldn't be required");
+ zassert_equal(EC_SUCCESS,
+ tcpci_tcpm_mux_get(tcpci_usb_mux, &mux_state_get), NULL);
+ zassert_equal(mux_state, mux_state_get, "Expected state 0x%x, got 0x%x",
+ mux_state, mux_state_get);
+
+ /* Test setting/getting MUX DP with polarity inverted */
+ exp_val = (initial_val & ~TCPC_REG_CONFIG_STD_OUTPUT_MUX_MASK) |
+ TCPC_REG_CONFIG_STD_OUTPUT_MUX_DP |
+ TCPC_REG_CONFIG_STD_OUTPUT_CONNECTOR_FLIPPED;
+ mux_state = USB_PD_MUX_DP_ENABLED | USB_PD_MUX_POLARITY_INVERTED;
+ zassert_equal(EC_SUCCESS,
+ tcpci_tcpm_mux_set(tcpci_usb_mux, mux_state, &ack), NULL);
+ check_tcpci_reg(emul, TCPC_REG_CONFIG_STD_OUTPUT, exp_val);
+ zassert_false(ack, "Ack from host shouldn't be required");
+ zassert_equal(EC_SUCCESS,
+ tcpci_tcpm_mux_get(tcpci_usb_mux, &mux_state_get), NULL);
+ zassert_equal(mux_state, mux_state_get, "Expected state 0x%x, got 0x%x",
+ mux_state, mux_state_get);
+
+ /* Test setting/getting MUX USB without polarity inverted */
+ exp_val = (initial_val & ~TCPC_REG_CONFIG_STD_OUTPUT_MUX_MASK) |
+ TCPC_REG_CONFIG_STD_OUTPUT_MUX_USB;
+ exp_val &= ~TCPC_REG_CONFIG_STD_OUTPUT_CONNECTOR_FLIPPED;
+ mux_state = USB_PD_MUX_USB_ENABLED;
+ zassert_equal(EC_SUCCESS,
+ tcpci_tcpm_mux_set(tcpci_usb_mux, mux_state, &ack), NULL);
+ check_tcpci_reg(emul, TCPC_REG_CONFIG_STD_OUTPUT, exp_val);
+ zassert_false(ack, "Ack from host shouldn't be required");
+ zassert_equal(EC_SUCCESS,
+ tcpci_tcpm_mux_get(tcpci_usb_mux, &mux_state_get), NULL);
+ zassert_equal(mux_state, mux_state_get, "Expected state 0x%x, got 0x%x",
+ mux_state, mux_state_get);
+
+ /* Test setting/getting MUX USB and DP with polarity inverted */
+ exp_val = (initial_val & ~TCPC_REG_CONFIG_STD_OUTPUT_MUX_MASK) |
+ TCPC_REG_CONFIG_STD_OUTPUT_MUX_DP |
+ TCPC_REG_CONFIG_STD_OUTPUT_MUX_USB |
+ TCPC_REG_CONFIG_STD_OUTPUT_CONNECTOR_FLIPPED;
+ mux_state = USB_PD_MUX_USB_ENABLED | USB_PD_MUX_DP_ENABLED |
+ USB_PD_MUX_POLARITY_INVERTED;
+ zassert_equal(EC_SUCCESS,
+ tcpci_tcpm_mux_set(tcpci_usb_mux, mux_state, &ack), NULL);
+ check_tcpci_reg(emul, TCPC_REG_CONFIG_STD_OUTPUT, exp_val);
+ zassert_false(ack, "Ack from host shouldn't be required");
+ zassert_equal(EC_SUCCESS,
+ tcpci_tcpm_mux_get(tcpci_usb_mux, &mux_state_get), NULL);
+ zassert_equal(mux_state, mux_state_get, "Expected state 0x%x, got 0x%x",
+ mux_state, mux_state_get);
+}
+
+ZTEST(tcpci, test_generic_tcpci_mux_set_get)
+{
+ test_generic_tcpci_mux_set_get();
+}
+
+ZTEST(tcpci, test_generic_tcpci_mux_set_get__not_tcpc)
+{
+ set_usb_mux_not_tcpc();
+ test_generic_tcpci_mux_set_get();
+ set_usb_mux_tcpc();
+}
+
+ZTEST(tcpci, test_generic_tcpci_hard_reset_reinit)
+{
+ const struct emul *emul = EMUL_DT_GET(TCPCI_EMUL_NODE);
+ struct i2c_common_emul_data *common_data =
+ emul_tcpci_generic_get_i2c_common_data(emul);
+
+ test_tcpci_hard_reset_reinit(emul, common_data, USBC_PORT_C0);
+}
+
+static void *tcpci_setup(void)
+{
+ /* This test suite assumes that first usb mux for port C0 is TCPCI */
+ __ASSERT(usb_muxes[USBC_PORT_C0].mux->driver ==
+ &tcpci_tcpm_usb_mux_driver,
+ "Invalid config of usb_muxes in test/drivers/src/stubs.c");
+
+ return NULL;
+}
+
+static void tcpci_after(void *state)
+{
+ set_usb_mux_tcpc();
+}
+
+ZTEST_SUITE(tcpci, drivers_predicate_pre_main, tcpci_setup, NULL, tcpci_after,
+ NULL);