diff options
author | Derek Huang <derek.huang@intel.corp-partner.google.com> | 2021-09-29 17:38:31 +0800 |
---|---|---|
committer | Tim Wawrzynczak <twawrzynczak@chromium.org> | 2021-10-06 22:17:42 +0000 |
commit | c0f005a5d6e26c29bd1379163b890331ba8b38d0 (patch) | |
tree | e553d874d037e89aeb7f68fa02857fb9dc594dd3 | |
parent | f1f9b3d5f5661fda4176b05528b37cb8951785c3 (diff) |
ec/google/chromeec: Update some PD and DisplayPort APIs
1. Update google_chromeec_pd_get_amode() to return bitmask.
2. Update google_chromeec_wait_for_displayport() to handle the
updated return value of google_chromeec_pd_get_amode().
3. Drop google_chromeec_pd_get_amode() from ec.h and make it static
because it's not used outside of ec.c.
BUG=b:192947843
Signed-off-by: Derek Huang <derek.huang@intel.corp-partner.google.com>
Change-Id: I6020c4305e30018d4c97d862c16e8d642c951765
Reviewed-on: https://review.coreboot.org/c/coreboot/+/58058
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Furquan Shaikh <furquan@google.com>
-rw-r--r-- | src/ec/google/chromeec/ec.c | 35 | ||||
-rw-r--r-- | src/ec/google/chromeec/ec.h | 7 |
2 files changed, 29 insertions, 13 deletions
diff --git a/src/ec/google/chromeec/ec.c b/src/ec/google/chromeec/ec.c index 650fd14fec..9086693770 100644 --- a/src/ec/google/chromeec/ec.c +++ b/src/ec/google/chromeec/ec.c @@ -1542,9 +1542,10 @@ int google_chromeec_usb_get_pd_mux_info(int port, uint8_t *flags) * Check if EC/TCPM is in an alternate mode or not. * * @param svid SVID of the alternate mode to check - * @return 0: Not in the mode. -1: Error. 1: Yes. + * @return 0: Not in the mode. -1: Error. + * >=1: bitmask of the ports that are in the mode. */ -int google_chromeec_pd_get_amode(uint16_t svid) +static int google_chromeec_pd_get_amode(uint16_t svid) { struct ec_response_usb_pd_ports resp; struct chromeec_command cmd = { @@ -1557,6 +1558,7 @@ int google_chromeec_pd_get_amode(uint16_t svid) .cmd_dev_index = 0, }; int i; + int ret = 0; if (google_chromeec_command(&cmd) < 0) return -1; @@ -1582,12 +1584,12 @@ int google_chromeec_pd_get_amode(uint16_t svid) if (google_chromeec_command(&cmd) < 0) return -1; if (resp2.svid == svid) - return 1; + ret |= BIT(i); svid_idx++; } while (resp2.svid); } - return 0; + return ret; } #define USB_SID_DISPLAYPORT 0xff01 @@ -1595,20 +1597,31 @@ int google_chromeec_pd_get_amode(uint16_t svid) /** * Wait for DisplayPort to be ready * - * @param timeout Wait aborts after <timeout> ms. - * @return 1: Success or 0: Timeout. + * @param timeout_ms Wait aborts after <timeout_ms> ms. + * @return -1: Error. 0: Timeout. + * >=1: Bitmask of the ports that DP device is connected */ -int google_chromeec_wait_for_displayport(long timeout) +int google_chromeec_wait_for_displayport(long timeout_ms) { struct stopwatch sw; + int ret = 0; printk(BIOS_INFO, "Waiting for DisplayPort\n"); - stopwatch_init_msecs_expire(&sw, timeout); - while (google_chromeec_pd_get_amode(USB_SID_DISPLAYPORT) != 1) { + stopwatch_init_msecs_expire(&sw, timeout_ms); + while (1) { + ret = google_chromeec_pd_get_amode(USB_SID_DISPLAYPORT); + if (ret > 0) + break; + + if (ret < 0) { + printk(BIOS_ERR, "Can't get alternate mode!\n"); + return ret; + } + if (stopwatch_expired(&sw)) { printk(BIOS_WARNING, "DisplayPort not ready after %ldms. Abort.\n", - timeout); + timeout_ms); return 0; } mdelay(200); @@ -1616,7 +1629,7 @@ int google_chromeec_wait_for_displayport(long timeout) printk(BIOS_INFO, "DisplayPort ready after %lu ms\n", stopwatch_duration_msecs(&sw)); - return 1; + return ret; } int google_chromeec_get_keybd_config(struct ec_response_keybd_config *keybd) diff --git a/src/ec/google/chromeec/ec.h b/src/ec/google/chromeec/ec.h index ebb7ae24a1..6fa58a9a1e 100644 --- a/src/ec/google/chromeec/ec.h +++ b/src/ec/google/chromeec/ec.h @@ -26,7 +26,6 @@ bool google_chromeec_is_uhepi_supported(void); int google_ec_running_ro(void); enum ec_image google_chromeec_get_current_image(void); void google_chromeec_init(void); -int google_chromeec_pd_get_amode(uint16_t svid); /* Check for the current mux state in EC * in: int port physical port number of the type-c port * out: uint8_t flags representing the status of the mux such as @@ -36,7 +35,11 @@ int google_chromeec_usb_get_pd_mux_info(int port, uint8_t *flags); /* Returns data role and type of device connected */ int google_chromeec_usb_pd_get_info(int port, bool *ufp, bool *dbg_acc, bool *active_cable, uint8_t *dp_mode); -int google_chromeec_wait_for_displayport(long timeout); +/* Poll (up to `timeout_ms` ms) for DisplayPort to be ready + * Return: -1: Error. 0: Timeout. + * >=1: Bitmask of the ports that DP device is connected + */ +int google_chromeec_wait_for_displayport(long timeout_ms); /* Device events */ uint64_t google_chromeec_get_device_enabled_events(void); |