summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Brockus <dbrockus@google.com>2021-01-08 13:01:58 -0700
committerCommit Bot <commit-bot@chromium.org>2021-01-09 01:03:44 +0000
commit78b0b3c79fd8befccbc0de7001a6f37e8268d97f (patch)
tree946e22d426565e16de6f27f355304bc78696c7bc
parentba81125401ff0dde76d9a064e53f6ad76226f84c (diff)
downloadchrome-ec-78b0b3c79fd8befccbc0de7001a6f37e8268d97f.tar.gz
TCPMv2: Compliance Unit Test - TD.PD.SRC3.E8
BUG=none BRANCH=none TEST=make buildall Signed-off-by: Denis Brockus <dbrockus@google.com> Change-Id: I439a7213ff60c8fce600d07aae481cecdb40d340 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2618570 Tested-by: Denis Brockus <dbrockus@chromium.org> Commit-Queue: Edward Hill <ecgh@chromium.org> Auto-Submit: Denis Brockus <dbrockus@chromium.org> Reviewed-by: Edward Hill <ecgh@chromium.org>
-rw-r--r--test/build.mk1
-rw-r--r--test/usb_tcpmv2_compliance.c1
-rw-r--r--test/usb_tcpmv2_compliance.h1
-rw-r--r--test/usb_tcpmv2_td_pd_src3_e8.c251
4 files changed, 254 insertions, 0 deletions
diff --git a/test/build.mk b/test/build.mk
index 5e3c74511f..ff1acaaee1 100644
--- a/test/build.mk
+++ b/test/build.mk
@@ -225,6 +225,7 @@ usb_tcpmv2_compliance-y=usb_tcpmv2_compliance.o usb_tcpmv2_compliance_common.o \
usb_tcpmv2_td_pd_src_e5.o \
usb_tcpmv2_td_pd_src3_e1.o \
usb_tcpmv2_td_pd_src3_e7.o \
+ usb_tcpmv2_td_pd_src3_e8.o \
usb_tcpmv2_td_pd_src3_e26.o \
usb_tcpmv2_td_pd_snk3_e12.o \
usb_tcpmv2_td_pd_other.o
diff --git a/test/usb_tcpmv2_compliance.c b/test/usb_tcpmv2_compliance.c
index bd6b3303a5..4470641d9d 100644
--- a/test/usb_tcpmv2_compliance.c
+++ b/test/usb_tcpmv2_compliance.c
@@ -46,6 +46,7 @@ void run_test(int argc, char **argv)
RUN_TEST(test_td_pd_src3_e1);
RUN_TEST(test_td_pd_src3_e7);
+ RUN_TEST(test_td_pd_src3_e8);
RUN_TEST(test_td_pd_src3_e26);
RUN_TEST(test_td_pd_snk3_e12);
diff --git a/test/usb_tcpmv2_compliance.h b/test/usb_tcpmv2_compliance.h
index 2468d857e9..e357450242 100644
--- a/test/usb_tcpmv2_compliance.h
+++ b/test/usb_tcpmv2_compliance.h
@@ -85,6 +85,7 @@ int test_td_pd_src_e5(void);
int test_td_pd_src3_e1(void);
int test_td_pd_src3_e7(void);
+int test_td_pd_src3_e8(void);
int test_td_pd_src3_e26(void);
int test_td_pd_snk3_e12(void);
diff --git a/test/usb_tcpmv2_td_pd_src3_e8.c b/test/usb_tcpmv2_td_pd_src3_e8.c
new file mode 100644
index 0000000000..cc07133043
--- /dev/null
+++ b/test/usb_tcpmv2_td_pd_src3_e8.c
@@ -0,0 +1,251 @@
+/* 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 "battery.h"
+#include "mock/tcpci_i2c_mock.h"
+#include "task.h"
+#include "driver/tcpm/tcpci.h"
+#include "test_util.h"
+#include "timer.h"
+#include "usb_tcpmv2_compliance.h"
+#include "usb_tc_sm.h"
+
+#define BUFFER_SIZE 100
+
+#define EXT_MSG_CHUNKED BIT(15)
+#define EXT_MSG_DATA_SIZE_1 1
+
+#define HEADER_BYTE_OFFSET 1
+#define HEADER_NUM_BYTES 2
+
+#define SCEDB_NUM_BATTERY_OFFSET 22
+#define SCEDB_NUM_BYTES 24
+
+#define BSDO_NUM_BYTES 4
+#define BSDO_INV_BATTERY_REF(bsdo) (((bsdo) >> 8) & 1)
+#define BSDO_BATTERY_PRESENT(bsdo) (((bsdo) >> 9) & 1)
+#define BSDO_BATTERY_CHRG_STS(bsdo) (((bsdo) >> 10) & 3)
+#define BSDO_BATTERY_INFO(bsdo) (((bsdo) >> 8) & 0xFF)
+
+static int number_of_fixed_batteries(void)
+{
+ return CONFIG_NUM_FIXED_BATTERIES;
+}
+
+static int number_of_swappable_batteries(void)
+{
+ return 0;
+}
+
+/*****************************************************************************
+ * TD.PD.SRC3.E8 Battery Status Field Checks
+ *
+ * Description:
+ * As Consumer (UFP), the Tester sends a Get_Battery_Status message to
+ * the UUT, verifies the UUT respond with a Battery_Status or
+ * Not_Supported message. If a Battery_Status message is received, the
+ * Tester verifies correct field values.
+ */
+int test_td_pd_src3_e8(void)
+{
+ int msg_len;
+ uint8_t data[BUFFER_SIZE];
+ uint32_t ext_msg;
+ int num_fixed_batteries;
+ int num_swappable_battery_slots;
+
+ int ref;
+ int found_index;
+ struct possible_tx possible[2];
+
+ TEST_EQ(tcpci_startup(), EC_SUCCESS, "%d");
+
+ /*
+ * a) Run PROC.PD.E1 Bring-up according to the UUT role.
+ */
+ TEST_EQ(proc_pd_e1(PD_ROLE_DFP, INITIAL_AND_ALREADY_ATTACHED),
+ EC_SUCCESS, "%d");
+
+ /*
+ * b) The Tester waits until it can start an AMS (Run PROC.PD.E3) and
+ * sends a Get_Source_Cap_Extended message to the UUT.
+ */
+ TEST_EQ(proc_pd_e3(), EC_SUCCESS, "%d");
+
+ partner_send_msg(PD_MSG_SOP, PD_CTRL_GET_SOURCE_CAP_EXT, 0, 0, NULL);
+
+ /*
+ * c) If a Source_Capabilities_Extended message is received, the
+ * Tester record the Number of Batteries/Battery Slots field.
+ */
+ possible[0].tx_type = TCPC_TX_SOP;
+ possible[0].ctrl_msg = PD_CTRL_NOT_SUPPORTED;
+ possible[0].data_msg = 0;
+
+ possible[1].tx_type = TCPC_TX_SOP;
+ possible[1].ctrl_msg = 0;
+ possible[1].data_msg = PD_EXT_SOURCE_CAP;
+
+ TEST_EQ(verify_tcpci_possible_tx(possible,
+ 2,
+ &found_index,
+ data,
+ sizeof(data),
+ &msg_len,
+ 0),
+ EC_SUCCESS, "%d");
+ if (found_index == 1) {
+ mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS);
+ task_wait_event(10 * MSEC);
+
+ TEST_EQ(msg_len, HEADER_BYTE_OFFSET +
+ HEADER_NUM_BYTES +
+ SCEDB_NUM_BYTES,
+ "%d");
+
+ num_fixed_batteries =
+ data[HEADER_BYTE_OFFSET +
+ HEADER_NUM_BYTES +
+ SCEDB_NUM_BATTERY_OFFSET] &
+ 0x0F;
+ num_swappable_battery_slots =
+ (data[HEADER_BYTE_OFFSET +
+ HEADER_NUM_BYTES +
+ SCEDB_NUM_BATTERY_OFFSET] >> 4) &
+ 0x0F;
+ }
+ /*
+ * If a Not_Supported message is received, the Tester reads the
+ * Number of Batteries/Battery Slots field (combine
+ * Num_Fixed_Batteries and Num_Swappable_Battery_Slots) from the
+ * VIF.
+ */
+ else {
+ TEST_EQ(found_index, 0, "%d");
+ mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS);
+ task_wait_event(10 * MSEC);
+
+ num_fixed_batteries = number_of_fixed_batteries();
+ num_swappable_battery_slots = number_of_swappable_batteries();
+ }
+
+ /*
+ * d) The Tester waits until it can start an AMS (Run PROC.PD.E3) and
+ * sends a Get_Battery_Status message to the UUT, with Battery
+ * Status Ref set to 0 (step g includes doing d-f with Battery
+ * Status Ref set to 1 - 7).
+ */
+ for (ref = 0; ref <= 7; ++ref) {
+ uint16_t header;
+ uint32_t bsdo;
+
+ ext_msg = EXT_MSG_CHUNKED | EXT_MSG_DATA_SIZE_1 |
+ (ref << 16);
+ partner_send_msg(PD_MSG_SOP, PD_EXT_GET_BATTERY_STATUS, 1, 1,
+ &ext_msg);
+
+ /*
+ * e) If a Battery_Status message is received, the Tester
+ * verifies:
+ */
+ TEST_EQ(verify_tcpci_tx_with_data(TCPC_TX_SOP,
+ PD_DATA_BATTERY_STATUS,
+ data,
+ sizeof(data),
+ &msg_len,
+ 0),
+ EC_SUCCESS, "%d");
+ mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS);
+ task_wait_event(10 * MSEC);
+ TEST_EQ(msg_len, HEADER_BYTE_OFFSET +
+ HEADER_NUM_BYTES +
+ BSDO_NUM_BYTES,
+ "%d");
+
+ /*
+ * 1. Number of Data Objects field = 001b
+ */
+ header = UINT16_FROM_BYTE_ARRAY_LE(data, HEADER_BYTE_OFFSET);
+ TEST_EQ(PD_HEADER_CNT(header), 1, "%d");
+
+ /*
+ * 2. Port Power Role field = 1b (Source)
+ */
+ TEST_EQ(PD_HEADER_PROLE(header), 1, "%d");
+
+ /*
+ * 3. Specification Revision field = 10b (Rev 3.0)
+ */
+ TEST_EQ(PD_HEADER_REV(header), PD_REV30, "%d");
+
+ /*
+ * 4. Port Data Role field = 1b (DFP)
+ */
+ TEST_EQ(PD_HEADER_DROLE(header), PD_ROLE_DFP, "%d");
+
+ /*
+ * 5. Extended = 0b
+ */
+ TEST_EQ(PD_HEADER_EXT(header), 0, "%d");
+
+ /*
+ * 6. Invalid Battery Reference field (Bit 0) of the
+ * Battery Info field in the BSDO matches with the
+ * recorded Number of Batteries/Battery Slots field
+ * 7. If Battery Status Ref referred to a fixed battery
+ * and Invalid Battery Reference field is 0, the Battery
+ * is present field (Bit 1) shall be 1
+ * 8. If Invalid Battery Reference field is 1, Battery is
+ * present field shall be 0
+ */
+ bsdo = UINT32_FROM_BYTE_ARRAY_LE(data, HEADER_BYTE_OFFSET +
+ HEADER_NUM_BYTES);
+
+ /* FIXED BATTERY */
+ if (ref < 4) {
+ if (ref < num_fixed_batteries) {
+ TEST_EQ(BSDO_INV_BATTERY_REF(bsdo),
+ 0, "%d");
+ TEST_EQ(BSDO_BATTERY_PRESENT(bsdo),
+ 1, "%d");
+ } else {
+ TEST_EQ(BSDO_INV_BATTERY_REF(bsdo),
+ 1, "%d");
+ TEST_EQ(BSDO_BATTERY_PRESENT(bsdo),
+ 0, "%d");
+ }
+ }
+ /* BATTERY SLOT */
+ else {
+ if ((ref - 4) < num_swappable_battery_slots) {
+ TEST_EQ(BSDO_INV_BATTERY_REF(bsdo),
+ 0, "%d");
+ } else {
+ TEST_EQ(BSDO_INV_BATTERY_REF(bsdo),
+ 1, "%d");
+ TEST_EQ(BSDO_BATTERY_PRESENT(bsdo),
+ 0, "%d");
+ }
+ }
+
+ /*
+ * 9. If Battery is present, Battery charging status
+ * (Bits 3..2) of Battery Info field is not 11b
+ * 10. If Battery is not present, Bits 3..2 of Battery Info
+ * field is 00b
+ * 11. Bits 7..4 of Battery Info field are 0
+ * 12. Bits 7..0 of the BSDO are 0
+ */
+ if (BSDO_BATTERY_PRESENT(bsdo))
+ TEST_NE(BSDO_BATTERY_CHRG_STS(bsdo), 3, "%d");
+ else
+ TEST_EQ(BSDO_BATTERY_CHRG_STS(bsdo), 0, "%d");
+
+ TEST_EQ(BSDO_BATTERY_INFO(bsdo) & GENMASK(7, 4), 0, "%d");
+ TEST_EQ(bsdo & GENMASK(7, 0), 0, "%d");
+ }
+
+ return EC_SUCCESS;
+}