summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiana Z <dzigterman@chromium.org>2022-06-02 09:27:00 -0600
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-06-02 22:48:30 +0000
commit48f6e378bec40a4550490367cc6ed9eb1aea9cc5 (patch)
treed99f62442a3f49fdfb5c8215f18b312f745a2c10
parent1934bd11883fe7acc87b8920ba8ed00d5599a046 (diff)
downloadchrome-ec-48f6e378bec40a4550490367cc6ed9eb1aea9cc5.tar.gz
TCPMv2: Add a host command to allow the AP to set muxes
Add a sub-command onto the TYPEC_CONTROL command in order to permit the AP to set muxes and retimers. BRANCH=None BUG=b:208882941,b:155889939 TEST=on nipperkin, ensure muxes can be changed from ectool Signed-off-by: Diana Z <dzigterman@chromium.org> Change-Id: I08ed46474693ec09b1db155b469b83d4acec8fbb Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3687079 Commit-Queue: Abe Levkoy <alevkoy@chromium.org> Reviewed-by: Abe Levkoy <alevkoy@chromium.org>
-rw-r--r--common/usbc/usb_pd_host.c9
-rw-r--r--include/ec_commands.h8
-rw-r--r--util/ectool.c39
3 files changed, 55 insertions, 1 deletions
diff --git a/common/usbc/usb_pd_host.c b/common/usbc/usb_pd_host.c
index d254e9827b..d6bd61057f 100644
--- a/common/usbc/usb_pd_host.c
+++ b/common/usbc/usb_pd_host.c
@@ -126,6 +126,15 @@ static enum ec_status hc_typec_control(struct host_cmd_handler_args *args)
return pd_request_enter_mode(p->port, p->mode_to_enter);
case TYPEC_CONTROL_COMMAND_TBT_UFP_REPLY:
return board_set_tbt_ufp_reply(p->port, p->tbt_ufp_reply);
+ case TYPEC_CONTROL_COMMAND_USB_MUX_SET:
+ if (!IS_ENABLED(CONFIG_USB_MUX_AP_CONTROL))
+ return EC_RES_INVALID_PARAM;
+ /* TODO: Check if AP wants to set usb mode or polarity */
+ usb_mux_set_single(p->port, p->mux_params.mux_index,
+ p->mux_params.mux_flags,
+ USB_SWITCH_CONNECT,
+ polarity_rm_dts(pd_get_polarity(p->port)));
+ return EC_RES_SUCCESS;
default:
return EC_RES_INVALID_PARAM;
}
diff --git a/include/ec_commands.h b/include/ec_commands.h
index f43ad24e06..d52c08fb75 100644
--- a/include/ec_commands.h
+++ b/include/ec_commands.h
@@ -6687,6 +6687,7 @@ enum typec_control_command {
TYPEC_CONTROL_COMMAND_CLEAR_EVENTS,
TYPEC_CONTROL_COMMAND_ENTER_MODE,
TYPEC_CONTROL_COMMAND_TBT_UFP_REPLY,
+ TYPEC_CONTROL_COMMAND_USB_MUX_SET,
};
/* Modes (USB or alternate) that a type-C port may enter. */
@@ -6702,6 +6703,11 @@ enum typec_tbt_ufp_reply {
TYPEC_TBT_UFP_REPLY_ACK,
};
+struct typec_usb_mux_set {
+ uint8_t mux_index; /* Index of the mux to set in the chain */
+ uint8_t mux_flags; /* USB_PD_MUX_*-encoded USB mux state to set */
+} __ec_align1;
+
struct ec_params_typec_control {
uint8_t port;
uint8_t command; /* enum typec_control_command */
@@ -6719,6 +6725,8 @@ struct ec_params_typec_control {
uint8_t mode_to_enter;
/* Used for TBT_UFP_REPLY - enum typec_tbt_ufp_reply */
uint8_t tbt_ufp_reply;
+ /* Used for USB_MUX_SET */
+ struct typec_usb_mux_set mux_params;
uint8_t placeholder[128];
};
} __ec_align1;
diff --git a/util/ectool.c b/util/ectool.c
index 9c62e36093..9d2f8f29fa 100644
--- a/util/ectool.c
+++ b/util/ectool.c
@@ -10048,7 +10048,11 @@ int cmd_typec_control(int argc, char *argv[])
" 2: Enter mode\n"
" args: <0: DP, 1:TBT, 2:USB4>\n"
" 3: Set TBT UFP Reply\n"
- " args: <0: NAK, 1: ACK>\n",
+ " args: <0: NAK, 1: ACK>\n"
+ " 4: Set USB mux mode\n"
+ " args: <mux_index> <mux_mode>\n"
+ " <mux_mode> is one of: dp, dock, usb, tbt,\n"
+ " usb4, none, safe\n",
argv[0]);
return -1;
}
@@ -10105,6 +10109,39 @@ int cmd_typec_control(int argc, char *argv[])
return -1;
}
p.tbt_ufp_reply = conversion_result;
+ break;
+ case TYPEC_CONTROL_COMMAND_USB_MUX_SET:
+ if (argc < 5) {
+ fprintf(stderr, "Missing index or mode\n");
+ return -1;
+ }
+
+ conversion_result = strtol(argv[3], &endptr, 0);
+ if ((endptr && *endptr) || conversion_result > UINT8_MAX ||
+ conversion_result < 0) {
+ fprintf(stderr, "Bad index\n");
+ return -1;
+ }
+ p.mux_params.mux_index = conversion_result;
+ if (!strcmp(argv[4], "dp")) {
+ p.mux_params.mux_flags = USB_PD_MUX_DP_ENABLED;
+ } else if (!strcmp(argv[4], "dock")) {
+ p.mux_params.mux_flags = USB_PD_MUX_DOCK;
+ } else if (!strcmp(argv[4], "usb")) {
+ p.mux_params.mux_flags = USB_PD_MUX_USB_ENABLED;
+ } else if (!strcmp(argv[4], "tbt")) {
+ p.mux_params.mux_flags = USB_PD_MUX_TBT_COMPAT_ENABLED;
+ } else if (!strcmp(argv[4], "usb4")) {
+ p.mux_params.mux_flags = USB_PD_MUX_USB4_ENABLED;
+ } else if (!strcmp(argv[4], "none")) {
+ p.mux_params.mux_flags = USB_PD_MUX_NONE;
+ } else if (!strcmp(argv[4], "safe")) {
+ p.mux_params.mux_flags = USB_PD_MUX_SAFE_MODE;
+ } else {
+ fprintf(stderr, "Bad mux mode\n");
+ return -1;
+ }
+ break;
}
rv = ec_command(EC_CMD_TYPEC_CONTROL, 0, &p, sizeof(p),