summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiana Z <dzigterman@chromium.org>2023-03-10 10:57:13 -0700
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2023-03-14 20:32:04 +0000
commit6f87ad821fc33f82ae874bba17728fb6aef315e1 (patch)
tree9c641eb969a194768e1ece1a63db63801755e9c2
parent9871e7919969e97a6a28856043d8608b16febb0c (diff)
downloadchrome-ec-6f87ad821fc33f82ae874bba17728fb6aef315e1.tar.gz
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 <dzigterman@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4329094 Reviewed-by: Tomasz Michalec <tmichalec@google.com>
-rw-r--r--zephyr/test/drivers/CMakeLists.txt1
-rw-r--r--zephyr/test/drivers/Kconfig3
-rw-r--r--zephyr/test/drivers/testcase.yaml3
-rw-r--r--zephyr/test/drivers/usb_pd_discovery/CMakeLists.txt15
-rw-r--r--zephyr/test/drivers/usb_pd_discovery/src/usb_pd_discovery.c397
5 files changed, 419 insertions, 0 deletions
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 <stdint.h>
+
+#include <zephyr/kernel.h>
+#include <zephyr/sys/byteorder.h>
+#include <zephyr/ztest.h>
+
+#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);
+}