summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbe Levkoy <alevkoy@chromium.org>2022-11-21 13:47:05 -0700
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-11-22 21:56:01 +0000
commit34be701febda42a32d9c98a21f008fbb292fd885 (patch)
tree5183bc02dbde6ab526a2046e7b21e832c0f64f42
parent6a96283c3b07e0718588fe8742805f647f81b772 (diff)
downloadchrome-ec-34be701febda42a32d9c98a21f008fbb292fd885.tar.gz
zephyr emul: TCPC partner: Expose CC to extensions
Implement a callback in the TCPC partner common code for changes to control registers in the TCPCI TCPC emulator. Specifically, when the TCPC changes ROLE_CONTROL, record the new CC "voltages" exposed by the TCPC emulator in the partner emulator. Then call any partner extension callbacks for control changes. This change does not cause the partner to react to other changes to TCPCI control registers. BUG=b:257341564 TEST=twister -s zephyr/test/drivers/drivers.usbc_ctvpd BRANCH=none LOW_COVERAGE_REASON=This is an emulator. Later tests will use it. Signed-off-by: Abe Levkoy <alevkoy@chromium.org> Change-Id: Id27a156ed5db6d805c439a33a157ae13706d541a Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4043735 Reviewed-by: Tomasz Michalec <tmichalec@google.com> Code-Coverage: Zoss <zoss-cl-coverage@prod.google.com>
-rw-r--r--zephyr/emul/tcpc/emul_tcpci_partner_common.c29
-rw-r--r--zephyr/include/emul/tcpc/emul_tcpci_partner_common.h6
2 files changed, 34 insertions, 1 deletions
diff --git a/zephyr/emul/tcpc/emul_tcpci_partner_common.c b/zephyr/emul/tcpc/emul_tcpci_partner_common.c
index abc46ef0a2..cb12d37b63 100644
--- a/zephyr/emul/tcpc/emul_tcpci_partner_common.c
+++ b/zephyr/emul/tcpc/emul_tcpci_partner_common.c
@@ -4,6 +4,7 @@
*/
#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"
@@ -1193,6 +1194,16 @@ 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);
@@ -1491,6 +1502,22 @@ 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
*
@@ -1582,7 +1609,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 = NULL;
+ data->ops.control_change = tcpci_partner_control_change_op;
data->ops.disconnect = tcpci_partner_disconnect_op;
data->displayport_configured = false;
data->entered_svid = 0;
diff --git a/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h b/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h
index 36071bc7d3..d0d0a2d183 100644
--- a/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h
+++ b/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h
@@ -148,6 +148,9 @@ struct tcpci_partner_data {
/* SVID of entered mode (0 if no mode is entered) */
uint16_t entered_svid;
+ enum tcpc_cc_voltage_status tcpm_cc1;
+ enum tcpc_cc_voltage_status tcpm_cc2;
+
/* VDMs with which the partner responds to discovery REQs. The VDM
* buffers include the VDM header, and the VDO counts include 1 for the
* VDM header. This structure has space for the mode response for a
@@ -312,6 +315,9 @@ struct tcpci_partner_extension_ops {
void (*soft_reset)(struct tcpci_partner_extension *ext,
struct tcpci_partner_data *common_data);
+ void (*control_change)(struct tcpci_partner_extension *ext,
+ struct tcpci_partner_data *common_data);
+
/**
* @brief Function called when partner emulator is disconnected from
* TCPM