diff options
-rw-r--r-- | zephyr/emul/emul_bb_retimer.c | 6 | ||||
-rw-r--r-- | zephyr/test/drivers/include/stubs.h | 4 | ||||
-rw-r--r-- | zephyr/test/drivers/overlay.dts | 6 | ||||
-rw-r--r-- | zephyr/test/drivers/prj.conf | 4 | ||||
-rw-r--r-- | zephyr/test/drivers/src/bb_retimer.c | 98 | ||||
-rw-r--r-- | zephyr/test/drivers/src/stubs.c | 30 |
6 files changed, 145 insertions, 3 deletions
diff --git a/zephyr/emul/emul_bb_retimer.c b/zephyr/emul/emul_bb_retimer.c index 51e60948c8..30fd1a27b1 100644 --- a/zephyr/emul/emul_bb_retimer.c +++ b/zephyr/emul/emul_bb_retimer.c @@ -256,6 +256,12 @@ static int bb_emul_read_byte(struct i2c_emul *emul, int reg, uint8_t *val, data = BB_DATA_FROM_I2C_EMUL(emul); + /* First byte of read message is read size which is always 4 */ + if (bytes == 0) { + *val = 4; + return 0; + } + *val = data->data_dword & 0xff; data->data_dword >>= 8; diff --git a/zephyr/test/drivers/include/stubs.h b/zephyr/test/drivers/include/stubs.h index 847de8e083..1ae0f3a50d 100644 --- a/zephyr/test/drivers/include/stubs.h +++ b/zephyr/test/drivers/include/stubs.h @@ -3,4 +3,8 @@ * found in the LICENSE file. */ +#include "power.h" + enum usbc_port { USBC_PORT_C0 = 0, USBC_PORT_C1, USBC_PORT_COUNT }; + +void set_mock_power_state(enum power_state state); diff --git a/zephyr/test/drivers/overlay.dts b/zephyr/test/drivers/overlay.dts index 8e557b31bf..9ca18812b2 100644 --- a/zephyr/test/drivers/overlay.dts +++ b/zephyr/test/drivers/overlay.dts @@ -44,13 +44,15 @@ enum-name = "GPIO_EC_PCH_WAKE_ODL"; label = "EC_PCH_WAKE_ODL"; }; + /* Setup USB C1 pin as output to check their state in test */ usb_c1_ls_en { - gpios = <&gpio0 6 (GPIO_INPUT | GPIO_PULL_UP)>; + gpios = <&gpio0 6 (GPIO_INPUT | GPIO_PULL_UP | + GPIO_OUTPUT)>; enum-name = "GPIO_USB_C1_LS_EN"; label = "USB_C1_LS_EN"; }; usb_c1_rt_rst_odl { - gpios = <&gpio0 7 GPIO_ODR_LOW>; + gpios = <&gpio0 7 (GPIO_OUTPUT | GPIO_INPUT)>; enum-name = "GPIO_USB_C1_RT_RST_ODL"; label = "USB_C1_RT_RST_ODL"; }; diff --git a/zephyr/test/drivers/prj.conf b/zephyr/test/drivers/prj.conf index ed0b27432a..44057c2c12 100644 --- a/zephyr/test/drivers/prj.conf +++ b/zephyr/test/drivers/prj.conf @@ -23,6 +23,8 @@ CONFIG_EMUL_BMI=y CONFIG_EMUL_TCS3400=y CONFIG_EMUL_BB_RETIMER=y +CONFIG_PLATFORM_EC_POWERSEQ=y + CONFIG_PLATFORM_EC_BATTERY_PRESENT_GPIO=y CONFIG_PLATFORM_EC_EXTPOWER_GPIO=y @@ -75,3 +77,5 @@ CONFIG_ESPI_PERIPHERAL_EC_HOST_CMD=y CONFIG_PLATFORM_EC_BACKLIGHT_LID=n CONFIG_PLATFORM_EC_SWITCH=n CONFIG_PLATFORM_EC_VBOOT_HASH=n +CONFIG_PLATFORM_EC_POWERSEQ_INTEL=n +CONFIG_PLATFORM_EC_POWERSEQ_PP5000_CONTROL=n diff --git a/zephyr/test/drivers/src/bb_retimer.c b/zephyr/test/drivers/src/bb_retimer.c index c7e5fb7789..38111ce4e5 100644 --- a/zephyr/test/drivers/src/bb_retimer.c +++ b/zephyr/test/drivers/src/bb_retimer.c @@ -5,6 +5,8 @@ #include <zephyr.h> #include <ztest.h> +#include <drivers/gpio.h> +#include <drivers/gpio/gpio_emul.h> #include "common.h" #include "ec_tasks.h" @@ -18,6 +20,11 @@ #include "driver/retimer/bb_retimer.h" +#define GPIO_USB_C1_LS_EN_PATH DT_PATH(named_gpios, usb_c1_ls_en) +#define GPIO_USB_C1_LS_EN_PORT DT_GPIO_PIN(GPIO_USB_C1_LS_EN_PATH, gpios) +#define GPIO_USB_C1_RT_RST_ODL_PATH DT_PATH(named_gpios, usb_c1_rt_rst_odl) +#define GPIO_USB_C1_RT_RST_ODL_PORT \ + DT_GPIO_PIN(GPIO_USB_C1_RT_RST_ODL_PATH, gpios) #define EMUL_LABEL DT_NODELABEL(usb_c1_bb_retimer_emul) #define BB_RETIMER_ORD DT_DEP_ORD(EMUL_LABEL) @@ -418,11 +425,100 @@ static void test_bb_set_dfp_state(void) exp_conn, conn); } +/** Test BB retimer init */ +static void test_bb_init(void) +{ + const struct device *gpio_dev = + DEVICE_DT_GET(DT_GPIO_CTLR(GPIO_USB_C1_LS_EN_PATH, gpios)); + struct i2c_emul *emul; + + zassert_not_null(gpio_dev, "Cannot get GPIO device"); + + emul = bb_emul_get(BB_RETIMER_ORD); + + /* Set AP to normal state and wait for chipset task */ + set_mock_power_state(POWER_S0); + k_msleep(1); + + /* Setup emulator fail on read */ + i2c_common_emul_set_read_fail_reg(emul, BB_RETIMER_REG_VENDOR_ID); + /* Test fail on vendor ID read */ + zassert_equal(-EIO, bb_usb_retimer.init(&usb_muxes[USBC_PORT_C1]), + NULL); + /* Enable pins should be set always after init, when AP is on */ + zassert_equal(1, gpio_emul_output_get(gpio_dev, GPIO_USB_C1_LS_EN_PORT), + NULL); + zassert_equal(1, gpio_emul_output_get(gpio_dev, + GPIO_USB_C1_RT_RST_ODL_PORT), + NULL); + + /* Setup wrong vendor ID */ + i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG); + bb_emul_set_reg(emul, BB_RETIMER_REG_VENDOR_ID, 0x12144678); + /* Test fail on wrong vendor ID */ + zassert_equal(EC_ERROR_INVAL, + bb_usb_retimer.init(&usb_muxes[USBC_PORT_C1]), NULL); + zassert_equal(1, gpio_emul_output_get(gpio_dev, GPIO_USB_C1_LS_EN_PORT), + NULL); + zassert_equal(1, gpio_emul_output_get(gpio_dev, + GPIO_USB_C1_RT_RST_ODL_PORT), + NULL); + + /* Setup emulator fail on device ID read */ + i2c_common_emul_set_read_fail_reg(emul, BB_RETIMER_REG_DEVICE_ID); + bb_emul_set_reg(emul, BB_RETIMER_REG_VENDOR_ID, BB_RETIMER_VENDOR_ID_1); + /* Test fail on device ID read */ + zassert_equal(-EIO, bb_usb_retimer.init(&usb_muxes[USBC_PORT_C1]), + NULL); + zassert_equal(1, gpio_emul_output_get(gpio_dev, GPIO_USB_C1_LS_EN_PORT), + NULL); + zassert_equal(1, gpio_emul_output_get(gpio_dev, + GPIO_USB_C1_RT_RST_ODL_PORT), + NULL); + + /* Setup wrong device ID */ + i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG); + bb_emul_set_reg(emul, BB_RETIMER_REG_DEVICE_ID, 0x12144678); + /* Test fail on wrong device ID */ + zassert_equal(EC_ERROR_INVAL, + bb_usb_retimer.init(&usb_muxes[USBC_PORT_C1]), NULL); + zassert_equal(1, gpio_emul_output_get(gpio_dev, GPIO_USB_C1_LS_EN_PORT), + NULL); + zassert_equal(1, gpio_emul_output_get(gpio_dev, + GPIO_USB_C1_RT_RST_ODL_PORT), + NULL); + + /* Test successful init */ + bb_emul_set_reg(emul, BB_RETIMER_REG_DEVICE_ID, BB_RETIMER_DEVICE_ID); + zassert_equal(EC_SUCCESS, bb_usb_retimer.init(&usb_muxes[USBC_PORT_C1]), + NULL); + zassert_equal(1, gpio_emul_output_get(gpio_dev, GPIO_USB_C1_LS_EN_PORT), + NULL); + zassert_equal(1, gpio_emul_output_get(gpio_dev, + GPIO_USB_C1_RT_RST_ODL_PORT), + NULL); + + /* Set AP to off state and wait for chipset task */ + set_mock_power_state(POWER_G3); + k_msleep(1); + + /* With AP off, init should fail and pins should be unset */ + zassert_equal(EC_ERROR_NOT_POWERED, + bb_usb_retimer.init(&usb_muxes[USBC_PORT_C1]), NULL); + zassert_equal(0, gpio_emul_output_get(gpio_dev, GPIO_USB_C1_LS_EN_PORT), + NULL); + zassert_equal(0, gpio_emul_output_get(gpio_dev, + GPIO_USB_C1_RT_RST_ODL_PORT), + NULL); +} + + void test_suite_bb_retimer(void) { ztest_test_suite(bb_retimer, ztest_user_unit_test(test_bb_is_fw_update_capable), ztest_user_unit_test(test_bb_set_state), - ztest_user_unit_test(test_bb_set_dfp_state)); + ztest_user_unit_test(test_bb_set_dfp_state), + ztest_user_unit_test(test_bb_init)); ztest_run_test_suite(bb_retimer); } diff --git a/zephyr/test/drivers/src/stubs.c b/zephyr/test/drivers/src/stubs.c index 62d037d718..8a339679a8 100644 --- a/zephyr/test/drivers/src/stubs.c +++ b/zephyr/test/drivers/src/stubs.c @@ -11,6 +11,7 @@ #include "charger/isl9241_public.h" #include "config.h" #include "i2c/i2c.h" +#include "power.h" #include "ppc/sn5s330_public.h" #include "ppc/syv682x_public.h" #include "retimer/bb_retimer_public.h" @@ -200,3 +201,32 @@ uint16_t tcpc_get_alert_status(void) { return 0; } + +enum power_state power_chipset_init(void) +{ + return POWER_G3; +} + +enum power_state mock_state = POWER_G3; + +void set_mock_power_state(enum power_state state) +{ + mock_state = state; + task_wake(TASK_ID_CHIPSET); +} + +enum power_state power_handle_state(enum power_state state) +{ + return mock_state; +} + +void chipset_reset(enum chipset_reset_reason reason) +{ +} + +void chipset_force_shutdown(enum chipset_shutdown_reason reason) +{ +} + +/* Power signals list. Must match order of enum power_signal. */ +const struct power_signal_info power_signal_list[] = {}; |