diff options
-rw-r--r-- | common/usbc/usb_pd_dpm.c | 21 | ||||
-rw-r--r-- | common/usbc/usb_pd_host.c | 3 | ||||
-rw-r--r-- | include/ec_commands.h | 3 | ||||
-rw-r--r-- | include/usb_pd_dpm.h | 9 | ||||
-rw-r--r-- | util/ectool.cc | 18 | ||||
-rw-r--r-- | zephyr/test/drivers/common/include/test/drivers/utils.h | 9 | ||||
-rw-r--r-- | zephyr/test/drivers/common/src/utils.c | 14 | ||||
-rw-r--r-- | zephyr/test/drivers/default/src/integration/usbc/usb_pd_bist_shared.c | 26 |
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); +} |