summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Palatin <vpalatin@chromium.org>2016-10-25 14:53:49 +0200
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2016-10-25 17:08:32 +0000
commit951921d40bce512e032c1da4615aa62dad467377 (patch)
treef135730c3ea59bf792ef6f30afc2ce95b79fd734
parent6686ed576ef9ad5134622f9267f4a1a90b1fac85 (diff)
downloadchrome-ec-951921d40bce512e032c1da4615aa62dad467377.tar.gz
pd: fix contract negotiation with dynamic PDOs
When the board is using dynamic source PDOs, we need to ensure that we are checking the incoming sink power request against the right set of PDOs else we might reject a valid request (e.g. with high-power source, we need to check against the 3.0A limit if we only have one port connected). Signed-off-by: Vincent Palatin <vpalatin@chromium.org> BRANCH=gru BUG=chrome-os-partner:56110 TEST=Connect Kevin to Caroline, ask Caroline to charge from the other side and see it negotiating successfully a 5V/3A contract. Change-Id: Ie1aa5746776be5946422bf07c08ae0f22faddd8c Reviewed-on: https://chromium-review.googlesource.com/402731 Reviewed-by: Shawn N <shawnn@chromium.org> Commit-Queue: Shawn N <shawnn@chromium.org> Tested-by: Shawn N <shawnn@chromium.org>
-rw-r--r--board/plankton/usb_pd_policy.c4
-rw-r--r--board/zinger/usb_pd_policy.c2
-rw-r--r--common/usb_pd_policy.c18
-rw-r--r--include/usb_pd.h4
4 files changed, 19 insertions, 9 deletions
diff --git a/board/plankton/usb_pd_policy.c b/board/plankton/usb_pd_policy.c
index 1b5e0271df..d1f0a8487e 100644
--- a/board/plankton/usb_pd_policy.c
+++ b/board/plankton/usb_pd_policy.c
@@ -74,12 +74,12 @@ int pd_is_valid_input_voltage(int mv)
return 1;
}
-int pd_board_check_request(uint32_t rdo)
+int pd_board_check_request(uint32_t rdo, int pdo_cnt)
{
int idx = RDO_POS(rdo);
/* Check for invalid index */
- return (!idx || idx > pd_src_pdo_cnts[pd_src_pdo_idx]) ?
+ return (!idx || idx > pdo_cnt) ?
EC_ERROR_INVAL : EC_SUCCESS;
}
diff --git a/board/zinger/usb_pd_policy.c b/board/zinger/usb_pd_policy.c
index fd9cf8be7b..c210ce9cea 100644
--- a/board/zinger/usb_pd_policy.c
+++ b/board/zinger/usb_pd_policy.c
@@ -198,7 +198,7 @@ static int discharge_volt_idx;
/* output current measurement */
int vbus_amp;
-int pd_board_check_request(uint32_t rdo)
+int pd_board_check_request(uint32_t rdo, int pdo_cnt)
{
int idx = RDO_POS(rdo);
diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c
index d9d803e398..9863ac405e 100644
--- a/common/usb_pd_policy.c
+++ b/common/usb_pd_policy.c
@@ -39,13 +39,21 @@ int pd_check_requested_voltage(uint32_t rdo)
int idx = RDO_POS(rdo);
uint32_t pdo;
uint32_t pdo_ma;
+#if defined(CONFIG_USB_PD_DYNAMIC_SRC_CAP) || \
+ defined(CONFIG_USB_PD_MAX_SINGLE_SOURCE_CURRENT)
+ const uint32_t *src_pdo;
+ const int pdo_cnt = charge_manager_get_source_pdo(&src_pdo);
+#else
+ const uint32_t *src_pdo = pd_src_pdo;
+ const int pdo_cnt = pd_src_pdo_cnt;
+#endif
/* Board specific check for this request */
- if (pd_board_check_request(rdo))
+ if (pd_board_check_request(rdo, pdo_cnt))
return EC_ERROR_INVAL;
/* check current ... */
- pdo = pd_src_pdo[idx - 1];
+ pdo = src_pdo[idx - 1];
pdo_ma = (pdo & 0x3ff);
if (op_ma > pdo_ma)
return EC_ERROR_INVAL; /* too much op current */
@@ -60,15 +68,15 @@ int pd_check_requested_voltage(uint32_t rdo)
return EC_SUCCESS;
}
-static int stub_pd_board_check_request(uint32_t rdo)
+static int stub_pd_board_check_request(uint32_t rdo, int pdo_cnt)
{
int idx = RDO_POS(rdo);
/* Check for invalid index */
- return (!idx || idx > pd_src_pdo_cnt) ?
+ return (!idx || idx > pdo_cnt) ?
EC_ERROR_INVAL : EC_SUCCESS;
}
-int pd_board_check_request(uint32_t)
+int pd_board_check_request(uint32_t, int)
__attribute__((weak, alias("stub_pd_board_check_request")));
#ifdef CONFIG_USB_PD_DUAL_ROLE
diff --git a/include/usb_pd.h b/include/usb_pd.h
index 6ed339d94e..c588596e4c 100644
--- a/include/usb_pd.h
+++ b/include/usb_pd.h
@@ -919,9 +919,11 @@ int pd_check_requested_voltage(uint32_t rdo);
/**
* Run board specific checks on request message
*
+ * @param rdo the request data object word sent by the sink.
+ * @param pdo_cnt the total number of source PDOs.
* @return EC_SUCCESS if request is ok , <0 else.
*/
-int pd_board_check_request(uint32_t rdo);
+int pd_board_check_request(uint32_t rdo, int pdo_cnt);
/**
* Select a new output voltage.