diff options
-rw-r--r-- | board/plankton/usb_pd_policy.c | 4 | ||||
-rw-r--r-- | board/zinger/usb_pd_policy.c | 2 | ||||
-rw-r--r-- | common/usb_pd_policy.c | 18 | ||||
-rw-r--r-- | include/usb_pd.h | 4 |
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 b1c4e17c92..87f6fbe3d1 100644 --- a/common/usb_pd_policy.c +++ b/common/usb_pd_policy.c @@ -40,13 +40,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 */ @@ -61,15 +69,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. |