summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Hill <ecgh@chromium.org>2019-01-17 14:20:09 -0700
committerchrome-bot <chrome-bot@chromium.org>2019-03-26 04:42:45 -0700
commit40eba6b0cabb0502f71ade0d44b339122709c777 (patch)
tree6da24ec9cfcee63c670b7239f2f28ea728bcd0dd
parentedcc6fc02c816781a9c24ac1d04e6e56e092a457 (diff)
downloadchrome-ec-40eba6b0cabb0502f71ade0d44b339122709c777.tar.gz
grunt: Check DP MF-bit against selected pin cfg
When we are configuring a Type-C port for DisplayPort alternate mode, we should check to see that the selected pin config supports multi-function mode or not. This commit fixes a bug where we were setting the SuperSpeed muxes based solely upon the Multi-function Preferred bit in the DPStatus VDO. Some Type-C video adapters are buggy and set the MF preferred bit without actually supporting an MF pin configuration. Therefore, we trust the reported supported pin configurations in the DiscMode VDO. BUG=chromium:919756 BRANCH=grunt TEST=DP still works with dock and DP-only dongles. Change-Id: I3df2b67f29aaf2c725bba30a45bb902bdc44fcf4 Signed-off-by: Edward Hill <ecgh@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1530128 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
-rw-r--r--baseboard/grunt/usb_pd_policy.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/baseboard/grunt/usb_pd_policy.c b/baseboard/grunt/usb_pd_policy.c
index 5c8b7e2359..63e5268668 100644
--- a/baseboard/grunt/usb_pd_policy.c
+++ b/baseboard/grunt/usb_pd_policy.c
@@ -280,12 +280,22 @@ static int svdm_dp_config(int port, uint32_t *payload)
int opos = pd_alt_mode(port, USB_SID_DISPLAYPORT);
int mf_pref = PD_VDO_DPSTS_MF_PREF(dp_status[port]);
int pin_mode = pd_dfp_dp_get_pin_mode(port, dp_status[port]);
+ enum typec_mux mux_mode;
if (!pin_mode)
return 0;
- usb_mux_set(port, mf_pref ? TYPEC_MUX_DOCK : TYPEC_MUX_DP,
- USB_SWITCH_CONNECT, pd_get_polarity(port));
+ /*
+ * Multi-function operation is only allowed if that pin config is
+ * supported.
+ */
+ mux_mode = ((pin_mode & MODE_DP_PIN_MF_MASK) && mf_pref) ?
+ TYPEC_MUX_DOCK : TYPEC_MUX_DP;
+ CPRINTS("pin_mode: %x, mf: %d, mux: %d", pin_mode, mf_pref, mux_mode);
+
+ /* Connect the SBU and USB lines to the connector. */
+ ppc_set_sbu(port, 1);
+ usb_mux_set(port, mux_mode, USB_SWITCH_CONNECT, pd_get_polarity(port));
payload[0] = VDO(USB_SID_DISPLAYPORT, 1,
CMD_DP_CONFIG | VDO_OPOS(opos));