diff options
-rw-r--r-- | board/servo_v4/usb_pd_policy.c | 13 | ||||
-rw-r--r-- | board/servo_v4p1/usb_pd_policy.c | 13 | ||||
-rw-r--r-- | common/usb_common.c | 29 | ||||
-rw-r--r-- | common/usb_pd_policy.c | 4 | ||||
-rw-r--r-- | common/usbc/usb_pe_drp_sm.c | 4 | ||||
-rw-r--r-- | include/usb_common.h | 6 |
6 files changed, 41 insertions, 28 deletions
diff --git a/board/servo_v4/usb_pd_policy.c b/board/servo_v4/usb_pd_policy.c index 393492b00d..f995bc58bb 100644 --- a/board/servo_v4/usb_pd_policy.c +++ b/board/servo_v4/usb_pd_policy.c @@ -273,7 +273,7 @@ static void board_manage_dut_port(void) static void update_ports(void) { int pdo_index, src_index, snk_index, i; - uint32_t pdo, max_ma, max_mv; + uint32_t pdo, max_ma, max_mv, unused; /* * CHG Vbus has changed states, update PDO that reflects CHG port @@ -307,7 +307,8 @@ static void update_ports(void) continue; snk_index = pdo_index; - pd_extract_pdo_power(pdo, &max_ma, &max_mv); + pd_extract_pdo_power(pdo, &max_ma, &max_mv, + &unused); pd_src_chg_pdo[src_index++] = PDO_FIXED_VOLT(max_mv) | PDO_FIXED_CURR(max_ma) | @@ -616,9 +617,9 @@ int charge_manager_get_source_pdo(const uint32_t **src_pdo, const int port) __override void pd_transition_voltage(int idx) { timestamp_t deadline; - uint32_t ma, mv; + uint32_t ma, mv, unused; - pd_extract_pdo_power(pd_src_chg_pdo[idx - 1], &ma, &mv); + pd_extract_pdo_power(pd_src_chg_pdo[idx - 1], &ma, &mv, &unused); /* Is this a transition to a new voltage? */ if (charge_port_is_active() && vbus[CHG].mv != mv) { /* @@ -1197,13 +1198,13 @@ static int cmd_ada_srccaps(int argc, char *argv[]) const uint32_t * const ada_srccaps = pd_get_src_caps(CHG); for (i = 0; i < pd_get_src_cap_cnt(CHG); ++i) { - uint32_t max_ma, max_mv; + uint32_t max_ma, max_mv, unused; /* It's an supported Augmented PDO (PD3.0) */ if ((ada_srccaps[i] & PDO_TYPE_MASK) == PDO_TYPE_AUGMENTED) continue; - pd_extract_pdo_power(ada_srccaps[i], &max_ma, &max_mv); + pd_extract_pdo_power(ada_srccaps[i], &max_ma, &max_mv, &unused); ccprintf("%d: %dmV/%dmA\n", i, max_mv, max_ma); } diff --git a/board/servo_v4p1/usb_pd_policy.c b/board/servo_v4p1/usb_pd_policy.c index e9afd07d6e..d00cc6e6b3 100644 --- a/board/servo_v4p1/usb_pd_policy.c +++ b/board/servo_v4p1/usb_pd_policy.c @@ -269,7 +269,7 @@ static void board_manage_dut_port(void) static void update_ports(void) { int pdo_index, src_index, snk_index, i; - uint32_t pdo, max_ma, max_mv; + uint32_t pdo, max_ma, max_mv, unused; /* * CHG Vbus has changed states, update PDO that reflects CHG port @@ -303,7 +303,8 @@ static void update_ports(void) continue; snk_index = pdo_index; - pd_extract_pdo_power(pdo, &max_ma, &max_mv); + pd_extract_pdo_power(pdo, &max_ma, &max_mv, + &unused); pd_src_chg_pdo[src_index++] = PDO_FIXED_VOLT(max_mv) | PDO_FIXED_CURR(max_ma) | @@ -672,9 +673,9 @@ int charge_manager_get_source_pdo(const uint32_t **src_pdo, const int port) __override void pd_transition_voltage(int idx) { timestamp_t deadline; - uint32_t ma, mv; + uint32_t ma, mv, unused; - pd_extract_pdo_power(pd_src_chg_pdo[idx - 1], &ma, &mv); + pd_extract_pdo_power(pd_src_chg_pdo[idx - 1], &ma, &mv, &unused); /* Is this a transition to a new voltage? */ if (charge_port_is_active() && vbus[CHG].mv != mv) { /* @@ -1269,13 +1270,13 @@ static int cmd_ada_srccaps(int argc, char *argv[]) const uint32_t * const ada_srccaps = pd_get_src_caps(CHG); for (i = 0; i < pd_get_src_cap_cnt(CHG); ++i) { - uint32_t max_ma, max_mv; + uint32_t max_ma, max_mv, unused; /* It's an supported Augmented PDO (PD3.0) */ if ((ada_srccaps[i] & PDO_TYPE_MASK) == PDO_TYPE_AUGMENTED) continue; - pd_extract_pdo_power(ada_srccaps[i], &max_ma, &max_mv); + pd_extract_pdo_power(ada_srccaps[i], &max_ma, &max_mv, &unused); ccprintf("%d: %dmV/%dmA\n", i, max_mv, max_ma); } diff --git a/common/usb_common.c b/common/usb_common.c index 760ffc2063..970152d4f9 100644 --- a/common/usb_common.c +++ b/common/usb_common.c @@ -253,26 +253,35 @@ int pd_find_pdo_index(uint32_t src_cap_cnt, const uint32_t * const src_caps, return ret; } -void pd_extract_pdo_power(uint32_t pdo, uint32_t *ma, uint32_t *mv) +void pd_extract_pdo_power(uint32_t pdo, uint32_t *ma, uint32_t *max_mv, + uint32_t *min_mv) { - int max_ma, uw; + uint32_t max_ma, uw; - *mv = ((pdo >> 10) & 0x3FF) * 50; + if ((pdo & PDO_TYPE_MASK) == PDO_TYPE_AUGMENTED) { + max_ma = 50 * (pdo & GENMASK(6, 0)); + *min_mv = 100 * ((pdo & GENMASK(15, 8)) >> 8); + *max_mv = 100 * ((pdo & GENMASK(24, 17)) >> 17); + max_ma = MIN(max_ma, PD_MAX_POWER_MW * 1000 / *min_mv); + *ma = MIN(max_ma, PD_MAX_CURRENT_MA); + return; + } - if (*mv == 0) { + *max_mv = ((pdo >> 10) & 0x3FF) * 50; + if (*max_mv == 0) { *ma = 0; + *min_mv = 0; return; } - if ((pdo & PDO_TYPE_MASK) == PDO_TYPE_BATTERY) { uw = 250000 * (pdo & 0x3FF); - max_ma = 1000 * MIN(1000 * uw, PD_MAX_POWER_MW) / *mv; + max_ma = 1000 * MIN(1000 * uw, PD_MAX_POWER_MW) / *max_mv; } else { max_ma = 10 * (pdo & 0x3FF); - max_ma = MIN(max_ma, PD_MAX_POWER_MW * 1000 / *mv); + max_ma = MIN(max_ma, PD_MAX_POWER_MW * 1000 / *max_mv); } - *ma = MIN(max_ma, PD_MAX_CURRENT_MA); + *min_mv = *max_mv; } void pd_build_request(uint32_t src_cap_cnt, const uint32_t * const src_caps, @@ -280,7 +289,7 @@ void pd_build_request(uint32_t src_cap_cnt, const uint32_t * const src_caps, uint32_t *mv, enum pd_request_type req_type, uint32_t max_request_mv) { - uint32_t pdo; + uint32_t pdo, unused; int pdo_index, flags = 0; int uw; int max_or_min_ma; @@ -299,7 +308,7 @@ void pd_build_request(uint32_t src_cap_cnt, const uint32_t * const src_caps, max_request_mv, &pdo); } - pd_extract_pdo_power(pdo, ma, mv); + pd_extract_pdo_power(pdo, ma, mv, &unused); /* * Adjust VBUS current if CTVPD device was detected. diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c index 26de109d81..16a126a618 100644 --- a/common/usb_pd_policy.c +++ b/common/usb_pd_policy.c @@ -132,7 +132,7 @@ void pd_set_src_caps(int port, int cnt, uint32_t *src_caps) void pd_process_source_cap(int port, int cnt, uint32_t *src_caps) { #ifdef CONFIG_CHARGE_MANAGER - uint32_t ma, mv, pdo; + uint32_t ma, mv, pdo, unused; #endif pd_set_src_caps(port, cnt, src_caps); @@ -141,7 +141,7 @@ void pd_process_source_cap(int port, int cnt, uint32_t *src_caps) /* Get max power info that we could request */ pd_find_pdo_index(pd_get_src_cap_cnt(port), pd_get_src_caps(port), PD_MAX_VOLTAGE_MV, &pdo); - pd_extract_pdo_power(pdo, &ma, &mv); + pd_extract_pdo_power(pdo, &ma, &mv, &unused); /* Set max. limit, but apply 500mA ceiling */ charge_manager_set_ceil(port, CEIL_REQUESTOR_PD, PD_MIN_MA); diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c index 1ffbe68e0b..174b9137be 100644 --- a/common/usbc/usb_pe_drp_sm.c +++ b/common/usbc/usb_pe_drp_sm.c @@ -4505,7 +4505,7 @@ int pd_check_requested_voltage(uint32_t rdo, const int port) void pd_process_source_cap(int port, int cnt, uint32_t *src_caps) { #ifdef CONFIG_CHARGE_MANAGER - uint32_t ma, mv, pdo; + uint32_t ma, mv, pdo, unused; #endif int i; @@ -4517,7 +4517,7 @@ void pd_process_source_cap(int port, int cnt, uint32_t *src_caps) /* Get max power info that we could request */ pd_find_pdo_index(pe[port].src_cap_cnt, pe[port].src_caps, PD_MAX_VOLTAGE_MV, &pdo); - pd_extract_pdo_power(pdo, &ma, &mv); + pd_extract_pdo_power(pdo, &ma, &mv, &unused); /* Set max. limit, but apply 500mA ceiling */ charge_manager_set_ceil(port, CEIL_REQUESTOR_PD, PD_MIN_MA); pd_set_input_current_limit(port, ma, mv); diff --git a/include/usb_common.h b/include/usb_common.h index 13bebc7915..04495a17b0 100644 --- a/include/usb_common.h +++ b/include/usb_common.h @@ -93,9 +93,11 @@ int pd_find_pdo_index(uint32_t src_cap_cnt, const uint32_t * const src_caps, * * @param pdo raw pdo to extract * @param ma current of the PDO (output) - * @param mv voltage of the PDO (output) + * @param mv voltage of the PDO, or max_mv of the Augmented PDO (output) + * @param mv voltage of the PDO, or min_mv of the Augmented PDO (output) */ -void pd_extract_pdo_power(uint32_t pdo, uint32_t *ma, uint32_t *mv); +void pd_extract_pdo_power(uint32_t pdo, uint32_t *ma, uint32_t *max_mv, + uint32_t *min_mv); /** * Decide which PDO to choose from the source capabilities. |