summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Hurst <shurst@google.com>2021-03-18 11:58:43 -0700
committerCommit Bot <commit-bot@chromium.org>2021-04-13 16:11:14 +0000
commit502751aafb75623c4279e1efbcb944e536859690 (patch)
tree054b1be178267f92fc8305b9223d0c33baf7826d
parent3a460983d41300a5265bfa91801e75978915b1b3 (diff)
downloadchrome-ec-502751aafb75623c4279e1efbcb944e536859690.tar.gz
TCPMV2: Default PD Policy Management
A simple implementation to manage PD Policies on honeybun devices. This is meant as an interim solution until a more robust solution is implemented BUG=b:183026242 BRANCH=none TEST=make runtests Tested on Voxel by plugging in a dock Signed-off-by: Sam Hurst <shurst@google.com> Change-Id: Ib8b38754e21b8497fe28855a7f80d2962a4ae7f4 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2774128 Reviewed-by: Yuval Peress <peress@chromium.org> Reviewed-by: Diana Z <dzigterman@chromium.org> Commit-Queue: Diana Z <dzigterman@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2821459 Tested-by: Abe Levkoy <alevkoy@chromium.org> Reviewed-by: Abe Levkoy <alevkoy@chromium.org> Commit-Queue: Abe Levkoy <alevkoy@chromium.org>
-rw-r--r--common/usbc/build.mk2
-rw-r--r--common/usbc/usb_pe_drp_sm.c31
-rw-r--r--common/usbc/usbc_pd_policy.c47
-rw-r--r--include/usb_pd_policy.h41
-rw-r--r--zephyr/CMakeLists.txt1
5 files changed, 104 insertions, 18 deletions
diff --git a/common/usbc/build.mk b/common/usbc/build.mk
index 82d9928f8e..48ab5351b8 100644
--- a/common/usbc/build.mk
+++ b/common/usbc/build.mk
@@ -28,6 +28,7 @@ endif # CONFIG_USB_PRL_SM
ifneq ($(CONFIG_USB_PE_SM),)
all-obj-$(CONFIG_USB_VPD)+=$(_usbc_dir)usb_pe_ctvpd_sm.o
all-obj-$(CONFIG_USB_CTVPD)+=$(_usbc_dir)usb_pe_ctvpd_sm.o
+all-obj-$(CONFIG_USB_DRP_ACC_TRYSRC)+=$(_usbc_dir)usbc_pd_policy.o
all-obj-$(CONFIG_USB_DRP_ACC_TRYSRC)+=$(_usbc_dir)usb_pe_drp_sm.o
all-obj-$(CONFIG_USB_DRP_ACC_TRYSRC)+=$(_usbc_dir)usb_pd_dpm.o
all-obj-$(CONFIG_USB_DRP_ACC_TRYSRC)+=$(_usbc_dir)dp_alt_mode.o
@@ -45,5 +46,6 @@ all-obj-$(CONFIG_USB_PD_ALT_MODE_UFP_DP)+=$(_usbc_dir)usb_pd_dp_ufp.o
endif # CONFIG_USB_PD_TCPMV2
# For testing
+all-obj-$(CONFIG_TEST_USB_PE_SM)+=$(_usbc_dir)usbc_pd_policy.o
all-obj-$(CONFIG_TEST_USB_PE_SM)+=$(_usbc_dir)usb_pe_drp_sm.o
all-obj-$(CONFIG_TEST_SM)+=$(_usbc_dir)usb_sm.o
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c
index 634df36829..66a5bf4c50 100644
--- a/common/usbc/usb_pe_drp_sm.c
+++ b/common/usbc/usb_pe_drp_sm.c
@@ -23,6 +23,7 @@
#include "usb_dp_alt_mode.h"
#include "usb_mode.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"
@@ -1806,29 +1807,23 @@ __maybe_unused static bool pe_attempt_port_discovery(int port)
if (PE_CHK_FLAG(port, PE_FLAGS_VDM_SETUP_DONE))
return false;
- /*
- * TODO: POLICY decision: move policy functionality out to a separate
- * file. For now, try once to become DFP/Vconn source
- */
- if (PE_CHK_FLAG(port, PE_FLAGS_DR_SWAP_TO_DFP)) {
+ /* Apply Port Discovery DR Swap Policy */
+ if (port_discovery_dr_swap_policy(port, pe[port].data_role,
+ PE_CHK_FLAG(port, PE_FLAGS_DR_SWAP_TO_DFP))) {
+ PE_SET_FLAG(port, PE_FLAGS_LOCALLY_INITIATED_AMS);
PE_CLR_FLAG(port, PE_FLAGS_DR_SWAP_TO_DFP);
-
- if (pe[port].data_role == PD_ROLE_UFP) {
- PE_SET_FLAG(port, PE_FLAGS_LOCALLY_INITIATED_AMS);
- set_state_pe(port, PE_DRS_SEND_SWAP);
- return true;
- }
+ set_state_pe(port, PE_DRS_SEND_SWAP);
+ return true;
}
+ /* Apply Port Discovery VCONN Swap Policy */
if (IS_ENABLED(CONFIG_USBC_VCONN) &&
- PE_CHK_FLAG(port, PE_FLAGS_VCONN_SWAP_TO_ON)) {
+ port_discovery_vconn_swap_policy(port,
+ PE_CHK_FLAG(port, PE_FLAGS_VCONN_SWAP_TO_ON))) {
+ PE_SET_FLAG(port, PE_FLAGS_LOCALLY_INITIATED_AMS);
PE_CLR_FLAG(port, PE_FLAGS_VCONN_SWAP_TO_ON);
-
- if (!tc_is_vconn_src(port)) {
- PE_SET_FLAG(port, PE_FLAGS_LOCALLY_INITIATED_AMS);
- set_state_pe(port, PE_VCS_SEND_SWAP);
- return true;
- }
+ set_state_pe(port, PE_VCS_SEND_SWAP);
+ return true;
}
/* If mode entry was successful, disable the timer */
diff --git a/common/usbc/usbc_pd_policy.c b/common/usbc/usbc_pd_policy.c
new file mode 100644
index 0000000000..2170734d6a
--- /dev/null
+++ b/common/usbc/usbc_pd_policy.c
@@ -0,0 +1,47 @@
+/* Copyright 2021 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "console.h"
+#include "ec_commands.h"
+#include "usb_pe_sm.h"
+#include "usb_tc_sm.h"
+
+/*
+ * TODO(b:159715784): Implement a more robust solution
+ * to managing PD Policies.
+ */
+
+/*
+ * Default Port Discovery DR Swap Policy.
+ *
+ * 1) If dr_swap_to_dfp_flag == true and port data role is UFP,
+ * transition to pe_drs_send_swap
+ */
+__overridable bool port_discovery_dr_swap_policy(int port,
+ enum pd_data_role dr, bool dr_swap_flag)
+{
+ if (dr_swap_flag && dr == PD_ROLE_UFP)
+ return true;
+
+ /* Do not perform a DR swap */
+ return false;
+}
+
+/*
+ * Default Port Discovery VCONN Swap Policy.
+ *
+ * 1) If vconn_swap_to_on_flag == true and vconn is currently off,
+ * transition to pe_vcs_send_swap
+ */
+__overridable bool port_discovery_vconn_swap_policy(int port,
+ bool vconn_swap_flag)
+{
+ if (IS_ENABLED(CONFIG_USBC_VCONN) && vconn_swap_flag &&
+ !tc_is_vconn_src(port))
+ return true;
+
+ /* Do not perform a VCONN swap */
+ return false;
+}
diff --git a/include/usb_pd_policy.h b/include/usb_pd_policy.h
new file mode 100644
index 0000000000..a4f0c64ea6
--- /dev/null
+++ b/include/usb_pd_policy.h
@@ -0,0 +1,41 @@
+/* Copyright 2021 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/* USBC PD Default Policies */
+
+#ifndef __CROS_EC_USB_PD_POLICY_H
+#define __CROS_EC_USB_PD_POLICY_H
+
+#include "usb_pe_sm.h"
+
+/**
+ * Port Discovery DR Swap Policy
+ *
+ * Different boards can implement its own DR swap policy during a port discovery
+ * by implementing this function.
+ *
+ * @param port USB-C port number
+ * @param dr current port data role
+ * @param dr_swap_flag Data Role Swap Flag bit
+ * @param return True if state machine should perform a DR swap, elsf False
+ */
+__override_proto bool port_discovery_dr_swap_policy(int port,
+ enum pd_data_role dr, bool dr_swap_flag);
+
+/**
+ * Port Discovery VCONN Swap Policy
+ *
+ * Different boards can implement its own VCONN swap policy during a port
+ * discovery by implementing this function.
+ *
+ * @param port USB-C port number
+ * @param vconn_swap_to_on_flag Vconn Swap to On Flag bit
+ * @param return True if state machine should perform a VCONN swap, elsf False
+ */
+__override_proto bool port_discovery_vconn_swap_policy(int port,
+ bool vconn_swap_flag);
+
+#endif /* __CROS_EC_USB_PD_POLICY_H */
+
diff --git a/zephyr/CMakeLists.txt b/zephyr/CMakeLists.txt
index 2830be499b..46747fed5a 100644
--- a/zephyr/CMakeLists.txt
+++ b/zephyr/CMakeLists.txt
@@ -219,6 +219,7 @@ zephyr_sources_ifdef(CONFIG_PLATFORM_EC_USB_DRP_ACC_TRYSRC
"${PLATFORM_EC}/common/usbc/usb_tc_drp_acc_trysrc_sm.c"
"${PLATFORM_EC}/common/usbc/usb_pe_drp_sm.c"
"${PLATFORM_EC}/common/usbc/usb_pd_dpm.c"
+ "${PLATFORM_EC}/common/usbc/usbc_pd_policy.c"
"${PLATFORM_EC}/common/usbc/dp_alt_mode.c")
zephyr_sources_ifdef(CONFIG_PLATFORM_EC_USB_PRL_SM