summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbe Levkoy <alevkoy@chromium.org>2022-10-12 16:59:29 -0600
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-10-14 01:06:56 +0000
commit7b218cd2968de6158e7a5dc0fd2bf85228631ba5 (patch)
tree69031ecc01ed7072daca618fa5f214540e4a7085
parent4909ae0824ab66e7663151aa1f4c5bb9f7210439 (diff)
downloadchrome-ec-7b218cd2968de6158e7a5dc0fd2bf85228631ba5.tar.gz
PD partner emul: Optional VCONN support
In the PD partner emulator, allow users to disable support for sourcing VCONN. Support the VCONN_Swap -> Not_Supported message flow when VCONN is not supported. BUG=b:251485312 TEST=./twister -T test/zephyr BRANCH=none Signed-off-by: Abe Levkoy <alevkoy@chromium.org> Change-Id: I833fb3927fd999bf81dcc0cd0aea3697db1346c0 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3949578 Code-Coverage: Zoss <zoss-cl-coverage@prod.google.com> Reviewed-by: Tomasz Michalec <tmichalec@google.com>
-rw-r--r--zephyr/emul/tcpc/emul_tcpci_partner_common.c13
-rw-r--r--zephyr/include/emul/tcpc/emul_tcpci_partner_common.h23
2 files changed, 35 insertions, 1 deletions
diff --git a/zephyr/emul/tcpc/emul_tcpci_partner_common.c b/zephyr/emul/tcpc/emul_tcpci_partner_common.c
index 0a58799ec9..1785acda51 100644
--- a/zephyr/emul/tcpc/emul_tcpci_partner_common.c
+++ b/zephyr/emul/tcpc/emul_tcpci_partner_common.c
@@ -876,6 +876,12 @@ tcpci_partner_common_vconn_swap_handler(struct tcpci_partner_data *data)
{
tcpci_partner_common_set_ams_ctrl_msg(data, PD_CTRL_VCONN_SWAP);
+ if (!data->vconn_supported) {
+ tcpci_partner_send_control_msg(data, PD_CTRL_NOT_SUPPORTED, 0);
+ tcpci_partner_common_clear_ams_ctrl_msg(data);
+ return TCPCI_PARTNER_COMMON_MSG_HANDLED;
+ }
+
tcpci_partner_send_control_msg(data, PD_CTRL_ACCEPT, 0);
if (data->vconn_role == PD_ROLE_VCONN_OFF) {
@@ -1521,6 +1527,7 @@ void tcpci_partner_init(struct tcpci_partner_data *data, enum pd_rev_type rev)
data->send_goodcrc = true;
data->rev = rev;
+ data->vconn_supported = true;
data->ops.transmit = tcpci_partner_transmit_op;
data->ops.rx_consumed = tcpci_partner_rx_consumed_op;
@@ -1536,3 +1543,9 @@ void tcpci_partner_init(struct tcpci_partner_data *data, enum pd_rev_type rev)
data->cable = NULL;
}
+
+void tcpci_partner_set_vconn_support(struct tcpci_partner_data *data,
+ bool vconn_supported)
+{
+ data->vconn_supported = vconn_supported;
+}
diff --git a/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h b/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h
index fb715a47dc..f232724ece 100644
--- a/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h
+++ b/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h
@@ -75,10 +75,15 @@ struct tcpci_partner_data {
enum pd_power_role power_role;
/** Data role (used in message header) */
enum pd_data_role data_role;
- /** VConn role (used in message header) */
+ /** VCONN role */
enum pd_vconn_role vconn_role;
/** Revision (used in message header) */
enum pd_rev_type rev;
+ /**
+ * Whether this partner can supply VCONN. If false, the partner will
+ * respond to VCONN_Swap with Not_Supported.
+ */
+ bool vconn_supported;
/** Resistor set at the CC1 line of partner emulator */
enum tcpc_cc_voltage_status cc1;
/** Resistor set at the CC2 line of partner emulator */
@@ -340,6 +345,22 @@ struct tcpci_partner_extension_ops {
void tcpci_partner_init(struct tcpci_partner_data *data, enum pd_rev_type rev);
/**
+ * @brief Set the partner emulator to support or not support sourcing VCONN. If
+ * the partner supports VCONN, it should respond to VCONN Swap with Accept,
+ * Reject, or Wait. If it does not support VCONN, it should respond with
+ * Not_Supported.
+ *
+ * A compliant partner should not change this while attached. However, there are
+ * real devices that pretend to stop supporting VCONN after completing a VCONN
+ * Swap.
+ *
+ * @param data Pointer to USB-C partner emulator
+ * @param vconn_support true to support sourcing VCONN, false to not support it.
+ */
+void tcpci_partner_set_vconn_support(struct tcpci_partner_data *data,
+ bool support_vconn);
+
+/**
* @brief Free message's memory
*
* @param msg Pointer to message