diff options
Diffstat (limited to 'zephyr/emul/tcpc/emul_tcpci_partner_common.c')
-rw-r--r-- | zephyr/emul/tcpc/emul_tcpci_partner_common.c | 140 |
1 files changed, 13 insertions, 127 deletions
diff --git a/zephyr/emul/tcpc/emul_tcpci_partner_common.c b/zephyr/emul/tcpc/emul_tcpci_partner_common.c index 0473f967dc..22a9ddb91e 100644 --- a/zephyr/emul/tcpc/emul_tcpci_partner_common.c +++ b/zephyr/emul/tcpc/emul_tcpci_partner_common.c @@ -3,21 +3,19 @@ * found in the LICENSE file. */ -#include "common.h" -#include "driver/tcpm/tcpci.h" -#include "emul/tcpc/emul_tcpci.h" -#include "emul/tcpc/emul_tcpci_partner_common.h" -#include "usb_pd.h" -#include "util.h" +#include <zephyr/logging/log.h> +LOG_MODULE_REGISTER(tcpci_partner, CONFIG_TCPCI_EMUL_LOG_LEVEL); #include <stdlib.h> - -#include <zephyr/kernel.h> -#include <zephyr/logging/log.h> #include <zephyr/sys/byteorder.h> +#include <zephyr/kernel.h> #include <zephyr/ztest.h> -LOG_MODULE_REGISTER(tcpci_partner, CONFIG_TCPCI_EMUL_LOG_LEVEL); +#include "common.h" +#include "emul/tcpc/emul_tcpci_partner_common.h" +#include "emul/tcpc/emul_tcpci.h" +#include "usb_pd.h" +#include "util.h" /** Length of PDO, RDO and BIST request object in SOP message in bytes */ #define TCPCI_MSG_DO_LEN 4 @@ -406,21 +404,11 @@ int tcpci_partner_send_control_msg(struct tcpci_partner_data *data, msg->type = type; - switch (msg->type) { - case PD_CTRL_DR_SWAP: - case PD_CTRL_VCONN_SWAP: - /* For supported message types, remember the control request - * initiated, so the partner can handle the responses. - * (Eventually, all messages that can start an AMS should be - * supported.) + if (msg->type == PD_CTRL_DR_SWAP) { + /* Remember the control request initiated, so we can + * handle the responses */ tcpci_partner_common_set_ams_ctrl_msg(data, msg->type); - break; - default: - /* For messages that do not start an AMS, there is nothing to - * record. - */ - break; } return tcpci_partner_send_msg(data, msg, delay); @@ -759,27 +747,6 @@ tcpci_partner_common_vdm_handler(struct tcpci_partner_data *data, } static enum tcpci_partner_handler_res -tcpci_partner_enter_usb_handler(struct tcpci_partner_data *data, - const struct tcpci_emul_msg *message) -{ - /* - * Validate received Enter_USB message against EUDO contents in - * tcpci_partner_data. - * - * TODO(b/260095516): This support needs to be expanded to validate the - * message contents, in a bit field basis. Currently, using this field - * as simple ACCEPT/REJECT criteria. If this value is 0 (default case), - * then ACCEPT this message, else reject it. - */ - if (data->enter_usb_accept) - tcpci_partner_send_control_msg(data, PD_CTRL_ACCEPT, 0); - else - tcpci_partner_send_control_msg(data, PD_CTRL_REJECT, 0); - - return TCPCI_PARTNER_COMMON_MSG_HANDLED; -} - -static enum tcpci_partner_handler_res tcpci_partner_common_cable_handler(struct tcpci_partner_data *data, const struct tcpci_emul_msg *message, enum tcpci_msg_type sop_type) @@ -974,26 +941,6 @@ tcpci_partner_common_accept_dr_swap_handler(struct tcpci_partner_data *data) } static enum tcpci_partner_handler_res -tcpci_partner_common_accept_vconn_swap_handler(struct tcpci_partner_data *data) -{ - if (data->vconn_role == PD_ROLE_VCONN_SRC) { - /* TODO: Wait for PS_RDY. */ - } else { - /* VCONN Swap from off to VCONN Source means the partner sends - * the first PS_RDY after turning on VCONN. - */ - tcpci_partner_common_set_vconn(data, PD_ROLE_VCONN_ON); - tcpci_partner_send_control_msg(data, PD_CTRL_PS_RDY, 15); - tcpci_partner_common_clear_ams_ctrl_msg(data); - /* Strictly speaking, the AMS isn't over until the partner - * receives GoodCRC for the PS_RDY. - */ - } - - return TCPCI_PARTNER_COMMON_MSG_HANDLED; -} - -static enum tcpci_partner_handler_res tcpi_drp_emul_ps_rdy_handler(struct tcpci_partner_data *data) { switch (data->cur_ams_ctrl_req) { @@ -1011,25 +958,8 @@ static enum tcpci_partner_handler_res tcpi_partner_common_handle_accept(struct tcpci_partner_data *data) { switch (data->cur_ams_ctrl_req) { - case PD_CTRL_VCONN_SWAP: - data->cur_ams_ctrl_req = PD_CTRL_INVALID; - return TCPCI_PARTNER_COMMON_MSG_HANDLED; - - default: - LOG_ERR("Unhandled current_req=%u in ACCEPT", - data->cur_ams_ctrl_req); - return TCPCI_PARTNER_COMMON_MSG_NOT_HANDLED; - } -} - -static enum tcpci_partner_handler_res -tcpci_partner_common_handle_reject(struct tcpci_partner_data *data) -{ - switch (data->cur_ams_ctrl_req) { case PD_CTRL_DR_SWAP: return tcpci_partner_common_accept_dr_swap_handler(data); - case PD_CTRL_VCONN_SWAP: - return tcpci_partner_common_accept_vconn_swap_handler(data); default: LOG_ERR("Unhandled current_req=%u in ACCEPT", @@ -1102,8 +1032,6 @@ tcpci_partner_common_sop_msg_handler(struct tcpci_partner_data *data, switch (PD_HEADER_TYPE(header)) { case PD_DATA_VENDOR_DEF: return tcpci_partner_common_vdm_handler(data, tx_msg); - case PD_DATA_ENTER_USB: - return tcpci_partner_enter_usb_handler(data, tx_msg); default: /* No other common handlers for data messages */ return TCPCI_PARTNER_COMMON_MSG_NOT_HANDLED; @@ -1144,10 +1072,6 @@ tcpci_partner_common_sop_msg_handler(struct tcpci_partner_data *data, tcpci_partner_common_send_hard_reset(data); return TCPCI_PARTNER_COMMON_MSG_HARD_RESET; - } else if (data->cur_ams_ctrl_req != PD_CTRL_INVALID) { - if (tcpci_partner_common_handle_reject(data) == - TCPCI_PARTNER_COMMON_MSG_HANDLED) - return TCPCI_PARTNER_COMMON_MSG_HANDLED; } tcpci_partner_common_clear_ams_ctrl_msg(data); @@ -1183,18 +1107,6 @@ tcpci_partner_common_sop_msg_handler(struct tcpci_partner_data *data, tcpci_partner_common_send_soft_reset(data); return TCPCI_PARTNER_COMMON_MSG_HANDLED; - case PD_CTRL_DATA_RESET: - /* - * Send Accept/Reject message - * TODO(b/260095516): To fully exercise this code path, there - * needs to be a mechanism (trigger) to either accept or reject - * this message. - */ - tcpci_partner_send_control_msg(data, PD_CTRL_ACCEPT, 0); - return TCPCI_PARTNER_COMMON_MSG_HANDLED; - case PD_CTRL_DATA_RESET_COMPLETE: - /* There is no expected reply message from the port parter */ - return TCPCI_PARTNER_COMMON_MSG_HANDLED; } return TCPCI_PARTNER_COMMON_MSG_NOT_HANDLED; @@ -1229,16 +1141,6 @@ void tcpci_partner_set_discovery_info(struct tcpci_partner_data *data, memcpy(data->modes_vdm, modes_vdm, modes_vdos * sizeof(*modes_vdm)); } -static void tcpci_partner_common_control_change(struct tcpci_partner_data *data) -{ - const struct emul *tcpci_emul = data->tcpci_emul; - uint16_t role_control; - - tcpci_emul_get_reg(tcpci_emul, TCPC_REG_ROLE_CTRL, &role_control); - data->tcpm_cc1 = TCPC_REG_ROLE_CTRL_CC1(role_control); - data->tcpm_cc1 = TCPC_REG_ROLE_CTRL_CC2(role_control); -} - void tcpci_partner_common_disconnect(struct tcpci_partner_data *data) { tcpci_partner_clear_msg_queue(data); @@ -1414,6 +1316,7 @@ void tcpci_partner_received_msg_status(struct tcpci_partner_data *data, if (data->received_msg_status == NULL) { return; } + /* * Status of each received message should be reported to TCPCI emulator * only once @@ -1537,22 +1440,6 @@ tcpci_partner_rx_consumed_op(const struct emul *emul, tcpci_partner_free_msg(msg); } -static void -tcpci_partner_control_change_op(const struct emul *emul, - const struct tcpci_emul_partner_ops *ops) -{ - struct tcpci_partner_data *data = - CONTAINER_OF(ops, struct tcpci_partner_data, ops); - struct tcpci_partner_extension *ext; - - tcpci_partner_common_control_change(data); - for (ext = data->extensions; ext != NULL; ext = ext->next) { - if (ext->ops->control_change) { - ext->ops->control_change(ext, data); - } - } -} - /** * @brief Function called when emulator is disconnected from TCPCI * @@ -1634,7 +1521,6 @@ void tcpci_partner_init(struct tcpci_partner_data *data, enum pd_rev_type rev) data->identity_vdos = 0; data->svids_vdos = 0; data->modes_vdos = 0; - data->enter_usb_accept = false; tcpci_partner_common_clear_ams_ctrl_msg(data); @@ -1645,7 +1531,7 @@ void tcpci_partner_init(struct tcpci_partner_data *data, enum pd_rev_type rev) data->ops.transmit = tcpci_partner_transmit_op; data->ops.rx_consumed = tcpci_partner_rx_consumed_op; - data->ops.control_change = tcpci_partner_control_change_op; + data->ops.control_change = NULL; data->ops.disconnect = tcpci_partner_disconnect_op; data->displayport_configured = false; data->entered_svid = 0; |