summaryrefslogtreecommitdiff
path: root/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode.c
diff options
context:
space:
mode:
Diffstat (limited to 'zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode.c')
-rw-r--r--zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode.c129
1 files changed, 120 insertions, 9 deletions
diff --git a/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode.c b/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode.c
index 43ccc3b3f3..c6387aae64 100644
--- a/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode.c
+++ b/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode.c
@@ -3,11 +3,6 @@
* found in the LICENSE file.
*/
-#include <stdint.h>
-#include <zephyr/kernel.h>
-#include <zephyr/ztest.h>
-#include <zephyr/drivers/gpio/gpio_emul.h>
-
#include "ec_commands.h"
#include "ec_tasks.h"
#include "emul/emul_isl923x.h"
@@ -16,12 +11,18 @@
#include "emul/tcpc/emul_tcpci_partner_common.h"
#include "emul/tcpc/emul_tcpci_partner_snk.h"
#include "host_command.h"
-#include "test/drivers/stubs.h"
#include "tcpm/tcpci.h"
-#include "test/drivers/utils.h"
+#include "test/drivers/stubs.h"
#include "test/drivers/test_state.h"
+#include "test/drivers/utils.h"
#include "test_usbc_alt_mode.h"
+#include <stdint.h>
+
+#include <zephyr/drivers/gpio/gpio_emul.h>
+#include <zephyr/kernel.h>
+#include <zephyr/ztest.h>
+
#define TEST_PORT 0
/* Arbitrary */
@@ -41,7 +42,7 @@ static void connect_partner_to_port(const struct emul *tcpc_emul,
* function.
*/
set_ac_enabled(true);
- zassume_ok(tcpci_partner_connect_to_tcpci(partner_emul, tcpc_emul),
+ zassert_ok(tcpci_partner_connect_to_tcpci(partner_emul, tcpc_emul),
NULL);
isl923x_emul_set_adc_vbus(charger_emul,
@@ -54,7 +55,7 @@ static void connect_partner_to_port(const struct emul *tcpc_emul,
static void disconnect_partner_from_port(const struct emul *tcpc_emul,
const struct emul *charger_emul)
{
- zassume_ok(tcpci_emul_disconnect_partner(tcpc_emul));
+ zassert_ok(tcpci_emul_disconnect_partner(tcpc_emul));
isl923x_emul_set_adc_vbus(charger_emul, 0);
k_sleep(K_SECONDS(1));
}
@@ -129,6 +130,40 @@ static void add_displayport_mode_responses(struct tcpci_partner_data *partner)
partner->dp_config_vdos = VDO_INDEX_HDR + 1;
}
+static void add_displayport_mode_responses__minus_configure_responses(
+ struct tcpci_partner_data *partner)
+{
+ /*
+ * This is the same function as add_displayport_mode_responses() but
+ * does not include the configure response so as to induce a failure to
+ * enter dp alt mode
+ */
+
+ /* Add DisplayPort EnterMode response */
+ partner->enter_mode_vdm[VDO_INDEX_HDR] =
+ VDO(USB_SID_DISPLAYPORT, /* structured VDM */ true,
+ VDO_CMDT(CMDT_RSP_ACK) | CMD_ENTER_MODE);
+ partner->enter_mode_vdos = VDO_INDEX_HDR + 1;
+
+ /* Add DisplayPort StatusUpdate response */
+ partner->dp_status_vdm[VDO_INDEX_HDR] =
+ VDO(USB_SID_DISPLAYPORT, /* structured VDM */ true,
+ VDO_CMDT(CMDT_RSP_ACK) | CMD_DP_STATUS);
+ partner->dp_status_vdm[VDO_INDEX_HDR + 1] =
+ /* Mainly copied from hoho */
+ VDO_DP_STATUS(0, /* IRQ_HPD */
+ false, /* HPD_HI|LOW - Changed*/
+ 0, /* request exit DP */
+ 0, /* request exit USB */
+ 0, /* MF pref */
+ true, /* DP Enabled */
+ 0, /* power low e.g. normal */
+ 0x2 /* Connected as Sink */);
+ partner->dp_status_vdos = VDO_INDEX_HDR + 2;
+
+ /* NO DisplayPort Configure Response */
+}
+
static void *usbc_alt_mode_setup(void)
{
static struct usbc_alt_mode_fixture fixture;
@@ -394,3 +429,79 @@ ZTEST_SUITE(usbc_alt_mode_dp_unsupported, drivers_predicate_post_main,
usbc_alt_mode_dp_unsupported_setup,
usbc_alt_mode_dp_unsupported_before,
usbc_alt_mode_dp_unsupported_after, NULL);
+
+static void *usbc_alt_mode_minus_dp_configure_setup(void)
+{
+ static struct usbc_alt_mode_minus_dp_configure_fixture fixture;
+ struct tcpci_partner_data *partner = &fixture.partner;
+ struct tcpci_src_emul_data *src_ext = &fixture.src_ext;
+
+ tcpci_partner_init(partner, PD_REV20);
+ partner->extensions = tcpci_src_emul_init(src_ext, partner, NULL);
+
+ /* Get references for the emulators */
+ fixture.tcpci_emul = EMUL_GET_USBC_BINDING(TEST_PORT, tcpc);
+ fixture.charger_emul = EMUL_GET_USBC_BINDING(TEST_PORT, chg);
+
+ add_discovery_responses(partner);
+ add_displayport_mode_responses__minus_configure_responses(partner);
+
+ return &fixture;
+}
+
+static void usbc_alt_mode_minus_dp_configure_before(void *data)
+{
+ /* Set chipset to ON, this will set TCPM to DRP */
+ test_set_chipset_to_s0();
+
+ /* TODO(b/214401892): Check why need to give time TCPM to spin */
+ k_sleep(K_SECONDS(1));
+
+ struct usbc_alt_mode_minus_dp_configure_fixture *fixture = data;
+
+ connect_partner_to_port(fixture->tcpci_emul, fixture->charger_emul,
+ &fixture->partner, &fixture->src_ext);
+}
+
+static void usbc_alt_mode_minus_dp_configure_after(void *data)
+{
+ struct usbc_alt_mode_fixture *fixture = data;
+
+ disconnect_partner_from_port(fixture->tcpci_emul,
+ fixture->charger_emul);
+}
+
+ZTEST_F(usbc_alt_mode_minus_dp_configure, test_dp_mode_entry_minus_config)
+{
+ if (IS_ENABLED(CONFIG_PLATFORM_EC_USB_PD_REQUIRE_AP_MODE_ENTRY)) {
+ host_cmd_typec_control_enter_mode(TEST_PORT, TYPEC_MODE_DP);
+ k_sleep(K_SECONDS(1));
+ }
+
+ /* Verify host command when VDOs are present. */
+ struct ec_response_typec_status status;
+ struct ec_params_usb_pd_get_mode_response response;
+ int response_size;
+
+ host_cmd_usb_pd_get_amode(TEST_PORT, 0, &response, &response_size);
+
+ /* Response should be populated with a DisplayPort VDO */
+ zassert_equal(response_size, sizeof(response));
+ zassert_equal(response.svid, USB_SID_DISPLAYPORT);
+ zassert_equal(response.vdo[0],
+ fixture->partner.modes_vdm[response.opos], NULL);
+
+ /* DPM configures the partner on DP mode entry */
+ /* Verify port partner thinks it's *NOT* configured for DisplayPort */
+ zassert_false(fixture->partner.displayport_configured);
+ /* Also verify DP config is missing from mux */
+ status = host_cmd_typec_status(TEST_PORT);
+ zassert_not_equal((status.mux_state & USB_PD_MUX_DP_ENABLED),
+ USB_PD_MUX_DP_ENABLED,
+ "Failed to *NOT* see DP set in mux");
+}
+
+ZTEST_SUITE(usbc_alt_mode_minus_dp_configure, drivers_predicate_post_main,
+ usbc_alt_mode_minus_dp_configure_setup,
+ usbc_alt_mode_minus_dp_configure_before,
+ usbc_alt_mode_minus_dp_configure_after, NULL);