diff options
author | Ayushee <ayushee.shah@intel.com> | 2020-05-28 16:37:44 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-06-05 10:15:38 +0000 |
commit | 5fceb8b92e1fc492036d57d1d0f9df81c6c3e2ff (patch) | |
tree | 233b50aabac969285ad4ccd1c2174caa6f0b7d55 /common | |
parent | c9e0e383c9279c07ddcfa12c604a259da665bebb (diff) | |
download | chrome-ec-5fceb8b92e1fc492036d57d1d0f9df81c6c3e2ff.tar.gz |
usb_pd: USB4: Limit the cable speed
Added 'get_usb4_cable_speed()' to return USB4 speed as per the port, the
speed supported by DUT's port or cable speed whichever is lowest.
Added configuring the cable speed in cros_ec_usb_pd_control according to
the mux setting.
Removed 'set_max_usb4_cable_speed()' to retain cable's actual VDO
response.
BUG=b:157671582
BRANCH=none
TEST=1. Able to set USB4/USB3.2 Gen2 cable speed when DFP isn't gen 3
capable.
2. Able to limit cable speed according to the port, if the cable
speed is higher.
Signed-off-by: Ayushee <ayushee.shah@intel.com>
Change-Id: I21bba7e5a2aa8ca54f304ef8418320f319f020b1
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2220826
Reviewed-by: Keith Short <keithshort@chromium.org>
Diffstat (limited to 'common')
-rw-r--r-- | common/usb_pd_alt_mode_dfp.c | 44 | ||||
-rw-r--r-- | common/usb_pd_host_cmd.c | 13 | ||||
-rw-r--r-- | common/usb_pd_policy.c | 23 |
3 files changed, 43 insertions, 37 deletions
diff --git a/common/usb_pd_alt_mode_dfp.c b/common/usb_pd_alt_mode_dfp.c index 051fa9740c..42b21a6fa8 100644 --- a/common/usb_pd_alt_mode_dfp.c +++ b/common/usb_pd_alt_mode_dfp.c @@ -881,27 +881,47 @@ __overridable enum tbt_compat_cable_speed board_get_max_tbt_speed(int port) * ############################################################################ */ -enum usb_rev30_ss get_usb4_cable_speed(int port) +/* + * For Cable rev 3.0: USB4 cable speed is set according to speed supported by + * the port and the response received from the cable, whichever is least. + * + * For Cable rev 2.0: Since board_is_tbt_usb4_port() should not enabled if the + * port supports speed less than USB_R20_SS_U31_GEN1_GEN2, USB4 cable speed is + * set according to the cable response. + */ +static enum usb_rev30_ss board_get_max_usb_cable_speed(int port) { struct pd_cable *cable = pd_get_cable_attributes(port); - /* - * TODO: Return USB4 cable speed for USB3.2 Gen 2 cables if DFP isn't - * Gen 3 capable. + * Converting Thunderbolt-Compatible board speed to equivalent USB4 + * speed. */ - if ((cable->rev == PD_REV30) && - (get_usb_pd_cable_type(port) == IDH_PTYPE_PCABLE) && - ((cable->attr.p_rev30.ss != USB_R30_SS_U32_U40_GEN2) || - !IS_ENABLED(CONFIG_USB_PD_TBT_GEN3_CAPABLE))) { - return cable->attr.p_rev30.ss; - } + enum usb_rev30_ss max_usb4_speed = + board_get_max_tbt_speed(port) == TBT_SS_TBT_GEN3 ? + USB_R30_SS_U40_GEN3 : USB_R30_SS_U32_U40_GEN2; + return max_usb4_speed < cable->attr.p_rev30.ss ? + max_usb4_speed : cable->attr.p_rev30.ss; +} + +enum usb_rev30_ss get_usb4_cable_speed(int port) +{ + struct pd_cable *cable = pd_get_cable_attributes(port); + enum usb_rev30_ss max_rev30_usb4_speed; + + if (cable->rev == PD_REV30) { + max_rev30_usb4_speed = board_get_max_usb_cable_speed(port); + if (!IS_ENABLED(CONFIG_USB_PD_TBT_GEN3_CAPABLE) || + max_rev30_usb4_speed != USB_R30_SS_U32_U40_GEN2 || + get_usb_pd_cable_type(port) == IDH_PTYPE_ACABLE) + return max_rev30_usb4_speed; + } /* * Converting Thunderolt-Compatible cable speed to equivalent USB4 cable * speed. */ - return cable->cable_mode_resp.tbt_cable_speed == TBT_SS_TBT_GEN3 ? - USB_R30_SS_U40_GEN3 : USB_R30_SS_U32_U40_GEN2; + return get_tbt_cable_speed(port) == TBT_SS_TBT_GEN3 ? + USB_R30_SS_U40_GEN3 : USB_R30_SS_U32_U40_GEN2; } __overridable void svdm_safe_dp_mode(int port) diff --git a/common/usb_pd_host_cmd.c b/common/usb_pd_host_cmd.c index 11345a7624..8bd9f16aea 100644 --- a/common/usb_pd_host_cmd.c +++ b/common/usb_pd_host_cmd.c @@ -296,6 +296,7 @@ static enum ec_status hc_usb_pd_control(struct host_cmd_handler_args *args) struct ec_response_usb_pd_control_v1 *r_v1 = args->response; struct ec_response_usb_pd_control *r = args->response; const char *task_state_name; + mux_state_t mux_state; if (p->port >= board_get_usb_pd_port_count()) return EC_RES_INVALID_PARAM; @@ -360,8 +361,16 @@ static enum ec_status hc_usb_pd_control(struct host_cmd_handler_args *args) r_v2->control_flags = get_pd_control_flags(p->port); if (IS_ENABLED(CONFIG_USB_PD_ALT_MODE_DFP)) { r_v2->dp_mode = get_dp_pin_mode(p->port); - r_v2->cable_speed = get_tbt_cable_speed(p->port); - r_v2->cable_gen = get_tbt_rounded_support(p->port); + mux_state = usb_mux_get(p->port); + if (mux_state & USB_PD_MUX_USB4_ENABLED) { + r_v2->cable_speed = + get_usb4_cable_speed(p->port); + } else if (mux_state & USB_PD_MUX_TBT_COMPAT_ENABLED) { + r_v2->cable_speed = + get_tbt_cable_speed(p->port); + r_v2->cable_gen = + get_tbt_rounded_support(p->port); + } } if (args->version == 1) diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c index 38bb04f83b..8a92ac879f 100644 --- a/common/usb_pd_policy.c +++ b/common/usb_pd_policy.c @@ -346,28 +346,6 @@ static inline void disable_usb4_mode(int port) } /* - * For Cable rev 3.0: USB4 cable speed is set according to speed supported by - * the port and the response received from the cable, whichever is least. - * - * For Cable rev 2.0: Since board_is_tbt_usb4_port() should not enabled if the - * port supports speed less than USB_R20_SS_U31_GEN1_GEN2, USB4 cable speed is - * set according to the cable response. - */ -static void set_max_usb4_cable_speed(int port) -{ - /* - * Converting Thunderbolt-Compatible board speed to equivalent USB4 - * speed. - */ - enum usb_rev30_ss max_usb4_speed = - board_get_max_tbt_speed(port) == TBT_SS_TBT_GEN3 ? - USB_R30_SS_U40_GEN3 : USB_R30_SS_U32_U40_GEN2; - - if (max_usb4_speed < cable[port].attr.p_rev30.ss) - cable[port].attr.p_rev30.ss = max_usb4_speed; -} - -/* * Ref: USB Type-C Cable and Connector Specification * Figure 5-1 USB4 Discovery and Entry Flow Model. * @@ -410,7 +388,6 @@ static bool is_cable_ready_to_enter_usb4(int port, int cnt) is_vdo_present(cnt, VDO_INDEX_PTYPE_CABLE1)) { switch (cable[port].rev) { case PD_REV30: - set_max_usb4_cable_speed(port); switch (cable[port].attr.p_rev30.ss) { case USB_R30_SS_U40_GEN3: case USB_R30_SS_U32_U40_GEN1: |