summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Massey <aaronmassey@google.com>2022-10-07 11:54:59 -0600
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-10-10 19:09:05 +0000
commitaf031d35dbd45cfaa7e36e8e515463502f87474c (patch)
tree8a24bbbb9596596b62e3c5bdda7843a98ba0900a
parent3358e501e393ba0838c7ce39de3ce9560628fb9d (diff)
downloadchrome-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.c4
-rw-r--r--zephyr/test/drivers/shim_rtc/src/test_shim_rtc.c35
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);