summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbe Levkoy <alevkoy@chromium.org>2023-02-09 16:12:12 -0700
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2023-02-13 22:08:44 +0000
commit13b898fbf00ed8aced0d9758c323a3cd58a8c6a0 (patch)
treefd574df365cfc6eac1dee177ffb546e4f3c956de
parent6a0c42bf25c153f53f6377f1c0b776286771bf2e (diff)
downloadchrome-ec-13b898fbf00ed8aced0d9758c323a3cd58a8c6a0.tar.gz
TCPMv2: Remove PE_FLAGS_VDM_SETUP_DONE
Remove a PE flag that is redundant with the discovery state. Update the discovery state where appropriate to keep it internally consistent. BUG=b:189353401 TEST=voxel: Attach TBT4 hub; verify discovery sequence BRANCH=none Change-Id: I8ea870271ee95eb1dd4633370f7e39ca789f1328 Signed-off-by: Abe Levkoy <alevkoy@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4237156 Reviewed-by: Diana Z <dzigterman@chromium.org>
-rw-r--r--common/usb_pd_discovery.c11
-rw-r--r--common/usbc/usb_pe_drp_sm.c14
-rw-r--r--common/usbc/usb_pe_private.h2
-rw-r--r--include/usb_pd.h7
-rw-r--r--test/usb_pe_drp_old.c39
5 files changed, 55 insertions, 18 deletions
diff --git a/common/usb_pd_discovery.c b/common/usb_pd_discovery.c
index 9cadd197be..3fad82d10d 100644
--- a/common/usb_pd_discovery.c
+++ b/common/usb_pd_discovery.c
@@ -185,6 +185,17 @@ void dfp_consume_modes(int port, enum tcpci_msg_type type, int cnt,
PD_DISC_COMPLETE);
}
+void pd_disable_discovery(int port)
+{
+ /* Mark identity and SVIDs for the port partner and cable as failed.
+ * With no discovered SVIDs, there are no modes to mark as failed.
+ */
+ pd_set_identity_discovery(port, TCPCI_MSG_SOP, PD_DISC_FAIL);
+ pd_set_svids_discovery(port, TCPCI_MSG_SOP, PD_DISC_FAIL);
+ pd_set_identity_discovery(port, TCPCI_MSG_SOP_PRIME, PD_DISC_FAIL);
+ pd_set_svids_discovery(port, TCPCI_MSG_SOP_PRIME, PD_DISC_FAIL);
+}
+
void pd_set_identity_discovery(int port, enum tcpci_msg_type type,
enum pd_discovery_state disc)
{
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c
index 249526d36e..5eb983a89c 100644
--- a/common/usbc/usb_pe_drp_sm.c
+++ b/common/usbc/usb_pe_drp_sm.c
@@ -1927,13 +1927,6 @@ __maybe_unused static bool pe_attempt_port_discovery(int port)
if (!IS_ENABLED(CONFIG_USB_PD_ALT_MODE_DFP))
assert(0);
- /*
- * DONE set once modal entry is successful, discovery completes, or
- * discovery results in a NAK
- */
- if (PE_CHK_FLAG(port, PE_FLAGS_VDM_SETUP_DONE))
- return false;
-
/* Apply Port Discovery DR Swap Policy */
if (port_discovery_dr_swap_policy(
port, pe[port].data_role,
@@ -1951,12 +1944,9 @@ __maybe_unused static bool pe_attempt_port_discovery(int port)
*/
if (pe[port].data_role == PD_ROLE_UFP &&
prl_get_rev(port, TCPCI_MSG_SOP) == PD_REV20) {
- pd_set_identity_discovery(port, TCPCI_MSG_SOP, PD_DISC_FAIL);
- pd_set_identity_discovery(port, TCPCI_MSG_SOP_PRIME,
- PD_DISC_FAIL);
+ pd_disable_discovery(port);
pd_notify_event(port, PD_STATUS_EVENT_SOP_DISC_DONE);
pd_notify_event(port, PD_STATUS_EVENT_SOP_PRIME_DISC_DONE);
- PE_SET_FLAG(port, PE_FLAGS_VDM_SETUP_DONE);
return false;
}
@@ -2009,7 +1999,6 @@ __maybe_unused static bool pe_attempt_port_discovery(int port)
set_state_pe(port, PE_INIT_VDM_MODES_REQUEST);
return true;
} else {
- PE_SET_FLAG(port, PE_FLAGS_VDM_SETUP_DONE);
pd_timer_disable(port, PE_TIMER_DISCOVER_IDENTITY);
return false;
}
@@ -7782,7 +7771,6 @@ void pd_dfp_discovery_init(int port)
BIT(task_get_current()));
memset(pe[port].discovery, 0, sizeof(pe[port].discovery));
- PE_CLR_FLAG(port, PE_FLAGS_VDM_SETUP_DONE);
}
void pd_dfp_mode_init(int port)
diff --git a/common/usbc/usb_pe_private.h b/common/usbc/usb_pe_private.h
index c6703f6fd3..6bbf947bea 100644
--- a/common/usbc/usb_pe_private.h
+++ b/common/usbc/usb_pe_private.h
@@ -48,8 +48,6 @@ enum {
PE_FLAGS_PS_RESET_COMPLETE_FN,
/* VCONN swap operation has completed */
PE_FLAGS_VCONN_SWAP_COMPLETE_FN,
- /* Flag to note no more setup VDMs (discovery, etc.) should be sent */
- PE_FLAGS_VDM_SETUP_DONE_FN,
/* Flag to note PR Swap just completed for Startup entry */
PE_FLAGS_PR_SWAP_COMPLETE_FN,
/* Flag to note FRS/PRS context in shared state machine path */
diff --git a/include/usb_pd.h b/include/usb_pd.h
index 08fa9b1dbd..ddc632e91c 100644
--- a/include/usb_pd.h
+++ b/include/usb_pd.h
@@ -1960,6 +1960,13 @@ void pd_dfp_discovery_init(int port);
void pd_dfp_mode_init(int port);
/**
+ * Mark all discovery types as failed to prevent any further discovery attempts
+ * until a connection change or DPM request triggers discovery again.
+ * @param port USB-C port number
+ */
+void pd_disable_discovery(int port);
+
+/**
* Set identity discovery state for this type and port
*
* @param port USB-C port number
diff --git a/test/usb_pe_drp_old.c b/test/usb_pe_drp_old.c
index 4ea07c1ec9..c352760d1d 100644
--- a/test/usb_pe_drp_old.c
+++ b/test/usb_pe_drp_old.c
@@ -83,11 +83,40 @@ void pd_set_error_recovery(int port)
{
}
+/* Skip discovery (and the corresponding DRS and VCS sequences) by default. A
+ * test may enable this to allow those sequences to run.
+ */
+static bool discovery_enabled;
+
+__override bool port_discovery_dr_swap_policy(int port, enum pd_data_role dr,
+ bool dr_swap_flag)
+{
+ if (!discovery_enabled)
+ return false;
+
+ if (dr_swap_flag && dr == PD_ROLE_UFP)
+ return true;
+
+ return false;
+}
+
+__override bool port_discovery_vconn_swap_policy(int port, bool vconn_swap_flag)
+{
+ if (!discovery_enabled)
+ return false;
+
+ if (IS_ENABLED(CONFIG_USBC_VCONN) && vconn_swap_flag &&
+ !tc_is_vconn_src(port) && tc_check_vconn_swap(port))
+ return true;
+
+ return false;
+}
+
test_static void setup_source(void)
{
/* Start PE. */
task_wait_event(10 * MSEC);
- pe_set_flag(PORT0, PE_FLAGS_VDM_SETUP_DONE);
+ pd_disable_discovery(PORT0);
pe_set_flag(PORT0, PE_FLAGS_EXPLICIT_CONTRACT);
/* As long as we're hacking our way to ready, clear any DPM requests */
pe_clr_dpm_requests(PORT0);
@@ -103,7 +132,7 @@ test_static void setup_sink(void)
task_wait_event(10 * MSEC);
pd_comm_enable(PORT0, 1);
task_wait_event(10 * MSEC);
- pe_set_flag(PORT0, PE_FLAGS_VDM_SETUP_DONE);
+ pd_disable_discovery(PORT0);
pe_set_flag(PORT0, PE_FLAGS_EXPLICIT_CONTRACT);
/* As long as we're hacking our way to ready, clear any DPM requests */
pe_clr_dpm_requests(PORT0);
@@ -131,7 +160,7 @@ static int test_pe_frs(void)
* background tasks (ex. discovery) aren't running.
*/
tc_prs_src_snk_assert_rd(PORT0);
- pe_set_flag(PORT0, PE_FLAGS_VDM_SETUP_DONE);
+ pd_disable_discovery(PORT0);
pe_set_flag(PORT0, PE_FLAGS_EXPLICIT_CONTRACT);
pe_clr_dpm_requests(PORT0);
set_state_pe(PORT0, PE_SNK_READY);
@@ -332,6 +361,8 @@ test_static int test_prl_is_busy(enum pd_power_role pr)
{
int ready_state;
+ discovery_enabled = true;
+
if (pr == PD_ROLE_SOURCE)
ready_state = PE_SRC_READY;
else
@@ -363,6 +394,8 @@ test_static int test_prl_is_busy(enum pd_power_role pr)
*/
TEST_ASSERT(get_state_pe(PORT0) != ready_state);
+ discovery_enabled = false;
+
return EC_SUCCESS;
}