From 6f87ad821fc33f82ae874bba17728fb6aef315e1 Mon Sep 17 00:00:00 2001 From: Diana Z Date: Fri, 10 Mar 2023 10:57:13 -0700 Subject: Zephyr test: Add USB PD Discovery test Add a test to cover the various ifs and elses of the usb_pd_discovery.c code. BRANCH=None BUG=b:267964449 TEST=run in twister and observe sweet sweet 93% coverage in usb_pd_discovery.c Change-Id: Ifdec5a8f57213b1e8050dbd0ca69ff068b038714 Signed-off-by: Diana Z Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4329094 Reviewed-by: Tomasz Michalec --- zephyr/test/drivers/CMakeLists.txt | 1 + zephyr/test/drivers/Kconfig | 3 + zephyr/test/drivers/testcase.yaml | 3 + .../test/drivers/usb_pd_discovery/CMakeLists.txt | 15 + .../usb_pd_discovery/src/usb_pd_discovery.c | 397 +++++++++++++++++++++ 5 files changed, 419 insertions(+) create mode 100644 zephyr/test/drivers/usb_pd_discovery/CMakeLists.txt create mode 100644 zephyr/test/drivers/usb_pd_discovery/src/usb_pd_discovery.c (limited to 'zephyr/test/drivers') diff --git a/zephyr/test/drivers/CMakeLists.txt b/zephyr/test/drivers/CMakeLists.txt index ea754dc812..b91b1295d9 100644 --- a/zephyr/test/drivers/CMakeLists.txt +++ b/zephyr/test/drivers/CMakeLists.txt @@ -40,6 +40,7 @@ add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_SHIM_RTC shim_rtc) add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_TIMER timer) add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_USB_COMMON usb_common) add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_USB_MALFUNCTION_SINK usb_malfunction_sink) +add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_USB_PD_DISCOVERY usb_pd_discovery) add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_USB_PD_DPS dps) add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_USB_PORT_POWER_DUMB usb_port_power_dumb) add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_USB_RETIMER_FW_UPDATE usb_retimer_fw_update) diff --git a/zephyr/test/drivers/Kconfig b/zephyr/test/drivers/Kconfig index 980a3b6a5c..670746d505 100644 --- a/zephyr/test/drivers/Kconfig +++ b/zephyr/test/drivers/Kconfig @@ -121,6 +121,9 @@ config LINK_TEST_SUITE_TIMER config LINK_TEST_SUITE_USB_COMMON bool "Link and test USB common code tests" +config LINK_TEST_SUITE_USB_PD_DISCOVERY + bool "Link and test USB PD discovery tests" + config LINK_TEST_SUITE_USB_MALFUNCTION_SINK bool "Link and test the usb_malfunction_sink tests" diff --git a/zephyr/test/drivers/testcase.yaml b/zephyr/test/drivers/testcase.yaml index afe12cb8d9..c3dc0d13c8 100644 --- a/zephyr/test/drivers/testcase.yaml +++ b/zephyr/test/drivers/testcase.yaml @@ -273,6 +273,9 @@ tests: - CONFIG_PLATFORM_EC_USB_PD_DISCHARGE=y - CONFIG_PLATFORM_EC_USB_PD_DISCHARGE_PPC=y - CONFIG_PLATFORM_EC_USB_PD_FLAGS=y + drivers.usb_pd_discovery: + extra_configs: + - CONFIG_LINK_TEST_SUITE_USB_PD_DISCOVERY=y drivers.usb_pd_flags: extra_configs: - CONFIG_LINK_TEST_SUITE_USB_COMMON=y diff --git a/zephyr/test/drivers/usb_pd_discovery/CMakeLists.txt b/zephyr/test/drivers/usb_pd_discovery/CMakeLists.txt new file mode 100644 index 0000000000..6c02382202 --- /dev/null +++ b/zephyr/test/drivers/usb_pd_discovery/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright 2023 The ChromiumOS Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Create library name based on current directory +zephyr_library_get_current_dir_lib_name(${ZEPHYR_BASE} lib_name) + +# Create interface library +zephyr_interface_library_named(${lib_name}) + +# Add source files +zephyr_library_sources("${CMAKE_CURRENT_SOURCE_DIR}/src/usb_pd_discovery.c") + +# Link in the library +zephyr_library_link_libraries(${lib_name}) diff --git a/zephyr/test/drivers/usb_pd_discovery/src/usb_pd_discovery.c b/zephyr/test/drivers/usb_pd_discovery/src/usb_pd_discovery.c new file mode 100644 index 0000000000..8696fb68f3 --- /dev/null +++ b/zephyr/test/drivers/usb_pd_discovery/src/usb_pd_discovery.c @@ -0,0 +1,397 @@ +/* Copyright 2023 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "ec_commands.h" +#include "emul/emul_isl923x.h" +#include "emul/tcpc/emul_ps8xxx.h" +#include "emul/tcpc/emul_tcpci.h" +#include "emul/tcpc/emul_tcpci_partner_snk.h" +#include "test/drivers/stubs.h" +#include "test/drivers/test_state.h" +#include "test/drivers/utils.h" +#include "usb_dp_alt_mode.h" +#include "usb_mux.h" +#include "usb_pd_vdo.h" + +#include + +#include +#include +#include + +#define TEST_PORT USBC_PORT_C0 + +struct usb_pd_discovery_fixture { + const struct emul *tcpci_emul; + const struct emul *charger_emul; + struct tcpci_partner_data partner; + struct tcpci_snk_emul_data snk_ext; +}; + +static void *usb_pd_discovery_setup(void) +{ + static struct usb_pd_discovery_fixture fixture; + struct tcpci_partner_data *partner = &fixture.partner; + struct tcpci_snk_emul_data *snk_ext = &fixture.snk_ext; + + tcpci_partner_init(partner, PD_REV30); + partner->extensions = tcpci_snk_emul_init(snk_ext, partner, NULL); + + /* Get references for the emulators */ + fixture.tcpci_emul = EMUL_DT_GET(DT_NODELABEL(tcpci_emul)); + fixture.charger_emul = EMUL_DT_GET(DT_NODELABEL(isl923x_emul)); + + return &fixture; +} + +static void usb_pd_discovery_before(void *data) +{ + /* Set chipset on so we'll connect to a sink partner */ + test_set_chipset_to_s0(); + + /* + * Test cases will attach the port partner themselves, since they need + * to set up their own unique discovery replies + */ +} + +static void usb_pd_discovery_after(void *data) +{ + struct usb_pd_discovery_fixture *fix = data; + + disconnect_sink_from_port(fix->tcpci_emul); +} + +ZTEST_SUITE(usb_pd_discovery, drivers_predicate_post_main, + usb_pd_discovery_setup, usb_pd_discovery_before, + usb_pd_discovery_after, NULL); + +/* First up: Plain and correct DP response */ +ZTEST_F(usb_pd_discovery, verify_discovery) +{ + struct tcpci_partner_data *partner = &fixture->partner; + uint8_t response_buffer[EC_LPC_HOST_PACKET_SIZE]; + struct ec_response_typec_discovery *discovery = + (struct ec_response_typec_discovery *)response_buffer; + + /* Add Discover Identity response */ + partner->identity_vdm[VDO_INDEX_HDR] = + VDO(USB_SID_PD, /* structured VDM */ true, + VDO_CMDT(CMDT_RSP_ACK) | CMD_DISCOVER_IDENT) | + VDO_SVDM_VERS(VDM_VER20); + partner->identity_vdm[VDO_INDEX_IDH] = VDO_IDH( + /* USB host */ false, /* USB device */ true, IDH_PTYPE_HUB, + /* modal operation */ true, USB_VID_GOOGLE); + partner->identity_vdm[VDO_INDEX_CSTAT] = 0; + partner->identity_vdm[VDO_INDEX_PRODUCT] = VDO_PRODUCT(0xBEAD, 0x1001); + /* Hardware version 1, firmware version 2 */ + partner->identity_vdm[VDO_INDEX_PTYPE_UFP1_VDO] = VDO_UFP1( + (VDO_UFP1_CAPABILITY_USB20 | VDO_UFP1_CAPABILITY_USB32), + USB_TYPEC_RECEPTACLE, VDO_UFP1_ALT_MODE_RECONFIGURE, + USB_R30_SS_U32_U40_GEN2); + partner->identity_vdos = VDO_INDEX_PTYPE_UFP1_VDO + 1; + + /* Add Discover Modes response with just DP */ + partner->modes_vdm[VDO_INDEX_HDR] = + VDO(USB_SID_DISPLAYPORT, /* structured VDM */ true, + VDO_CMDT(CMDT_RSP_ACK) | CMD_DISCOVER_MODES) | + VDO_SVDM_VERS(VDM_VER20); + partner->modes_vdm[VDO_INDEX_HDR + 1] = + VDO_MODE_DP(MODE_DP_PIN_E, 0, 1, CABLE_RECEPTACLE, MODE_DP_V13, + MODE_DP_SNK); + partner->modes_vdos = VDO_INDEX_HDR + 2; + + /* Add Discover SVIDs response for DP */ + partner->svids_vdm[VDO_INDEX_HDR] = + VDO(USB_SID_PD, /* structured VDM */ true, + VDO_CMDT(CMDT_RSP_ACK) | CMD_DISCOVER_SVID) | + VDO_SVDM_VERS(VDM_VER20); + partner->svids_vdm[VDO_INDEX_HDR + 1] = + VDO_SVID(USB_SID_DISPLAYPORT, 0); + partner->svids_vdos = VDO_INDEX_HDR + 2; + + connect_sink_to_port(&fixture->partner, fixture->tcpci_emul, + fixture->charger_emul); + + host_cmd_typec_discovery(TEST_PORT, TYPEC_PARTNER_SOP, response_buffer, + sizeof(response_buffer)); + + /* The host command does not count the VDM header in identity_count. */ + zassert_equal(discovery->identity_count, + fixture->partner.identity_vdos - 1); + zassert_mem_equal( + discovery->discovery_vdo, fixture->partner.identity_vdm + 1, + discovery->identity_count * sizeof(*discovery->discovery_vdo)); + zassert_equal(discovery->svid_count, 1); + zassert_equal(discovery->svids[0].svid, USB_SID_DISPLAYPORT); + zassert_equal(discovery->svids[0].mode_count, 1); + zassert_equal(discovery->svids[0].mode_vdo[0], + fixture->partner.modes_vdm[1]); +} + +/* Now: Duplicate the DP SID */ +ZTEST_F(usb_pd_discovery, verify_svid_duplicate) +{ + struct tcpci_partner_data *partner = &fixture->partner; + uint8_t response_buffer[EC_LPC_HOST_PACKET_SIZE]; + struct ec_response_typec_discovery *discovery = + (struct ec_response_typec_discovery *)response_buffer; + + /* Add Discover Identity response */ + partner->identity_vdm[VDO_INDEX_HDR] = + VDO(USB_SID_PD, /* structured VDM */ true, + VDO_CMDT(CMDT_RSP_ACK) | CMD_DISCOVER_IDENT) | + VDO_SVDM_VERS(VDM_VER20); + partner->identity_vdm[VDO_INDEX_IDH] = VDO_IDH( + /* USB host */ false, /* USB device */ true, IDH_PTYPE_HUB, + /* modal operation */ true, USB_VID_GOOGLE); + partner->identity_vdm[VDO_INDEX_CSTAT] = 0; + partner->identity_vdm[VDO_INDEX_PRODUCT] = VDO_PRODUCT(0xBEAD, 0x1001); + /* Hardware version 1, firmware version 2 */ + partner->identity_vdm[VDO_INDEX_PTYPE_UFP1_VDO] = VDO_UFP1( + (VDO_UFP1_CAPABILITY_USB20 | VDO_UFP1_CAPABILITY_USB32), + USB_TYPEC_RECEPTACLE, VDO_UFP1_ALT_MODE_RECONFIGURE, + USB_R30_SS_U32_U40_GEN2); + partner->identity_vdos = VDO_INDEX_PTYPE_UFP1_VDO + 1; + + /* Add Discover SVIDs response for DP twice */ + partner->svids_vdm[VDO_INDEX_HDR] = + VDO(USB_SID_PD, /* structured VDM */ true, + VDO_CMDT(CMDT_RSP_ACK) | CMD_DISCOVER_SVID) | + VDO_SVDM_VERS(VDM_VER20); + partner->svids_vdm[VDO_INDEX_HDR + 1] = + VDO_SVID(USB_SID_DISPLAYPORT, USB_SID_DISPLAYPORT); + partner->svids_vdm[VDO_INDEX_HDR + 2] = 0; + partner->svids_vdos = VDO_INDEX_HDR + 3; + + /* Add Discover Modes response with just DP */ + partner->modes_vdm[VDO_INDEX_HDR] = + VDO(USB_SID_DISPLAYPORT, /* structured VDM */ true, + VDO_CMDT(CMDT_RSP_ACK) | CMD_DISCOVER_MODES) | + VDO_SVDM_VERS(VDM_VER20); + partner->modes_vdm[VDO_INDEX_HDR + 1] = + VDO_MODE_DP(MODE_DP_PIN_E, 0, 1, CABLE_RECEPTACLE, MODE_DP_V13, + MODE_DP_SNK); + partner->modes_vdos = VDO_INDEX_HDR + 2; + + connect_sink_to_port(&fixture->partner, fixture->tcpci_emul, + fixture->charger_emul); + + host_cmd_typec_discovery(TEST_PORT, TYPEC_PARTNER_SOP, response_buffer, + sizeof(response_buffer)); + + /* We should have but one SVID reported */ + zassert_equal(discovery->svid_count, 1); + zassert_equal(discovery->svids[0].svid, USB_SID_DISPLAYPORT); +} + +/* Forget to 0 terminate the SVIDs */ +ZTEST_F(usb_pd_discovery, verify_bad_termination) +{ + struct tcpci_partner_data *partner = &fixture->partner; + uint8_t response_buffer[EC_LPC_HOST_PACKET_SIZE]; + struct ec_response_typec_discovery *discovery = + (struct ec_response_typec_discovery *)response_buffer; + + /* Add Discover Identity response */ + partner->identity_vdm[VDO_INDEX_HDR] = + VDO(USB_SID_PD, /* structured VDM */ true, + VDO_CMDT(CMDT_RSP_ACK) | CMD_DISCOVER_IDENT) | + VDO_SVDM_VERS(VDM_VER20); + partner->identity_vdm[VDO_INDEX_IDH] = VDO_IDH( + /* USB host */ false, /* USB device */ true, IDH_PTYPE_HUB, + /* modal operation */ true, USB_VID_GOOGLE); + partner->identity_vdm[VDO_INDEX_CSTAT] = 0; + partner->identity_vdm[VDO_INDEX_PRODUCT] = VDO_PRODUCT(0xBEAD, 0x1001); + /* Hardware version 1, firmware version 2 */ + partner->identity_vdm[VDO_INDEX_PTYPE_UFP1_VDO] = VDO_UFP1( + (VDO_UFP1_CAPABILITY_USB20 | VDO_UFP1_CAPABILITY_USB32), + USB_TYPEC_RECEPTACLE, VDO_UFP1_ALT_MODE_RECONFIGURE, + USB_R30_SS_U32_U40_GEN2); + partner->identity_vdos = VDO_INDEX_PTYPE_UFP1_VDO + 1; + + /* Add Discover SVIDs response for DP and TBT with no NULL */ + partner->svids_vdm[VDO_INDEX_HDR] = + VDO(USB_SID_PD, /* structured VDM */ true, + VDO_CMDT(CMDT_RSP_ACK) | CMD_DISCOVER_SVID) | + VDO_SVDM_VERS(VDM_VER20); + partner->svids_vdm[VDO_INDEX_HDR + 1] = + VDO_SVID(USB_SID_DISPLAYPORT, USB_VID_INTEL); + partner->svids_vdos = VDO_INDEX_HDR + 2; + + /* Add Discover Modes response with just DP */ + partner->modes_vdm[VDO_INDEX_HDR] = + VDO(USB_SID_DISPLAYPORT, /* structured VDM */ true, + VDO_CMDT(CMDT_RSP_ACK) | CMD_DISCOVER_MODES) | + VDO_SVDM_VERS(VDM_VER20); + partner->modes_vdm[VDO_INDEX_HDR + 1] = + VDO_MODE_DP(MODE_DP_PIN_E, 0, 1, CABLE_RECEPTACLE, MODE_DP_V13, + MODE_DP_SNK); + partner->modes_vdos = VDO_INDEX_HDR + 2; + + connect_sink_to_port(&fixture->partner, fixture->tcpci_emul, + fixture->charger_emul); + + host_cmd_typec_discovery(TEST_PORT, TYPEC_PARTNER_SOP, response_buffer, + sizeof(response_buffer)); + + /* We should have both SVIDs and no nonsense */ + zassert_equal(discovery->svid_count, 2); + zassert_equal(discovery->svids[0].svid, USB_SID_DISPLAYPORT); + zassert_equal(discovery->svids[1].svid, USB_VID_INTEL); +} + +/* Reply with a NAK to DiscoverModes */ +ZTEST_F(usb_pd_discovery, verify_modes_nak) +{ + struct tcpci_partner_data *partner = &fixture->partner; + uint8_t response_buffer[EC_LPC_HOST_PACKET_SIZE]; + struct ec_response_typec_discovery *discovery = + (struct ec_response_typec_discovery *)response_buffer; + + /* Add Discover Identity response */ + partner->identity_vdm[VDO_INDEX_HDR] = + VDO(USB_SID_PD, /* structured VDM */ true, + VDO_CMDT(CMDT_RSP_ACK) | CMD_DISCOVER_IDENT) | + VDO_SVDM_VERS(VDM_VER20); + partner->identity_vdm[VDO_INDEX_IDH] = VDO_IDH( + /* USB host */ false, /* USB device */ true, IDH_PTYPE_HUB, + /* modal operation */ true, USB_VID_GOOGLE); + partner->identity_vdm[VDO_INDEX_CSTAT] = 0; + partner->identity_vdm[VDO_INDEX_PRODUCT] = VDO_PRODUCT(0xBEAD, 0x1001); + /* Hardware version 1, firmware version 2 */ + partner->identity_vdm[VDO_INDEX_PTYPE_UFP1_VDO] = VDO_UFP1( + (VDO_UFP1_CAPABILITY_USB20 | VDO_UFP1_CAPABILITY_USB32), + USB_TYPEC_RECEPTACLE, VDO_UFP1_ALT_MODE_RECONFIGURE, + USB_R30_SS_U32_U40_GEN2); + partner->identity_vdos = VDO_INDEX_PTYPE_UFP1_VDO + 1; + + /* Add Discover SVIDs response for TBT */ + partner->svids_vdm[VDO_INDEX_HDR] = + VDO(USB_SID_PD, /* structured VDM */ true, + VDO_CMDT(CMDT_RSP_ACK) | CMD_DISCOVER_SVID) | + VDO_SVDM_VERS(VDM_VER20); + partner->svids_vdm[VDO_INDEX_HDR + 1] = VDO_SVID(USB_VID_INTEL, 0); + partner->svids_vdos = VDO_INDEX_HDR + 2; + + /* Add Discover Modes NAK */ + partner->modes_vdm[VDO_INDEX_HDR] = + VDO(USB_VID_INTEL, /* structured VDM */ true, + VDO_CMDT(CMDT_RSP_NAK) | CMD_DISCOVER_MODES) | + VDO_SVDM_VERS(VDM_VER20); + partner->modes_vdos = 1; + + connect_sink_to_port(&fixture->partner, fixture->tcpci_emul, + fixture->charger_emul); + + host_cmd_typec_discovery(TEST_PORT, TYPEC_PARTNER_SOP, response_buffer, + sizeof(response_buffer)); + + /* No SVID reported up to the AP because it didn't report any data */ + zassert_equal(discovery->svid_count, 0); +} + +/* Reply with the wrong SVID to DiscoverModes */ +ZTEST_F(usb_pd_discovery, verify_bad_mode) +{ + struct tcpci_partner_data *partner = &fixture->partner; + uint8_t response_buffer[EC_LPC_HOST_PACKET_SIZE]; + struct ec_response_typec_discovery *discovery = + (struct ec_response_typec_discovery *)response_buffer; + + /* Add Discover Identity response */ + partner->identity_vdm[VDO_INDEX_HDR] = + VDO(USB_SID_PD, /* structured VDM */ true, + VDO_CMDT(CMDT_RSP_ACK) | CMD_DISCOVER_IDENT) | + VDO_SVDM_VERS(VDM_VER20); + partner->identity_vdm[VDO_INDEX_IDH] = VDO_IDH( + /* USB host */ false, /* USB device */ true, IDH_PTYPE_HUB, + /* modal operation */ true, USB_VID_GOOGLE); + partner->identity_vdm[VDO_INDEX_CSTAT] = 0; + partner->identity_vdm[VDO_INDEX_PRODUCT] = VDO_PRODUCT(0xBEAD, 0x1001); + /* Hardware version 1, firmware version 2 */ + partner->identity_vdm[VDO_INDEX_PTYPE_UFP1_VDO] = VDO_UFP1( + (VDO_UFP1_CAPABILITY_USB20 | VDO_UFP1_CAPABILITY_USB32), + USB_TYPEC_RECEPTACLE, VDO_UFP1_ALT_MODE_RECONFIGURE, + USB_R30_SS_U32_U40_GEN2); + partner->identity_vdos = VDO_INDEX_PTYPE_UFP1_VDO + 1; + + /* Add Discover SVIDs response for TBT */ + partner->svids_vdm[VDO_INDEX_HDR] = + VDO(USB_SID_PD, /* structured VDM */ true, + VDO_CMDT(CMDT_RSP_ACK) | CMD_DISCOVER_SVID) | + VDO_SVDM_VERS(VDM_VER20); + partner->svids_vdm[VDO_INDEX_HDR + 1] = VDO_SVID(USB_VID_INTEL, 0); + partner->svids_vdos = VDO_INDEX_HDR + 2; + + /* Add Discover Modes for DP, which we didn't report in DiscoverSVIDs */ + partner->modes_vdm[VDO_INDEX_HDR] = + VDO(USB_SID_DISPLAYPORT, /* structured VDM */ true, + VDO_CMDT(CMDT_RSP_ACK) | CMD_DISCOVER_MODES) | + VDO_SVDM_VERS(VDM_VER20); + partner->modes_vdm[VDO_INDEX_HDR + 1] = + VDO_MODE_DP(MODE_DP_PIN_E, 0, 1, CABLE_RECEPTACLE, MODE_DP_V13, + MODE_DP_SNK); + partner->modes_vdos = VDO_INDEX_HDR + 2; + + connect_sink_to_port(&fixture->partner, fixture->tcpci_emul, + fixture->charger_emul); + + host_cmd_typec_discovery(TEST_PORT, TYPEC_PARTNER_SOP, response_buffer, + sizeof(response_buffer)); + + /* No SVID reported up to the AP because it didn't report any data */ + zassert_equal(discovery->svid_count, 0); +} + +/* Reply without required mode VDO */ +ZTEST_F(usb_pd_discovery, verify_modes_missing) +{ + struct tcpci_partner_data *partner = &fixture->partner; + uint8_t response_buffer[EC_LPC_HOST_PACKET_SIZE]; + struct ec_response_typec_discovery *discovery = + (struct ec_response_typec_discovery *)response_buffer; + + /* Add Discover Identity response */ + partner->identity_vdm[VDO_INDEX_HDR] = + VDO(USB_SID_PD, /* structured VDM */ true, + VDO_CMDT(CMDT_RSP_ACK) | CMD_DISCOVER_IDENT) | + VDO_SVDM_VERS(VDM_VER20); + partner->identity_vdm[VDO_INDEX_IDH] = VDO_IDH( + /* USB host */ false, /* USB device */ true, IDH_PTYPE_HUB, + /* modal operation */ true, USB_VID_GOOGLE); + partner->identity_vdm[VDO_INDEX_CSTAT] = 0; + partner->identity_vdm[VDO_INDEX_PRODUCT] = VDO_PRODUCT(0xBEAD, 0x1001); + /* Hardware version 1, firmware version 2 */ + partner->identity_vdm[VDO_INDEX_PTYPE_UFP1_VDO] = VDO_UFP1( + (VDO_UFP1_CAPABILITY_USB20 | VDO_UFP1_CAPABILITY_USB32), + USB_TYPEC_RECEPTACLE, VDO_UFP1_ALT_MODE_RECONFIGURE, + USB_R30_SS_U32_U40_GEN2); + partner->identity_vdos = VDO_INDEX_PTYPE_UFP1_VDO + 1; + + /* Add Discover SVIDs response for TBT */ + partner->svids_vdm[VDO_INDEX_HDR] = + VDO(USB_SID_PD, /* structured VDM */ true, + VDO_CMDT(CMDT_RSP_ACK) | CMD_DISCOVER_SVID) | + VDO_SVDM_VERS(VDM_VER20); + partner->svids_vdm[VDO_INDEX_HDR + 1] = VDO_SVID(USB_VID_INTEL, 0); + partner->svids_vdos = VDO_INDEX_HDR + 2; + + /* Add Discover Modes ACK with no data */ + partner->modes_vdm[VDO_INDEX_HDR] = + VDO(USB_VID_INTEL, /* structured VDM */ true, + VDO_CMDT(CMDT_RSP_ACK) | CMD_DISCOVER_MODES) | + VDO_SVDM_VERS(VDM_VER20); + partner->modes_vdos = 1; + + connect_sink_to_port(&fixture->partner, fixture->tcpci_emul, + fixture->charger_emul); + + host_cmd_typec_discovery(TEST_PORT, TYPEC_PARTNER_SOP, response_buffer, + sizeof(response_buffer)); + + /* No SVID reported up to the AP because it didn't report any data */ + zassert_equal(discovery->svid_count, 0); +} -- cgit v1.2.1