diff options
author | Sam Hurst <shurst@google.com> | 2021-03-18 11:58:43 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-04-13 16:11:14 +0000 |
commit | 502751aafb75623c4279e1efbcb944e536859690 (patch) | |
tree | 054b1be178267f92fc8305b9223d0c33baf7826d | |
parent | 3a460983d41300a5265bfa91801e75978915b1b3 (diff) | |
download | chrome-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.mk | 2 | ||||
-rw-r--r-- | common/usbc/usb_pe_drp_sm.c | 31 | ||||
-rw-r--r-- | common/usbc/usbc_pd_policy.c | 47 | ||||
-rw-r--r-- | include/usb_pd_policy.h | 41 | ||||
-rw-r--r-- | zephyr/CMakeLists.txt | 1 |
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 |