diff options
author | Abe Levkoy <alevkoy@chromium.org> | 2023-03-13 14:44:23 -0600 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2023-03-15 16:07:29 +0000 |
commit | 3efa30fa07272980f85be0caa711d2fbfeeca287 (patch) | |
tree | e5ae24590949abee4e1c4edb7623e31805157471 | |
parent | 8fd62bab5711a126e50559e3133e053c0130e764 (diff) | |
download | chrome-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.c | 21 | ||||
-rw-r--r-- | zephyr/include/emul/tcpc/emul_tcpci_partner_common.h | 20 |
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 |