summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorJett Rink <jettrink@chromium.org>2020-03-31 13:44:28 -0600
committerJett Rink <jettrink@chromium.org>2020-04-03 17:06:28 +0000
commit736db12af829d826f0a1247b6a787fcc56d2b060 (patch)
tree044e90f6837e797f9f495cf005bfb1a4b35d1df7 /common
parenta08de50a749ab4ec09ad2b7b32b1605f49d8a5c6 (diff)
downloadchrome-ec-736db12af829d826f0a1247b6a787fcc56d2b060.tar.gz
tcpmv2: move function from TC layer to PE
- Move pd_ function that belong in PE layer to PE layer. Remove the extra pe_ layer. - Remove unnecessary PE and Vconn ifdef guards in TC layer - Remove unused print_dev_info function - Move host commands in TC layer to host command file - Move RW hash stuff from TC to PE, since this only has to do with VDO (Which is a PE layer thing) - Removed dependency for tc_drp test on usbc_fake as we don't really need it anymore once we don't pull in the PRL and PE layers anymore (based on previously landed CLs) BRANCH=none BUG=b:153071799 TEST=everything still builds and passes tests Change-Id: Id1d1efa291c3525f57bc26af9fddda6ddace1b58 Signed-off-by: Jett Rink <jettrink@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2132871
Diffstat (limited to 'common')
-rw-r--r--common/usb_common.c3
-rw-r--r--common/usb_pd_host_cmd.c97
-rw-r--r--common/usb_pd_policy.c6
-rw-r--r--common/usbc/usb_pe_drp_sm.c45
-rw-r--r--common/usbc/usb_tc_drp_acc_trysrc_sm.c163
5 files changed, 136 insertions, 178 deletions
diff --git a/common/usb_common.c b/common/usb_common.c
index 2a3ac922ed..588493b823 100644
--- a/common/usb_common.c
+++ b/common/usb_common.c
@@ -588,6 +588,8 @@ const int pd_snk_pdo_cnt = ARRAY_SIZE(pd_snk_pdo);
#endif /* CONFIG_USB_PD_CUSTOM_PDO */
/* ----------------- Vendor Defined Messages ------------------ */
+#if defined(CONFIG_USB_PE_SM) && !defined(CONFIG_USB_VPD) && \
+ !defined(CONFIG_USB_CTVPD)
__overridable int pd_custom_vdm(int port, int cnt, uint32_t *payload,
uint32_t **rpayload)
{
@@ -650,6 +652,7 @@ __overridable int pd_custom_vdm(int port, int cnt, uint32_t *payload,
return 0;
}
+#endif /* CONFIG_USB_PE_SM && !CONFIG_USB_VPD && !CONFIG_USB_CTVPD */
__overridable bool vboot_allow_usb_pd(void)
{
diff --git a/common/usb_pd_host_cmd.c b/common/usb_pd_host_cmd.c
index d7106c4625..700b2615f7 100644
--- a/common/usb_pd_host_cmd.c
+++ b/common/usb_pd_host_cmd.c
@@ -8,13 +8,14 @@
#include <string.h>
#include "battery.h"
+#include "charge_manager.h"
#include "console.h"
#include "ec_commands.h"
#include "host_command.h"
#include "tcpm.h"
#include "usb_mux.h"
-#include "usb_pd.h"
#include "usb_pd_tcpm.h"
+#include "usb_pd.h"
#ifdef CONFIG_COMMON_RUNTIME
/*
@@ -83,8 +84,7 @@ DECLARE_HOST_COMMAND(EC_CMD_USB_PD_RW_HASH_ENTRY,
EC_VER_MASK(0));
#endif /* CONFIG_HOSTCMD_RWHASHPD */
-#ifndef CONFIG_USB_PD_TCPC
-#ifdef CONFIG_EC_CMD_PD_CHIP_INFO
+#if defined(CONFIG_EC_CMD_PD_CHIP_INFO) && !defined(CONFIG_USB_PD_TCPC)
static enum ec_status hc_remote_pd_chip_info(struct host_cmd_handler_args *args)
{
const struct ec_params_pd_chip_info *p = args->params;
@@ -111,8 +111,7 @@ static enum ec_status hc_remote_pd_chip_info(struct host_cmd_handler_args *args)
DECLARE_HOST_COMMAND(EC_CMD_PD_CHIP_INFO,
hc_remote_pd_chip_info,
EC_VER_MASK(0) | EC_VER_MASK(1));
-#endif /* CONFIG_EC_CMD_PD_CHIP_INFO */
-#endif /* CONFIG_USB_PD_TCPC */
+#endif /* CONFIG_EC_CMD_PD_CHIP_INFO && !CONFIG_USB_PD_TCPC */
#ifdef CONFIG_USB_PD_ALT_MODE_DFP
static enum ec_status hc_remote_pd_set_amode(struct host_cmd_handler_args *args)
@@ -379,6 +378,94 @@ DECLARE_HOST_COMMAND(EC_CMD_USB_PD_CONTROL,
EC_VER_MASK(0) | EC_VER_MASK(1) | EC_VER_MASK(2));
#endif /* CONFIG_COMMON_RUNTIME */
+#if defined(CONFIG_HOSTCMD_FLASHPD) && defined(CONFIG_USB_PD_TCPMV2)
+static enum ec_status hc_remote_flash(struct host_cmd_handler_args *args)
+{
+ const struct ec_params_usb_pd_fw_update *p = args->params;
+ int port = p->port;
+ int rv = EC_RES_SUCCESS;
+ const uint32_t *data = &(p->size) + 1;
+ int i, size;
+
+ if (port >= board_get_usb_pd_port_count())
+ return EC_RES_INVALID_PARAM;
+
+ if (p->size + sizeof(*p) > args->params_size)
+ return EC_RES_INVALID_PARAM;
+
+#if defined(CONFIG_CHARGE_MANAGER) && defined(CONFIG_BATTERY) && \
+ (defined(CONFIG_BATTERY_PRESENT_CUSTOM) || \
+ defined(CONFIG_BATTERY_PRESENT_GPIO))
+ /*
+ * Do not allow PD firmware update if no battery and this port
+ * is sinking power, because we will lose power.
+ */
+ if (battery_is_present() != BP_YES &&
+ charge_manager_get_active_charge_port() == port)
+ return EC_RES_UNAVAILABLE;
+#endif
+
+ switch (p->cmd) {
+ case USB_PD_FW_REBOOT:
+ pd_send_vdm(port, USB_VID_GOOGLE, VDO_CMD_REBOOT, NULL, 0);
+ /*
+ * Return immediately to free pending i2c bus. Host needs to
+ * manage this delay.
+ */
+ return EC_RES_SUCCESS;
+
+ case USB_PD_FW_FLASH_ERASE:
+ pd_send_vdm(port, USB_VID_GOOGLE, VDO_CMD_FLASH_ERASE, NULL, 0);
+ /*
+ * Return immediately. Host needs to manage delays here which
+ * can be as long as 1.2 seconds on 64KB RW flash.
+ */
+ return EC_RES_SUCCESS;
+
+ case USB_PD_FW_ERASE_SIG:
+ pd_send_vdm(port, USB_VID_GOOGLE, VDO_CMD_ERASE_SIG, NULL, 0);
+ break;
+
+ case USB_PD_FW_FLASH_WRITE:
+ /* Data size must be a multiple of 4 */
+ if (!p->size || p->size % 4)
+ return EC_RES_INVALID_PARAM;
+
+ size = p->size / 4;
+ for (i = 0; i < size; i += VDO_MAX_SIZE - 1) {
+ pd_send_vdm(port, USB_VID_GOOGLE, VDO_CMD_FLASH_WRITE,
+ data + i, MIN(size - i, VDO_MAX_SIZE - 1));
+ }
+ return EC_RES_SUCCESS;
+
+ default:
+ return EC_RES_INVALID_PARAM;
+ }
+
+ return rv;
+}
+DECLARE_HOST_COMMAND(EC_CMD_USB_PD_FW_UPDATE,
+ hc_remote_flash,
+ EC_VER_MASK(0));
+#endif /* CONFIG_HOSTCMD_FLASHPD && CONFIG_USB_PD_TCPMV2 */
+
+#ifdef CONFIG_HOSTCMD_EVENTS
+void pd_notify_dp_alt_mode_entry(void)
+{
+ /*
+ * Note: EC_HOST_EVENT_PD_MCU may be a more appropriate host event to
+ * send, but we do not send that here because there are other cases
+ * where we send EC_HOST_EVENT_PD_MCU such as charger insertion or
+ * removal. Currently, those do not wake the system up, but
+ * EC_HOST_EVENT_MODE_CHANGE does. If we made the system wake up on
+ * EC_HOST_EVENT_PD_MCU, we would be turning the internal display on on
+ * every charger insertion/removal, which is not desired.
+ */
+ CPRINTS("Notifying AP of DP Alt Mode Entry...");
+ host_set_single_event(EC_HOST_EVENT_MODE_CHANGE);
+}
+#endif /* CONFIG_HOSTCMD_EVENTS */
+
__overridable enum ec_pd_port_location board_get_pd_port_location(int port)
{
(void)port;
diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c
index 6cb69f5bc5..87d1c47a20 100644
--- a/common/usb_pd_policy.c
+++ b/common/usb_pd_policy.c
@@ -45,12 +45,6 @@ static int dp_alt_mode_entry_get_next_event(uint8_t *data)
}
DECLARE_EVENT_SOURCE(EC_MKBP_EVENT_DP_ALT_MODE_ENTERED,
dp_alt_mode_entry_get_next_event);
-
-void pd_notify_dp_alt_mode_entry(void)
-{
- CPRINTS("Notifying AP of DP Alt Mode Entry...");
- mkbp_send_event(EC_MKBP_EVENT_DP_ALT_MODE_ENTERED);
-}
#endif /* CONFIG_MKBP_EVENT */
#ifdef CONFIG_USB_PD_DUAL_ROLE
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c
index 9f2b3c9c50..15715051f4 100644
--- a/common/usbc/usb_pe_drp_sm.c
+++ b/common/usbc/usb_pe_drp_sm.c
@@ -500,6 +500,10 @@ static struct policy_engine {
uint32_t src_caps[PDO_MAX_OBJECTS];
int src_cap_cnt;
+ /* Attached ChromeOS device id, RW hash, and current RO / RW image */
+ uint16_t dev_id;
+ uint32_t dev_rw_hash[PD_RW_HASH_SIZE/4];
+ enum ec_image current_image;
} pe[CONFIG_USB_PD_PORT_MAX_COUNT];
test_export_static enum usb_pe_state get_state_pe(const int port);
@@ -635,13 +639,13 @@ void pe_got_hard_reset(int port)
}
/*
- * pe_got_frs_signal
+ * pd_got_frs_signal
*
* Called by the handler that detects the FRS signal in order to
* switch PE states to complete the FRS that the hardware has
* started.
*/
-void pe_got_frs_signal(int port)
+void pd_got_frs_signal(int port)
{
PE_SET_FLAG(port, PE_FLAGS_FAST_ROLE_SWAP_SIGNALED);
}
@@ -821,7 +825,7 @@ void pe_message_sent(int port)
PE_SET_FLAG(port, PE_FLAGS_TX_COMPLETE);
}
-void pe_send_vdm(int port, uint32_t vid, int cmd, const uint32_t *data,
+void pd_send_vdm(int port, uint32_t vid, int cmd, const uint32_t *data,
int count)
{
pe[port].partner_type = PORT;
@@ -852,7 +856,7 @@ void pe_exit_dp_mode(int port)
if (!pd_dfp_exit_mode(port, USB_SID_DISPLAYPORT, opos))
return;
- pe_send_vdm(port, USB_SID_DISPLAYPORT,
+ pd_send_vdm(port, USB_SID_DISPLAYPORT,
CMD_EXIT_MODE | VDO_OPOS(opos), NULL, 0);
}
}
@@ -1126,6 +1130,39 @@ static void pe_attempt_port_discovery(int port)
PE_CLR_FLAG(port, PE_FLAGS_WAITING_DR_SWAP);
}
+int pd_dev_store_rw_hash(int port, uint16_t dev_id, uint32_t *rw_hash,
+ uint32_t current_image)
+{
+ pe[port].dev_id = dev_id;
+ memcpy(pe[port].dev_rw_hash, rw_hash, PD_RW_HASH_SIZE);
+#ifdef CONFIG_CMD_PD_DEV_DUMP_INFO
+ pd_dev_dump_info(dev_id, rw_hash);
+#endif
+ pe[port].current_image = current_image;
+
+ if (IS_ENABLED(CONFIG_USB_PD_HOST_CMD)) {
+ int i;
+
+ /* Search table for matching device / hash */
+ for (i = 0; i < RW_HASH_ENTRIES; i++)
+ if (dev_id == rw_hash_table[i].dev_id)
+ return !memcmp(rw_hash,
+ rw_hash_table[i].dev_rw_hash,
+ PD_RW_HASH_SIZE);
+ }
+
+ return 0;
+}
+
+void pd_dev_get_rw_hash(int port, uint16_t *dev_id, uint8_t *rw_hash,
+ uint32_t *current_image)
+{
+ *dev_id = pe[port].dev_id;
+ *current_image = pe[port].current_image;
+ if (*dev_id)
+ memcpy(rw_hash, pe[port].dev_rw_hash, PD_RW_HASH_SIZE);
+}
+
/*
* This function must only be called from the PE_SNK_READY entry and
* PE_SRC_READY entry State.
diff --git a/common/usbc/usb_tc_drp_acc_trysrc_sm.c b/common/usbc/usb_tc_drp_acc_trysrc_sm.c
index b8ceb5b7da..3b310c012e 100644
--- a/common/usbc/usb_tc_drp_acc_trysrc_sm.c
+++ b/common/usbc/usb_tc_drp_acc_trysrc_sm.c
@@ -250,10 +250,6 @@ static struct type_c {
typec_current_t typec_curr;
/* Type-C current change */
typec_current_t typec_curr_change;
- /* Attached ChromeOS device id, RW hash, and current RO / RW image */
- uint16_t dev_id;
- uint32_t dev_rw_hash[PD_RW_HASH_SIZE/4];
- enum ec_image current_image;
} tc[CONFIG_USB_PD_PORT_MAX_COUNT];
/* Port dual-role state */
@@ -264,11 +260,7 @@ enum pd_dual_role_states drp_state[CONFIG_USB_PD_PORT_MAX_COUNT] = {
static uint8_t saved_flgs[CONFIG_USB_PD_PORT_MAX_COUNT];
-#ifdef CONFIG_USBC_VCONN
static void set_vconn(int port, int enable);
-#endif
-
-#ifdef CONFIG_USB_PE_SM
#ifdef CONFIG_USB_PD_ALT_MODE_DFP
/* Tracker for which task is waiting on sysjump prep to finish */
@@ -283,7 +275,6 @@ static void handle_new_power_state(int port);
#endif /* CONFIG_POWER_COMMON */
static void pd_update_dual_role_config(int port);
-#endif /* CONFIG_USB_PE_SM */
/* Forward declare common, private functions */
static void set_state_tc(const int port, const enum usb_tc_state new_state);
@@ -449,7 +440,6 @@ void pd_set_dual_role(int port, enum pd_dual_role_states state)
PD_EVENT_UPDATE_DUAL_ROLE, 0);
}
-#ifdef CONFIG_USB_PE_SM
bool pd_get_partner_data_swap_capable(int port)
{
/* return data swap capable status of port partner */
@@ -461,12 +451,6 @@ int pd_comm_is_enabled(int port)
return tc_get_pd_enabled(port);
}
-void pd_send_vdm(int port, uint32_t vid, int cmd, const uint32_t *data,
- int count)
-{
- pe_send_vdm(port, vid, cmd, data, count);
-}
-
void pd_request_data_swap(int port)
{
/*
@@ -525,41 +509,6 @@ static inline void pd_dev_dump_info(uint16_t dev_id, uint32_t *hash)
}
#endif /* CONFIG_CMD_PD_DEV_DUMP_INFO */
-int pd_dev_store_rw_hash(int port, uint16_t dev_id, uint32_t *rw_hash,
- uint32_t current_image)
-{
- int i;
-
- tc[port].dev_id = dev_id;
- memcpy(tc[port].dev_rw_hash, rw_hash, PD_RW_HASH_SIZE);
-#ifdef CONFIG_CMD_PD_DEV_DUMP_INFO
- pd_dev_dump_info(dev_id, rw_hash);
-#endif
- tc[port].current_image = current_image;
-
- /* Search table for matching device / hash */
- for (i = 0; i < RW_HASH_ENTRIES; i++)
- if (dev_id == rw_hash_table[i].dev_id)
- return !memcmp(rw_hash,
- rw_hash_table[i].dev_rw_hash,
- PD_RW_HASH_SIZE);
- return 0;
-}
-
-void pd_dev_get_rw_hash(int port, uint16_t *dev_id, uint8_t *rw_hash,
- uint32_t *current_image)
-{
- *dev_id = tc[port].dev_id;
- *current_image = tc[port].current_image;
- if (*dev_id)
- memcpy(rw_hash, tc[port].dev_rw_hash, PD_RW_HASH_SIZE);
-}
-
-void pd_got_frs_signal(int port)
-{
- pe_got_frs_signal(port);
-}
-
const char *tc_get_current_state(int port)
{
return tc_state_names[get_state_tc(port)];
@@ -570,18 +519,6 @@ uint32_t tc_get_flags(int port)
return tc[port].flags;
}
-void tc_print_dev_info(int port)
-{
- int i;
-
- ccprintf("Hash ");
- for (i = 0; i < PD_RW_HASH_SIZE / 4; i++)
- ccprintf("%08x ", tc[port].dev_rw_hash[i]);
-
- ccprintf("\nImage %s\n", ec_image_to_string(
- tc[port].current_image));
-}
-
int tc_is_attached_src(int port)
{
return get_state_tc(port) == TC_ATTACHED_SRC;
@@ -694,7 +631,6 @@ void tc_disc_ident_complete(int port)
{
TC_CLR_FLAG(port, TC_FLAGS_DISC_IDENT_IN_PROGRESS);
}
-#endif /* CONFIG_USB_PE_SM */
void tc_try_src_override(enum try_src_override_t ov)
{
@@ -1154,16 +1090,13 @@ static void print_current_state(const int port)
CPRINTS("C%d: %s", port, tc_state_names[get_state_tc(port)]);
}
-#ifdef CONFIG_USB_PE_SM
static void handle_device_access(int port)
{
tc[port].low_power_time = get_time().val + PD_LPM_DEBOUNCE_US;
}
-#endif
void tc_event_check(int port, int evt)
{
-#ifdef CONFIG_USB_PE_SM
if (IS_ENABLED(CONFIG_USB_PD_TCPC_LOW_POWER)) {
if (evt & PD_EXIT_LOW_POWER_EVENT_MASK)
TC_SET_FLAG(port, TC_FLAGS_WAKE_FROM_LPM);
@@ -1201,7 +1134,6 @@ void tc_event_check(int port, int evt)
if (evt & PD_EVENT_UPDATE_DUAL_ROLE)
pd_update_dual_role_config(port);
-#endif
}
/*
@@ -1290,7 +1222,6 @@ static void set_vconn(int port, int enable)
ppc_set_vconn(port, enable);
}
-#ifdef CONFIG_USB_PE_SM
/* This must only be called from the PD task */
static void pd_update_dual_role_config(int port)
{
@@ -1346,99 +1277,6 @@ static void handle_new_power_state(int port)
}
#endif /* CONFIG_POWER_COMMON */
-/*
- * HOST COMMANDS
- */
-#ifdef HAS_TASK_HOSTCMD
-
-static enum ec_status hc_remote_flash(struct host_cmd_handler_args *args)
-{
- const struct ec_params_usb_pd_fw_update *p = args->params;
- int port = p->port;
- int rv = EC_RES_SUCCESS;
- const uint32_t *data = &(p->size) + 1;
- int i, size;
-
- if (port >= board_get_usb_pd_port_count())
- return EC_RES_INVALID_PARAM;
-
- if (p->size + sizeof(*p) > args->params_size)
- return EC_RES_INVALID_PARAM;
-
-#if defined(CONFIG_BATTERY) && \
- (defined(CONFIG_BATTERY_PRESENT_CUSTOM) || \
- defined(CONFIG_BATTERY_PRESENT_GPIO))
- /*
- * Do not allow PD firmware update if no battery and this port
- * is sinking power, because we will lose power.
- */
- if (battery_is_present() != BP_YES &&
- charge_manager_get_active_charge_port() == port)
- return EC_RES_UNAVAILABLE;
-#endif
-
- switch (p->cmd) {
- case USB_PD_FW_REBOOT:
- pe_send_vdm(port, USB_VID_GOOGLE, VDO_CMD_REBOOT, NULL, 0);
- /*
- * Return immediately to free pending i2c bus. Host needs to
- * manage this delay.
- */
- return EC_RES_SUCCESS;
-
- case USB_PD_FW_FLASH_ERASE:
- pe_send_vdm(port, USB_VID_GOOGLE, VDO_CMD_FLASH_ERASE, NULL, 0);
- /*
- * Return immediately. Host needs to manage delays here which
- * can be as long as 1.2 seconds on 64KB RW flash.
- */
- return EC_RES_SUCCESS;
-
- case USB_PD_FW_ERASE_SIG:
- pe_send_vdm(port, USB_VID_GOOGLE, VDO_CMD_ERASE_SIG, NULL, 0);
- break;
-
- case USB_PD_FW_FLASH_WRITE:
- /* Data size must be a multiple of 4 */
- if (!p->size || p->size % 4)
- return EC_RES_INVALID_PARAM;
-
- size = p->size / 4;
- for (i = 0; i < size; i += VDO_MAX_SIZE - 1) {
- pe_send_vdm(port, USB_VID_GOOGLE, VDO_CMD_FLASH_WRITE,
- data + i, MIN(size - i, VDO_MAX_SIZE - 1));
- }
- return EC_RES_SUCCESS;
-
- default:
- return EC_RES_INVALID_PARAM;
- }
-
- return rv;
-}
-DECLARE_HOST_COMMAND(EC_CMD_USB_PD_FW_UPDATE,
- hc_remote_flash,
- EC_VER_MASK(0));
-
-#ifdef CONFIG_HOSTCMD_EVENTS
-void pd_notify_dp_alt_mode_entry(void)
-{
- /*
- * Note: EC_HOST_EVENT_PD_MCU may be a more appropriate host event to
- * send, but we do not send that here because there are other cases
- * where we send EC_HOST_EVENT_PD_MCU such as charger insertion or
- * removal. Currently, those do not wake the system up, but
- * EC_HOST_EVENT_MODE_CHANGE does. If we made the system wake up on
- * EC_HOST_EVENT_PD_MCU, we would be turning the internal display on on
- * every charger insertion/removal, which is not desired.
- */
- CPRINTS("Notifying AP of DP Alt Mode Entry...");
- host_set_single_event(EC_HOST_EVENT_MODE_CHANGE);
-}
-#endif /* CONFIG_HOSTCMD_EVENTS */
-
-#endif /* HAS_TASK_HOSTCMD */
-
#if defined(CONFIG_USB_PD_ALT_MODE) && !defined(CONFIG_USB_PD_ALT_MODE_DFP)
void pd_send_hpd(int port, enum hpd_event hpd)
{
@@ -1461,7 +1299,6 @@ void pd_send_hpd(int port, enum hpd_event hpd)
VDO_OPOS(opos) | CMD_ATTENTION, data, 1);
}
#endif
-#endif /* CONFIG_USB_PE_SM */
#ifdef CONFIG_USBC_VCONN_SWAP
void pd_request_vconn_swap_off(int port)