summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Chao <scott_chao@wistron.corp-partner.google.com>2022-09-08 08:38:03 +0800
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-10-06 00:12:15 +0000
commit52a51c53a022bc5d3905654a5e2ccae35ad3a506 (patch)
treed73e9d3f98ec458b4b30fe1fedfde275edca4be4
parentbcd18f426a4b5fae16074c2a0b24793c6d3ddaf1 (diff)
downloadchrome-ec-52a51c53a022bc5d3905654a5e2ccae35ad3a506.tar.gz
ectool: support bist share mode enable/disable command
Add bist share mode enable/ disable command. This command will only be effective if system is unlocked. Tested this command by sending Get_Source_Cap command. DUT will return Source Cap with 5V/3A after BIST share mode be enabled. BUG=b:242957100 BRANCH=none TEST=ectool typeccontrol 0 5 [0 | 1] TEST=./twister -v -T zephyr/test TEST=make buildall Change-Id: I307596b9b59d60b72ff1e594919fadfb644dcc53 Signed-off-by: Scott Chao <scott_chao@wistron.corp-partner.google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3881522 Reviewed-by: Diana Z <dzigterman@chromium.org> Code-Coverage: Zoss <zoss-cl-coverage@prod.google.com>
-rw-r--r--common/usbc/usb_pd_dpm.c21
-rw-r--r--common/usbc/usb_pd_host.c3
-rw-r--r--include/ec_commands.h3
-rw-r--r--include/usb_pd_dpm.h9
-rw-r--r--util/ectool.cc18
-rw-r--r--zephyr/test/drivers/common/include/test/drivers/utils.h9
-rw-r--r--zephyr/test/drivers/common/src/utils.c14
-rw-r--r--zephyr/test/drivers/default/src/integration/usbc/usb_pd_bist_shared.c26
8 files changed, 102 insertions, 1 deletions
diff --git a/common/usbc/usb_pd_dpm.c b/common/usbc/usb_pd_dpm.c
index 9d951109c0..3af3ac3dbe 100644
--- a/common/usbc/usb_pd_dpm.c
+++ b/common/usbc/usb_pd_dpm.c
@@ -1159,3 +1159,24 @@ int dpm_get_status_msg(int port, uint8_t *msg, uint32_t *len)
memcpy(msg, &sdb, *len);
return EC_SUCCESS;
}
+
+enum ec_status pd_set_bist_share_mode(uint8_t enable)
+{
+ /*
+ * This command is not allowed if system is locked.
+ */
+ if (CONFIG_USB_PD_3A_PORTS == 0 || system_is_locked())
+ return EC_RES_ACCESS_DENIED;
+
+ if (enable)
+ bist_shared_mode_enabled = true;
+ else
+ bist_shared_mode_enabled = false;
+
+ return EC_RES_SUCCESS;
+}
+
+uint8_t pd_get_bist_share_mode(void)
+{
+ return bist_shared_mode_enabled;
+}
diff --git a/common/usbc/usb_pd_host.c b/common/usbc/usb_pd_host.c
index 5d22e8ecd3..1e2965d114 100644
--- a/common/usbc/usb_pd_host.c
+++ b/common/usbc/usb_pd_host.c
@@ -12,6 +12,7 @@
#include "host_command.h"
#include "usb_mux.h"
#include "usb_pd.h"
+#include "usb_pd_dpm.h"
#include "usb_pd_tcpm.h"
#include "util.h"
@@ -137,6 +138,8 @@ static enum ec_status hc_typec_control(struct host_cmd_handler_args *args)
USB_SWITCH_CONNECT,
polarity_rm_dts(pd_get_polarity(p->port)));
return EC_RES_SUCCESS;
+ case TYPEC_CONTROL_COMMAND_BIST_SHARE_MODE:
+ return pd_set_bist_share_mode(p->bist_share_mode);
default:
return EC_RES_INVALID_PARAM;
}
diff --git a/include/ec_commands.h b/include/ec_commands.h
index a4ec6a00ed..2d4e1b8aac 100644
--- a/include/ec_commands.h
+++ b/include/ec_commands.h
@@ -6769,6 +6769,7 @@ enum typec_control_command {
TYPEC_CONTROL_COMMAND_ENTER_MODE,
TYPEC_CONTROL_COMMAND_TBT_UFP_REPLY,
TYPEC_CONTROL_COMMAND_USB_MUX_SET,
+ TYPEC_CONTROL_COMMAND_BIST_SHARE_MODE,
};
/* Modes (USB or alternate) that a type-C port may enter. */
@@ -6813,6 +6814,8 @@ struct ec_params_typec_control {
uint8_t tbt_ufp_reply;
/* Used for USB_MUX_SET */
struct typec_usb_mux_set mux_params;
+ /* Used for BIST_SHARE_MODE */
+ uint8_t bist_share_mode;
uint8_t placeholder[128];
};
} __ec_align1;
diff --git a/include/usb_pd_dpm.h b/include/usb_pd_dpm.h
index 083ef216b6..c74357d588 100644
--- a/include/usb_pd_dpm.h
+++ b/include/usb_pd_dpm.h
@@ -145,6 +145,15 @@ void dpm_bist_shared_mode_enter(int port);
void dpm_bist_shared_mode_exit(int port);
/*
+ * Set BIST Shared Test Mode
+ */
+enum ec_status pd_set_bist_share_mode(uint8_t enable);
+
+/*
+ * Get BIST Shared Test Mode status
+ */
+uint8_t pd_get_bist_share_mode(void);
+/*
* Build SOP Status Data Block (SDB)
*
* @param port USB-C port number
diff --git a/util/ectool.cc b/util/ectool.cc
index dc0ff723d8..89b4926303 100644
--- a/util/ectool.cc
+++ b/util/ectool.cc
@@ -10162,7 +10162,9 @@ int cmd_typec_control(int argc, char *argv[])
" 4: Set USB mux mode\n"
" args: <mux_index> <mux_mode>\n"
" <mux_mode> is one of: dp, dock, usb, tbt,\n"
- " usb4, none, safe\n",
+ " usb4, none, safe\n"
+ " 5: Enable bist share mode\n"
+ " args: <0: DISABLE, 1: ENABLE>\n",
argv[0]);
return -1;
}
@@ -10252,6 +10254,20 @@ int cmd_typec_control(int argc, char *argv[])
return -1;
}
break;
+ case TYPEC_CONTROL_COMMAND_BIST_SHARE_MODE:
+ if (argc < 4) {
+ fprintf(stderr, "Missing reply\n");
+ return -1;
+ }
+
+ conversion_result = strtol(argv[3], &endptr, 0);
+ if ((endptr && *endptr) || conversion_result > UINT8_MAX ||
+ conversion_result < 0) {
+ fprintf(stderr, "Bad index\n");
+ return -1;
+ }
+ p.bist_share_mode = conversion_result;
+ break;
}
rv = ec_command(EC_CMD_TYPEC_CONTROL, 0, &p, sizeof(p), ec_inbuf,
diff --git a/zephyr/test/drivers/common/include/test/drivers/utils.h b/zephyr/test/drivers/common/include/test/drivers/utils.h
index 306f2894d4..1b69ac23bd 100644
--- a/zephyr/test/drivers/common/include/test/drivers/utils.h
+++ b/zephyr/test/drivers/common/include/test/drivers/utils.h
@@ -492,6 +492,15 @@ void host_cmd_typec_control_usb_mux_set(int port,
*/
void host_cmd_typec_control_clear_events(int port, uint32_t events);
+/**
+ * Run the host command to control PD port behavior, with the sub-command of
+ * TYPEC_CONTROL_COMMAND_BIST_SHARE_MODE
+ *
+ * @param port The USB-C port number
+ * @param enable enable bist share mode or not
+ */
+void host_cmd_typec_control_bist_share_mode(int port, int enable);
+
struct host_events_ctx {
host_event_t lpc_host_events;
host_event_t lpc_host_event_mask[LPC_HOST_EVENT_COUNT];
diff --git a/zephyr/test/drivers/common/src/utils.c b/zephyr/test/drivers/common/src/utils.c
index f083300886..798513fc8f 100644
--- a/zephyr/test/drivers/common/src/utils.c
+++ b/zephyr/test/drivers/common/src/utils.c
@@ -536,6 +536,20 @@ void host_cmd_typec_control_clear_events(int port, uint32_t events)
"Failed to send Type-C control for port %d", port);
}
+void host_cmd_typec_control_bist_share_mode(int port, int enable)
+{
+ struct ec_params_typec_control params = {
+ .port = port,
+ .command = TYPEC_CONTROL_COMMAND_BIST_SHARE_MODE,
+ .bist_share_mode = enable
+ };
+ struct host_cmd_handler_args args =
+ BUILD_HOST_COMMAND_PARAMS(EC_CMD_TYPEC_CONTROL, 0, params);
+
+ zassume_ok(host_command_process(&args),
+ "Failed to send Type-C control for port %d", port);
+}
+
void host_cmd_usb_pd_get_amode(
uint8_t port, uint16_t svid_idx,
struct ec_params_usb_pd_get_mode_response *response, int *response_size)
diff --git a/zephyr/test/drivers/default/src/integration/usbc/usb_pd_bist_shared.c b/zephyr/test/drivers/default/src/integration/usbc/usb_pd_bist_shared.c
index 9c76f862f8..bf51c9814d 100644
--- a/zephyr/test/drivers/default/src/integration/usbc/usb_pd_bist_shared.c
+++ b/zephyr/test/drivers/default/src/integration/usbc/usb_pd_bist_shared.c
@@ -73,6 +73,7 @@ static void usb_pd_bist_shared_after(void *data)
disconnect_sink_from_port(test_fixture->tcpci_emul);
disconnect_source_from_port(test_fixture->tcpci_ps8xxx_emul,
test_fixture->charger_emul);
+ host_cmd_typec_control_bist_share_mode(USBC_PORT_C0, 0);
}
ZTEST_SUITE(usb_pd_bist_shared, drivers_predicate_post_main,
@@ -191,3 +192,28 @@ ZTEST_F(usb_pd_bist_shared, verify_bist_shared_exit_no_action)
f5v_cap = fixture->snk_ext_500ma.last_5v_source_cap;
zassert_equal(f5v_cap, 0, "Received unexpected source cap");
}
+
+ZTEST_F(usb_pd_bist_shared, verify_control_bist_shared_mode)
+{
+ uint32_t f5v_cap;
+
+ host_cmd_typec_control_bist_share_mode(USBC_PORT_C0, 1);
+ zassume_ok(tcpci_partner_send_control_msg(&fixture->sink_5v_500ma,
+ PD_CTRL_GET_SOURCE_CAP, 0),
+ "Failed to send get src cap");
+ /* wait tSenderResponse (26 ms) */
+ k_sleep(K_MSEC(26));
+ /*
+ * Verify we were offered the 3A source cap because of
+ * bist share mode be enabled.
+ */
+ f5v_cap = fixture->snk_ext_500ma.last_5v_source_cap;
+ /* Capability should be 5V fixed, 3 A */
+ zassert_equal((f5v_cap & PDO_TYPE_MASK), PDO_TYPE_FIXED,
+ "PDO type wrong");
+ zassert_equal(PDO_FIXED_VOLTAGE(f5v_cap), 5000, "PDO voltage wrong");
+ zassert_equal(PDO_FIXED_CURRENT(f5v_cap), 3000,
+ "PDO initial current wrong");
+
+ host_cmd_typec_control_bist_share_mode(USBC_PORT_C0, 0);
+}