diff options
Diffstat (limited to 'common/usbc/usb_pe_drp_sm.c')
-rw-r--r-- | common/usbc/usb_pe_drp_sm.c | 197 |
1 files changed, 92 insertions, 105 deletions
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c index 0de098788a..f6cd95463f 100644 --- a/common/usbc/usb_pe_drp_sm.c +++ b/common/usbc/usb_pe_drp_sm.c @@ -21,25 +21,25 @@ #include "system.h" #include "task.h" #include "tcpm/tcpm.h" +#include "util.h" #include "usb_charge.h" #include "usb_common.h" #include "usb_dp_alt_mode.h" -#include "usb_emsg.h" #include "usb_mode.h" #include "usb_mux.h" -#include "usb_pd.h" -#include "usb_pd_dpm_sm.h" +#include "usb_pd_dpm.h" #include "usb_pd_policy.h" +#include "usb_pd.h" #include "usb_pd_tcpm.h" #include "usb_pd_timer.h" #include "usb_pe_private.h" #include "usb_pe_sm.h" -#include "usb_prl_sm.h" -#include "usb_sm.h" #include "usb_tbt_alt_mode.h" +#include "usb_prl_sm.h" #include "usb_tc_sm.h" +#include "usb_emsg.h" +#include "usb_sm.h" #include "usbc_ppc.h" -#include "util.h" /* * USB Policy Engine Sink / Source module @@ -202,91 +202,91 @@ typedef int (*svdm_rsp_func)(int port, uint32_t *payload); /* List of all Policy Engine level states */ enum usb_pe_state { /* Super States */ - PE_PRS_FRS_SHARED, /* pe-st0 */ - PE_VDM_SEND_REQUEST, /* pe-st1 */ + PE_PRS_FRS_SHARED, + PE_VDM_SEND_REQUEST, /* Normal States */ - PE_SRC_STARTUP, /* pe-st2 */ - PE_SRC_DISCOVERY, /* pe-st3 */ - PE_SRC_SEND_CAPABILITIES, /* pe-st4 */ - PE_SRC_NEGOTIATE_CAPABILITY, /* pe-st5 */ - PE_SRC_TRANSITION_SUPPLY, /* pe-st6 */ - PE_SRC_READY, /* pe-st7 */ - PE_SRC_DISABLED, /* pe-st8 */ - PE_SRC_CAPABILITY_RESPONSE, /* pe-st9 */ - PE_SRC_HARD_RESET, /* pe-st10 */ - PE_SRC_HARD_RESET_RECEIVED, /* pe-st11 */ - PE_SRC_TRANSITION_TO_DEFAULT, /* pe-st12 */ - PE_SNK_STARTUP, /* pe-st13 */ - PE_SNK_DISCOVERY, /* pe-st14 */ - PE_SNK_WAIT_FOR_CAPABILITIES, /* pe-st15 */ - PE_SNK_EVALUATE_CAPABILITY, /* pe-st16 */ - PE_SNK_SELECT_CAPABILITY, /* pe-st17 */ - PE_SNK_READY, /* pe-st18 */ - PE_SNK_HARD_RESET, /* pe-st19 */ - PE_SNK_TRANSITION_TO_DEFAULT, /* pe-st20 */ - PE_SNK_GIVE_SINK_CAP, /* pe-st21 */ - PE_SNK_GET_SOURCE_CAP, /* pe-st22 */ - PE_SNK_TRANSITION_SINK, /* pe-st23 */ - PE_SEND_SOFT_RESET, /* pe-st24 */ - PE_SOFT_RESET, /* pe-st25 */ - PE_SEND_NOT_SUPPORTED, /* pe-st26 */ - PE_SRC_PING, /* pe-st27 */ - PE_DRS_EVALUATE_SWAP, /* pe-st28 */ - PE_DRS_CHANGE, /* pe-st29 */ - PE_DRS_SEND_SWAP, /* pe-st30 */ - PE_PRS_SRC_SNK_EVALUATE_SWAP, /* pe-st31 */ - PE_PRS_SRC_SNK_TRANSITION_TO_OFF, /* pe-st32 */ - PE_PRS_SRC_SNK_ASSERT_RD, /* pe-st33 */ - PE_PRS_SRC_SNK_WAIT_SOURCE_ON, /* pe-st34 */ - PE_PRS_SRC_SNK_SEND_SWAP, /* pe-st35 */ - PE_PRS_SNK_SRC_EVALUATE_SWAP, /* pe-st36 */ - PE_PRS_SNK_SRC_TRANSITION_TO_OFF, /* pe-st37 */ - PE_PRS_SNK_SRC_ASSERT_RP, /* pe-st38 */ - PE_PRS_SNK_SRC_SOURCE_ON, /* pe-st39 */ - PE_PRS_SNK_SRC_SEND_SWAP, /* pe-st40 */ - PE_VCS_EVALUATE_SWAP, /* pe-st41 */ - PE_VCS_SEND_SWAP, /* pe-st42 */ - PE_VCS_WAIT_FOR_VCONN_SWAP, /* pe-st43 */ - PE_VCS_TURN_ON_VCONN_SWAP, /* pe-st44 */ - PE_VCS_TURN_OFF_VCONN_SWAP, /* pe-st45 */ - PE_VCS_SEND_PS_RDY_SWAP, /* pe-st46 */ - PE_VCS_CBL_SEND_SOFT_RESET, /* pe-st47 */ - PE_VDM_IDENTITY_REQUEST_CBL, /* pe-st48 */ - PE_INIT_PORT_VDM_IDENTITY_REQUEST, /* pe-st49 */ - PE_INIT_VDM_SVIDS_REQUEST, /* pe-st50 */ - PE_INIT_VDM_MODES_REQUEST, /* pe-st51 */ - PE_VDM_REQUEST_DPM, /* pe-st52 */ - PE_VDM_RESPONSE, /* pe-st53 */ - PE_WAIT_FOR_ERROR_RECOVERY, /* pe-st54 */ - PE_BIST_TX, /* pe-st55 */ - PE_DEU_SEND_ENTER_USB, /* pe-st56 */ - PE_DR_GET_SINK_CAP, /* pe-st57 */ - PE_DR_SNK_GIVE_SOURCE_CAP, /* pe-st58 */ - PE_DR_SRC_GET_SOURCE_CAP, /* pe-st59 */ + PE_SRC_STARTUP, + PE_SRC_DISCOVERY, + PE_SRC_SEND_CAPABILITIES, + PE_SRC_NEGOTIATE_CAPABILITY, + PE_SRC_TRANSITION_SUPPLY, + PE_SRC_READY, + PE_SRC_DISABLED, + PE_SRC_CAPABILITY_RESPONSE, + PE_SRC_HARD_RESET, + PE_SRC_HARD_RESET_RECEIVED, + PE_SRC_TRANSITION_TO_DEFAULT, + PE_SNK_STARTUP, + PE_SNK_DISCOVERY, + PE_SNK_WAIT_FOR_CAPABILITIES, + PE_SNK_EVALUATE_CAPABILITY, + PE_SNK_SELECT_CAPABILITY, + PE_SNK_READY, + PE_SNK_HARD_RESET, + PE_SNK_TRANSITION_TO_DEFAULT, + PE_SNK_GIVE_SINK_CAP, + PE_SNK_GET_SOURCE_CAP, + PE_SNK_TRANSITION_SINK, + PE_SEND_SOFT_RESET, + PE_SOFT_RESET, + PE_SEND_NOT_SUPPORTED, + PE_SRC_PING, + PE_DRS_EVALUATE_SWAP, + PE_DRS_CHANGE, + PE_DRS_SEND_SWAP, + PE_PRS_SRC_SNK_EVALUATE_SWAP, + PE_PRS_SRC_SNK_TRANSITION_TO_OFF, + PE_PRS_SRC_SNK_ASSERT_RD, + PE_PRS_SRC_SNK_WAIT_SOURCE_ON, + PE_PRS_SRC_SNK_SEND_SWAP, + PE_PRS_SNK_SRC_EVALUATE_SWAP, + PE_PRS_SNK_SRC_TRANSITION_TO_OFF, + PE_PRS_SNK_SRC_ASSERT_RP, + PE_PRS_SNK_SRC_SOURCE_ON, + PE_PRS_SNK_SRC_SEND_SWAP, + PE_VCS_EVALUATE_SWAP, + PE_VCS_SEND_SWAP, + PE_VCS_WAIT_FOR_VCONN_SWAP, + PE_VCS_TURN_ON_VCONN_SWAP, + PE_VCS_TURN_OFF_VCONN_SWAP, + PE_VCS_SEND_PS_RDY_SWAP, + PE_VCS_CBL_SEND_SOFT_RESET, + PE_VDM_IDENTITY_REQUEST_CBL, + PE_INIT_PORT_VDM_IDENTITY_REQUEST, + PE_INIT_VDM_SVIDS_REQUEST, + PE_INIT_VDM_MODES_REQUEST, + PE_VDM_REQUEST_DPM, + PE_VDM_RESPONSE, + PE_WAIT_FOR_ERROR_RECOVERY, + PE_BIST_TX, + PE_DEU_SEND_ENTER_USB, + PE_DR_GET_SINK_CAP, + PE_DR_SNK_GIVE_SOURCE_CAP, + PE_DR_SRC_GET_SOURCE_CAP, /* PD3.0 only states below here*/ /* UFP Data Reset States */ - PE_UDR_SEND_DATA_RESET, /* pe-st60 */ - PE_UDR_DATA_RESET_RECEIVED, /* pe-st61 */ - PE_UDR_TURN_OFF_VCONN, /* pe-st62 */ - PE_UDR_SEND_PS_RDY, /* pe-st63 */ - PE_UDR_WAIT_FOR_DATA_RESET_COMPLETE, /* pe-st64 */ + PE_UDR_SEND_DATA_RESET, + PE_UDR_DATA_RESET_RECEIVED, + PE_UDR_TURN_OFF_VCONN, + PE_UDR_SEND_PS_RDY, + PE_UDR_WAIT_FOR_DATA_RESET_COMPLETE, /* DFP Data Reset States */ - PE_DDR_SEND_DATA_RESET, /* pe-st65 */ - PE_DDR_DATA_RESET_RECEIVED, /* pe-st66 */ - PE_DDR_WAIT_FOR_VCONN_OFF, /* pe-st67 */ - PE_DDR_PERFORM_DATA_RESET, /* pe-st68 */ - PE_FRS_SNK_SRC_START_AMS, /* pe-st69 */ - PE_GIVE_BATTERY_CAP, /* pe-st70 */ - PE_GIVE_BATTERY_STATUS, /* pe-st71 */ - PE_GIVE_STATUS, /* pe-st72 */ - PE_SEND_ALERT, /* pe-st73 */ - PE_ALERT_RECEIVED, /* pe-st74 */ - PE_SRC_CHUNK_RECEIVED, /* pe-st75 */ - PE_SNK_CHUNK_RECEIVED, /* pe-st76 */ - PE_VCS_FORCE_VCONN, /* pe-st77 */ - PE_GET_REVISION, /* pe-st78 */ + PE_DDR_SEND_DATA_RESET, + PE_DDR_DATA_RESET_RECEIVED, + PE_DDR_WAIT_FOR_VCONN_OFF, + PE_DDR_PERFORM_DATA_RESET, + PE_FRS_SNK_SRC_START_AMS, + PE_GIVE_BATTERY_CAP, + PE_GIVE_BATTERY_STATUS, + PE_GIVE_STATUS, + PE_SEND_ALERT, + PE_ALERT_RECEIVED, + PE_SRC_CHUNK_RECEIVED, + PE_SNK_CHUNK_RECEIVED, + PE_VCS_FORCE_VCONN, + PE_GET_REVISION, }; /* @@ -2927,17 +2927,11 @@ static void pe_src_ready_run(int port) if (pe_attempt_port_discovery(port)) return; - /* Inform DPM state machine that PE is set for messages */ - dpm_set_pe_ready(port, true); + /* No DPM requests; attempt mode entry/exit if needed */ + dpm_run(port); } } -static void pe_src_ready_exit(int port) -{ - /* Inform DPM state machine that PE is in ready state */ - dpm_set_pe_ready(port, false); -} - /** * PE_SRC_Disabled */ @@ -3809,17 +3803,11 @@ static void pe_snk_ready_run(int port) if (pe_attempt_port_discovery(port)) return; - /* Inform DPM state machine that PE is set for messages */ - dpm_set_pe_ready(port, true); + /* No DPM requests; attempt mode entry/exit if needed */ + dpm_run(port); } } -static void pe_snk_ready_exit(int port) -{ - /* Inform DPM state machine that PE is in ready state */ - dpm_set_pe_ready(port, false); -} - /** * PE_SNK_Hard_Reset */ @@ -6514,7 +6502,7 @@ static void pe_vcs_evaluate_swap_entry(int port) */ /* DPM rejects a VCONN Swap and port is not a VCONN source*/ - if (!tc_check_vconn_swap(port) || tc_is_vconn_src(port) < 1) { + if (!tc_check_vconn_swap(port) && tc_is_vconn_src(port) < 1) { /* NOTE: PE_VCS_Reject_Swap State embedded here */ send_ctrl_msg(port, TCPCI_MSG_SOP, PD_CTRL_REJECT); } @@ -7686,7 +7674,8 @@ static void pe_ddr_perform_data_reset_run(int port) * interpretations are mutually exclusive. Resolve that * ambiguity and update this implementation. */ - set_usb_mux_with_current_data_role(port); + usb_mux_set(port, USB_PD_MUX_NONE, USB_SWITCH_DISCONNECT, + polarity_rm_dts(pd_get_polarity(port))); } else if (IS_ENABLED(CONFIG_USBC_VCONN) && PE_CHK_FLAG(port, PE_FLAGS_VCONN_SWAP_COMPLETE) && tc_is_vconn_src(port)) { @@ -7913,7 +7902,6 @@ static __const_data const struct usb_state pe_states[] = { [PE_SRC_READY] = { .entry = pe_src_ready_entry, .run = pe_src_ready_run, - .exit = pe_src_ready_exit, }, [PE_SRC_DISABLED] = { .entry = pe_src_disabled_entry, @@ -7960,7 +7948,6 @@ static __const_data const struct usb_state pe_states[] = { [PE_SNK_READY] = { .entry = pe_snk_ready_entry, .run = pe_snk_ready_run, - .exit = pe_snk_ready_exit, }, [PE_SNK_HARD_RESET] = { .entry = pe_snk_hard_reset_entry, |