diff options
author | Tom Hughes <tomhughes@chromium.org> | 2022-09-21 14:08:36 -0700 |
---|---|---|
committer | Tom Hughes <tomhughes@chromium.org> | 2022-09-22 12:59:38 -0700 |
commit | c453fd704268ef72de871b0c5ac7a989de662334 (patch) | |
tree | fcf6ce5810f9ff9e3c8cce434812dd75492269ed /zephyr/test/drivers/default/src/tcpci.c | |
parent | 6c1587ca70f558b4f96b3f0b18ad8b027d3ba99d (diff) | |
parent | 28712dae9d7ed1e694f7622cc083afa71090d4d5 (diff) | |
download | chrome-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.c | 524 |
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, ®, 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); |