From c0f005a5d6e26c29bd1379163b890331ba8b38d0 Mon Sep 17 00:00:00 2001 From: Derek Huang Date: Wed, 29 Sep 2021 17:38:31 +0800 Subject: 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 Change-Id: I6020c4305e30018d4c97d862c16e8d642c951765 Reviewed-on: https://review.coreboot.org/c/coreboot/+/58058 Tested-by: build bot (Jenkins) Reviewed-by: Furquan Shaikh --- src/ec/google/chromeec/ec.c | 35 ++++++++++++++++++++++++----------- src/ec/google/chromeec/ec.h | 7 +++++-- 2 files changed, 29 insertions(+), 13 deletions(-) (limited to 'src') 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 ms. - * @return 1: Success or 0: Timeout. + * @param timeout_ms Wait aborts after 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); -- cgit v1.2.3