diff options
author | li feng <li1.feng@intel.com> | 2021-07-07 09:48:57 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-07-19 17:49:15 +0000 |
commit | acc12b843cb90e117374a2395f5b318e336db338 (patch) | |
tree | 02da78feef75bf9c2a10e61e2c53e4fe8d0df4eb | |
parent | 2dd687f160dcda988ba9cb93ffb07d58680de572 (diff) | |
download | chrome-ec-acc12b843cb90e117374a2395f5b318e336db338.tar.gz |
retimer: clear unused mux bits
During retimer firmware update, EC passes mux value to Coreboot/kernel.
Coreboot/kernel checks mux value to know if PD port is NDA, or if port
connection is set to what retimer firmware update sequence expects.
Some bits of mux value are not used by Coreboot/kernel. This patch
clears unused bits; and keeps alternate mode bits and safe mode bit in
the mux value.
BUG=none
BRANCH=none
TEST=On ADL RVP, verified NDA port retimer firmware update working.
TEST=On Voxel DVT, verified NDA port retimer firmware update working
with both Chromium solution and upstream solution.
Signed-off-by: li feng <li1.feng@intel.com>
Change-Id: I1becc09a0f5c5d4e1fb845c5fe33fa748d44bd4f
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3010482
Reviewed-by: Keith Short <keithshort@chromium.org>
-rw-r--r-- | common/usbc/usb_retimer_fw_update.c | 15 | ||||
-rw-r--r-- | include/ec_commands.h | 7 |
2 files changed, 17 insertions, 5 deletions
diff --git a/common/usbc/usb_retimer_fw_update.c b/common/usbc/usb_retimer_fw_update.c index 2634081e2e..1ff198c78f 100644 --- a/common/usbc/usb_retimer_fw_update.c +++ b/common/usbc/usb_retimer_fw_update.c @@ -91,6 +91,11 @@ static void deferred_pd_suspend(void) } DECLARE_DEFERRED(deferred_pd_suspend); +static inline mux_state_t retimer_fw_update_usb_mux_get(int port) +{ + return usb_mux_get(port) & USB_RETIMER_FW_UPDATE_MUX_MASK; +} + void usb_retimer_fw_update_process_op_cb(int port) { switch (last_op) { @@ -118,26 +123,26 @@ void usb_retimer_fw_update_process_op_cb(int port) pd_set_suspend(port, RESUME); break; case USB_RETIMER_FW_UPDATE_GET_MUX: - last_result = usb_mux_get(port); + last_result = retimer_fw_update_usb_mux_get(port); break; case USB_RETIMER_FW_UPDATE_SET_USB: usb_mux_set(port, USB_PD_MUX_USB_ENABLED, USB_SWITCH_CONNECT, pd_get_polarity(port)); - last_result = usb_mux_get(port); + last_result = retimer_fw_update_usb_mux_get(port); break; case USB_RETIMER_FW_UPDATE_SET_SAFE: usb_mux_set_safe_mode(port); - last_result = usb_mux_get(port); + last_result = retimer_fw_update_usb_mux_get(port); break; case USB_RETIMER_FW_UPDATE_SET_TBT: usb_mux_set(port, USB_PD_MUX_TBT_COMPAT_ENABLED, USB_SWITCH_CONNECT, pd_get_polarity(port)); - last_result = usb_mux_get(port); + last_result = retimer_fw_update_usb_mux_get(port); break; case USB_RETIMER_FW_UPDATE_DISCONNECT: usb_mux_set(port, USB_PD_MUX_NONE, USB_SWITCH_DISCONNECT, pd_get_polarity(port)); - last_result = usb_mux_get(port); + last_result = retimer_fw_update_usb_mux_get(port); break; default: break; diff --git a/include/ec_commands.h b/include/ec_commands.h index 441db29d74..470c0a9425 100644 --- a/include/ec_commands.h +++ b/include/ec_commands.h @@ -455,6 +455,13 @@ extern "C" { #define USB_RETIMER_FW_UPDATE_OP_SHIFT 4 #define USB_RETIMER_FW_UPDATE_ERR 0xfe #define USB_RETIMER_FW_UPDATE_INVALID_MUX 0xff +/* Mask to clear unused MUX bits in retimer firmware update */ +#define USB_RETIMER_FW_UPDATE_MUX_MASK (USB_PD_MUX_USB_ENABLED | \ + USB_PD_MUX_DP_ENABLED | \ + USB_PD_MUX_SAFE_MODE | \ + USB_PD_MUX_TBT_COMPAT_ENABLED | \ + USB_PD_MUX_USB4_ENABLED) + /* Retimer firmware update operations */ #define USB_RETIMER_FW_UPDATE_QUERY_PORT 0 /* Which ports has retimer */ #define USB_RETIMER_FW_UPDATE_SUSPEND_PD 1 /* Suspend PD port */ |