The property had no coverage in either of its two settings.
Signed-off-by: Emmanuel Blot <[email protected]>
---
tests/qtest/ds1338-test.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 54 insertions(+)
diff --git a/tests/qtest/ds1338-test.c b/tests/qtest/ds1338-test.c
index 1b73dca98d..1b9c02d931 100644
--- a/tests/qtest/ds1338-test.c
+++ b/tests/qtest/ds1338-test.c
@@ -20,12 +20,15 @@
#include "qemu/osdep.h"
#include "qemu/bcd.h"
#include "libqtest.h"
+#include "libqtest-single.h"
#include "libqos/i2c.h"
+#include "qobject/qdict.h"
#define DS1338_ADDR 0x68
/* DS1338 register map */
#define DS1338_SECONDS 0x00
+#define DS1338_YEAR 0x06
#define DS1338_CONTROL 0x07
#define DS1338_NVRAM 0x08
#define DS1338_NUM_REGS 0x40
@@ -136,6 +139,50 @@ static void test_nvram(void *obj, void *data,
QGuestAllocator *alloc)
g_assert_cmphex(i2c_get8(i2cdev, 0x3f), ==, 0xc3);
}
+/* A reset restores the power-on state, unless persist-on-reset is set. */
+static void check_reset(QI2CDevice *i2cdev, bool persists)
+{
+ uint8_t year = i2c_get8(i2cdev, DS1338_YEAR);
+ /* A year the clock is not already showing, so the check discriminates. */
+ uint8_t marker = year == 0x42 ? 0x77 : 0x42;
+ QDict *rsp;
+
+ i2c_set8(i2cdev, DS1338_NVRAM, 0xa5);
+ i2c_set8(i2cdev, DS1338_CONTROL, 0x00);
+ i2c_set8(i2cdev, DS1338_YEAR, marker);
+ g_assert_cmphex(i2c_get8(i2cdev, DS1338_NVRAM), ==, 0xa5);
+ g_assert_cmphex(i2c_get8(i2cdev, DS1338_CONTROL), ==, 0x00);
+ g_assert_cmphex(i2c_get8(i2cdev, DS1338_YEAR), ==, marker);
+
+ rsp = qmp("{ 'execute': 'system_reset' }");
+ g_assert(qdict_haskey(rsp, "return"));
+ qobject_unref(rsp);
+ qmp_eventwait("RESET");
+
+ if (persists) {
+ g_assert_cmphex(i2c_get8(i2cdev, DS1338_NVRAM), ==, 0xa5);
+ g_assert_cmphex(i2c_get8(i2cdev, DS1338_CONTROL), ==, 0x00);
+ g_assert_cmphex(i2c_get8(i2cdev, DS1338_YEAR), ==, marker);
+ } else {
+ g_assert_cmphex(i2c_get8(i2cdev, DS1338_NVRAM), ==, 0x00);
+ g_assert_cmphex(i2c_get8(i2cdev, DS1338_CONTROL), ==, DS1338_CTRL_POR);
+ /* Back on host time, which is where the year came from. */
+ g_assert_cmphex(i2c_get8(i2cdev, DS1338_YEAR), ==, year);
+ }
+}
+
+/* Without persist-on-reset, a reset takes the part back to power-on. */
+static void test_reset_clears(void *obj, void *data, QGuestAllocator *alloc)
+{
+ check_reset((QI2CDevice *)obj, false);
+}
+
+/* With persist-on-reset, the registers and the clock survive a reset. */
+static void test_reset_persists(void *obj, void *data, QGuestAllocator *alloc)
+{
+ check_reset((QI2CDevice *)obj, true);
+}
+
/* The register pointer wraps at the end of the map. */
static void test_address_wrap(void *obj, void *data, QGuestAllocator *alloc)
{
@@ -162,6 +209,13 @@ static void ds1338_register_nodes(void)
qos_add_test("clock-halt", "ds1338", test_clock_halt, NULL);
qos_add_test("nvram", "ds1338", test_nvram, NULL);
qos_add_test("address-wrap", "ds1338", test_address_wrap, NULL);
+ qos_add_test("reset-clears", "ds1338", test_reset_clears, NULL);
+
+ opts.extra_device_opts = "address=0x68,persist-on-reset=on";
+ qos_node_create_driver_named("ds1338-persist", "ds1338",
i2c_device_create);
+ qos_node_consumes("ds1338-persist", "i2c-bus", &opts);
+
+ qos_add_test("reset-persists", "ds1338-persist", test_reset_persists,
NULL);
}
libqos_init(ds1338_register_nodes);
--
2.50.1