summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbe Levkoy <alevkoy@chromium.org>2023-03-13 14:44:23 -0600
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2023-03-15 16:07:29 +0000
commit3efa30fa07272980f85be0caa711d2fbfeeca287 (patch)
treee5ae24590949abee4e1c4edb7623e31805157471
parent8fd62bab5711a126e50559e3133e053c0130e764 (diff)
downloadchrome-ec-3efa30fa07272980f85be0caa711d2fbfeeca287.tar.gz
partner emul: Optionally reject DR_Swap
Support runtime configuration of the partner emulator to Reject a Data Role Swap based on the new role of the partner emulator. BUG=b:271613370 TEST=twister -s drivers/drivers.usbc_alt_mode BRANCH=none Change-Id: I47a6b99d334d083ad0d9e40b211507a4e21248b3 Signed-off-by: Abe Levkoy <alevkoy@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4334627 Reviewed-by: Diana Z <dzigterman@chromium.org>
-rw-r--r--zephyr/emul/tcpc/emul_tcpci_partner_common.c21
-rw-r--r--zephyr/include/emul/tcpc/emul_tcpci_partner_common.h20
2 files changed, 39 insertions, 2 deletions
diff --git a/zephyr/emul/tcpc/emul_tcpci_partner_common.c b/zephyr/emul/tcpc/emul_tcpci_partner_common.c
index 7a1670fe0e..e7be6250b6 100644
--- a/zephyr/emul/tcpc/emul_tcpci_partner_common.c
+++ b/zephyr/emul/tcpc/emul_tcpci_partner_common.c
@@ -5,6 +5,7 @@
#include "common.h"
#include "driver/tcpm/tcpci.h"
+#include "ec_commands.h"
#include "emul/tcpc/emul_tcpci.h"
#include "emul/tcpc/emul_tcpci_partner_common.h"
#include "usb_pd.h"
@@ -957,8 +958,14 @@ void tcpci_partner_common_swap_data_role(struct tcpci_partner_data *data)
static enum tcpci_partner_handler_res
tcpci_partner_common_dr_swap_handler(struct tcpci_partner_data *data)
{
- tcpci_partner_send_control_msg(data, PD_CTRL_ACCEPT, 0);
- tcpci_partner_common_swap_data_role(data);
+ enum pd_ctrl_msg_type response = PD_CTRL_REJECT;
+
+ if ((data->data_role == PD_ROLE_DFP && data->drs_to_ufp_supported) ||
+ (data->data_role == PD_ROLE_UFP && data->drs_to_dfp_supported))
+ response = PD_CTRL_ACCEPT;
+ tcpci_partner_send_control_msg(data, response, 0);
+ if (response == PD_CTRL_ACCEPT)
+ tcpci_partner_common_swap_data_role(data);
return TCPCI_PARTNER_COMMON_MSG_HANDLED;
}
@@ -1642,6 +1649,8 @@ void tcpci_partner_init(struct tcpci_partner_data *data, enum pd_rev_type rev)
data->send_goodcrc = true;
data->rev = rev;
+ data->drs_to_dfp_supported = true;
+ data->drs_to_ufp_supported = true;
data->vconn_supported = true;
data->ops.transmit = tcpci_partner_transmit_op;
@@ -1659,6 +1668,14 @@ void tcpci_partner_init(struct tcpci_partner_data *data, enum pd_rev_type rev)
data->cable = NULL;
}
+void tcpci_partner_set_drs_support(struct tcpci_partner_data *data,
+ bool drs_to_ufp_supported,
+ bool drs_to_dfp_supported)
+{
+ data->drs_to_ufp_supported = drs_to_ufp_supported;
+ data->drs_to_dfp_supported = drs_to_dfp_supported;
+}
+
void tcpci_partner_set_vconn_support(struct tcpci_partner_data *data,
bool 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 91e7d057f5..7a8c69076b 100644
--- a/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h
+++ b/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h
@@ -76,6 +76,14 @@ struct tcpci_partner_data {
enum pd_power_role power_role;
/** Data role (used in message header) */
enum pd_data_role data_role;
+ /** Whether this partner will Accept a Data Role Swap that would switch
+ * the partner from DFP to UFP.
+ */
+ bool drs_to_ufp_supported;
+ /** Whether this partner will Accept a Data Role Swap that would switch
+ * the partner from UFP to DFP.
+ */
+ bool drs_to_dfp_supported;
/** VCONN role */
enum pd_vconn_role vconn_role;
/** Revision (used in message header) */
@@ -356,6 +364,18 @@ 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 swapping data roles
+ * to UFP and DFP. If the partner supports a swap, it should respond to DR_Swap
+ * with Accept with that role as the new data role.
+ *
+ * @param data Pointer to USB-C partner emulator
+ * @param drs_to_ufp_supported Whether the partner supports swapping to UFP
+ * @param drs_to_dfp_supported Whether the partner supports swapping to DFP
+ */
+void tcpci_partner_set_drs_support(struct tcpci_partner_data *data,
+ bool drs_to_ufp_supported,
+ bool drs_to_dfp_supported);
+/**
* @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