summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorAbe Levkoy <alevkoy@chromium.org>2020-09-16 12:48:00 -0600
committerCommit Bot <commit-bot@chromium.org>2020-09-21 22:03:09 +0000
commit0ae00b445eafae62141e65576f39a91f0683f4bd (patch)
tree425eae1a68237707dafb30d3f841d8bb27e8daaf /common
parentcb4a02d5e0358631242ada9178bbc6d5b8367340 (diff)
downloadchrome-ec-0ae00b445eafae62141e65576f39a91f0683f4bd.tar.gz
TCPMv2: Define typeccontrol host command
For now, just support exiting the entered mode, if that mode happens to be DisplayPort (getting TBT3 and USB4 to work correctly will require some more work). Support this command in ectool. BUG=b:168030639 TEST=ectool typeccontrol 0 1; observe DP Exit Mode exchange in PD trace BRANCH=none Signed-off-by: Abe Levkoy <alevkoy@chromium.org> Change-Id: Ib30479cc88696115060e9ff74f6815ce074e6bf5 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2415069 Reviewed-by: Diana Z <dzigterman@chromium.org>
Diffstat (limited to 'common')
-rw-r--r--common/mock/usb_pd_dpm_mock.c8
-rw-r--r--common/usbc/usb_pd_dpm.c5
-rw-r--r--common/usbc/usb_pd_host.c20
-rw-r--r--common/usbc/usb_pe_drp_sm.c4
4 files changed, 37 insertions, 0 deletions
diff --git a/common/mock/usb_pd_dpm_mock.c b/common/mock/usb_pd_dpm_mock.c
index 18778c36f4..344d53576d 100644
--- a/common/mock/usb_pd_dpm_mock.c
+++ b/common/mock/usb_pd_dpm_mock.c
@@ -36,6 +36,14 @@ void dpm_vdm_naked(int port, enum tcpm_transmit_type type, uint16_t svid,
{
}
+void dpm_set_mode_entry_done(int port)
+{
+}
+
+void dpm_set_mode_exit_request(int port)
+{
+}
+
void dpm_run(int port)
{
}
diff --git a/common/usbc/usb_pd_dpm.c b/common/usbc/usb_pd_dpm.c
index d1a26ee54b..e9c7782512 100644
--- a/common/usbc/usb_pd_dpm.c
+++ b/common/usbc/usb_pd_dpm.c
@@ -174,6 +174,7 @@ static void dpm_attempt_mode_exit(int port)
uint16_t svid;
uint32_t vdm;
+ /* TODO(b/156749387): Support Data Reset for exiting USB4. */
if (IS_ENABLED(CONFIG_USB_PD_TBT_COMPAT_MODE) &&
tbt_is_active(port))
svid = USB_VID_INTEL;
@@ -185,6 +186,10 @@ static void dpm_attempt_mode_exit(int port)
return;
}
+ /*
+ * TODO(b/148528713): Support cable plug Exit Mode (probably outsource
+ * VDM construction to alt mode modules).
+ */
opos = pd_alt_mode(port, TCPC_TX_SOP, svid);
if (opos > 0 && pd_dfp_exit_mode(port, TCPC_TX_SOP, svid, opos)) {
/*
diff --git a/common/usbc/usb_pd_host.c b/common/usbc/usb_pd_host.c
index a5e4c52baa..8fdd8a2748 100644
--- a/common/usbc/usb_pd_host.c
+++ b/common/usbc/usb_pd_host.c
@@ -94,3 +94,23 @@ static enum ec_status hc_typec_discovery(struct host_cmd_handler_args *args)
DECLARE_HOST_COMMAND(EC_CMD_TYPEC_DISCOVERY,
hc_typec_discovery,
EC_VER_MASK(0));
+
+static enum ec_status hc_typec_control(struct host_cmd_handler_args *args)
+{
+ const struct ec_params_typec_control *p = args->params;
+
+ if (p->port >= board_get_usb_pd_port_count())
+ return EC_RES_INVALID_PARAM;
+
+ switch (p->command) {
+ case TYPEC_CONTROL_COMMAND_EXIT_MODES:
+ pd_dpm_request(p->port, DPM_REQUEST_EXIT_MODES);
+ break;
+ default:
+ return EC_RES_INVALID_PARAM;
+ }
+
+
+ return EC_RES_SUCCESS;
+}
+DECLARE_HOST_COMMAND(EC_CMD_TYPEC_CONTROL, hc_typec_control, EC_VER_MASK(0));
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c
index a238d522bf..a7a3774838 100644
--- a/common/usbc/usb_pe_drp_sm.c
+++ b/common/usbc/usb_pe_drp_sm.c
@@ -1309,6 +1309,10 @@ static bool common_src_snk_dpm_requests(int port)
pe_set_dpm_curr_request(port, DPM_REQUEST_ENTER_USB);
set_state_pe(port, PE_DEU_SEND_ENTER_USB);
return true;
+ } else if (PE_CHK_DPM_REQUEST(port, DPM_REQUEST_EXIT_MODES)) {
+ pe_set_dpm_curr_request(port, DPM_REQUEST_EXIT_MODES);
+ dpm_set_mode_exit_request(port);
+ return true;
}
return false;
}