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, 105 insertions, 92 deletions
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c index f6cd95463f..0de098788a 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_dpm.h" -#include "usb_pd_policy.h" #include "usb_pd.h" +#include "usb_pd_dpm_sm.h" +#include "usb_pd_policy.h" #include "usb_pd_tcpm.h" #include "usb_pd_timer.h" #include "usb_pe_private.h" #include "usb_pe_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 "usb_tbt_alt_mode.h" +#include "usb_tc_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_VDM_SEND_REQUEST, + PE_PRS_FRS_SHARED, /* pe-st0 */ + PE_VDM_SEND_REQUEST, /* pe-st1 */ /* Normal States */ - 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, + 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 */ /* PD3.0 only states below here*/ /* UFP Data Reset States */ - 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, + 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 */ /* DFP Data Reset States */ - 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, + 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 */ }; /* @@ -2927,11 +2927,17 @@ static void pe_src_ready_run(int port) if (pe_attempt_port_discovery(port)) return; - /* No DPM requests; attempt mode entry/exit if needed */ - dpm_run(port); + /* Inform DPM state machine that PE is set for messages */ + dpm_set_pe_ready(port, true); } } +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 */ @@ -3803,11 +3809,17 @@ static void pe_snk_ready_run(int port) if (pe_attempt_port_discovery(port)) return; - /* No DPM requests; attempt mode entry/exit if needed */ - dpm_run(port); + /* Inform DPM state machine that PE is set for messages */ + dpm_set_pe_ready(port, true); } } +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 */ @@ -6502,7 +6514,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); } @@ -7674,8 +7686,7 @@ static void pe_ddr_perform_data_reset_run(int port) * interpretations are mutually exclusive. Resolve that * ambiguity and update this implementation. */ - usb_mux_set(port, USB_PD_MUX_NONE, USB_SWITCH_DISCONNECT, - polarity_rm_dts(pd_get_polarity(port))); + set_usb_mux_with_current_data_role(port); } else if (IS_ENABLED(CONFIG_USBC_VCONN) && PE_CHK_FLAG(port, PE_FLAGS_VCONN_SWAP_COMPLETE) && tc_is_vconn_src(port)) { @@ -7902,6 +7913,7 @@ 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, @@ -7948,6 +7960,7 @@ 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, |