diff options
author | Aaron Massey <aaronmassey@google.com> | 2022-10-07 11:54:59 -0600 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-10-10 19:09:05 +0000 |
commit | af031d35dbd45cfaa7e36e8e515463502f87474c (patch) | |
tree | 8a24bbbb9596596b62e3c5bdda7843a98ba0900a | |
parent | 3358e501e393ba0838c7ce39de3ce9560628fb9d (diff) | |
download | chrome-ec-af031d35dbd45cfaa7e36e8e515463502f87474c.tar.gz |
test: shim rtc EC_CMD_RTC_SET_ALARM hostcmd
Add test that verifies setting an rtc alarm when fired will invoke the
initialized rtc callback function and accompanying host_event.
BRANCH=none
BUG=b:236160570
TEST=twister --clobber -i -s zephyr/test/drivers/drivers.shim_rtc
Signed-off-by: Aaron Massey <aaronmassey@google.com>
Change-Id: I2a4aa421418a16944ffa8e452f8a297c000b7367
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3939609
Code-Coverage: Zoss <zoss-cl-coverage@prod.google.com>
Reviewed-by: Keith Short <keithshort@chromium.org>
-rw-r--r-- | zephyr/emul/emul_rtc.c | 4 | ||||
-rw-r--r-- | zephyr/test/drivers/shim_rtc/src/test_shim_rtc.c | 35 |
2 files changed, 39 insertions, 0 deletions
diff --git a/zephyr/emul/emul_rtc.c b/zephyr/emul/emul_rtc.c index 0d59fb782a..0bd2ef0828 100644 --- a/zephyr/emul/emul_rtc.c +++ b/zephyr/emul/emul_rtc.c @@ -63,6 +63,10 @@ static int cros_rtc_emul_set_value(const struct device *dev, uint32_t value) data->value = value; + if (data->value >= data->alarm_time && data->alarm_time) { + data->alarm_callback(dev); + } + return EC_SUCCESS; } diff --git a/zephyr/test/drivers/shim_rtc/src/test_shim_rtc.c b/zephyr/test/drivers/shim_rtc/src/test_shim_rtc.c index f0b35037be..0b4120a404 100644 --- a/zephyr/test/drivers/shim_rtc/src/test_shim_rtc.c +++ b/zephyr/test/drivers/shim_rtc/src/test_shim_rtc.c @@ -10,6 +10,8 @@ #include "ec_commands.h" #include "host_command.h" +#include "lpc.h" +#include "system.h" #include "test/drivers/test_state.h" ZTEST_USER(rtc_shim, test_hc_rtc_set_get_val) @@ -34,4 +36,37 @@ ZTEST_USER(rtc_shim, test_hc_rtc_set_get_val) zassert_equal(get_value.time, set_value.time); } +ZTEST(rtc_shim, test_hc_rtc_set_alarm_can_fire_cb) +{ + struct ec_params_rtc set_value; + struct host_cmd_handler_args set_args = + BUILD_HOST_COMMAND_PARAMS(EC_CMD_RTC_SET_ALARM, 0, set_value); + +#ifdef CONFIG_HOSTCMD_X86 + /* Enable the RTC event to fire */ + host_event_t lpc_event_mask; + host_event_t mask = EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC); + + lpc_event_mask = lpc_get_host_event_mask(LPC_HOST_EVENT_SMI); + lpc_set_host_event_mask(LPC_HOST_EVENT_SMI, lpc_event_mask | mask); +#endif + + /* Arbitrary value of 2 */ + system_set_rtc(2); + + /* Clear events so we can check that RTC event happened */ + host_clear_events(CONFIG_HOST_EVENT_REPORT_MASK); + zassert_false(host_is_event_set(EC_HOST_EVENT_RTC)); + + /* Initially set arbitrary value of alarm in 2 seconds*/ + set_value.time = 2; + zassert_ok(host_command_process(&set_args)); + /* Set fake driver time forward to hit the alarm in 2 seconds */ + system_set_rtc(4); + + /* Wait for irq to finish */ + k_sleep(K_SECONDS(1)); + zassert_true(host_is_event_set(EC_HOST_EVENT_RTC)); +} + ZTEST_SUITE(rtc_shim, drivers_predicate_post_main, NULL, NULL, NULL, NULL); |