summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorli feng <li1.feng@intel.com>2021-07-07 09:48:57 -0700
committerCommit Bot <commit-bot@chromium.org>2021-07-19 17:49:15 +0000
commitacc12b843cb90e117374a2395f5b318e336db338 (patch)
tree02da78feef75bf9c2a10e61e2c53e4fe8d0df4eb
parent2dd687f160dcda988ba9cb93ffb07d58680de572 (diff)
downloadchrome-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.c15
-rw-r--r--include/ec_commands.h7
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 */