summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Yilun Lin <yllin@chromium.org>2021-04-07 17:42:03 +0800
committerCommit Bot <commit-bot@chromium.org>2021-04-15 19:21:48 +0000
commit9b1254b253c085a9cc70bfaf169b289bf8d9410f (patch)
tree48fc9f7de651e69d78f6204f226ec21b9a831df4
parentba362eff8aab9cd9bd145cc9ea66a0990df7b7ae (diff)
downloadchrome-ec-9b1254b253c085a9cc70bfaf169b289bf8d9410f.tar.gz
usb_common: support parse Augmented PDO
Change the function signature to void pd_extract_pdo_power(uint32_t pdo, uint32_t *ma, uint32_t *max_mv, uint32_t *min_mv); Replace the original caller with an extra unused parameter, no functional changes. BUG=none TEST=`pd 0 srccaps` prints the correct PDO info BRANCH=servo Signed-off-by: Jeremy Bettis <jbettis@google.com> Change-Id: I0ea9c3a00ffbb465aaea34f77101ab27188ca34e Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2827323 Reviewed-by: Brian Nemec <bnemec@chromium.org> Tested-by: Jeremy Bettis <jbettis@chromium.org> Commit-Queue: Jeremy Bettis <jbettis@chromium.org>
-rw-r--r--board/servo_v4/usb_pd_policy.c13
-rw-r--r--board/servo_v4p1/usb_pd_policy.c13
-rw-r--r--common/usb_common.c29
-rw-r--r--common/usb_pd_policy.c4
-rw-r--r--common/usbc/usb_pe_drp_sm.c4
-rw-r--r--include/usb_common.h6
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.