diff options
author | Denis Brockus <dbrockus@google.com> | 2021-02-18 12:50:29 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-03-02 00:13:30 +0000 |
commit | 198834ed267b7ea742fe1438c95e40e35d1097e0 (patch) | |
tree | b49e94235bd5056514fb01d79a6f6c2ef0545165 /common | |
parent | ad70e9e230b290fe8b52871ead1059adcae32e99 (diff) | |
download | chrome-ec-198834ed267b7ea742fe1438c95e40e35d1097e0.tar.gz |
TCPMv2: PD Timers - Add PE PSSourceTimer to framework
BUG=b:178029034
BRANCH=none
TEST=make runtests
Signed-off-by: Denis Brockus <dbrockus@google.com>
Change-Id: Ie7b6dfb64fb419c43f71493f5de44a6e90b8542a
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2707903
Commit-Queue: Denis Brockus <dbrockus@chromium.org>
Tested-by: Denis Brockus <dbrockus@chromium.org>
Reviewed-by: Diana Z <dzigterman@chromium.org>
Diffstat (limited to 'common')
-rw-r--r-- | common/usbc/usb_pe_drp_sm.c | 60 |
1 files changed, 29 insertions, 31 deletions
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c index be7df932a3..f7e8eeb9a9 100644 --- a/common/usbc/usb_pe_drp_sm.c +++ b/common/usbc/usb_pe_drp_sm.c @@ -632,19 +632,6 @@ static struct policy_engine { uint64_t pr_swap_wait_timer; /* - * This timer combines the PSSourceOffTimer and PSSourceOnTimer timers. - * For PSSourceOffTimer, when this DRP device is currently acting as a - * Sink, this timer times out on a PS_RDY Message during a Power Role - * Swap sequence. - * - * For PSSourceOnTimer, when this DRP device is currently acting as a - * Source that has just stopped sourcing power and is waiting to start - * sinking power to timeout on a PS_RDY Message during a Power Role - * Swap. - */ - uint64_t ps_source_timer; - - /* * This timer is used by the new Source, after a Power Role Swap or * Fast Role Swap, to ensure that it does not send Source_Capabilities * Message before the new Sink is ready to receive the @@ -4343,18 +4330,23 @@ static void pe_prs_src_snk_transition_to_off_entry(int port) /* Tell TypeC to power off the source */ tc_src_power_off(port); - pe[port].ps_source_timer = - get_time().val + PD_POWER_SUPPLY_TURN_OFF_DELAY; + pd_timer_enable(port, PE_TIMER_PS_SOURCE, + PD_POWER_SUPPLY_TURN_OFF_DELAY); } static void pe_prs_src_snk_transition_to_off_run(int port) { /* Give time for supply to power off */ - if (get_time().val > pe[port].ps_source_timer && + if (pd_timer_is_expired(port, PE_TIMER_PS_SOURCE) && pd_check_vbus_level(port, VBUS_SAFE0V)) set_state_pe(port, PE_PRS_SRC_SNK_ASSERT_RD); } +static void pe_prs_src_snk_transition_to_off_exit(int port) +{ + pd_timer_disable(port, PE_TIMER_PS_SOURCE); +} + /** * PE_PRS_SRC_SNK_Assert_Rd */ @@ -4380,25 +4372,24 @@ static void pe_prs_src_snk_wait_source_on_entry(int port) { print_current_state(port); send_ctrl_msg(port, TCPC_TX_SOP, PD_CTRL_PS_RDY); - pe[port].ps_source_timer = TIMER_DISABLED; } static void pe_prs_src_snk_wait_source_on_run(int port) { - if (pe[port].ps_source_timer == TIMER_DISABLED && - PE_CHK_FLAG(port, PE_FLAGS_TX_COMPLETE)) { + if (pd_timer_is_disabled(port, PE_TIMER_PS_SOURCE) && + PE_CHK_FLAG(port, PE_FLAGS_TX_COMPLETE)) { PE_CLR_FLAG(port, PE_FLAGS_TX_COMPLETE); /* Update pe power role */ pe[port].power_role = pd_get_power_role(port); - pe[port].ps_source_timer = get_time().val + PD_T_PS_SOURCE_ON; + pd_timer_enable(port, PE_TIMER_PS_SOURCE, PD_T_PS_SOURCE_ON); } /* * Transition to PE_SNK_Startup when: * 1) A PS_RDY Message is received. */ - if (pe[port].ps_source_timer != TIMER_DISABLED && + if (!pd_timer_is_disabled(port, PE_TIMER_PS_SOURCE) && PE_CHK_FLAG(port, PE_FLAGS_MSG_RECEIVED)) { int type = PD_HEADER_TYPE(rx_emsg[port].header); int cnt = PD_HEADER_CNT(rx_emsg[port].header); @@ -4407,8 +4398,6 @@ static void pe_prs_src_snk_wait_source_on_run(int port) PE_CLR_FLAG(port, PE_FLAGS_MSG_RECEIVED); if ((ext == 0) && (cnt == 0) && (type == PD_CTRL_PS_RDY)) { - pe[port].ps_source_timer = TIMER_DISABLED; - PE_SET_FLAG(port, PE_FLAGS_PR_SWAP_COMPLETE); set_state_pe(port, PE_SNK_STARTUP); } else { @@ -4428,7 +4417,7 @@ static void pe_prs_src_snk_wait_source_on_run(int port) * 1) The PSSourceOnTimer times out. * 2) PS_RDY not sent after retries. */ - if (get_time().val > pe[port].ps_source_timer || + if (pd_timer_is_expired(port, PE_TIMER_PS_SOURCE) || PE_CHK_FLAG(port, PE_FLAGS_PROTOCOL_ERROR)) { PE_CLR_FLAG(port, PE_FLAGS_PROTOCOL_ERROR); @@ -4439,6 +4428,7 @@ static void pe_prs_src_snk_wait_source_on_run(int port) static void pe_prs_src_snk_wait_source_on_exit(int port) { + pd_timer_disable(port, PE_TIMER_PS_SOURCE); tc_pr_swap_complete(port, PE_CHK_FLAG(port, PE_FLAGS_PR_SWAP_COMPLETE)); } @@ -4594,7 +4584,7 @@ static void pe_prs_snk_src_transition_to_off_entry(int port) !pe_in_frs_mode(port)) tc_snk_power_off(port); - pe[port].ps_source_timer = get_time().val + PD_T_PS_SOURCE_OFF; + pd_timer_enable(port, PE_TIMER_PS_SOURCE, PD_T_PS_SOURCE_OFF); } static void pe_prs_snk_src_transition_to_off_run(int port) @@ -4607,7 +4597,7 @@ static void pe_prs_snk_src_transition_to_off_run(int port) * Transition to ErrorRecovery state when: * 1) The PSSourceOffTimer times out. */ - if (get_time().val > pe[port].ps_source_timer) + if (pd_timer_is_expired(port, PE_TIMER_PS_SOURCE)) set_state_pe(port, PE_WAIT_FOR_ERROR_RECOVERY); /* @@ -4632,6 +4622,11 @@ static void pe_prs_snk_src_transition_to_off_run(int port) } } +static void pe_prs_snk_src_transition_to_off_exit(int port) +{ + pd_timer_disable(port, PE_TIMER_PS_SOURCE); +} + /** * PE_PRS_SNK_SRC_Assert_Rp * PE_FRS_SNK_SRC_Assert_Rp @@ -4676,22 +4671,22 @@ static void pe_prs_snk_src_source_on_entry(int port) * VBUS was enabled when the TypeC state machine entered * Attached.SRC state */ - pe[port].ps_source_timer = get_time().val + - PD_POWER_SUPPLY_TURN_ON_DELAY; + pd_timer_enable(port, PE_TIMER_PS_SOURCE, + PD_POWER_SUPPLY_TURN_ON_DELAY); } static void pe_prs_snk_src_source_on_run(int port) { /* Wait until power supply turns on */ - if (pe[port].ps_source_timer != TIMER_DISABLED) { - if (get_time().val < pe[port].ps_source_timer) + if (!pd_timer_is_disabled(port, PE_TIMER_PS_SOURCE)) { + if (!pd_timer_is_expired(port, PE_TIMER_PS_SOURCE)) return; /* update pe power role */ pe[port].power_role = pd_get_power_role(port); send_ctrl_msg(port, TCPC_TX_SOP, PD_CTRL_PS_RDY); /* reset timer so PD_CTRL_PS_RDY isn't sent again */ - pe[port].ps_source_timer = TIMER_DISABLED; + pd_timer_disable(port, PE_TIMER_PS_SOURCE); } /* @@ -4714,6 +4709,7 @@ static void pe_prs_snk_src_source_on_run(int port) static void pe_prs_snk_src_source_on_exit(int port) { + pd_timer_disable(port, PE_TIMER_PS_SOURCE); tc_pr_swap_complete(port, PE_CHK_FLAG(port, PE_FLAGS_PR_SWAP_COMPLETE)); } @@ -6957,6 +6953,7 @@ static __const_data const struct usb_state pe_states[] = { [PE_PRS_SRC_SNK_TRANSITION_TO_OFF] = { .entry = pe_prs_src_snk_transition_to_off_entry, .run = pe_prs_src_snk_transition_to_off_run, + .exit = pe_prs_src_snk_transition_to_off_exit, }, [PE_PRS_SRC_SNK_ASSERT_RD] = { .entry = pe_prs_src_snk_assert_rd_entry, @@ -6984,6 +6981,7 @@ static __const_data const struct usb_state pe_states[] = { [PE_PRS_SNK_SRC_TRANSITION_TO_OFF] = { .entry = pe_prs_snk_src_transition_to_off_entry, .run = pe_prs_snk_src_transition_to_off_run, + .exit = pe_prs_snk_src_transition_to_off_exit, #ifdef CONFIG_USB_PD_REV30 .parent = &pe_states[PE_PRS_FRS_SHARED], #endif /* CONFIG_USB_PD_REV30 */ |