diff options
author | Diana Z <dzigterman@chromium.org> | 2022-06-02 09:27:00 -0600 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-06-02 22:48:30 +0000 |
commit | 48f6e378bec40a4550490367cc6ed9eb1aea9cc5 (patch) | |
tree | d99f62442a3f49fdfb5c8215f18b312f745a2c10 | |
parent | 1934bd11883fe7acc87b8920ba8ed00d5599a046 (diff) | |
download | chrome-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.c | 9 | ||||
-rw-r--r-- | include/ec_commands.h | 8 | ||||
-rw-r--r-- | util/ectool.c | 39 |
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), |